LoginSignup
0
0

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

Last updated at Posted at 2024-05-16

はじめに

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

前提

  • アプリケーションの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のリポジトリ項目からリポジトリを作成をクリックし、作成します

image.png

プッシュコマンドでイメージのpullを試みる

プッシュコマンドを順番に叩いていけば、問題ないと思ったので、早速チャレンジ
プッシュコマンドを表示を選択し、1のコマンドを叩きます

4つのコマンドが表示され、順番に上から実行してくださいと指示があります

Elastic_Container_Registry_-_Images.png

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]

Elastic_Container_Registry___ap-northeast-1.png

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

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

最後に

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

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0