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

#はじめに
当方、スクールでAWS EC2を利用してちょっとデプロイをした程度の初学者です。
自力でDocker環境デプロイしようと、ECRの序盤で盛大に躓きましたので、どなたかの参考になればと、解決までを記事にいたします。
#前提 
**・AWSサービス IAMユーザーを作成し、アクセスキー、シークレットアクセスキーをダウンロードしている**
**・AWS  Elastic Container Registry (ECR)でリポジトリを作成している**
**・IAMユーザーのポリシー、またはグループポリシー、またはECR側ポリシーでアクセス許可をしている**
**・macOS AWS CLI バージョン 2 のインストール を完了している**
　ターミナルでAWSを操作できるCLI : コマンドラインインターフェイスの略です
　当方は、[macOS グラフィカルインターフェイスを使用したインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-mac.html#cliv2-mac-install-gui)で導入しました


#0.AWS CLIバージョン2をインストールする
こちらのページからインストールできます。
[macOS での AWS CLI バージョン 2 のインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-mac.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/bf576401-da10-97d6-0652-42e4c35d35c6.png)

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

ダウンロードファイルを開くとこんな感じです。すべて、続ける、で完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/3c2e077a-fded-2cfb-0dc8-0029ad33e0f7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/4c69e239-208c-c8e3-5399-afbc0346c364.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/8fe11a73-4bf5-49ec-6363-b70834b3d3ff.png)
すべてのユーザーようにインストールを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/9333bf01-988a-ac1e-a7d4-dc75e77d93f2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/0b3af3e7-283e-d33f-ad4a-c87e3b2e1da0.png)
以下のコマンドで、インストールできたか確認します。

```ruby:ターミナル 
which aws
aws --version
```
こんな感じです。
インストールができました。　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/1470c7ab-7d3e-ea8f-a673-2d5fcc31e10b.png)






#1.AWS CLIバージョン2を設定する 
公式ドキュメントでは、この設定で認証できるとのことです。

```ruby:ターミナル
aws configure  実行
```
すると、以下を１行ずつ入力を求めてきます。
IAMのアクセスキー、シークレットアクセスキー、リージョン、フォーマットを入力します。

```ruby:ターミナル
% aws configure
AWS Access Key ID []:  アクセスキー (をコピペ )
AWS Secret Access Key []:  シークレットアクセスキー (をコピペ )
Default region name []:  ap-northeast-1    (東京リージョンになります)
Default output format []:  json   (と書きます)
```

こんな感じです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/7ba078d7-cebe-6375-2998-56a7b42bd1e2.png)

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

AWS  Elastic Container Registry (ECR)のリポジトリページを見ます。
Dockerイメージをプッシュするリポジトリを作成しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/fe64dec7-bc18-6369-4b86-68c69618ad02.png)
リポジトリ名をクリックして、プッシュコマンドの表示ボタンをクリックします。
こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/e22355c9-6778-4434-56f8-b9877e3ed166.png)
認証トークンを取得し、レジストリに対して Docker クライアントを認証します。をやりたい訳です。

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

```ruby:ターミナル
aws ecr get-login-password --region ap-northeast-1
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/e59a85c5-f5e4-ce5c-74be-46771f5d5f7a.png)

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


#3.An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation:

```ruby:ターミナル
aws ecr get-login-password --region ap-northeast-1   実行
```

```ruby:エラー
An error occurred (UnrecognizedClientException) when calling the GetAuthorizationToken operation: The security token included in the request is invalid.

GetAuthorizationTokenオペレーションを呼び出すときにエラーが発生しました（UnrecognizedClientException）：リクエストに含まれているセキュリティトークンが無効です。
```

MENTAサービスで単発の相談をしたり、あれこれ試行錯誤しましたが、どうしても解決できませんでした。
最終手段のAWS有料プランに切り替えて、サポートセンターに問い合わせしました。
すると、以下の確認と共有を求められました。

```ruby:確認・共有すること
・aws configure の入力間違いがないかチェック
・aws --version　コマンド結果
・aws ecr get-login-password --region ap-northeast-1 --debug　コマンド結果
```
いう通り、確認してAWSサポートに送付共有しました。

すると、以下のことがわかったそうです。

```ruby:
・aws ecr get-login-password コマンドのみに発生している問題ではない
・AWS API のヘッダの作成に失敗している
・アクセスキーが不正である場合に同様のエラーが発生する
```
（...正直、なるほど！と理解できませんでした、３つ目はそんな気がしていました）
さらに、

```ruby: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.あなた、環境変数が間違ってませんか？

