8
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Linkbal(リンクバル)Advent Calendar 2022

Day 3

AWS CLIの認証情報の優先順位を実際に試して理解する

Last updated at Posted at 2022-12-02

この記事は、リンクバルアドベントカレンダー2022のシリーズ2の3日目の記事です。
昨日の記事は、目に見えない文字を悪用してサイトを好き放題荒らされた話
です。

はじめに

AWS CLIでは、AWSが決めた優先順位に基づいて、認証情報を利用します。

普段は優先順位を意識しなくても問題が起きることはあまりないと思います。しかし、優先順位の存在を認識していないと、まれに想定していない挙動に混乱するかもしれません。

ありそうなケースとしては、環境変数にアクセスキーが設定済みのECSやEC2でIAMロールの認証情報を利用しようとするが、優先順位の関係で環境変数の認証情報が利用される、などでしょうか。
※IAMロールをアタッチしているのに、環境変数にアクセスキーを設定するなという話ですが

ということで、優先順位の理解のために、実際に挙動を試してみましょう!

AWS CLIの認証情報の優先順位

まず、優先順位は、以下のとおりです。

  1. コマンドラインオプション
  2. 環境変数( AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY )
  3. 認証情報ファイル( ~/.aws/credentials )
  4. 設定ファイル( ~/.aws/config)
  5. コンテナ認証情報(ECSのタスク定義にアタッチされたIAMロール)
  6. Amazon EC2 インスタンスプロファイル(EC2インスタンスにアタッチされたIAMロール)

詳しくは、公式ドキュメントをご覧ください。

実際に挙動を試す

どの設定を使っているかがわかる aws configure list コマンドで、確認します。

なお、認証情報元のAccountやArnを知りたい場合は aws sts get-caller-identity コマンドをどうぞ。

環境

$ aws --version
aws-cli/1.22.34 Python/3.10.6 Linux/5.15.0-1022-aws botocore/1.23.34

$ uname -a
Linux ip-xx-xx-xx-xx 5.15.0-1022-aws #26-Ubuntu SMP Thu Oct 13 12:59:25 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

共通条件

  • IAMロールがアタッチされているEC2インスタンス上で実行
  • 環境変数 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY が設定済み

~/.aws/credentialsdefault の記載なしの場合

  • ~/.aws/credentialsdefault にアクセスキーの記載なし
    • もちろん ~/.aws/config にもアクセスキーの記載なし
  • ~/.aws/credentialshoge profileにはアクセスキーの記載あり

実行内容

$ echo $AWS_ACCESS_KEY_ID $AWS_SECRET_ACCESS_KEY
XXXXXXXXXXX YYYYYYYYYYYYYYYYYYYYYY

# 無指定
# 環境変数が優先される(Typeがenv)
$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************XXXX              env
secret_key     ****************YYYY              env
    region           ap-northeast-1      config-file    ~/.aws/config

# コマンドラインオプションで --profile hoge を指定
# コマンドラインオプションは優先順位が最高
# そのため hoge profile の参照元の shared-credentials-file(~/.aws/credentials)が利用される
$ aws configure list --profile hoge
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                     hoge             manual  --profile
access_key     ****************CCCC shared-credentials-file
secret_key     ****************DDDD shared-credentials-file
    region           ap-northeast-1      config-file    ~/.aws/config

# AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYを空にする
# IAMロールより優先順位が高い認証情報がないため、IAMロールが利用される(Typeがiam-role)
$ AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************AAAA         iam-role
secret_key     ****************BBBB         iam-role
    region           ap-northeast-1      config-file    ~/.aws/config

# AWS_ACCESS_KEY_IDだけ空にする
# IAMロールより優先順位が高い認証情報がないため、IAMロールが利用される(Typeがiam-role)
# AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYを空にするのと結果は同じ
$ AWS_ACCESS_KEY_ID= aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************AAAA         iam-role
secret_key     ****************BBBB         iam-role
    region           ap-northeast-1      config-file    ~/.aws/config

# AWS_SECRET_ACCESS_KEYだけ空にする
# エラーになる
$ AWS_SECRET_ACCESS_KEY= aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None

Partial credentials found in env, missing: AWS_SECRET_ACCESS_KEY

~/.aws/credentialsdefault の記載ありの場合

  • ~/.aws/credentialsdefault にアクセスキーの記載あり
  • ~/.aws/credentialshoge profileにアクセスキーの記載あり

実行内容

$ echo $AWS_ACCESS_KEY_ID $AWS_SECRET_ACCESS_KEY
XXXXXXXXXXX YYYYYYYYYYYYYYYYYYYYYY

# 無指定
# 環境変数が利用される(Typeがenv)
$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************XXXX              env
secret_key     ****************YYYY              env
    region           ap-northeast-1      config-file    ~/.aws/config

# コマンドラインオプションで --profile hoge を指定
# コマンドラインオプションは優先順位が最高
# そのため hoge profile の参照元の shared-credentials-file(~/.aws/credentials)が利用される
$ aws configure list --profile hoge
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                     hoge             manual  --profile
access_key     ****************CCCC shared-credentials-file
secret_key     ****************DDDD shared-credentials-file
    region           ap-northeast-1      config-file    ~/.aws/config

# AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYを空にする
# 環境変数の次に優先順位が高いshared-credentials-fileのdefaultが利用される
# (Typeがshared-credentials-file)
$ AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************EEEE shared-credentials-file
secret_key     ****************FFFF shared-credentials-file
    region           ap-northeast-1      config-file    ~/.aws/config

# AWS_ACCESS_KEY_IDだけ空にする
# 環境変数の次に優先順位が高いshared-credentials-fileのdefaultが利用される
# (Typeがshared-credentials-file)
# AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYを空にするのと結果は同じ
$ AWS_ACCESS_KEY_ID= aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************EEEE shared-credentials-file
secret_key     ****************FFFF shared-credentials-file
    region           ap-northeast-1      config-file    ~/.aws/config

# AWS_SECRET_ACCESS_KEYだけ空にする
# エラーになる
$ AWS_SECRET_ACCESS_KEY= aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None

Partial credentials found in env, missing: AWS_SECRET_ACCESS_KEY

おわりに(自分語り)

最初は、「環境変数にアクセスキーが設定済みのECSとEC2のAWS CLIでIAMロールの認証情報利用する」というタイトルで記事を書いていました。
しかし、内容は環境変数を空にしてコマンドを実行しているだけで、タイトル負けしていたので、タイトルを変えて内容を増やしました!

誰かのお役に立てば幸いです!

8
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?