構造解析ソフトFrontISTRをクラウドAWSで動かす~ECS(Dockerイメージ)作成編~
シリーズ目次
- 構造解析ソフトFrontISTRをクラウドAWSで動かす~システムの構成編~
- 構造解析ソフトFrontISTRをクラウドAWSで動かす~S3 バケットからlambda関数編~
- 構造解析ソフトFrontISTRをクラウドAWSで動かす~ECS(Dockerイメージ)作成編~
- 構造解析ソフトFrontISTRをクラウドAWSで動かす~テストそして成功!!編~
今回の概要
構造解析ソフトFrontISTRをクラウドAWSで動かすため
今回はlambda関数によびだされたECSタスクがFrontISTRを実行するところまでの解説を行います.
前提条件
Docker Desktop がインストールされていること
この記事は Windows10 上で Docker を用いて操作しています。
この記事の作業はローカル環境に Docker Desktop がインストールされていることを前提で進めます。インストールされていない場合は、インストールしてから進めてください。
Amazon CLI がインストールされていること
Amazon 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に用意しました
このイメージ(sasaco/frontistr-python) にはFrontISTRとpythonがインストールされています
Dockerfile から新しいイメージを作成する
FrontISTRとpythonがインストールされているDockerイメージから新しいDockerイメージを作成します。
新しいDockerイメージは下図のように
-
/tmp
フォルダをワークフォルダとする -
/tmp
フォルダにdownload.pyとupload.pyとrun.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
- python ファイル download.pyを実行し
-
ワークフォルダ
/tmp
で, FrontISTRを実行する - 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/')
- lambda関数から渡された アップロード用S3バケット名
EVENT_BUCKET
(=frontistr-bucket-sasaco)とアップロードされたファイル名EVENT_OBJECKT_KEY
を取得 - zipファイルを
/tmp
フォルダに保存 - 保存した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)
- lambda関数から渡された 解析結果保存用S3バケット名
EVENT_BUCKET
(=frontistr-bucket-sasaco-resized)を取得 -
/tmp
フォルダに保存されている解析結果ファイルを収集 - 解析結果ファイルを解析結果保存用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