```ruby:AWSサポートさんから
お客様のシェルの環境におきまして
既に環境変数 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY がセットされているため、
優先順位の関係で aws configure で設定された ~/.aws/credentials のクレデンシャルが使用されず
環境変数のクレデンシャルが使用されている状況なのではないかと推測いたしております。
```
とのことでした。やはり...(汗) 穴があったら隠れたい
しかも。どなたかの記事で見たことあったこれ。

#5.シェルの環境変数を確認する
 env コマンド、または、export -pコマンドで環境変数を確認します。


```ruby:ターミナル
 env 実行
```
こんな感じです。
指摘されたとおり、AWSアクセスキーの環境変数がありました(汗)
正直、記憶から消え去っており、わからなくなっていました。
スクールのカリキュラムで右も左もわからず作った時のものだと思われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/60bc1f35-24d0-07a8-1d70-51187884457f.png)


```ruby:ターミナル
export -p
```
こんな感じです。同じ環境変数が見つかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/1b07a812-5eb2-9a48-772d-d7f3c20c935c.png)

#6.シェルの環境変数を削除する場合
unset コマンドで指定した環境変数を削除できます。

```ruby:ターミナル
unset  “環境変数”
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
```

削除できたか確認します。

```ruby:ターミナル
export -p  
```

削除できたのでAWS認証コマンドを実行します。

```ruby:ターミナル
aws ecr get-login-password --region ap-northeast-1 
```
すると当初と同じエラーになります。
シェルで環境変数をきちんと設定する必要がありそうです。

```ruby:エラー
An error occurred (UnrecognizedClientException) when calling the GetAuthorizationToken operation: The security token included in the request is invalid.

GetAuthorizationTokenオペレーションを呼び出すときにエラーが発生しました（UnrecognizedClientException）：リクエストに含まれているセキュリティトークンが無効です。
```

#7.シェルのAWS環境変数を上書きする 
exportコマンドを実行して上書きします。
アクセスキーおよびシークレットキーは、ダブルクォーテーションで囲みます。

```ruby:ターミナル
export AWS_ACCESS_KEY_ID="[アクセスキー]"
export AWS_SECRET_ACCESS_KEY="[シークレットキー]"
export AWS_DEFAULT_REGION=ap-northeast-1
```


```ruby:実際の記述
export AWS_ACCESS_KEY_ID="AKIA2＊＊＊＊＊＊＊＊OVJ7G"
export AWS_SECRET_ACCESS_KEY="Uo2aU0E5TdAZ＊＊＊＊＊＊＊＊GuyDakZpAP"
export AWS_DEFAULT_REGION=ap-northeast-1
```

envコマンド、または、export -p コマンドで設定できたか確認します。

```ruby:ターミナル
export -p 
```
こんな感じで確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/b61e4da1-b906-acc6-b451-2eb44d1c8e40.png)

#8.AWS認証コマンドの実行
 
```ruby:ターミナル
aws ecr get-login-password --region ap-northeast-1   
```
無事、パスワードの返り値が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/6d0781bc-5923-2152-baa4-c53b20687231.png)

#9.参考にさせていただいた記事 
[【Linux】環境変数の確認・設定・削除・永続化について](https://ac-as.net/linux-environment-variable/)

#10.ターミナルを開き直すと削除したはずの環境変数が再度設定されてしまう場合
こちらの記事が参考になるかと思います。
[Macでの環境変数（environment variables）の設定方法](https://qiita.com/hoisjp/items/19374252db8e748c3407)
#11.最後に 
経験者の方であれば感覚的に対応できてしまうレベルであろうと思われますが、経験値や理解度が足りずに行き詰まってしまいました。
きっと、似た状況の方もいるのかなと思いますので記事にしました。
MENTAで相談に乗ってくださった方、AWSサポートのHさん、本当にありがとうございました！
また一つ、勉強になりました！