概要
自前で作成したコンテナをAWS Batchで使えるようにするためにいろいろ調べて試した流れのメモです。
rdkitを使いたかったのでrdkitを使えるコンテナを使用しています。
事前準備
Dockerimage の作成
- 起動させるDockerコンテナのイメージを作成します。
FROM mcs07/rdkit:2020.03.2
# https://github.com/mcs07/docker-rdkit
RUN apt-get update && apt-get upgrade -y
RUN apt-get install python3-pip -y
RUN pip3 install pandas && \
pip3 install numpy && \
pip3 install hashids && \
pip3 install xlsxwriter && \
pip3 install Pillow
WORKDIR /dev/app
COPY module .
ENTRYPOINT ["python3", "src/pandasTest.py"]
- ディレクトリは以下のようになっています。
dockerfile
module\data
module\data\signal-datas_1.csv
module\src
module\src\logger.py
module\src\pandasTest.py
- pandasTest.py
-
data/signal-datas_1.csv
を読み込んで出力するだけの内容です。
-
import pandas as pd
from logger import LoggerObj
if __name__ == "__main__":
logObj=LoggerObj()
log=logObj.createLog()
log.info('処理開始')
test=pd.read_csv('data/signal-datas_1.csv')
log.info(test.head())
log.info('処理終了')
- looger.py
- ログ出力用のプログラム
長いので折りたたんでます
from logging import Formatter, handlers, StreamHandler, getLogger, DEBUG,INFO
from datetime import datetime
import configparser
import os
# ログの出力処理
class LoggerObj:
loggers={}
logger=None
def __init__(self, name=__name__,logFilename='log_'):
print('log作成:'+name+':'+logFilename)
pass
def createLog(self, name=__name__,logFilename='log_'):
if len(self.loggers)!=0:
if name in self.loggers:
# すでに作成済みなら重複して作成しないようにする
return self.loggers[name]
self.logger = getLogger(name)
self.logger.setLevel(DEBUG)
formatter = Formatter("[%(levelname)s]:[%(asctime)s]: %(message)s")
needoutput=True
# stdout
handler = StreamHandler()
handler.setLevel(DEBUG)
handler.setFormatter(formatter)
self.logger.addHandler(handler)
logdirectory='logs'
os.makedirs(logdirectory,exist_ok=True)
fileNamePath=logdirectory+'/'+logFilename
if needoutput:
logFileName=fileNamePath+datetime.now().strftime("%Y%m%d%H%M%S")+'.log'
# file
handler = handlers.RotatingFileHandler(filename = logFileName,
maxBytes = 1048576,
backupCount = 3)
handler.setLevel(DEBUG)
handler.setFormatter(formatter)
self.logger.addHandler(handler)
self.loggers[name]=self.logger
return self.logger
def debug(self, msg):
self.logger.debug(msg)
def info(self, msg):
self.logger.info(msg)
def warn(self, msg):
self.logger.warning(msg)
def error(self, msg):
self.logger.error(msg)
def critical(self, msg):
self.logger.critical(msg)
- Docker imageの作成
- dockerfile を格納しているディレクトリに移動して以下のコマンドを実行します。
docker build -t pandastest/0.1 .
- dockerfile を格納しているディレクトリに移動して以下のコマンドを実行します。
ECRの作成
- AWSのコンソールからリポジトリを作成する。
- リポジトリの名前を設定します。
- コンテナのスキャンや暗号化は状況に応じて設定します。 今回はお試しなので省略しています。
ECRへのプッシュ
- 作成したリポジトリの
プッシュコマンドの表示
ボタンを押下するとプッシュするための方法が出てきます。 - 認証トークンの取得の部分がうまくいかなかったのでこちらを参考にログインコマンドを発行しました。そうするとdockerログイン用の情報が取得できます。すごく長いのでtextに吐き出すのがよさそうです
-
aws ecr get-login --no-include-email --region ap-northeast-1 > text.text
- AWS CLIでAWSに接続して操作できるようにcredentialsの設定が必要です。
-
- dockerログイン用のコマンドを実行します。吐き出したtextの内容をそのままコピペします。
docker login -u AWS -p xxxxxxxx https://yyyyyyyy.dkr.ecr.ap-northeast-1.amazonaws.com
- docker imageにtagを付与します。ここはイメージ名などに合わせてください。
プッシュコマンドの表示
で出てくる内容を使えばいいはずですが名前についてはの状況に合わせてください。docker tag pandastest/0.1 yyyyyyyy.dkr.ecr.ap-northeast-1.amazonaws.com/pandastest:latest
- imageに付与したtagを指定してECRへのプッシュします。
docker push yyyyyyyy.dkr.ecr.ap-northeast-1.amazonaws.com/pandastest:latest
- ECRの画面でプッシュしたコンテナimageが登録されていることを確認します。
AWSBatchの作成
- AWSコンソール上から
Batch
を選択します。 - コンテナイメージにはECRに登録されているコンテナimageの
イメージの URI
を設定します。ほかの項目については必要に応じて環境変数や引数などを設定します。 - 作成後
ジョブの送信
から作成したジョブを選択して実行します。 - 結果は CloudWatch Log で確認できます。