【AWS】ローカルで作成したDockerファイルをAWS ECRにプッシュする時のエラーの原因

#インフラ
writtdden by ザキヤマ

こんにちはザキヤマです。
最近は暑くなってきて梅雨入りも発表されましたね。
今回はAWSの案件でAWS ECR(以下ECR)にローカルからDockerファイルをプッシュする時に苦労した点を紹介できればと思います。

クリアしている前提条件

  • ECRにリポジトリを作成していること
  • ローカル環境にDockerファイルが作成されていること
  • プロキシ等セキュリティ設定に引っかかっていないこと

原因-その1

EC2のIAMロールに必要な権限が与えられていない

ECRにプッシュした際に以下のエラーが出た場合は、EC2のIAMロールにECRの権限が足りていない状態となります。
CannotPullContainerError: API error
「ecr:GetAuthorizationToken」

解決方法
EC2のIAMロールのポリシーに以下どちらかのポリシーをアタッチします。
「AmazonElasticContainerRegistryPublicFullAccess」
「AmazonElasticContainerRegistryPublicPowerUser」

以下AWS公式で詳細に説明されています。
AWS Amazon Elastic Container Registry の マネージドポリシー

原因-その2

レジストリ認証ができていない

ECRにプッシュした際に以下のエラーが出た場合は、ECRのレジストリ認証ができていない可能性があります。
「permission denied while trying to connect to the Docker daemon」

解決方法
ECRからプッシュしたいリポジトリを押下して右上の「プッシュコマンドを表示」を押下して、「1.Retrieve an authentication token and authenticate~」のコマンドを実行します。(基本的にはコピペでOK)

以下AWS公式で詳細に説明されています。
Docker イメージを Amazon ECR プライベートリポジトリにプッシュする

原因-その3

レジストリ認証のトークンの有効期限が切れている

以下エラーが出た場合は原因-その2で認証したトークンの有効期限が切れている可能性があります。有効期限は12時間です。
自分は別の日にプッシュしようとして引っかかりました。
「denied: Your authorization token has expired. Reauthenticate and try again.」

解決方法
SSH接続しているEC2から一度「exit」や「ctrl+D」などでログアウトして原因その2のレジストリ認証をもう一度実施してみてください。

以下AWS公式で詳細に説明されています。
レポジトリへのプッシュの際の HTTP 403 エラー、または “基本的な認証情報がありません” エラー

原因-その4

「aws configure」が設定できていない

上記の原因1~3まで全て実行できていて、プッシュのステータスの最後で以下エラーが出る場合は「aws configure」が設定できていない可能性があります。
「no basic auth credentials」

解決方法
コマンド「aws configure」を実行してもろもろ設定してください。
もし既に設定済みの場合でも再度実施してみてください。
それでもうまく行かない場合はIAMユーザからアクセスキーをもう1つ作って実施しても良いかもしれません。(自分はもう一つ作ってプッシュできました)

AWS Access Key ID:公開鍵のID
AWS Secret Access Key ID:秘密鍵のID
Default region name:認証したいリージョン(東京ならap-northeast-1)
Default output format:jsonやYAMLなど

最後に

以上が自分が案件でECRにプッシュする時につまずいた点です。
コンテナの理解から始めたのでかなり大変でしたが一連の流れを理解することで、より理解が深まると思います。

Favorite