【AWS ECR】Dockerイメージの保存と取得

##目標
AWS ECRを利用したDockerコンテナレジストリ上にDokcerイメージの保存及び取得を実施する。

##はじめに
以下Youtube動画（by くろかわこうへい氏）に沿ってハンズオンを実施した結果をアウトプットとして記載致しました。
AWS ECRに関する基本事項は以下のリンクより学習することが出来ます。

[今から追いつくDocker講座！AWS ECSとFargateで目指せコンテナマスター！〜シリーズ3回目〜](https://www.youtube.com/watch?v=7Lggi7bykYs&list=PLtpYHR4V8Mg-jbuk4yoXhXwJtreodnvzg&index=3)

##前提
・Dockerデーモンが起動しているEC2インスタンス（Amazon Linux2）が構築済みであること（※）。

※以下記事の手順1「Dockerデーモン起動」までを完了すれば前提は整います。
[【Docker】dockerfileを利用してEC2にApacheコンテナを構築（Dockerデーモン起動）](https://qiita.com/OPySPGcLYpJE0Tc/items/b2eb91d144fb481a2f08#1docker%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3%E8%B5%B7%E5%8B%95)

##作業の流れ
| 項番 | タイトル |
|:----:|:-------------|
| 1 | [ECRの構築](#1ecrの構築) |
| 2 | [ECRアクセス用IAMロールアタッチ](#2ecrアクセス用iamロールアタッチ)|
| 3 | [ECRにDockerイメージを保存する](#3ecrにdockerイメージを保存する)|
| 4 | [ECRからDockerイメージを取得する](#4ecrからdockerイメージを取得する)|


##手順
###1.ECRの構築
[ECRコンソール](https://ap-northeast-1.console.aws.amazon.com/ecr/get-started?region=ap-northeast-1)からレポジトリ作成を開始します。![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/a869c83c-fca6-7ff7-0c51-2b57efc5b419.png)

レポジトリ名を入力し（本記事では`testrepo`としました）、下段にあるレポジトリ作成実行ボタンをクリック
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/91cafc85-b032-c16f-8842-c2a89ff04186.png)
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/83751ea0-18f5-1fa4-eac4-afbcd6acc613.png)

レポジトリが正常に構築されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/20eb061b-eeee-19bc-13d6-957c7cb7c158.png)

###2.ECRアクセス用IAMロールアタッチ
EC2からECRへアクセスするための権限を付与するため、IAMロールの作成、及び対象EC2インスタンスへのアタッチを実施します。

[IAMロールコンソール](https://console.aws.amazon.com/iam/home?region=ap-northeast-1#/roles)からロールの作成をクリック
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/f824c429-0d94-108c-246d-6cfc7086a926.png)

今回はIAMロールをEC2にアタッチするため、EC2を信頼されたエンティティとして設定します。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/90a77c43-161c-5291-a93e-b8502433b969.png)

ECRへのフルアクセス権を付与するIAMポリシー`AmazonEC2ContainerRegistryFullAccess`をIAMロールに埋め込みます。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/788656e0-f642-b873-42d6-d9f80b5288a6.png)

IAMロール名を記載（本記事では`ecr-access`と設定）しロールの作成を実行します。

![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/6b8395de-3141-939c-ab5a-226aae2f0e16.png)

作成したIAMロールを対象のEC2インスタンスへアタッチします。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/8b4956d6-459d-09f1-d329-4355c67a1087.png)

![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/93c4116f-b42c-f50d-dd0d-dcade267e8da.png)

###3.ECRにDockerイメージを保存する
対象のEC2インスタンスへOSログイン（ルートユーザ前提として記載します）し、`dockerfile`の記載を行います。

サンプルとして、httpdをインストールし、コンテナ起動時にhttpdを自動起動するDockerイメージを作成するような処理を記述します。

```:dockerfile
FROM centos:centos7

RUN yum -y install httpd

CMD ["/usr/sbin/httpd","-DFOREGROUND"]
```

次にECRコンソールに戻り、作成したECRレポジトリを選択し`プッシュコマンドの表示`をクリックします。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/b15f2590-c54c-b6a9-386b-506c2b69d901.png)

