AWS Fargate, ECSを用いたコンテナ運用設計、構築をしてみた。~ECRへのビルド~

# 前記事
[AWS Fargate, ECSを用いたコンテナ運用設計、構築をしてみた。~ネットワーク編~](https://qiita.com/bakuchiku/items/b9b723e33d18d0164fed "AWS Fargate, ECSを用いたコンテナ運用設計、構築をしてみた。~ネットワーク編~")
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/c2b896a5-5067-96db-0bc5-1130b37f66eb.png)

# 今回やること
管理用Cloud9とECRの作成、ECRへのコンテナイメージのビルドまで行います！！
ECRへのInterface Endopointを作成するタイミングでCloud Watchも作成しましょう！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/c5150881-1b85-0485-2728-ab912aca6725.png)

# Cloud9の作成
「Cloud9」→「Create Environment」から作成していきます。
サブネットには前回作成したCloud9用Public subnetを設定し、それ以外は各々必要なスペックを選択します。
今回は最小スペックで作成しています。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/034349b6-7b9b-919d-e73f-928a2aedd0c3.png)

## Cloud9のセキュリティグループ変更
Cloud9を作成すると、デフォルトでセキュリティグループが作成されます。
「EC2」→「インスタンス」から、Cloud9作成時に作成されたEC2インスタンスのセキュリティグループを前回作成したセキュリティグループに付け替えます。
（Cloud9作成時にデフォルトで作成されるセキュリティグループを使用しても良いですが、セキュリティグループの命名規則等を考えると、先にセキュリティグループを作成し付け替える流れが綺麗だと思いました。）
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/8e0ee6ab-fafe-affd-b59e-4fcb3a68b027.png)

## Cloud9への接続
「Cloud9」から作成したCloud9を選択するとターミナル画面が表示されます。
作成したコンテナイメージをCloud9にgit cloneしておきます。
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/ff0abfee-29f1-924c-9c4b-933db3de2802.png)

# ECRの作成
「ECR」→「リポジトリ」から作成していきます。
リポジトリはプライベートに設定し、リポジトリ名はfrontとbackendを作成します。
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/4fa1e029-6ce9-d94f-e153-b0abefb1e0e1.png)


上記画像と同様にfrontも作成します。
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/203fd118-e0e3-dda0-e1eb-91b831bd6876.png)

## ECRへ接続するためのEndpoint作成
Interface Endpointを作成します。
ECRはリージョンサービスなのでインターネットからのアウトバウンド通信か、Endpointからの内部通信が必要になります。
ECRへの接続には以下2つのEndpoint作成が必要です。
* ECR APIを呼び出すためのEndpoint（com.amazonaws.{region}.ecr.api）
* Dockerコマンドを呼び出すためのEndpoint（com.amazonaws.{region}.ecr.dkr）

サブネットには前回作成したPrivate subnetを選択します。
また、セキュリティグループは前回Endpoint用に作成したものを選択します。
下図はECR API用になります。同様にDockerコマンド用のEndpointも作成します。
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/71e2482e-126e-b469-562f-19705c77cd3c.png)

## Cloud9→ECR接続許可用のIAMロールの作成
AWSではOSに認証情報を埋め込むような設定は良くないとされています。
その代わりIAMロールを付与して接続許可を行います。
「IAM」→「ロール」からIAMロールを作成します。
以下ロールを作成します。参考（[Amazon Elastic Container Registry のアイデンティティベースのポリシーの例](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/security_iam_id-based-policy-examples.html "ユーザーが自分のアクセス許可を表示できるようにする")）
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListImagesInRepository",
            "Effect": "Allow",
            "Action": [
                "ecr:ListImages"
            ],
            "Resource": "arn:aws:ecr:ap-northeast-1:{アカウントID}:repository/*"
        },
        {
            "Sid": "GetAuthorizationToken",
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken"
            ],
            "Resource": "*"
        },
        {
            "Sid": "ManageRepositoryContents",
            "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:{アカウントID}:repository/*"
        }
    ]
}
```

作成したIAMロールをCloud9のEC2にアタッチします。
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/e9c6aadc-8f41-25e4-f429-fe3ff5d1fd7d.png)

# Cloud9からECRへコンテナアプリの登録をする
AWSではECR内のコンテナイメージをAWSアカウントごとに識別しています。
そのため、image idとして決められた形で登録する必要があります。
```
docker tag {元の名前}:latest {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/{リポジトリ名}:latest
```

次はDockerへの認証を行います。
```
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com
```

最後にECRへプッシュします。
```
docker push {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/{リポジトリ名}:latest
```

これらのコマンドは「ECR」→「リポジトリ」から対象のリポジトリを選択すると確認できます。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/a4ba86a9-b96d-9aa6-759a-8a46c81efc49.png)

## 登録した結果の確認
「ECR」→「リポジトリ」から登録したリポジトリを確認します。
![16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/ab6faf8a-7426-3e6c-28c2-355a8bda5054.png)
frontも同様の手順でECRへプッシュしたら完了です。

# Cloud Watchへ接続するためのEndpoint作成
ECRへのInterfase Endopoint作成したタイミングでCloud Watch用のも作成しておきます。
ECRと同様の手順で作成します。サービス名は「logs」絞りこむと「com.amazonaws.{region}.logs」が出てきます。
サブネット、セキュリティグループはECRと同様です。
![18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/d97f7afb-5c35-85bb-4ee2-c7e7378b8efd.png)


# まとめ
ECRへのコンテナイメージの登録環境作成が完了しました！！
また、ログ管理の準備も完了です！！

次回が大変なやつですね。Fargate+ECS上でコンテナイメージを実行するための構築をします。
がんばります。笑笑