【AWS】AWS認証情報の設定方法/保管場所/優先順位を理解する。

# まえがき
なんとなくで使ってきたAWS認証情報設定周りについてちゃんと理解する。

# AWS CLIインストール
[ここ](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html)からインストールする。
```
% aws --version
aws-cli/2.0.50 Python/3.7.4 Darwin/20.6.0 exe/x86_64
```

# まずは aws configure で認証情報を設定してみる
とりあえず適当な値を入れてみよう。
```
% aws configure
AWS Access Key ID [None]: AccessKeyId
AWS Secret Access Key [None]: SecretAccesskey
Default region name [None]: Tokyo    
Default output format [None]: json
```
上記コマンドを実行すると、下記2ファイルが生成される。
|ファイル  |内容  |
|---|---|
|CLI認証情報ファイル<br>~/.aws/credentials  |[default]<br>aws_access_key_id = AccessKeyId<br>aws_secret_access_key = SecretAccesskey  |
|CLI設定ファイル<br>~/.aws/config  |[default]<br>region = Tokyo<br>output = json |

各項目の説明
|項目名  |説明  |
|---|---|
|aws_access_key_id |IAMユーザー作成時に生成される"アクセスキーID"を設定する |
|aws_secret_access_key |IAMユーザー作成時に生成される"シークレットアクセスキー"を設定する |
|region |リクエストを送信するサーバーの AWS リージョン |
|output |出力形式 |

※IAMユーザー作成時に「アクセスキー・プログラムによるアクセス」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/55eece3b-5310-8649-31b4-7481b69f962b.png)

# 設定方法
設定方法1: `aws configure`コマンド
設定方法2: 環境変数
設定方法3: CLI認証情報ファイル(~/.aws/credentials)CLI設定ファイル(~/.aws/config)を直接編集
## 設定方法1: aws configure コマンド
Defaultプロファイルを登録/編集する場合
```
// 初めてDefaultプロファイルを登録
% aws configure
AWS Access Key ID [None]: AccessKeyId
AWS Secret Access Key [None]: SecretAccesskey
Default region name [None]: Tokyo
Default output format [None]: json

// 登録済のDefaultプロファイルを編集する
% aws configure
AWS Access Key ID [****************eyId]: UPDATE
AWS Secret Access Key [****************skey]: UPDATE
Default region name [Tokyo]: UPDATE
Default output format [json]: UPDATE
```
新しくプロファイルを追加する場合
```

```

特定の項目だけ更新したい場合
```
aws configure set [aws_access_key_id | aws_secret_access_key | region | output] {更新する値}
```
特定の項目だけ取得したい場合
```
aws configure get [aws_access_key_id | aws_secret_access_key | region | output]
```

## 設定方法2: 環境変数

Linux/Mac
```
export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
export AWS_DEFAULT_REGION=us-west-2
```
Windows
```
setx AWS_ACCESS_KEY_ID AKIAIOSFODNN7EXAMPLE
setx AWS_SECRET_ACCESS_KEY wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
setx AWS_DEFAULT_REGION us-west-2
```

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-envvars.html

## 設定方法3: CLI認証情報ファイル(~/.aws/credentials)CLI設定ファイル(~/.aws/config)を直接編集
`aws configure`コマンドで設定する方が楽だが、テキストエディタで直接編集してもOK。
# 保管場所
保管場所1: 環境変数
保管場所2: CLI認証情報ファイル(~/.aws/credentials) CLI設定ファイル(~/.aws/config)
## 保管場所1: 環境変数
・AWS_ACCESS_KEY_ID
・AWS_SECRET_ACCESS_KEY
・AWS_DEFAULT_REGION
・AWS_DEFAULT_OUTPUT
## 保管場所2: CLI認証情報ファイル(~/.aws/credentials) CLI設定ファイル(~/.aws/config)
|ファイル  |設定されるもの  |
|---|---|
|CLI認証情報ファイル<br>~/.aws/credentials  |aws configure で指定された**機密性の高い**認証情報<br>・aws_access_key_id<br>・aws_secret_access_key  |
|CLI設定ファイル<br>~/.aws/config  |aws configure で指定された**機密性の低い**認証情報<br>・region<br>・output  |

# 優先順位
環境変数とファイルの両方設定されている場合、**環境変数**が優先される。
AWS CLIはバージョン1とバージョン2(最新)が存在し、今回はバージョン2(最新)における優先順位についてまとめる。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-precedence

|優先順位|設定方法|内容|
|---|---|---|
|1 |コマンドラインオプション |他の場所の設定を上書きする。<br>コマンドラインで、--region、--output、および --profile をパラメータとして指定できる。 |
|2 |環境変数 |- |
|3 |CLI認証情報ファイル |~/.aws/crendentials |
|4 |CLI設定ファイル |~/.aws/config |


# プロファイルで複数の認証情報を切り替える
複数の認証情報を管理したい場合、`プロファイル`を利用する。

アプリケーションに対して「DEV/TEST/STG/PROD」の4環境あるとして、
環境ごとのIAMユーザーとそれに紐づく認証情報を下記のように用意したとしよう。
|IAMユーザー |認証情報(アクセスキーID)  |認証情報(シークレットアクセスキー)|
|---|---|---|
|hoge_dev_user |dev_access |dev_secret |
|hoge_test_user |test_access |test_secret |
|hoge_stg_user |stg_access |stg_secret |
|hoge_prod_user |prod_access |prod_secret |

この時、`~./aws/credentials`にプロファイル(環境)ごとに認証情報を定義する。
```
[default] // デフォルト(DEV環境)
aws_access_key_id=dev_access
aws_secret_access_key=dev_secret

[test]  // TEST環境
aws_access_key_id=test_access
aws_secret_access_key=test_secret

[stg] // STG環境
aws_access_key_id=stg_access
aws_secret_access_key=stg_secret

[prod] // PROD環境
aws_access_key_id=prod_access
aws_secret_access_key=prod_secret
```

この設定がなされている状態で、awsコマンドを下記のように実行することで`どの環境のIAMユーザーを利用するのか`を切り替えることができる。
```
// DEV環境のS3バケット一覧が表示される
$ aws s3 ls
$ aws s3 ls --profile dev 

// TEST環境のS3バケット一覧が表示される
$ aws s3 ls --profile test

// STG環境のS3バケット一覧が表示される
$ aws s3 ls --profile stg

// PROD環境のS3バケット一覧が表示される
$ aws s3 ls --profile prod
```