はじめに
- この記事は紆余曲折し、エラーを解消しながらゴールまで突き進む物語です
- 最短の手順だけを述べたものではありません
- 少しでも皆さんのデバッグのヒントになればと思っております
前提
- アプリケーションの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 互換アーティファクトをプッシュ、プル、管理することが可能です。
※公式ドキュメントより引用
ECRでリポジトリを作成
ECRのリポジトリ項目からリポジトリを作成
をクリックし、作成します
プッシュコマンドでイメージのpullを試みる
プッシュコマンドを順番に叩いていけば、問題ないと思ったので、早速チャレンジ
プッシュコマンドを表示
を選択し、1のコマンドを叩きます
4つのコマンドが表示され、順番に上から実行してくださいと指示があります
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情報を記述していないためでしょう
参考
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
再度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と出力されましたね
スイッチロール先のリソースを操作するので、適宜--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
最後に4つ目の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]
CLIでもECRにpushされたイメージを確認できます
aws ecr describe-images --profile sotaheavymetal21-PowerUser --repository-name app
最後に
お疲れ様でした!!
試行錯誤しながらの記事になっております
少しでも皆さんのお力添えになればと思っています🐰
参考