AWS Batchでコンテナの実行方法および実行結果の確認

## 概要

自前で作成したコンテナをAWS Batchで使えるようにするためにいろいろ調べて試した流れのメモです。
rdkitを使いたかったのでrdkitを使えるコンテナを使用しています。


## 事前準備

### Dockerimage の作成

* 起動させるDockerコンテナのイメージを作成します。

```dockerfile
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`を読み込んで出力するだけの内容です。

```python
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
    * ログ出力用のプログラム

<details><summary>長いので折りたたんでます</summary><div>

```python
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)
```
</div></details>


* Docker imageの作成
    * dockerfile を格納しているディレクトリに移動して以下のコマンドを実行します。
        * `docker build -t pandastest/0.1 .`

### ECRの作成

* AWSのコンソールからリポジトリを作成する。
    * リポジトリの名前を設定します。
    * コンテナのスキャンや暗号化は状況に応じて設定します。 今回はお試しなので省略しています。

## ECRへのプッシュ

* 作成したリポジトリの `プッシュコマンドの表示` ボタンを押下するとプッシュするための方法が出てきます。
* 認証トークンの取得の部分がうまくいかなかったので[こちら](https://qiita.com/Esfahan/items/2ddc8d481afd012da357)を参考にログインコマンドを発行しました。そうすると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 で確認できます。