今日やったこと

  • AWS CLI の profile について整理した
  • AWS CLI の設定ファイルである ~/.aws/config を確認した
  • AWS CLI の認証情報ファイルである ~/.aws/credentials を確認した
  • configcredentials で 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 を付けない。

つまり、configcredentials では同じ 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 の設定値は、必ずしも configcredentials だけから読み込まれるわけではない。

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 loginaws sso login の違いを整理する
  • IAM Identity Center とは何かを確認する