【AWS】ECS構築の基礎 −ECR編−

#はじめに
ECSクラスターの構築に慣れてきたので、今回はタスク(コンテナ)イメージをECRにプッシュして、そこからイメージを読み込むようにタスク定義を新しく作成してみることにしました。

https://qiita.com/suzuki0430/items/2745e9ca0ead8db982f9

https://qiita.com/suzuki0430/items/440daea590b22d1621c8

https://qiita.com/suzuki0430/items/6e4e7f513f982dadbf09

#ECRとは
AWS上でDockerコンテナイメージを管理するサービスです。
ECSに統合されているため、開発から本稼働までのワークフローを簡略化することができたりします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/a26b5561-df2e-8393-98de-cca10a67b1d6.png" width="700">

https://www.acrovision.jp/service/aws/?p=2761

#実装
今回はDockerHubから取得したコンテナイメージ`simplehttp`をECRにプッシュして、タスク定義を修正(イメージの読込先の修正)した後に新しくサービスをつくってみることにしました。

##リポジトリの作成
マネジメントコンソールとAWS CLIから、それぞれリポジトリを作成してみます。

###マネジメントコンソール
ECS画面の左側にあるリポジトリを押すと以下の画面になります。
![スクリーンショット 2021-07-06 20.06.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/bef3a0fa-62be-d9b1-08ec-77ea28b4273a.png)

"リポジトリを作成"を押すと以下の画面になるので、リポジトリ名を指定します。
![スクリーンショット 2021-07-06 20.08.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/348e6313-96ef-4dfb-6ee2-e05d5be91946.png)

以下のようにリポジトリが作成されます。
![スクリーンショット 2021-07-06 20.18.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/03db5666-b726-f50a-4874-643735f1e0e5.png)

###AWS CLI
aws-cliで作成する場合は以下のようなコマンドを打ちます。
`--image-scanning-configuration scanOnPush=true`の部分でイメージスキャンの設定を行っています。
イメージスキャンはコンテナイメージ内のソフトウェアの脆弱性を解析するものです。

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/image-scanning.html

```
$ aws ecr create-repository --repository-name ecr-simplehttp --region ap-northeast-1 --image-scanning-configuration scanOnPush=true
```

```
{
    "repository": {
        "repositoryArn": "arn:aws:ecr:ap-northeast-1:338233790232:repository/ecr-simplehttp",
        "registryId": "338233790232",
        "repositoryName": "ecr-simplehttp",
        "repositoryUri": "338233790232.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-simplehttp",
        "createdAt": "2021-07-06T20:12:56+09:00",
        "imageTagMutability": "MUTABLE",
        "imageScanningConfiguration": {
            "scanOnPush": true
        },
        "encryptionConfiguration": {
            "encryptionType": "AES256"
        }
    }
}
```
このようにリポジトリが作成されます。
![スクリーンショット 2021-07-06 20.14.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/50784c23-eb6d-3e9c-84aa-91798c207d32.png)

##ECRへのコンテナイメージのプッシュ
DockerHubからECRへプッシュしたいイメージをプルします。

```
$ docker pull gkoenig/simplehttp
```

```
Using default tag: latest
latest: Pulling from gkoenig/simplehttp
12dc4b9ba0e4: Pull complete
Digest: sha256:1f0c62b20a6718a42d5e6f06c6f4df37c0b52d0fc3e64b431889bb5d492b08ee
Status: Downloaded newer image for gkoenig/simplehttp:latest
docker.io/gkoenig/simplehttp:latest
```
以下のコマンドでプルしたイメージを確認することができます。

```
$ docker images
```

```
REPOSITORY                    TAG              IMAGE ID       CREATED         SIZE
gkoenig/simplehttp            latest           66cd53172aac   14 months ago   7.43MB
```

作成したリポジトリを選択して"プッシュコマンドを表示"を選択します。
![スクリーンショット 2021-07-06 20.35.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/04440395-ca41-318e-551a-1487688ecf4f.png)

これらのコマンドを順に実行します。
![スクリーンショット 2021-07-06 20.36.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/c37c5734-cafe-b470-ab16-173be8438bde.png)

まず、認証トークンを取得して、レジストリに対してDockerクライアントを認証します。

```
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 338233790232.dkr.ecr.ap-northeast-1.amazonaws.com
```

```
Login Succeeded
```

すでにイメージをpullしているので、ステップ2(イメージビルド)はスキップしてイメージへのタグ付けを行います。

```
$ docker tag gkoenig/simplehttp 338233790232.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-simplehttp:latest
```

`docker images`を実行すると、タグ付けができていることを確認することができます。

```
REPOSITORY                    TAG              IMAGE ID       CREATED         SIZE
338233790232.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-simplehttp   latest           66cd53172aac   14 months ago   7.43MB
```

最後に、リポジトリへイメージをプッシュします。

```
$ docker push 338233790232.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-simplehttp:latest
```

```
The push refers to repository [338233790232.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-simplehttp]
22cfb2031743: Pushed
latest: digest: sha256:1f0c62b20a6718a42d5e6f06c6f4df37c0b52d0fc3e64b431889bb5d492b08ee size: 528
```

成功していればプッシュされたイメージが以下のように表示されます。
![スクリーンショット 2021-07-06 21.04.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/98b34ea4-9933-ac2c-3b14-24df4f1eeea7.png)

ECRにプッシュしたイメージからコンテナを起動させるように、タスク定義を修正します。

タスク定義名をチェックして、"新しいリビジョンの作成"を選択します。
![スクリーンショット 2021-07-06 21.08.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/c4bea049-c344-f30f-2900-d38372c0a79c.png)

イメージにタグ名を記述して更新します。
![スクリーンショット 2021-07-06 21.10.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/200c1c3a-59a2-2d8e-be60-8a1b576ca454.png)

`td-simplehttp-ec2-2`というリビジョンが新しく作成されます。
![スクリーンショット 2021-07-06 21.11.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/3304c56d-89e8-98c9-7f9a-53230dbeeead.png)

最新リビジョンのタスク定義を指定したサービスを新しく作成して、タスクが実行されるかどうか確かめます。
![スクリーンショット 2021-07-06 21.13.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/f2c76704-d92a-0ca1-71f5-9c865a196954.png)
![スクリーンショット 2021-07-06 21.14.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/f3ddb152-76c6-fea5-eddd-42ecdc6ec9a9.png)
![スクリーンショット 2021-07-06 21.15.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/d0863a73-c758-063e-22d8-53473176e9ed.png)

ELBのDNS名をコピーしてアクセスすると、ページが表示され、タスクが実行されていることを確認できます。
![スクリーンショット 2021-07-06 21.19.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/602333c0-6df8-9d5a-2ebb-210de2850b41.png)

#参考資料

https://www.udemy.com/share/103fe82@PkdKZFlYTFYJcEBSOGJNfT1t/