AWS CLI の profile / config / credentials の関係を整理する
AWS CLI で複数の認証情報や設定を使い分けるために、profile、~/.aws/config、~/.aws/credentials の関係を整理する
今日やったこと
- AWS CLI の
profileについて整理した - AWS CLI の設定ファイルである
~/.aws/configを確認した - AWS CLI の認証情報ファイルである
~/.aws/credentialsを確認した configとcredentialsで profile の書き方が少し違うことを知った--profileを指定すると、どの設定が使われるのか整理した
学んだこと
profile とは
AWS CLI の profile は、AWS CLI の設定や認証情報に名前を付けて切り替えるための仕組み。
たとえば、以下のように profile を指定してコマンドを実行できる。
aws sts get-caller-identity \
--profile reotech-dev
--profile reotech-dev を指定すると、AWS CLI は reotech-dev という名前の設定・認証情報を使ってコマンドを実行する。
複数のAWSアカウントや環境を扱う場合、すべてを default に寄せるよりも、用途ごとに profile を分けた方が安全に扱いやすい。
例:
default
reotech-dev
reotech-prod
sandbox
~/.aws/config とは
~/.aws/config は、AWS CLI の設定を保存するファイル。
主に以下のような情報を書く。
- デフォルトリージョン
- 出力形式
- profile ごとの設定
- ロール引き受け設定
- SSO / IAM Identity Center 関連の設定
例:
[default]
region = ap-northeast-1
output = json
[profile reotech-dev]
region = ap-northeast-1
output = json
config ファイルでは、default 以外の profile は以下のように書く。
[profile reotech-dev]
ここで profile というプレフィックスを付ける点が重要。
~/.aws/credentials とは
~/.aws/credentials は、AWS CLI の認証情報を保存するファイル。
従来のアクセスキー方式では、以下のような情報が保存される。
[default]
aws_access_key_id = AKIAXXXXXXXXXXXXXXXXX
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[reotech-dev]
aws_access_key_id = AKIAYYYYYYYYYYYYYYYYY
aws_secret_access_key = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
credentials ファイルでは、profile 名に profile を付けない。
つまり、config と credentials では同じ reotech-dev profile でも書き方が違う。
# ~/.aws/config
[profile reotech-dev]
region = ap-northeast-1
output = json
# ~/.aws/credentials
[reotech-dev]
aws_access_key_id = AKIAYYYYYYYYYYYYYYYYY
aws_secret_access_key = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
ここを混同すると、AWS CLI が想定通りに profile を読み込めない可能性がある。
config と credentials の役割の違い
ざっくり整理すると、以下のようになる。
| ファイル | 主な役割 | 例 |
|---|---|---|
~/.aws/config |
AWS CLI の設定 | region、output、role、SSO設定 |
~/.aws/credentials |
認証情報 | access key、secret access key |
config は「どう実行するか」の設定、credentials は「誰として実行するか」の認証情報、というイメージ。
ただし、認証方式によっては config 側に認証関連の設定を書くこともあるため、完全に分離されているわけではない。
–profile を指定したときの動き
以下のように実行した場合、
aws sts get-caller-identity \
--profile reotech-dev
AWS CLI は reotech-dev profile に対応する設定や認証情報を探す。
たとえば、以下のような組み合わせで読み込まれる。
# ~/.aws/config
[profile reotech-dev]
region = ap-northeast-1
output = json
# ~/.aws/credentials
[reotech-dev]
aws_access_key_id = AKIAYYYYYYYYYYYYYYYYY
aws_secret_access_key = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
この場合、reotech-dev profile では、
- region は
ap-northeast-1 - output は
json - 認証情報は
[reotech-dev]の access key / secret access key
が使われる。
aws configure で設定するとどうなるか
aws configure を使うと、AWS CLI の設定ファイルを対話的に作成・更新できる。
aws configure --profile reotech-dev
従来のアクセスキー方式で設定すると、入力したアクセスキーは ~/.aws/credentials に保存される。AWS CLI の公式リファレンスでも、aws configure で入力した Access Key ID と Secret Access Key は shared credentials file、つまり ~/.aws/credentials に書き込まれると説明されている。
一方、region や output などの設定は ~/.aws/config 側に保存される。
設定の優先順位に注意する
AWS CLI の設定値は、必ずしも config や credentials だけから読み込まれるわけではない。
AWS CLI の設定値は、コマンドラインオプション、環境変数、config ファイル、shared credentials ファイルなど、複数の場所から読み込まれる。
そのため、環境変数に AWS_ACCESS_KEY_ID などが設定されていると、ファイルに書いた profile とは別の認証情報が使われる場合がある。
たとえば、以下のような環境変数が設定されている場合は注意する。
echo $AWS_ACCESS_KEY_ID
echo $AWS_SECRET_ACCESS_KEY
echo $AWS_PROFILE
想定と違う認証情報が使われていないか確認したい場合は、前回整理した以下のコマンドを使う。
aws sts get-caller-identity \
--profile reotech-dev
profile を使うときの確認コマンド
profile の設定を確認したい場合は、以下のように実行できる。
aws configure list \
--profile reotech-dev
現在の認証主体を確認したい場合は、以下を使う。
aws sts get-caller-identity \
--profile reotech-dev
AWS CLI で作業するときは、
1. --profile を指定する
2. aws configure list で設定元を確認する
3. aws sts get-caller-identity で現在の認証主体を確認する
という流れにすると、意図しないAWSアカウントや認証情報で操作する事故を減らせそう。
あいまいなこと
aws loginを使った場合に、認証情報がどのファイル・キャッシュにどのように保存されるのかはまだ整理しきれていないaws sso loginを使う場合のconfigの書き方はまだ確認できていない- 環境変数、profile、config、credentials の厳密な優先順位はもう少し整理したい
- IAMロールを引き受ける場合の profile 設定はまだ理解が浅い
次にやること
- rootユーザー、IAMユーザー、IAMロールの違いを整理する
- IAMロールを引き受けるとはどういうことか確認する
aws loginとaws sso loginの違いを整理する- IAM Identity Center とは何かを確認する