AWS Tools for PowerShell V5で追加された環境変数からの認証情報設定に関する注意点

AWS Tools for PowerShell V5で追加された環境変数からの認証情報設定に関する注意点

Clock Icon2025.07.07

しばたです。

先月AWS Tools for PowerShellのメジャーバージョンアップとなるV5がリリースされました。

https://dev.classmethod.jp/articles/aws-tools-for-powershell-50-ga/

このV5の新機能の一つに「環境変数から認証情報の設定をサポートする」というものがあるのですが、その内容が期待していたものと少し異なっていたので本記事ではその点を解説していきます。

従来の挙動と期待した動作

従来AWS Tools for PowerShellでは基盤となるAWS SDK for .NET独自の認証情報である「AWS SDKストア」とAWS CLI等で設定する「AWS共有認証情報ファイル(~/.aws/credentials~/.aws/config)」に認証情報を記載し利用することができました。

ただしAWS共有認証情報ファイルに関しては一部の記述のみがサポートされる形となっています。

例えば次の様に~/.aws/credentials~/.aws/configtest_profileが設定されている場合、AWS Tools for PowerShellでこのtest_profileを使うことは可能なもののリージョン設定は無視されてしまいます。

~/.aws/credentials
[test_profile]
aws_access_key_id=AKIAXXXXXXXXXXXXXXXXXXX
aws_secret_access_key=XXXXXXXXXXXXXXXXXXXXX
~/.aws/config
# プロファイルにデフォルトリージョンを記述
[profile test_profile]
region=ap-northeast-1

AWS Tools for PowerShellではSet-DefaultAWSRegionコマンドでデフォルトリージョンを設定する必要があります。  
(もしくは各コマンドで-Regionパラメーターを指定する形でも構いません)

PowerShell
# Set-AWSCredential コマンドで test_profile プロファイルの指定はサポートされている
# ※ただしリージョン設定は無視される
Set-AWSCredential -ProfileName test_profile

# デフォルトリージョンを指定する場合は Set-DefaultAWSRegion コマンドを使う
Set-DefaultAWSRegion -Region ap-northeast-1

AWS Tools for PowerShell V5ではこれらに加えてAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYなどの環境変数による認証情報の指定もサポートされる様になりました。
環境変数による認証情報の指定はAWS CLIや各種SDKでは古くからあるおなじみの方式です。

私はこのおなじみの方式がサポートされたことからうっかり「AWS共有認証情報ファイルのフルサポートも増えた」と誤解してしまったのですが、残念ながらこの点は従来通り変わりません。
また、基盤となるAWS SDK for .NET自身の認証情報の解決方法にも限度があるためAWS CLIと完全に同一のサポートにはならないことがわかりました。

AWS共有認証情報ファイルをAWS CLIとAWS Tools for PowerShellで完全互換で使える様になれば最高に嬉しかったのですが、残念ながら現状はそうではありませんでした。
とはいえ従来より互換性が上がっていることは確かなのでこの新機能自体は素直に助かります。

実際の挙動

ここからは実際の挙動を確認しながらAWS CLIの場合との違いを解説していきます。

検証環境として私の開発用PC環境(PowerShell 7.5.2 on Windows 11)に本日時点で最新のAWS Tools for PowerShell 5.0.8をインストールしています。
インストール手順は割愛します。

1. AWS_ACCESS_KEY_IDなどの環境変数はサポートされる

まず最初に従来からよく使われる以下の環境変数は特に問題なく利用できる様になっています。

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_SESSION_TOKEN

この他にも

  • AWS_REGION
  • AWS_PROFILE

環境変数の指定も反映されました。

PowerShell
# AWS Tools for PowerShell V5では各種環境変数での認証情報指定をサポート
$env:AWS_ACCESS_KEY_ID="AKIAXXXXXXXXXXXXXXXXXXX"
$env:AWS_SECRET_ACCESS_KEY="XXXXXXXXXXXXXXXXXXXXX"
$env:AWS_REGION="ap-northeast-1"
Get-STSCallerIdentity

about-aws-tools-for-powershell-v5-credential-support-01

2. プロファイルに記載されたリージョン情報はサポートされない

前述の通りAWS_PROFILE環境変数自体はサポートされたのですが、AWS共有認証情報ファイルのサポートは従来通り部分的なものであるため先述のtest_profileの場合でもリージョン指定は別に行う必要があります。

PowerShell
# プロファイル中のリージョン情報はサポートされないので別途指定が必要 (エラーになる)
$env:AWS_PROFILE="test_profile"
Get-STSCallerIdentity

