はじめに
当方、スクールでAWS EC2を利用してちょっとデプロイをした程度の初学者です。
自力でDocker環境デプロイしようと、ECRの序盤で盛大に躓きましたので、どなたかの参考になればと、解決までを記事にいたします。
前提
・AWSサービス IAMユーザーを作成し、アクセスキー、シークレットアクセスキーをダウンロードしている
・AWS Elastic Container Registry (ECR)でリポジトリを作成している
・IAMユーザーのポリシー、またはグループポリシー、またはECR側ポリシーでアクセス許可をしている
・macOS AWS CLI バージョン 2 のインストール を完了している
ターミナルでAWSを操作できるCLI : コマンドラインインターフェイスの略です
当方は、macOS グラフィカルインターフェイスを使用したインストールで導入しました
0.AWS CLIバージョン2をインストールする
こちらのページからインストールできます。
macOS での AWS CLI バージョン 2 のインストール
macOSでのインストールをクリックし、macOSグラフィカルインターフェイスを使用したインストールをクリックします。
ダウンロードファイルを開くとこんな感じです。すべて、続ける、で完了します。
すべてのユーザーようにインストールを選択します。
以下のコマンドで、インストールできたか確認します。
which aws
aws --version
1.AWS CLIバージョン2を設定する
公式ドキュメントでは、この設定で認証できるとのことです。
aws configure 実行
すると、以下を1行ずつ入力を求めてきます。
IAMのアクセスキー、シークレットアクセスキー、リージョン、フォーマットを入力します。
% aws configure
AWS Access Key ID []: アクセスキー (をコピペ
)
AWS Secret Access Key []: シークレットアクセスキー (をコピペ
)
Default region name []: ap-northeast-1
(東京リージョンになります)
Default output format []: json (と書きます)
2.認証コマンド aws ecr get-login-password --region ap-northeast-1実行
AWS Elastic Container Registry (ECR)のリポジトリページを見ます。
Dockerイメージをプッシュするリポジトリを作成しておきます。
リポジトリ名をクリックして、プッシュコマンドの表示ボタンをクリックします。
こんな感じです。
認証トークンを取得し、レジストリに対して Docker クライアントを認証します。をやりたい訳です。
当方は、この左側のAWS認証でハマったのです。
aws ecr get-login-password --region ap-northeast-1
予定では、こんな風にパスワードが返ってくる予定でしたが、そうはいきませんでした。
3.An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation:
aws ecr get-login-password --region ap-northeast-1 実行
An error occurred (UnrecognizedClientException) when calling the GetAuthorizationToken operation: The security token included in the request is invalid.
GetAuthorizationTokenオペレーションを呼び出すときにエラーが発生しました(UnrecognizedClientException):リクエストに含まれているセキュリティトークンが無効です。
MENTAサービスで単発の相談をしたり、あれこれ試行錯誤しましたが、どうしても解決できませんでした。
最終手段のAWS有料プランに切り替えて、サポートセンターに問い合わせしました。
すると、以下の確認と共有を求められました。
・aws configure の入力間違いがないかチェック
・aws --version コマンド結果
・aws ecr get-login-password --region ap-northeast-1 --debug コマンド結果
いう通り、確認してAWSサポートに送付共有しました。
すると、以下のことがわかったそうです。
・aws ecr get-login-password コマンドのみに発生している問題ではない
・AWS API のヘッダの作成に失敗している
・アクセスキーが不正である場合に同様のエラーが発生する
(...正直、なるほど!と理解できませんでした、3つ目はそんな気がしていました)
さらに、
・環境変数 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY を使用するのではなく
aws configure コマンドを使用した上で、AWS CLI を実行しているにもかかわらず、
使用されていたクレデンシャルは以下のログより環境変数の方を確認しました。
> 2020-04-29 12:41:10,571 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: env
> 2020-04-29 12:41:10,571 - MainThread - botocore.credentials - INFO - Found credentials in environment variables.
訳
aws configure コマンドで設定したのに、ログを見ると、何故か、違う環境変数を認識してるようですよ
本当に心当たりはないですか?
4.あなた、環境変数が間違ってませんか?
お客様のシェルの環境におきまして
既に環境変数 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY がセットされているため、
優先順位の関係で aws configure で設定された ~/.aws/credentials のクレデンシャルが使用されず
環境変数のクレデンシャルが使用されている状況なのではないかと推測いたしております。
とのことでした。やはり...(汗) 穴があったら隠れたい
しかも。どなたかの記事で見たことあったこれ。
5.シェルの環境変数を確認する
env コマンド、または、export -pコマンドで環境変数を確認します。
env 実行
こんな感じです。
指摘されたとおり、AWSアクセスキーの環境変数がありました(汗)
正直、記憶から消え去っており、わからなくなっていました。
スクールのカリキュラムで右も左もわからず作った時のものだと思われます。
export -p
6.シェルの環境変数を削除する場合
unset コマンドで指定した環境変数を削除できます。
unset “環境変数”
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
削除できたか確認します。
export -p
削除できたのでAWS認証コマンドを実行します。
aws ecr get-login-password --region ap-northeast-1
すると当初と同じエラーになります。
シェルで環境変数をきちんと設定する必要がありそうです。
An error occurred (UnrecognizedClientException) when calling the GetAuthorizationToken operation: The security token included in the request is invalid.
GetAuthorizationTokenオペレーションを呼び出すときにエラーが発生しました(UnrecognizedClientException):リクエストに含まれているセキュリティトークンが無効です。
7.シェルのAWS環境変数を上書きする
exportコマンドを実行して上書きします。
アクセスキーおよびシークレットキーは、ダブルクォーテーションで囲みます。
export AWS_ACCESS_KEY_ID="[アクセスキー]"
export AWS_SECRET_ACCESS_KEY="[シークレットキー]"
export AWS_DEFAULT_REGION=ap-northeast-1
export AWS_ACCESS_KEY_ID="AKIA2********OVJ7G"
export AWS_SECRET_ACCESS_KEY="Uo2aU0E5TdAZ********GuyDakZpAP"
export AWS_DEFAULT_REGION=ap-northeast-1
envコマンド、または、export -p コマンドで設定できたか確認します。
export -p
8.AWS認証コマンドの実行
aws ecr get-login-password --region ap-northeast-1
9.参考にさせていただいた記事
10.ターミナルを開き直すと削除したはずの環境変数が再度設定されてしまう場合
こちらの記事が参考になるかと思います。
Macでの環境変数(environment variables)の設定方法
11.最後に
経験者の方であれば感覚的に対応できてしまうレベルであろうと思われますが、経験値や理解度が足りずに行き詰まってしまいました。
きっと、似た状況の方もいるのかなと思いますので記事にしました。
MENTAで相談に乗ってくださった方、AWSサポートのHさん、本当にありがとうございました!
また一つ、勉強になりました!