LoginSignup
2
2

More than 3 years have passed since last update.

⑦AWS CLI バージョン2 認証"セキュリティトークンが無効エラー”の解決 (2020.4時点)

Last updated at Posted at 2020-04-29

はじめに

当方、スクールで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 のインストール
image.png

macOSでのインストールをクリックし、macOSグラフィカルインターフェイスを使用したインストールをクリックします。

ダウンロードファイルを開くとこんな感じです。すべて、続ける、で完了します。
image.png
image.png
image.png
すべてのユーザーようにインストールを選択します。
image.png
image.png
以下のコマンドで、インストールできたか確認します。

ターミナル
which aws
aws --version

こんな感じです。
インストールができました。 
image.png

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   (と書きます)

こんな感じです
image.png

2.認証コマンド aws ecr get-login-password --region ap-northeast-1実行

AWS Elastic Container Registry (ECR)のリポジトリページを見ます。
Dockerイメージをプッシュするリポジトリを作成しておきます。
image.png
リポジトリ名をクリックして、プッシュコマンドの表示ボタンをクリックします。
こんな感じです。
image.png
認証トークンを取得し、レジストリに対して Docker クライアントを認証します。をやりたい訳です。

当方は、この左側のAWS認証でハマったのです。

ターミナル
aws ecr get-login-password --region ap-northeast-1

image.png

予定では、こんな風にパスワードが返ってくる予定でしたが、そうはいきませんでした。

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サポートさんから
・環境変数 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サポートさんから
お客様のシェルの環境におきまして
既に環境変数 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY がセットされているため、
優先順位の関係で aws configure で設定された ~/.aws/credentials のクレデンシャルが使用されず
環境変数のクレデンシャルが使用されている状況なのではないかと推測いたしております。

とのことでした。やはり...(汗) 穴があったら隠れたい
しかも。どなたかの記事で見たことあったこれ。

5.シェルの環境変数を確認する

env コマンド、または、export -pコマンドで環境変数を確認します。

ターミナル
 env 実行

こんな感じです。
指摘されたとおり、AWSアクセスキーの環境変数がありました(汗)
正直、記憶から消え去っており、わからなくなっていました。
スクールのカリキュラムで右も左もわからず作った時のものだと思われます。
image.png

ターミナル
export -p

こんな感じです。同じ環境変数が見つかります。
image.png

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 

こんな感じで確認できます。
image.png

8.AWS認証コマンドの実行

ターミナル
aws ecr get-login-password --region ap-northeast-1   

無事、パスワードの返り値が表示されました。
image.png

9.参考にさせていただいた記事

【Linux】環境変数の確認・設定・削除・永続化について

10.ターミナルを開き直すと削除したはずの環境変数が再度設定されてしまう場合

こちらの記事が参考になるかと思います。
Macでの環境変数(environment variables)の設定方法

11.最後に

経験者の方であれば感覚的に対応できてしまうレベルであろうと思われますが、経験値や理解度が足りずに行き詰まってしまいました。
きっと、似た状況の方もいるのかなと思いますので記事にしました。
MENTAで相談に乗ってくださった方、AWSサポートのHさん、本当にありがとうございました!
また一つ、勉強になりました!

2
2
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
2
2