すると対象のECRレポジトリにプッシュを行うために一連のコマンドが表示されます。
これらを順に実行していく流れとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/030ed7d7-120a-5dbf-0fba-a64e25bed7e9.png)

まずは上記プッシュコマンド群の1番目をコピーして実行します。
内容はECRレポジトリへのログインパスワードを取得し、そのパスワードを標準入力として`docker login`を実行するという内容です。

Login Succeededと表示されればOKです。（IAMロールの設定等が誤っているとcredential系のエラーが表示されます）

```
[root@ip-172-31-35-94 ~]# aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 932699493995.dkr.ecr.ap-northeast-1.amazonaws.com
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
```

2番目のコマンドは通常の`docker build`コマンドです。

```
docker build -t testrepo .
```

3番目のコマンドでECRレポジトリプッシュに必要なタグ付けを`docker tag`で実施します。

```
[root@ip-172-31-35-94 ~]# docker tag testrepo:latest 932699493995.dkr.ecr.ap-northeast-1.amazonaws.com/testrepo:latest
[root@ip-172-31-35-94 ~]# docker images
REPOSITORY                                                   TAG                 IMAGE ID            CREATED             SIZE
932699493995.dkr.ecr.ap-northeast-1.amazonaws.com/testrepo   latest              306adf672fc7        10 minutes ago      330MB
testrepo                                                     latest              306adf672fc7        10 minutes ago      330MB
centos                                                       centos7             8652b9f0cb4c        2 months ago        204MB
```

4番目のコマンドで実際に`docker push`を実行します。

```
[root@ip-172-31-35-94 ~]# docker push 932699493995.dkr.ecr.ap-northeast-1.amazonaws.com/testrepo:latest
The push refers to repository [932699493995.dkr.ecr.ap-northeast-1.amazonaws.com/testrepo]
9cdaef33df63: Pushed
174f56854903: Pushed
latest: digest: sha256:33f3b20422ea489ca61be9a5b4334b0a68572989b4143bca3cb6d55825c2c07c size: 741
```

`aws ecr describe-images --repository-name リポジトリ名 --region ap-northeast-1`を実行し、プッシュしたイメージが確認出来ればOKです。

```
[root@ip-172-31-35-94 ~]# aws ecr describe-images --repository-name testrepo --region ap-northeast-1
{
    "imageDetails": [
        {
            "artifactMediaType": "application/vnd.docker.container.image.v1+json",
            "imageSizeInBytes": 135861914,
            "imageDigest": "sha256:33f3b20422ea489ca61be9a5b4334b0a68572989b4143bca3cb6d55825c2c07c",
            "imageManifestMediaType": "application/vnd.docker.distribution.manifest.v2+json",
            "imageTags": [
                "latest"
            ],
            "registryId": "932699493995",
            "repositoryName": "testrepo",
            "imagePushedAt": 1610607670.0
        }
    ]
}
```

###4.ECRからDockerイメージを取得する
ECRコンソールから、ECR内に保存されているDockerイメージのURLをコピーします。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/df7d2cc3-3d59-4ca1-f3f3-93a2c439cefe.png)

コピーしたURLを`docker pull`コマンドの引数として実行します。

```
[root@ip-172-31-35-94 ~]# docker pull 932699493995.dkr.ecr.ap-northeast-1.amazonaws.com/testrepo:latest
latest: Pulling from testrepo
Digest: sha256:33f3b20422ea489ca61be9a5b4334b0a68572989b4143bca3cb6d55825c2c07c
Status: Downloaded newer image for 932699493995.dkr.ecr.ap-northeast-1.amazonaws.com/testrepo:latest
932699493995.dkr.ecr.ap-northeast-1.amazonaws.com/testrepo:latest
```