Get-STSCallerIdentity: No region specified or obtained from persisted/shell defaults.

about-aws-tools-for-powershell-v5-credential-support-02
リージョン未指定のエラーとなる

AWS_REGION環境変数を設定するかSet-DefaultAWSRegionコマンドを使えばエラーは解消できます。

PowerShell
$env:AWS_PROFILE="test_profile"
# Set-DefaultAWSRegion の代わりにAWS_REGION環境変数を使ってもOK
$env:AWS_REGION="ap-northeast-1"
Get-STSCallerIdentity

about-aws-tools-for-powershell-v5-credential-support-03
リージョン指定によりエラーは解消

3. IAMロールにスイッチするMFA必須プロファイルは非サポート

この他にAWS CLIでは以下の様な形でIAMロールを使う形のプロファイルを書くことができますが、このタイプのプロファイルのうちMFA必須となるものはAWS SDK for .NET自体の制限により非サポートとなります。

~/.aws/config
# MFA必須でIAMロールを使うプロファイル
[profile switch_profile]
role_arn=arn:aws:iam::xxxxxxxxxxxx:role/role-name
mfa_serial=arn:aws:iam::xxxxxxxxxxxx:mfa/mfa-serial-name
source_profile=test_profile

この場合かなり長文のエラーメッセージが表示されてしまいます。

$env:AWS_PROFILE="switch_profile"
$env:AWS_REGION="ap-northeast-1"
Get-STSCallerIdentity

Get-STSCallerIdentity: Failed to resolve AWS credentials. The credential providers used to search for credentials returned the following errors:

Exception 1 of 4: The environment variables AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY/AWS_SESSION_TOKEN were not set with AWS credentials.
Exception 2 of 4: The webIdentityTokenFile must be an absolute path. (Parameter 'webIdentityTokenFile')
Exception 3 of 4: The profile [switch_profile] is an assume role profile that requires an MFA. This type of profile is not allowed here. Please use an assume role profile that doesn't require an MFA, or a different type of profile.
Exception 4 of 4: Failed to connect to EC2 instance metadata to retrieve credentials: Unable to get IAM security credentials from EC2 Instance Metadata Service..

about-aws-tools-for-powershell-v5-credential-support-04

このエラーを回避するには従来通りSet-AWSCredentialコマンドを使う必要があります。

PowerShell
# 従来どおり Set-AWSCredential を使えばエラーを回避できる
Set-AWSCredential -ProfileName switch_profile
$env:AWS_REGION="ap-northeast-1"
Get-STSCallerIdentity

about-aws-tools-for-powershell-v5-credential-support-05
エラーなくMFA認証できる

ちなみにAWS SDK for .NETのこの辺にこのエラーが記述されています。

実際に試す環境がないため動作確認まではできないのですが、ソースコードを読む限りだとMFAのほかにIAM Identity Centerを使う場合やSAML認証を使う場合にも制約がある様です。

余談 : 認証情報の解決順序

ドキュメントによればAWS Tools for PowerShell V5における認証情報の解決順序は次の通りです。

  1. コマンドラインに直接埋め込まれたリテラルの認証情報
    • AWSとしてはこの代わりにプロファイル指定を強く推奨
  2. 各コマンドの-Credentialパラメーターで指定された認証情報
  3. Set-AWSCredentialコマンドで指定されたプロファイル
    • プロファイル名だけ指定された場合は「AWS SDKストア」→「AWS共有認証情報ファイル」の順で検索
    • プロファイルのパスが指定された場合はそこにあるdefaultプロファイルを検索
    • プロファイルのパスと名前を指定した場合はそこにあるプロファイルを検索
  4. AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN環境変数の値
  5. AWS_PROFILE環境変数で指定されたプロファイル
  6. 各種defaultプロファイル
    • 「AWS SDKストア」のdefault → 「AWS共有認証情報ファイル」のdefault → 「AWS SDKストア」のAWS PS Default の順で検索
  7. インスタンスメタデータ

基本的な部分はAWS Tools for PowerShell V4と変わらないものの、

    1. -Credentialパラメーターの優先度が上がっている
    1. と 5. の環境変数のサポートが増えた

ことが主な変更点となります。
普段気にすることは少ないでしょうが何らかのトラブルが起きた際はこの順序を意識しておくとよいでしょう。

最後に

簡単ですが以上となります。

便利な新機能ですが従来通り変わらない点とAWS SDK for .NET固有の制限もあるのでご注意ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.