Fargateで起動したコンテナからS3へファイルをアップロードする

## 概要
* EC2上で動かしてたバッチスクリプトをコンテナへ移植するにあたり、そのバッチ処理の結果をEC2上に保管する処理をS3へアップロードする処理へ変更するために試してみたことのメモ。
* Docker に aws cli を入れて、コンテナ内から [aws s3 cp コマンド](https://docs.aws.amazon.com/cli/latest/reference/s3/cp.html)を実行してコンテナ内のファイルをS3へアップロードする。

## 前提
* Fargate と S3 は同じAWSアカウントの東京リージョンにある

## 設定
#### バッチの結果を保存するS3バケットを作成
* バケット名
任意。今回は世界でユニークなものにするため、末尾にこのS3のAWSアカウントIDを付けている。
 * log-infra-batch-AWSアカウントID

* アクセス権限
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/8f5b5cd4-87d1-ef17-20ae-a4ba24172a8d.png)

* フォルダ（プレフィックス）作成
S3バケット 「log-infra-batch-AWSアカウントID」 に様々なバッチの結果を保存する予定。
今回は terraform-plan の実行結果を保存するプレフィックスを作成する。
 * terraform-plan


#### コンテナからS3へファイルをアップロードする権限をもったIAMロール、IAMポリシーを作成
* IAMポリシーを作成
 * ポリシー名：s3-log-infra-batch
 * JSON

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "20190629s3loginfrabatch",
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::log-infra-batch-AWSアカウントID/*"
        }
    ]
}
```

* IAMロール作成
 * ロール名：s3-log-infra-batch
 * 信頼されたエンティティの種類：Elastic Container Service の Elastic Container Service Task
 * ロールにアタッチするポリシー：s3-log-infra-batch

![スクリーンショット 2019-06-29 12.03.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/be507ed6-29a7-a551-d4e8-fb00de2396c4.png)

#### Dockerfile
* 概要
 * 軽量のAlpine Linux に awscli をインストール
 * コンテナ内で test.txt を作成
 * aws s3 コマンドで test.txt を S3 バケットへアップロード

* Dockerfileの内容

```Dockerfile
FROM python:3.7-alpine
RUN pip3 install awscli
RUN echo "test" > /test.txt
CMD aws s3 cp test.txt s3://log-infra-batch-AWSアカウントID/terraform-plan/
```

#### Dockerfile をビルドしてDockerイメージをECRへプッシュ
* 参照
 * [動作確認用コンテナのDockerイメージを作成](https://qiita.com/tonishy/items/810950dec4f1ae0d761f#%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D%E7%94%A8%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AEdocker%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%9C%E6%88%90)
 * [AWS ECR 設定概要](https://qiita.com/tonishy/items/810950dec4f1ae0d761f#aws-ecr-%E8%A8%AD%E5%AE%9A%E6%A6%82%E8%A6%81)
 * [Dockerイメージを AWS ECR へ PUSH する](https://qiita.com/tonishy/items/810950dec4f1ae0d761f#docker%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92-aws-ecr-%E3%81%B8-push-%E3%81%99%E3%82%8B)

#### Fargate タスク定義 作成
* 参照
 * [AWS Fargate の設定とタスク実行](https://qiita.com/tonishy/items/810950dec4f1ae0d761f#aws-fargate-%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A8%E3%82%BF%E3%82%B9%E3%82%AF%E5%AE%9F%E8%A1%8C)

* タスクロールで 「s3-log-infra-batch」 を選択する
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/b32f4d28-23f7-82ce-5c69-35e75568f183.png)

#### Fargete でタスクを実行テスト
* タスク定義で上記で作成したタスク定義を選択、アクションで タスクの実行 を選択
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/df2830dd-d721-88d6-a845-bb3a8b6c8a3b.png)

* 起動タイプはFargateを選択、VPCは適当なものを選択して、タスクを実行する
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/b320a238-cb69-9a79-21d0-312bb744b399.png)

* タスク実行中
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/25e513d2-a1e4-6636-f8f7-6726d3488b5d.png)

* 実行結果は CloudWatch ログの /ecs/タスク定義 ログストリームに出力される
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/ba0c81ea-cf45-5d2a-c51b-5105aeda78e9.png)
↓
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/aa1862ba-eae8-996a-bab8-7b54713ac03c.png)

* S３にアップロードされたか確認
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/2740abdf-be12-3362-4a64-7c23ad0fcb09.png)