構造解析ソフトFrontISTRをクラウドAWSで動かす~ECS(Dockerイメージ)作成編~

2022/02/20に公開

シリーズ目次

今回の概要

構造解析ソフトFrontISTRをクラウドAWSで動かすため
今回はlambda関数によびだされたECSタスクがFrontISTRを実行するところまでの解説を行います.

前提条件

Docker Desktop がインストールされていること

この記事は Windows10 上で Docker を用いて操作しています。

この記事の作業はローカル環境に Docker Desktop がインストールされていることを前提で進めます。インストールされていない場合は、インストールしてから進めてください。

Amazon CLI がインストールされていること

Amazon CLI
https://aws.amazon.com/jp/cli/

aws configure (初期化) が済んでいること

> aws configure
AWS Access Key ID [None]: ATI********CS
AWS Secret Access Key [None]: ***erg***sdfg***bs1sderg**
Default region name [None]: ap-northeast-1
Default output format [None]: json

ECRにリポジトリを用意する

AWSコンソールからAmazon ECR > リポジトリダッシュボードを表示

リポジトリ作成ボタンを押下

private リポジトリをデフォルト設定で作成ます


今回リポジトリ名を python-workerとしました

リポジトリ作成後の画面

URLを今後の手順で使いますので記憶しておきます。

Dockerファイルを用意する

FrontISTRとpythonがインストールされている Dockerイメージを用意する必要があります。
今回は既にFrontISTRとpythonがインストールされているDockerイメージをDockerHubに用意しました

https://hub.docker.com/repository/docker/sasaco/frontistr-python

このイメージ(sasaco/frontistr-python) にはFrontISTRとpythonがインストールされています

Dockerfile から新しいイメージを作成する

FrontISTRとpythonがインストールされているDockerイメージから新しいDockerイメージを作成します。

新しいDockerイメージは下図のように

  • /tmpフォルダをワークフォルダとする
  • /tmpフォルダにdownload.pyupload.pyrun.shを配置
  • 起動したら/tmpフォルダのスクリプトファイルrun.shを実行する

Dockerイメージ作成のためのファイルを用意する

github にこのプロジェクトを公開しています
https://github.com/sasaco/frontistr-python

Dockerfile

FROM sasaco/frontistr-python:latest
WORKDIR /tmp
COPY app/* /tmp
CMD [ "./run.sh" ]

run.sh

起動と同時に実行されるスクリプトファイルです

#!/bin/bash
python3 download.py
fistr1 -t 1
python3 upload.py
  1. python ファイル download.pyを実行し
  2. ワークフォルダ/tmpで, FrontISTRを実行する
  3. python ファイル upload.py を実行する

というスクリプトです

FrontISTRの実行方法fistr1 -t 1はこのサイトを参考にしましたDocker を活用して FrontISTR を使う

download.py

import boto3
import os
import shutil
# 入力データ(zipファイル)の保存場所S3を取得
EVENT_BUCKET = os.environ["EVENT_BUCKET"]
EVENT_OBJECKT_KEY = os.environ["EVENT_OBJECKT_KEY"]
s3 = boto3.resource("s3")
bucket = s3.Bucket(EVENT_BUCKET)
# zipファイルの保存場所を決める
zip_filepath = '/tmp/' + EVENT_OBJECKT_KEY.split('/')[-1]
# zipファイルを取得する
bucket.download_file(EVENT_OBJECKT_KEY, zip_filepath)
# zipファイルを解凍する
shutil.unpack_archive(zip_filepath, '/tmp/')
  1. lambda関数から渡された アップロード用S3バケット名EVENT_BUCKET(=frontistr-bucket-sasaco)とアップロードされたファイル名EVENT_OBJECKT_KEYを取得
  2. zipファイルを/tmpフォルダに保存
  3. 保存したzipファイルを解凍する

という python コードです

upload.py

import boto3
import os
from os import path
import glob
# 出力フォルダS3を取得
DESTINATION_BUCKET = os.environ["DESTINATION_BUCKET"]
s3 = boto3.resource("s3")
bucket = s3.Bucket(DESTINATION_BUCKET)
# 出力データを収集する
files = glob.glob("/tmp/*")
# 解析結果ファイルを出力フォルダS3にコピー
for filepath in files:
    filename = os.path.basename(filepath)
    path, ext = os.path.splitext(filepath)
    # 解析結果に関係ないファイルは除外する
    if ext == '.sh' or ext == '.py' or ext == '.zip':
        continue
    bucket.upload_file(filepath, filename)
  1. lambda関数から渡された 解析結果保存用S3バケット名EVENT_BUCKET(=frontistr-bucket-sasaco-resized)を取得
  2. /tmpフォルダに保存されている解析結果ファイルを収集
  3. 解析結果ファイルを解析結果保存用S3バケットに保存する

という python コードです

Dockerイメージを作成する

Dockerイメージを作成

docker build -t  frontistr-python .

Docker Desctop が下図のようになります

新しいDockerイメージをAmazon ECR リポジトリにプッシュする

Dockerイメージにタグをつける

Dockerイメージfrontistr-pythonにリポジトリURIとおなじ名前をtag付けします

 docker tag frontistr-python:latest {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/python-worker

Docker Desctop が下図のようになります

Amazon CLI でログインする

aws ecr get-login-password --region ap-northeast-1  --profile sasaco | docker login --username AWS --password-stdin {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com

Amazon ECR リポジトリにプッシュする

docker push {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/python-worker

Amazon ECR リポジトリにlatestが表示されていれば成功です。

Amazon ECS タスクを作成する

AWSコンソールからElastic Container Service > タスク定義を表示

新しいタスク定義を作成ボタンを押下

FARGATE を選択して次で

タスクに名前を付ける

PythonWorkerTaskという名前を付けました

※1 実行ロールを用意する

実行ロールは

ポリシー

  • AmazonS3FullAccess
  • AmazonECSTaskExecutionRolePolicy

Amazon ECR リポジトリのコンテナを追加して作成する


タスク作成後の画面

ECSクラスタを作成する

Fargate用のテンプレートを元にECSクラスタを作成します。

これまでの総括

今回で、一連の実装部分の作成を完了しました

次回
テストそして成功!!編 で実際に動かしてみたいと思います

Discussion