AWS CLIの設定切替方法と、AWS_DEFAULT_PROFILEとAWS_PROFILEの違いについて

# はじめに

AWS CLIで使う設定(プロファイル)とその切替方法に関してまとめてみました。

以下のような方に参考にしていただけると幸いです。

- AWS CLIをこれから使い始めるAWS初心者の方
- 複数のアクセスキーを使い分けて、AWS CLIによる操作を行う必要がある方

# 環境

- Mac OS
- AWS CLIをインストール済み 

# 設定切替を行うにあたっての予備知識

## aws configure

すでにAWS CLIを使用中の方は、AWS CLIインストール直後に

- `aws configure`コマンド

を使って、以下のように利用するアクセスキーなどを設定したかと思います。

```console
$ aws configure
AWS Access Key ID [None]: アクセスキーIDを入力
AWS Secret Access Key [None]: シークレットアクセスキーを入力
Default region name [None]: リージョンを入力(ap-northeast-1等)
Default output format [None]: json
```

上記の設定を行うと、

- ~/.aws/config
- ~/.aws/credentials

のそれぞれに設定内容が書き込まれます。

## ~/.aws/configの内容

`~/.aws/config`には、リージョンと出力形式が書き込まれます。

```console
$ cat ~/.aws/config
[default]
region = ap-northeast-1
output = json
```

## ~/.aws/credentialsの内容

`~/.aws/credentials`には、アクセスキーIDとシークレットアクセスキーが書き込まれます。

```console
$ cat ~/.aws/credentials 
[default]
aws_access_key_id = AAAAAAAAAAAAAAAAAAAA
aws_secret_access_key = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
```

## 現在使用中の設定の確認(aws configure list)

また、`aws configure list`でAWS CLIで現在使用中の設定を確認できます。

```console
$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>           manual    --profile
access_key     ****************AAAA shared-credentials-file    
secret_key     ****************BBBB shared-credentials-file  
```

先ほど`aws configure`で設定したアクセスキー等が表示されていることがわかります。

# 【本題】設定の追加と切替方法

では、AWS CLIで複数のアクセスキーを使い分けられるようにします。
そのためにプロファイルというものを新たに作成します。

## プロファイルの作成

プロファイルの作成コマンドは以下のとおりです。

- `aws configure --profile プロファイルの名前`

上記の通り、プロファイルに対しては何らかの名前を付けます。

名前は何でも良いのですが、今回は`prod`という名前のプロファイルを作ることにします。

```console
$ aws configure --profile prod
AWS Access Key ID [None]: アクセスキーIDを入力
AWS Secret Access Key [None]: シークレットアクセスキーを入力
Default region name [None]: リージョンを入力(ap-northeast-1等)
Default output format [None]: json
```

上記を実行したことで、`~/.aws/config`と`~/.aws/credentials`にその内容が追加されます。

### ~/.aws/configの内容

`[profile prod]`より下の内容が新たに書き加わっています。

```console
$ cat ~/.aws/config
[default]
region = ap-northeast-1
output = json
[profile prod]
region = ap-northeast-1
output = json
```

### ~/.aws/credentialsの内容

`[prod]`より下の内容が新たに書き加わっています。


```console
$ cat ~/.aws/credentials 
[default]
aws_access_key_id = AAAAAAAAAAAAAAAAAAAA
aws_secret_access_key = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
[prod]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
```

## 設定の切替

先ほど作成したプロファイルに切り替えるには

- AWS_DEFAULT_PROFILE

という環境変数にプロファイル名を設定します(`AWS_PROFILE`でも良いのですが、これに関しては後述)。

以下コマンドで、`AWS_DEFAULT_PROFILE`に先ほど作成したプロファイルの名前`prod`を設定します。

```console
$ export AWS_DEFAULT_PROFILE=prod
```

そして、AWS CLIの現在の設定を確認すると、新しいプロファイル`prod`が使用中になっていることがわかります。

```console
$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                     prod           manual    --profile
access_key     ****************XXXX shared-credentials-file    
secret_key     ****************YYYY shared-credentials-file  
```

もとの設定に戻すには`AWS_DEFAULT_PROFILE`に`default`を設定します。

```console
$ export AWS_DEFAULT_PROFILE=default
$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                  default           manual    --profile
access_key     ****************AAAA shared-credentials-file    
secret_key     ****************BBBB shared-credentials-file  
````

# AWS_DEFAULT_PROFILEとAWS_PROFILEの違い

`AWS_DEFAULT_PROFILE`とよく似た名前の環境変数として`AWS_PROFILE`が存在します。

**AWS CLIで使用されるプロファイルとしては、`AWS_DEFAULT_PROFILE`に設定したプロファイル名が優先されるようです。**

`AWS_DEFAULT_PROFILE`と`AWS_PROFILE`それぞれに異なるプロファイル名を設定した場合、`aws configure list`で確認できるAWS CLIで現在使用中のプロファイル名は、`AWS_DEFAULT_PROFILE`のものとなっています。

```console
$ export AWS_DEFAULT_PROFILE=prod 
$ export AWS_PROFILE=default
$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                     prod           manual    --profile
access_key     ****************XXXX shared-credentials-file    
secret_key     ****************YYYY shared-credentials-file  
```

```console
$ export AWS_DEFAULT_PROFILE=default 
$ export AWS_PROFILE=prod
$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                  default           manual    --profile
access_key     ****************AAAA shared-credentials-file    
secret_key     ****************BBBB shared-credentials-file  
```

そして、`AWS_DEFAULT_PROFILE`が存在せず、`AWS_PROFILE`にのみプロファイル名が設定されている場合には`AWS_PROFILE`に設定したプロファイル名がAWS CLIの設定として使われます。

```console
$ unset AWS_DEFAULT_PROFILE
$ echo $AWS_PROFILE
prod
$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                     prod           manual    --profile
access_key     ****************XXXX shared-credentials-file    
secret_key     ****************YYYY shared-credentials-file  
```

# 【補足】コマンド実行時に、都度プロファイルを指定する

本記事では使用するプロファイルを切り替える方法を説明してきましたが、各AWSコマンドの実行時に都度プロファイルを指定することもできます。

その場合は、コマンドに`--profile`オプションを指定します。

```console
$ aws s3 ls --profile prod
```

# まとめ

- プロファイルを切り替えることで、AWS CLIで複数のアクセスキーを使い分けることができる

- プロファイルの作成コマンドは、`aws configure --profile プロファイルの名前`

- `aws configure`で作成した設定内容は、`~/.aws/config`と`~/.aws/credentials`に書き込まれる

- 以下の環境変数にプロファイル名を設定することで、プロファイル名を切り替えることができる

  - `AWS_DEFAULT_PROFILE` または `AWS_PROFLIE`

  - 両方にプロファイル名が設定されている場合には、`AWS_DEFAULT_PROFILE`が優先される

- 現在使用中のプロファイルを確認するコマンドは、`aws configure list`

- コマンドの実行の都度、プロファイルを指定するには、そのAWSコマンドに`--profile`オプションを指定する

  - `aws s3 ls --profile プロファイル名` 

# 参考

- [名前付きプロファイル - AWSドキュメント](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-profiles.html)

- [AWS CLIのプロファイル切り替えをいい感じにする - Qiita](https://qiita.com/crossroad0201/items/f84b3e2fece41750755b)

- [AWS CLI 使用時のプロファイル指定方法 - rundrop](https://blog.roundrop.jp/1/)

- [awscliの設定切り替え - Qiita](https://qiita.com/ryuzee/items/e3ce493f132f1981f57a)