Amazon Elastic Container Registry (ECR) 新規作成手順

# Amazon Elastic Container Registry (ECR)とは
Amazon ECRは、コンテナイメージをクラウド上に保管できるサービスです。
詳細については、公式ページのDescription部分で説明されています。
>Amazon Elastic Container Registry (ECR) は、完全マネージド型の Docker コンテナレジストリです。このレジストリを使うと、デベロッパーは Docker コンテナイメージを簡単に保存、管理、デプロイできます。
https://aws.amazon.com/jp/ecr/

本記事ではECRにリポジトリを作成するところから、コンテナイメージをプッシュするまでを紹介します。
※AWSアカウントは作成済み。PCはMacを想定しています。

# ECRリポジトリ作成手順

https://ap-northeast-1.console.aws.amazon.com/ecr/get-started?region=ap-northeast-1
Amazon ECRのページから[使用方法]ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738154/3ace5582-d80a-f2f1-0808-6121c0008fee.png)


###リポジトリを作成
- 可視性設定:プライベート
- リポジトリ名:任意
- タグのイミュータビリティ:無効

タグのイミュータブルを有効にした場合、同じタグでの上書きを禁止します。
同じタグを別のイメージにつけてpushできないため、latest運用ができなくなります。

無効にした場合は、タグによるイメージの追跡が出来なくなるためSHAを使用して探す必要が出てきます。
https://aws.amazon.com/jp/about-aws/whats-new/2019/07/amazon-ecr-now-supports-immutable-image-tags/
![スクリーンショット 2021-07-26 14.58.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738154/5c995d0c-c380-2ac3-2003-ae3a1767708a.png)


- イメージスキャンの設定:無効
- KMS暗号化:無効

プッシュ時にスキャンを有効にした場合は、プッシュした際に自動でリポジトリ内のイメージに対して脆弱性スキャンをかけてくれます。
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/image-scanning.html

また、KMS暗号化を有効にすると、デフォルトの暗号化の代わりにKMS(Key Management Service)のカスタマーマスターキーを用いて暗号化するようになります。

![ecr3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738154/a4a3bcfe-5f20-99c4-b34f-7cf8ab5e0251.png)

[リポジトリを作成] ボタンをクリックし、 正常に作成されましたというメッセージ が表示されるとリポジトリの作成は完了です。

## ECRにイメージをプッシュ

### 準備
AWS CLI と Dockerが必要なので、あらかじめインストールを行います。
既にインストール済みの方はスキップしてください。

#### AWS CLIのインストール
以下のコマンドを実行し、最新版のAWS CLIをインストールします。

```
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /
```
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-mac.html

AWS CLIのインストールが完了したら、aws configコマンドで認証情報の設定を行います。

#### IAM ユーザーを設定済みの場合
以下の手順からアクセスキーとシークレットアクセスキーを生成した後、aws configを実行し情報を入力します。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-creds

#### IAM ユーザーを未設定の場合
管理者用のIAMを作成します。
IAM画面に遷移し、[ユーザー]→[ユーザーの追加]をクリックします。
https://console.aws.amazon.com/iam/home#/users
![スクリーンショット 2021-01-19 8.08.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738154/7b8f54ef-8262-3dda-8399-ab7be4103a59.png)
ユーザー名を入力し、アクセスの種類から[プログラムによるアクセス]を選択し、[次のステップ]をクリックします。
![スクリーンショット 2021-01-19 8.56.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738154/661e8d1f-154d-4288-e6f4-f3ca76506cc0.png)

アクセス許可の設定で、既存のポリシーを直接アタッチをから、 AdministratorAccess を選択し次へ進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738154/789d1146-30ca-5e11-1716-1591c3405dd6.png)
タグの追加 (オプション)は特に行わず、次のステップに進みます。
確認画面で[ユーザーの作成]をクリックします。

ユーザーの作成が完了すると、アクセスIDとシークレットアクセスキーが表示されます。
後の手順で利用するのでひかえておきます。
![スクリーンショット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738154/ed9111e1-e6b2-ce76-b161-c697580b592e.png)

aws configコマンドを実行し、以下の通り情報を入力します。

AWS Access Key ID [None]:先程作成したアクセスID
AWS Secret Access Key [None]:先程作成したシークレットアクセスキー
Default region name :ap-northeast-1 (東京リージョン)
Default output format :json

``` sh
$ aws configure
AWS Access Key ID [None]: ***
AWS Secret Access Key [None]: ***
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

#### Dockerのインストール
dockerコマンドを実行する必要があるため、最新のDockerをインストールします。
公式から [get Docker] をクリックしダウンロードし、インストールしてください。
https://hub.docker.com/editions/community/docker-ce-desktop-mac

インストールが完了したら起動し、メニューバーにDockerアイコンが現れることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738154/90eb913e-38fa-bef0-68c8-a3d0154836dd.png)


### コンテナイメージの格納
準備が完了したら、リポジトリにイメージを格納してみます。
メッセージ横の[プッシュコマンドの表示]をクリックします。
![ecr4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738154/f7afb158-5ffd-735b-ba2e-a349eb9fafc1.png)

メッセージを閉じてしまった場合は、リポジトリ画面からでも遷移出来ます。
![ecr5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738154/d4b52253-2984-a765-94d3-bfe0c177cd2a.png)

先程作成したリポジトリにプッシュするための手順が表示されます。
![ecr6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738154/c7c403ce-cae9-c408-753b-63402215d2b2.png)


#### コマンド実行

##### 1.認証
```sh
$ aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin <ドメイン名>
```

ダイアログ1番目のコマンドをコピペして実行します。
認証コマンドに成功すると、Login Succeededと表示されます。

```
Error response from daemon: dial unix docker.raw.sock: connect: connection refused 
```
上記のメッセージが表示された場合は、Dockerを起動していない可能性が高いので、Dockerが起動しているか確認してください。

```
Unable to locate credentials. You can configure credentials by running "aws configure".
Error: Cannot perform an interactive login from a non TTY device
```
上記のメッセージが表示された場合は、認証情報の設定が未完了ですのでaws configureを実行し認証設定を済ませてください。

##### 2.ビルド
dockerイメージのあるディレクトリに移動して、2番めのコマンドを実行します。

``` sh
$ docker build -t test .
```

もしも、dockerイメージの用意が無い場合は、試しにdockerのdoodle(いたずら書き)をcloneしてからビルドしてみましょう。

``` sh
$ git clone https://github.com/docker/doodle.git
$ cd doodle/cheers2019
$ docker build -t test .
```

##### 3.イメージにタグづけ
3番目のコマンドをコピペして実行します。

``` sh
docker tag test:latest <aws_account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/test:latest
```

一定時間時間が経つと認証が切れてコマンドに失敗することがあります。
以下のメッセージが表示されたら、`1.認証`に戻ってコマンドを再実行してください。

```
no basic auth credentials
```

##### 4.dockerイメージのpush
4番目のコマンドをコピペして実行します。

```sh
docker push <aws_account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/test:latest
```

以上で、コンテナイメージのpushは完了です。

### イメージの確認
コンテナイメージが正常に格納されたことを確認します。

ECRの画面からリポジトリを選択すると、プッシュしたイメージタグが表示されると思います。
`プッシュされた日時`が最新になっていればOKです。
https://ap-northeast-1.console.aws.amazon.com/ecr/repositories?region=ap-northeast-1#
![スクリーンショット 2021-01-19 16.36.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738154/e36e285d-3065-4ad7-6cfb-4e13900daa0b.png)