[AWS] スイッチロール先のECRにローカルで作成したイメージをpushしよう（試行錯誤編）！！

# はじめに
:::note info
- この記事は紆余曲折し、エラーを解消しながらゴールまで突き進む物語です
- 最短の手順だけを述べたものではありません
- 少しでも皆さんのデバッグのヒントになればと思っております
:::


    
# 前提
- アプリケーションのdockerfileを作成済み
- IAMユーザー作成済み
- スイッチロール先の環境で操作を行います



# ECR（Elastic Container Registry）とは
Amazon Elastic Container Registry (Amazon ECR) は、セキュリティ、スケーラビリティ、信頼性を備えた AWS マネージドコンテナイメージレジストリサービスです。
Amazon ECR は、AWS IAM を使用するリソースベースの許可を持つプライベートリポジトリをサポートします。
これは、指定されたユーザーまたは Amazon EC2 インスタンスがコンテナリポジトリとイメージにアクセスできるようにするためです。
任意の CLI を使用して、Docker イメージ、Open Container Initiative (OCI) イメージ、および OCI 互換アーティファクトをプッシュ、プル、管理することが可能です。
※公式ドキュメントより引用

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/what-is-ecr.html


# ECRでリポジトリを作成
ECRのリポジトリ項目から`リポジトリを作成`をクリックし、作成します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/9b0ff290-9a42-b868-6061-4858e5c24d9a.png)

# プッシュコマンドでイメージのpullを試みる
プッシュコマンドを順番に叩いていけば、問題ないと思ったので、早速チャレンジ
`プッシュコマンドを表示`を選択し、１のコマンドを叩きます
> ４つのコマンドが表示され、順番に上から実行してくださいと指示があります

![Elastic_Container_Registry_-_Images.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/1669e318-1847-8e98-61eb-bcf1701cf01e.png)

:::note alert
1のコマンドを叩くと、認証エラーが発生
:::

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

An error occurred (UnrecognizedClientException) when calling the GetAuthorizationToken operation: The security token included in the request is invalid.
Error: Cannot perform an interactive login from a non TTY device
```
これはaws/configにaccess_key, secret_access_key情報を記述していないためでしょう

#### 参考
https://qiita.com/kaito_program/items/7b9ba489e44d2295cf6f


aws/credentialsに`assume_role profile`を設定しましょう
また、configure listのプロファイルをdefaultからスイッチロール元のIAMユーザーのプロファイル（当記事でいう[sotaheavymetal21]）に変更しました
```
❯ cat ~/.aws/credentials
[default]
aws_access_key_id = aaaa
aws_secret_access_key = bbbb
[sotaheavymetal21] ⇦ 新しく追加
aws_access_key_id = AAAA
aws_secret_access_key = BBBB

```

:::note alert
再度1のコマンドを実行後、別のエラーが発生
:::


```
An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:iam::000000000000:user/sotaheavymetal21 is not authorized to perform: ecr:GetAuthorizationToken on resource: * because no identity-based policy allows the ecr:GetAuthorizationToken action:
```

原因はaws/configにプロファイルを追加していないからですね

```
❯ cat ~/.aws/config
[default]
region = ap-northeast-1
output = json
[profile sotaheavymetal21]
role_arn = arn:aws:iam::111111111111:role/sotaheavymetal21-PowerUser
source_profile = sotaheavymetal21
# スイッチロール元のIAMユーザーのMFA識別子
mfa_serial = arn:aws:iam::000000000000:mfa/GooglePixel
region = ap-northeast-1
output = json
```


# aws stsコマンドでスイッチロール先にアクセスできるかチェック！
よし、これで問題ないでしょう！
以下のコマンドを実行します
このコマンドは現在の認証されたユーザーやロールの情報を取得するためのものです
ユーザー情報が表示されれば、問題ありません

```
aws sts get-caller-identity --profile sotaheavymetal21-PowerUser
```
# よし、やっとプッシュコマンドを利用できそうだ！


1のコマンドではレジストリの認証を行います

ECRのレジストリはDockerイメージを一元管理するためのリポジトリサービスの事を指します
Docker クライアントはリポジトリを管理しているECRのレジストリから認証を得る必要があります
その際の認証トークンは12時間有効となります

こちらを--profileオプション付きで実行しました
無事,Login Succeededと出力されましたね

:::note warn
スイッチロール先のリソースを操作するので、適宜--profileオプションを必要とします
:::


```
❯ aws ecr get-login-password --profile sotaheavymetal21-PowerUser --region ap-northeast-1 | docker login --username AWS --password-stdin 111111111111.dkr.ecr.ap-northeast-1.amazonaws.com
Login Succeeded
```
続いて、2つ目のコマンドを実行します
ローカルでイメージをビルドします
```
docker build -t app .
```
3つ目のdocker tagコマンドはtagの変更が必要であれば実行してください
```
❯ docker images
REPOSITORY             TAG       IMAGE ID       CREATED         SIZE
app   latest    ad582cdaaaaa   3 minutes ago   1.2GB
```




# ビルドしたイメージをECRにpush
最後に４つ目のpushコマンドを実行すると、ECRにローカルで作成したイメージがpushされます

```
❯ docker push 111111111111.dkr.ecr.ap-northeast-1.amazonaws.com/app:latest
The push refers to repository [111111111111.dkr.ecr.ap-northeast-1.amazonaws.com/app]
```
![Elastic_Container_Registry___ap-northeast-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515002/a713a083-e88b-4729-e7e7-863dde0e79df.png)

CLIでもECRにpushされたイメージを確認できます

```
aws ecr describe-images --profile sotaheavymetal21-PowerUser --repository-name app
```

# 最後に
お疲れ様でした！！
試行錯誤しながらの記事になっております
少しでも皆さんのお力添えになればと思っています🐰


# 参考
https://dev.classmethod.jp/articles/beginner-series-to-check-how-t-create-docker-image-and-push-to-amazon-ecr/