問題の発生docker pushを実行してイメージをクラウドに送信しようとした際、即座に失敗し、昨日までは問題なく動いていたのに「no basic auth credentials」というストレスの溜まるエラーが表示されることがあります。これは通常、ローカルのDocker環境とAWS間の認証が切れていることが原因です。
$ docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app:latest
The push refers to repository [123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app]
Error response from daemon: no basic auth credentials
原因根本的な原因は単純で、Dockerクライアントの認証が切れていることです。多くの場合、セッショントークンの有効期限が切れたことを意味します。
AWS ECRの認証トークンは短命です。デフォルトでは12時間ごとに期限切れになります。これはセキュリティ機能であり、万が一認証情報が漏洩しても無期限にアクセスされるのを防ぐためのものです。Docker Hubのようにログインが数週間持続するのとは異なり、ECRでは頻繁にプッシュを行う場合、少なくとも1日2回は「パスワード」を更新する必要があります。
ステップバイステップの解決策### 1. AWSの識別情報を確認するまず、ターミナルで自分がどのユーザーとして認識されているかを確認します。AWSが想定とは異なる認証情報を使用しようとしている可能性があります。次のコマンドを実行して、現在アクティブなプロファイルを確認してください。
aws sts get-caller-identity
エラーが返される場合は、AWS CLIが設定されていません。先に進む前に aws configure を実行して、アクセスキーとシークレットキーを設定してください。
2. トークンの更新 (AWS CLI v2)最近の環境の多くはAWS CLI バージョン2を使用しています。get-login-password コマンドを使用して新しいトークンを取得し、Dockerに直接パイプするのが最もスマートなログイン方法です。
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
クイックチェックリスト:
us-east-1を実際のリージョン(ap-northeast-1など)に置き換えます。123456789012をご自身の12桁のAWSアカウントIDに置き換えます。- ユーザー名は
AWSのままにします。これは静的な文字列であり、IAMユーザー名ではありません。
3. AWS CLI v1 (レガシー) の場合の解決策古いビルドサーバーなどでCLI v1を保守している場合、コマンドは少し異なります。サブシェルを使用して実行する必要がある完全なコマンド文字列が生成されます。
$(aws ecr get-login --no-include-email --region us-east-1)
4. 複数のプロファイルの管理仕事用と個人用のAWSアカウントを使い分けていますか?間違ったアカウントで認証されている可能性があります。フラグを追加して、特定のプロファイルを使用するようにCLIに強制します。
aws ecr get-login-password --region us-east-1 --profile work-profile | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com

