AWS Tools for PowerShell V5で追加された環境変数からの認証情報設定に関する注意点
しばたです。
先月AWS Tools for PowerShellのメジャーバージョンアップとなるV5がリリースされました。
このV5の新機能の一つに「環境変数から認証情報の設定をサポートする」というものがあるのですが、その内容が期待していたものと少し異なっていたので本記事ではその点を解説していきます。
従来の挙動と期待した動作
従来AWS Tools for PowerShellでは基盤となるAWS SDK for .NET独自の認証情報である「AWS SDKストア」とAWS CLI等で設定する「AWS共有認証情報ファイル(~/.aws/credentials
と~/.aws/config
)」に認証情報を記載し利用することができました。
ただしAWS共有認証情報ファイルに関しては一部の記述のみがサポートされる形となっています。
例えば次の様に~/.aws/credentials
と~/.aws/config
にtest_profile
が設定されている場合、AWS Tools for PowerShellでこのtest_profile
を使うことは可能なもののリージョン設定は無視されてしまいます。
[test_profile]
aws_access_key_id=AKIAXXXXXXXXXXXXXXXXXXX
aws_secret_access_key=XXXXXXXXXXXXXXXXXXXXX
# プロファイルにデフォルトリージョンを記述
[profile test_profile]
region=ap-northeast-1
AWS Tools for PowerShellではSet-DefaultAWSRegion
コマンドでデフォルトリージョンを設定する必要があります。
(もしくは各コマンドで-Region
パラメーターを指定する形でも構いません)
# 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_ID
やAWS_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
環境変数の指定も反映されました。
# 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
2. プロファイルに記載されたリージョン情報はサポートされない
前述の通りAWS_PROFILE
環境変数自体はサポートされたのですが、AWS共有認証情報ファイルのサポートは従来通り部分的なものであるため先述のtest_profile
の場合でもリージョン指定は別に行う必要があります。
# プロファイル中のリージョン情報はサポートされないので別途指定が必要 (エラーになる)
$env:AWS_PROFILE="test_profile"
Get-STSCallerIdentity
Get-STSCallerIdentity: No region specified or obtained from persisted/shell defaults.
リージョン未指定のエラーとなる
AWS_REGION
環境変数を設定するかSet-DefaultAWSRegion
コマンドを使えばエラーは解消できます。
$env:AWS_PROFILE="test_profile"
# Set-DefaultAWSRegion の代わりにAWS_REGION環境変数を使ってもOK
$env:AWS_REGION="ap-northeast-1"
Get-STSCallerIdentity
リージョン指定によりエラーは解消
3. IAMロールにスイッチするMFA必須プロファイルは非サポート
この他にAWS CLIでは以下の様な形でIAMロールを使う形のプロファイルを書くことができますが、このタイプのプロファイルのうちMFA必須となるものはAWS SDK for .NET自体の制限により非サポートとなります。
# 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..
このエラーを回避するには従来通りSet-AWSCredential
コマンドを使う必要があります。
# 従来どおり Set-AWSCredential を使えばエラーを回避できる
Set-AWSCredential -ProfileName switch_profile
$env:AWS_REGION="ap-northeast-1"
Get-STSCallerIdentity
エラーなくMFA認証できる
ちなみにAWS SDK for .NETのこの辺にこのエラーが記述されています。
実際に試す環境がないため動作確認まではできないのですが、ソースコードを読む限りだとMFAのほかにIAM Identity Centerを使う場合やSAML認証を使う場合にも制約がある様です。
余談 : 認証情報の解決順序
ドキュメントによればAWS Tools for PowerShell V5における認証情報の解決順序は次の通りです。
- コマンドラインに直接埋め込まれたリテラルの認証情報
- AWSとしてはこの代わりにプロファイル指定を強く推奨
- 各コマンドの
-Credential
パラメーターで指定された認証情報 Set-AWSCredential
コマンドで指定されたプロファイル- プロファイル名だけ指定された場合は「AWS SDKストア」→「AWS共有認証情報ファイル」の順で検索
- プロファイルのパスが指定された場合はそこにある
default
プロファイルを検索 - プロファイルのパスと名前を指定した場合はそこにあるプロファイルを検索
AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
、AWS_SESSION_TOKEN
環境変数の値AWS_PROFILE
環境変数で指定されたプロファイル- 各種
default
プロファイル- 「AWS SDKストア」の
default
→ 「AWS共有認証情報ファイル」のdefault
→ 「AWS SDKストア」のAWS PS Default
の順で検索
- 「AWS SDKストア」の
- インスタンスメタデータ
基本的な部分はAWS Tools for PowerShell V4と変わらないものの、
-
- の
-Credential
パラメーターの優先度が上がっている
- の
-
- と 5. の環境変数のサポートが増えた
ことが主な変更点となります。
普段気にすることは少ないでしょうが何らかのトラブルが起きた際はこの順序を意識しておくとよいでしょう。
最後に
簡単ですが以上となります。
便利な新機能ですが従来通り変わらない点とAWS SDK for .NET固有の制限もあるのでご注意ください。