CodeCommitとECRを連携してAWS Batchで実行結果の確認する方法

## 概要

[前回](https://qiita.com/dmikita/items/a793989f91ea9df36845)の内容をCodeCommitからECRにプッシュしてAWS Batchで実行する形を作ります。
CodeCommitとの連携でいろいろ試行錯誤したのでその内容をメモしていこうかと。


## 準備

Dockerファイルは[前回](https://qiita.com/dmikita/items/a793989f91ea9df36845)のものをそのまま使います。


### Commitするソースの準備

* ディレクトリは以下のようになっています。
    * CodeCommitにコミットするため.gitignoreを設定しています。

```
.gitignore
buildspec.yml
dockerfile
module\data
module\data\signal-datas_1.csv
module\src
module\src\logger.py
module\src\pandasTest.py
```

* pandasTest.py
    * 今回は環境変数、引数に与えたものを出力できるように修正しています。

```python
import pandas as pd
from logger import LoggerObj
import sys
import os


aws_region_name = os.getenv('DYNAMODB_REGION', 'ap-northeast-1')

if __name__ == "__main__":
    args=sys.argv

    logObj=LoggerObj()
    log=logObj.createLog()
    log.info('処理開始')
    log.info(args)
    log.info(aws_region_name)
    test=pd.read_csv('data/signal-datas_1.csv')
    log.info(test.head())
    log.info('処理終了')

```

* buildspec.yml
    * CodeBuildを使うためbuildspec.ymlを作成します。
    * `XXXXXXXXXX` はAWSのアカウントID
    * `pandastest2` はECRのリポジトリを指定します。(事前に作成してください)
    * 公式のサンプルでは環境変数で設定していますが、今回はお試しなので固定値にしています。

```yml
version: 0.2
phases:
  install:
    runtime-versions:
      docker: 19
    commands:
      - echo install step...
  pre_build:
    commands:
      - echo logging in to AWS ECR...
      - $(aws ecr get-login --no-include-email --region ap-northeast-1)
  build:
    commands:
      - echo build Docker image on `date`
      - echo Building the Docker image...
      - docker build -t pandastest:latest .
      - docker tag pandastest:latest XXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/pandastest2:latest
  post_build:
    commands:
      - echo build Docker image complete `date`
      - echo push latest Docker images to ECR...
      - docker push XXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/pandastest2:latest

```

### ソースのコミットからビルド

* リポジトリにソースをコミットします。
    * 事前にリポジトリを作成しソースをコミットします。認証の方法などは[公式ページ](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_ssh-keys.html)参照

* CodeBuildでビルドの実行を行います。
    * オペレーティングシステムは `ubuntu` にしないとDockerファイルの `apt-get` がエラーになってしまうようです。
    * 特権付与 `Docker イメージを構築するか、ビルドで昇格されたアクセス権限を取得するには、このフラグを有効にします` をチェックしないとイメージの作成で失敗します。
    * アーティファクトはECRにプッシュするのでなしです。
    * ロールには権限が足りないので[こちら](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/sample-docker.html)を参照して権限を追加します。以下の記述を追加します。
   
 ```
    {
      "Action": [
        "ecr:BatchCheckLayerAvailability",
        "ecr:CompleteLayerUpload",
        "ecr:GetAuthorizationToken",
        "ecr:InitiateLayerUpload",
        "ecr:PutImage",
        "ecr:UploadLayerPart"
      ],
      "Resource": "*",
      "Effect": "Allow"
    },
```
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/4bdd9faf-2a9e-c6be-b371-bc27e4159457.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/0431c55b-9ba4-aef0-9ac3-ba6267416916.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/201362aa-62c3-bb6b-8726-2909ed54631b.png)



* ビルドを実行し終了することを確認します。
    * 失敗した場合はcloudWatchLogを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/a6e31656-e842-2774-104e-5746c645007e.png)

## ジョブ定義の作成から実行

* AWSコンソール上から `Batch` を選択します。
* コンテナイメージにはECRに登録されているコンテナimageの `イメージの URI` を設定します。
    * 環境変数は以下のように設定します。
    * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/f5249409-a284-59ce-c47b-b4a11396ab68.png)
    * 引数は以下のように設定します。
    * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/c5ec50f2-d2d1-2a1a-ec57-d67cca4a5fc8.png)

* 作成後 `ジョブの送信` から作成したジョブを選択して実行します。
* 結果は CloudWatch Log で確認できます。
    * 引数、環境変数が出力されていることを確認できます。
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/65003188-3916-9b2a-01d0-24e4efabbddb.png)