ECRを使ってみる

Amazon ECRを使ってみる。
環境はEC2（AmazonLinux2：t2.micro）。


##リポジトリ作成
マネジメントコンソール → サービス → ECS → レポジトリ で「レポジトリを作成」

レポジトリ名を入力
　名前空間を含めることができるとのことなので
　今回は sandbox/test-pj/web とする。

タグのイミュータビリティ
　有効にすると同じタグを上書きができなくなる。
　業務等でイメージのバージョンを確実に管理したい場合は
　有効にしたほうがよさそう。　

　# タグが上書きできてしまうとイメージの特定するには
　# ハッシュ値が必要になってしまう。

　一方、上書きできないとlatestのようなタグは
　使い勝手が著しく悪くなるのでどっちにするかは用途次第。


イメージスキャンの設定
　有効にするとプッシュ後も自動でイメージスキャンをしてくれる。
　

##AWS CLI のバージョンアップ
バージョンアップしておかないとdockerコマンドの認証まわりでエラーが出る可能性がある。
バージョンアップの仕方は[公式ドキュメント](
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-linux.html)の「Linux での AWS CLI バージョン 2 の更新」。


```sh:AWS_CLIのバージョンアップ
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

unzip awscliv2.zip

which aws

ls -l /usr/bin/aws  ←whichコマンドの結果次第で内容が変わる

sudo ./aws/install --bin-dir /usr/bin --install-dir /usr/bin --update　←whichコマンド、lsコマンドと結果次第で内容が変わる

aws --version
```

参考までに、バージョンアップしないでdockerコマンドでget-login-passwordをやったら以下のとおりエラーになった。

```sh:バージョンアップしないとエラーになる
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 056789090539.dkr.ecr.ap-northeast-1.amazonaws.com

usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help
aws: error: argument operation: Invalid choice, valid choices are:

batch-check-layer-availability           | batch-delete-image
batch-get-image                          | complete-layer-upload
create-repository                        | delete-lifecycle-policy
delete-repository                        | delete-repository-policy
describe-image-scan-findings             | describe-images
describe-repositories                    | get-authorization-token
get-download-url-for-layer               | get-lifecycle-policy
get-lifecycle-policy-preview             | get-repository-policy
initiate-layer-upload                    | list-images
list-tags-for-resource                   | put-image
put-image-scanning-configuration         | put-image-tag-mutability
put-lifecycle-policy                     | set-repository-policy
start-image-scan                         | start-lifecycle-policy-preview
tag-resource                             | untag-resource
upload-layer-part                        | get-login
help
Error: Cannot perform an interactive login from a non TTY device
```

##dockerインストール
[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/getting-started-cli.html)の「Docker のインストール」

##IAMロールを作成しEC2にアタッチ
[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/security_iam_id-based-policy-examples.html)の
「 Amazon ECR リポジトリへのアクセス」を参考に
Resourceは*でポリシーを作成しEC2にアタッチ。

```test:ECR用ポリシー
{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Sid":"ListImagesInRepository",
         "Effect":"Allow",
         "Action":[
            "ecr:ListImages"
         ],
         "Resource":"*"
      },
      {
         "Sid":"GetAuthorizationToken",
         "Effect":"Allow",
         "Action":[
            "ecr:GetAuthorizationToken"
         ],
         "Resource":"*"
      },
      {
         "Sid":"ManageRepositoryContents",
         "Effect":"Allow",
         "Action":[
                "ecr:GetAuthorizationToken",
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:GetRepositoryPolicy",
                "ecr:DescribeRepositories",
                "ecr:ListImages",
                "ecr:DescribeImages",
                "ecr:BatchGetImage",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload",
                "ecr:PutImage"
         ],
         "Resource":"*"
      }
   ]
}
```

あとはマネジメントコンソール → ECR → リポジトリから
対象リポジトリを選んで「プッシュコマンドの表示」をクリックし
表示される内容をやっていくだけ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651099/6fe8740e-bb9c-a58c-ee2f-5455e7966a01.png)


##デフォルトレジストリに対して認証する
```sh:認証
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin ************.dkr.ecr.ap-northeast-1.amazonaws.com

WARNING! Your password will be stored unencrypted in /home/ec2-user/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
```

##イメージ作成
```sh:イメージ作成
$ docker build -t sandbox/test-pj/web .

$ docker image ls
REPOSITORY                  TAG           IMAGE ID            CREATED             SIZE
sandbox/test-pj/web         latest        c2df0d42b9ce        10 seconds ago      221MB
$

```

##ECR登録用のタグ付け
```sh:ECR登録用のタグ付け
$ docker tag sandbox/test-pj/web:latest ************.dkr.ecr.ap-northeast-1.amazonaws.com/sandbox/test-pj/web:latest

$ docker image ls
REPOSITORY                                                              TAG                 IMAGE ID            CREATED              SIZE
************.dkr.ecr.ap-northeast-1.amazonaws.com/sandbox/test-pj/web   latest              c2df0d42b9ce        About a minute ago   221MB
sandbox/test-pj/web                                                     latest              c2df0d42b9ce        About a minute ago   221MB
```

##PUSH
```sh:PUSH
$ docker push ************.dkr.ecr.ap-northeast-1.amazonaws.com/sandbox/test-pj/web:latest

:latest
631e3af3d0e9: Pushed
fc8234f25c50: Pushed
933e707b3698: Pushed
895d16eabfa1: Pushed
latest: digest: sha256:d5d908a0a3e69a0c37af7b64dc21146333a358cc733b33837e279647d619c101 size: 1155
$
```