AWS ECS Fargate を使ってS3にファイルをアップロードする


# コード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/c33ea68f-124c-53b5-e33d-7f450f5a97ae.png)



```upload_s3.py
import boto3
import sys

credentials = sys.argv
up_file = "test_upload.txt"
bucket = "test-bucket-upload-s3"
object_name = "test_upload.txt"

session = boto3.Session(aws_access_key_id=credentials[1],
                        aws_secret_access_key=credentials[2],
                        aws_session_token=credentials[3])
s3_client = session.client('s3')
s3_client.upload_file(up_file, bucket, object_name)
```

```execute.sh
apt update
apt-get install jq -y

AWS_CONTAINER_CREDENTIAL=`curl -s http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`
export AWS_ACCESS_KEY_ID=`echo "$AWS_CONTAINER_CREDENTIAL" | jq .AccessKeyId -r`
export AWS_SECRET_ACCESS_KEY=`echo "$AWS_CONTAINER_CREDENTIAL" | jq .SecretAccessKey -r`
export AWS_SESSION_TOKEN=`echo "$AWS_CONTAINER_CREDENTIAL" | jq .Token -r`

cd /mnt

python3 upload_s3.py $AWS_ACCESS_KEY_ID $AWS_SECRET_ACCESS_KEY $AWS_SESSION_TOKEN
```



```Dockerfile
FROM python:latest

RUN pip3 install boto3

ADD . /mnt

CMD ["sh", "/mnt/execute.sh"]
```

# コード説明

- upload_s3.py

公式ドキュメントをコピペすればいける。

https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-uploading-files.html

> 
The AWS SDK for Python provides a pair of methods to upload a file to an S3 bucket.
The upload_file method accepts a file name, a bucket name, and an object name. The method handles large files by splitting them into smaller chunks and uploading each chunk in parallel.

- execute.sh

公式ドキュメントのコマンドをほぼコピペすればいける。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-iam-roles.html

>
コンテナ内から、以下のコマンドを使用して認証情報をクエリできます。

```
curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
```

>出力:

```
{
    "AccessKeyId": "ACCESS_KEY_ID",
    "Expiration": "EXPIRATION_DATE",
    "RoleArn": "TASK_ROLE_ARN",
    "SecretAccessKey": "SECRET_ACCESS_KEY",
    "Token": "SECURITY_TOKEN_STRING"
}
```

上のjson出力から　`AccessKeyId` , `SecretAccessKey` , `Token` を取得する。

- Dockerfile

特になし

# ECR プッシュ

EC2インスタンスにIAMロールを割り当ててECRにログインする。

IAMロールを割り当てよう。
起動中でもアタッチできるが時間がかかるので一旦インスタンスを停止する。（インスタンス起動設定のときにアタッチするのが無難）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/6e429047-0769-8ff7-644b-b46becb375bf.png)


お試しなのでECRFullAccessをつける。
抵抗があれば許可するアクションの詳細は公式ドキュメントにあるので見てほしい。
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/security_iam_service-with-iam.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/69eaa6a0-91bc-73c2-feaa-4af2fc458d78.png)


ログインコマンドは覚える必要はない。以下の「プッシュコマンドの表示」を押せばよい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/8c10e9cb-2233-4d23-2e58-3bc695b0029a.png)

コマンドの横のコピーボタンを押して張り付ける作業を繰り返す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/2b84957f-413e-4f6f-38f9-177ffe75a4fc.png)



# S3アクセス許可設定

「編集する」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/091f67ec-644a-a0ae-5715-e7deb4deb4ce.png)

「パブリックアクセスをすべてブロック」のチェックを外す

<strong> これで自分のバケットが世界公開となる。</strong>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/f7e4f096-4686-e4ec-a32e-0d27ef89b409.png)

# ECS Fargate

タスク定義のとき、ロールの指定が必要

<strong>タスクロール</strong>のほうにs3にファイルをアップロードできるポリシーをアタッチしたロールを設定する。
なお、<strong>タスク実行ロール</strong>は自動で作成されるので気にしなくてよい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/5dd8e6b3-b563-c36d-fd03-a819b4685588.png)

後は実行！！

# 参考記事
boto3ライブラリ コード例
https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-uploading-files.html

AWS ECR IAM ロール
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-iam-roles.html