ECSでコンテナ実行メモ その１


## 概要

AWSコンテナ設計・構築[本格]入門をもとに自分でコンテナを動かそうとしてみた手順をまとめていこうかと思います。
動かす対象は以前[こちら](https://qiita.com/dmikita/items/fe262eb2f231fb73ca17)でcloud9上で動かしたコンテナをもとにしています。
タイトルの通りこれで完結ではないので続報ができたらこちらの概要も更新していきます。

## ECRの作成
* まずECRにリポジトリを作成します。以下のようにプライベートリポジトリで作成します。
![InkedECR_1_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/5b7dd402-c657-c043-5cf0-51b1fe159bf2.jpeg)
![ECR_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/5b1aed82-402b-4c03-a082-afb29f4c4900.png)

* 作成したリポジトリを確認します。
![InkedECR_3_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/d45360b7-4c55-6294-28d3-5fbb8dd16465.jpeg)



## ロールの作成
* インスタンスに付与するロールをCloudShellで作成します。jsonファイルでポリシーを作成します内容は以下のものです。${AWS_ACCOUNT}の部分は各自のアカウントに変更してください。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ECRRepositoryList",
            "Effect": "Allow",
            "Action": [
                "ecr:ListImages"
            ],
            "Resource": [
              "arn:aws:ecr:ap-northeast-1:${AWS_ACCOUNT}.dkr.ecr.ap-northeast-1.amazonaws.com/docker-advent"
            ]
        },
        {
            "Sid": "GetAuthorizationToken",
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken"
            ],
            "Resource": "*"
        },
        {
            "Sid": "ECRRepositoryManage",
            "Effect": "Allow",
            "Action": [
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:GetRepositoryPolicy",
                "ecr:DescribeRepositories",
                "ecr:ListImages",
                "ecr:DescribeImages",
                "ecr:BatchGetImage",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload",
                "ecr:PutImage"
            ],
            "Resource": [
              "arn:aws:ecr:ap-northeast-1:${AWS_ACCOUNT}.dkr.ecr.ap-northeast-1.amazonaws.com/docker-advent"
            ]
        }
    ]
}
```
* 以下のコマンドでファイル名や後程使う変数を指定します。

```shell
FILE_IAM_POLICY_DOC='policy.json'
IAM_ROLE_NAME='dockerAdventRoll'
IAM_ROLE_PATH='/docker-advent/'
IAM_ROLE_ARN='arn:aws:iam::${AWS_ACCOUNT}:policy/dockerAdventPplicy'
IAM_INSTANCE_PROFILE_NAME='dockerAdventRoll'
IAM_INSTANCE_PROFILE_PATH='/docker-advent/'
```

* jsonファイルを作成します。

``` shell
cat << EOF > ${FILE_IAM_POLICY_DOC}
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ECRRepositoryList",
            "Effect": "Allow",
            "Action": [
                "ecr:ListImages"
            ],
            "Resource": [
              "arn:aws:ecr:ap-northeast-1:${AWS_ACCOUNT}:repository/docker-advent"
            ]
        },
        {
            "Sid": "GetAuthorizationToken",
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken"
            ],
            "Resource": "*"
        },
        {
            "Sid": "ECRRepositoryManage",
            "Effect": "Allow",
            "Action": [
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:GetRepositoryPolicy",
                "ecr:DescribeRepositories",
                "ecr:ListImages",
                "ecr:DescribeImages",
                "ecr:BatchGetImage",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload",
                "ecr:PutImage"
            ],
            "Resource": [
              "arn:aws:ecr:ap-northeast-1:${AWS_ACCOUNT}:repository/docker-advent"
            ]
        }
    ]
}
EOF
```
* ファイルの内容を確認します。

```shell
cat ${FILE_IAM_POLICY_DOC}
```

* jsonファイルとしての妥当性を確認

```shell
cat ${FILE_IAM_POLICY_DOC} \
  |  python3 -m json.tool \
  > /dev/null
```
* ポリシーの作成

```shell
aws iam create-policy --policy-name dockerAdventPplicy --policy-document file://${FILE_IAM_POLICY_DOC}
```

* ロールを作成します。

```shell

aws iam create-role \
  --role-name ${IAM_ROLE_NAME} \
  --path "${IAM_ROLE_PATH}" \
  --assume-role-policy-document \
'{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}'
```
* 作成したロールにポリシーをアタッチしインスタンスポロファイルも作成します。

```shell
aws iam attach-role-policy \
  --role-name ${IAM_ROLE_NAME} \
  --policy-arn ${IAM_ROLE_ARN}

aws iam create-instance-profile \
  --instance-profile-name ${IAM_INSTANCE_PROFILE_NAME} \
  --path "${IAM_INSTANCE_PROFILE_PATH}"

aws iam add-role-to-instance-profile --instance-profile-name ${IAM_INSTANCE_PROFILE_NAME} --role-name ${IAM_ROLE_NAME}
```
* cloud9のインスタンスのロールをつけなおします。
![ロール変更_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/20d0a709-1478-1fd2-4fa5-d72798b374f9.png)
![ロール変更_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/4295eecd-f70d-537a-9357-52da79722b89.png)



## ECRへのpush
* [こちら](https://qiita.com/dmikita/items/fe262eb2f231fb73ca17)の手順でcloud9上で動かしているimageをpushします。(このままではECSでうまく動かなかったので、コンテナ自体ビルドしなおすかもしれません。)

* 以下のコマンドでタグをつけます。${imageID}の部分は `docker images`で確認したimageのIDを指定してください。

```shell
docker tag ${imageID} mongamaenioh/radvent:v1
```

* ECRにpushするためにtagを修正します。

```shell
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)

docker image tag mongamaenioh/radvent:v1 ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/docker-advent:v1
```

* ECRへログインをします。

```shell
aws ecr --region ap-northeast-1 get-login-password | docker login --username AWS --password-stdin https://${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/docker-advent
```
成功すると以下のようになります。
![ECR_push_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/a3ebca13-844a-ee36-6483-8ca0b1835411.png)


* imageをpushします。

```shell
docker image push ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/docker-advent:v1
```
成功するとECR上以下のように見られます。
![ECR_push_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/9e8acb61-b825-7fe8-1fe1-344f50bb3414.png)


* 最後にimageをpullして確認を行います。

```shell
docker image pull  ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/docker-advent:v1
```


## 最後に
とりあえずはECRへのpushまでの手順となります。
ECSに登録したところすぐにコンテナが終了してしまうためコンテナのbuildをやり直す必要があるかもしれません・・・