はじめに
AWS CLIを利用する際、「設定したはずの認証情報が使われない」「意図しないIAMロールで実行されてしまった」という経験はありませんか?
AWS CLIは、複数の場所から認証情報を読み込むことができ、それらには明確な優先順位が存在します。この優先順位を理解していないと、思わぬ設定の落とし穴にはまってしまうことがあります。
この記事では、AWS CLIがどの認証情報をどの順番で探しに行くのかを、具体例を交えながら徹底的に解説します。
対象読者
- AWS CLIを使い始めた方
- 複数のAWSアカウントやIAMロールを切り替えて作業する方
- CI/CDパイプラインなどでAWS CLIの認証を設定する方
結論:認証情報の優先順位
AWS CLIは以下の順序で認証情報を探し、最初に見つかったものを使用します。
-
コマンドラインオプション (
--profile
,--region
など) -
環境変数 (
AWS_ACCESS_KEY_ID
,AWS_SECRET_ACCESS_KEY
など) -
(Web Identity連携)OIDCの環境変数 (
AWS_ROLE_ARN
,AWS_WEB_IDENTITY_TOKEN_FILE
) -
共有認証情報ファイル (
~/.aws/credentials
) -
CLI設定ファイル (
~/.aws/config
) ※IAMロールの指定など - コンテナ認証情報 (ECSタスクロールなど)
- インスタンスプロファイル (EC2インスタンスプロファイルなど)
この順番が非常に重要です。例えば、環境変数を設定していると、~/.aws/credentials
に記述した内容は無視されます。
それでは、各項目を詳しく見ていきましょう。
1. コマンドラインオプション
最も優先度が高いのが、コマンド実行時に直接指定するオプションです。
--profile
オプションを使えば、~/.aws/credentials
や~/.aws/config
で設定した特定のプロファイルを明示的に使用できます。
# my-profileという名前のプロファイルを利用する
aws s3 ls --profile my-profile
この方法は、一時的に別のプロファイルを使いたい場合に非常に便利です。
2. 環境変数
次に優先されるのが環境変数です。以下の環境変数が設定されている場合、CLIはこれらを利用します。
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
-
AWS_SESSION_TOKEN
(一時的な認証情報の場合)
設定例:
export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
# この状態で実行すると、上記で設定したキーが使われる
aws s3 ls
# 使い終わったら必ずunsetすること!
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
注意点: 環境変数は非常に強力ですが、ターミナルのセッションが続く限り有効です。使い終わったらunset
コマンドで必ず解除する癖をつけましょう。CI/CD環境など、一時的な認証情報を扱うのに適しています。
4. 共有認証情報ファイル (~/.aws/credentials
)
aws configure
コマンドで設定される、おなじみのファイルです。複数のプロファイルを定義することができます。
ファイル例: ~/.aws/credentials
[default]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
[user1]
aws_access_key_id = AKIAI44QH8DHBEXAMPLE
aws_secret_access_key = je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
コマンドラインオプションや環境変数の指定がなければ、このファイルの[default]
プロファイルが使われます。
5. CLI設定ファイル (~/.aws/config
)
このファイルは、リージョンや出力形式のデフォルト設定、そして**IAMロールの引き受け(AssumeRole)**設定などを記述します。
ファイル例: ~/.aws/config
[default]
region = ap-northeast-1
output = json
[profile developer]
role_arn = arn:aws:iam::123456789012:role/developer-role
source_profile = default
region = ap-northeast-1
上記の例では、aws s3 ls --profile developer
と実行すると、default
プロファイルの認証情報を使ってdeveloper-role
というIAMロールを引き受けます。
6. コンテナ認証情報
Amazon ECSのタスクやEKSのPodで実行されているコンテナ内でAWS CLIを実行した場合、タスク/Podに割り当てられたIAMロール(タスクロール)の認証情報が自動的に使われます。
7. インスタンスプロファイル
EC2インスタンス内でAWS CLIを実行した場合、そのインスタンスにアタッチされたIAMロール(インスタンスプロファイル)の認証情報が自動的に使われます。
これは、EC2上でアプリケーションを動かす際の最も安全で推奨される方法です。
現在どの認証情報が使われているか確認する方法
「結局今、どの認証情報でCLIは動いているんだ?」と分からなくなったときは、sts get-caller-identity
コマンドが便利です。
aws sts get-caller-identity
実行結果例:
{
"UserId": "AIDAJQABLZS4A3QDU576Q",
"Account": "123456789012",
"Arn": "arn:aws:iam::123456789012:user/cli-user"
}
この結果を見れば、現在有効になっているIAMユーザーやロールのARNが分かり、意図した認証情報が使えているかを確認できます。
よくある落とし穴
-
環境変数の消し忘れ: ターミナルで一時的に環境変数を設定した後、
unset
し忘れてしまい、~/.aws/credentials
の設定が全く効かなくなるケース。 -
credentials
とconfig
の混同:~/.aws/credentials
にrole_arn
を書いても機能しません。ロール設定は~/.aws/config
に書く必要があります。 -
default
プロファイルの意図しない上書き:aws configure
を引数なしで実行すると[default]
プロファイルが上書きされるため、注意が必要です。特定のプロファイルを設定したい場合はaws configure --profile <profilename>
を使いましょう。
まとめ
AWS CLIの認証情報の優先順位は、以下の通りです。
- コマンドラインオプション (最優先)
- 環境変数
- 共有認証情報ファイル (
credentials
) - CLI設定ファイル (
config
) - コンテナ認証情報
- インスタンスプロファイル (最後の砦)
この順番をしっかり覚えておけば、認証にまつわるトラブルの多くは解決できます。
困ったときにはaws sts get-caller-identity
で現状を確認する癖をつけると、よりスムーズに開発を進められるでしょう。