Amazon ECRのDockerイメージをローカルにpull、pushする

## はじめに
Amazon ECR（Elastic Container Registry）のDockerイメージを取得するには事前にECRレジストリに対してDockerクライアントを認証させる必要があります。
本記事はDockerクライアントのレジストリ認証の手順についてまとめたものとなります。

> Amazon ECR では、ユーザーがレジストリに対して認証したり、AWS ECRレポジトリとの間でイメージをプッシュまたはプルしたりできるためには、事前に IAM ポリシーを通じて `ecr:GetAuthorizationToken API` へのアクセス権限を許可されている必要があります。
[イメージのプル - Amazon ECR](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/docker-pull-ecr-image.html)

### 使用環境とバージョン
- macOS Catalina
- aws-cli/2.0.28
- Docker version 19.03.13

## 記事の対象
- ある程度AWSとDockerの知識がある方
- ECSもしくはEKSを利用してアプリケーションを作成している方

## 事前準備
- AWS CLIを利用できること
- IAMユーザもしくはスイッチロール先に`ecr:GetAuthorizationToken`権限が付与されていること ※1

※1 最低限の権限で良ければ`AmazonEC2ContainerRegistryReadOnly`ポリシーをアタッチしておけば大丈夫です。
[Amazon ECR 管理ポリシー - Amazon ECR](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/ecr_managed_policies.html)

## 手順
AWS CLIでECRのログインパスワードを取得し、取得したログインパスワード使って`docker login`コマンドでログインします。

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

ログイン後は通常の`docker pull`でローカルにDockerイメージを取得できます。

```
$ docker pull {aws_account_id}.dkr.ecr.{region}.amazonaws.com/demo-api:latest
```

`docker pull`の対象URIはECRコンソールから確認できます。
![スクリーンショット 2020-11-05 12.10.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/756249/89b5e393-c593-1fa2-b2f1-8fc80b9f7e29.png)

## [補足] Dockerイメージを Amazon ECR リポジトリにpushするには
Dockerイメージをpushする場合にもpullと同様に事前にECRレジストリに対してDockerクライアントを認証させる必要があります。
事前に本記事の手順に従って事前に認証を行ってください。

### Amazon ECRリポジトリの作成
puah先となるECRリポジトリを事前に作成する必要があります。
AWSコンソールもしくは以下のAWC CLIにてECRリポジトリを作成します。

```
$ aws ecr create-repository
    --repository-name {aws_account_id}.dkr.ecr.{region}.amazonaws.com/demo-api
```

[create-repository — AWS CLI 1.18.197 Command Reference](https://docs.aws.amazon.com/cli/latest/reference/ecr/create-repository.html)

### dockerイメージ準備
pushしたいdockerイメージを確認します。

```
$ docker images

REPOSITORY                                                   TAG                 IMAGE ID            CREATED             SIZE
demo-api                                                     latest              9ec9f9c8cabf        5 months ago        402MB
...
```
次にdockerイメージをECRにpushするためにタグ付けします。

```
$ docker tag 9ec9f9c8cabf {aws_account_id}.dkr.ecr.{region}.amazonaws.com/demo-api

REPOSITORY                                                   TAG                 IMAGE ID            CREATED             SIZE
demo-api                                                     latest              9ec9f9c8cabf        5 months ago        402MB
+ {aws_account_id}.dkr.ecr.{region}.amazonaws.com/demo-api   latest              5acde687200b        5 months ago        402MB
...
```

これで準備が整ったのでdocker push コマンドを使用してイメージをpushできます。

```
docker push {aws_account_id}.dkr.ecr.{region}.amazonaws.com/demo-api
```

## 参考記事
- [イメージのプル - Amazon ECR](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/docker-pull-ecr-image.html)
- [イメージのプッシュ - Amazon ECR](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/docker-push-ecr-image.html)
- [Amazon ECR レジストリ - Amazon ECR](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/Registries.html#registry_auth)