[小ネタ] AWS Tools for PowerShellの認証情報をちょっとだけ便利に扱う

2021.02.28

しばたです。

AWS Tools for PowerShellでは.NET SDK由来の独自の認証情報(AWS SDKストア)以外にAWS CLIが使う認証ファイル(共有認証情報ファイル)も使うことができます。

要は以下の様にAWS CLI用の~/.aws/credentials~/.aws/configを共用できるということです。

~/.aws/credentials

[my_profile]
aws_access_key_id=AKIxxxxxxxxxxxxxxxxxxxx
aws_secret_access_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

~/.aws/config

[profile my_profile]
region = ap-northeast-1
cli_pager =

(AWS Tools for PowerShellでも ~/.aws/credentials は使える)

AWS CLIとAWS Tools for PowerShellの微妙な差異

私はAWS Tools for PowerShellだけでなくAWS CLIもそれなりに扱うので認証情報は共用できる共有認証情報ファイルに寄せたおり非常に便利に運用できています。

ただ、共有認証情報ファイル自体は共用できるのですが、残念ながらその中身については完全に共有できない場合があります。

AWS CLIではAWS_PROFILE環境変数を設定しデフォルトで使用するプロファイルを決めた際は設定ファイルで記載されたリージョンもデフォルト設定されるのですが、AWS Tools for PowerShellでは認証情報(プロファイル)指定とリージョン指定が完全に分離しているため、共有認証情報ファイルにあるリージョン指定が使われません。

(AWS CLIはデフォルトプロファイルを指定するとデフォルトリージョンも併せて設定してくれる)

(AWS Tools for PowerShellではSet-AWSCredentialでデフォルトプロファイルを指定してもリージョンは設定されない。都度Set-DefaultAWSRegionを呼ぶ必要がある)

AWS Tools for PowerShellの認証情報をちょっとだけ便利に扱う

この挙動は認証情報の指定方法の違いに起因するものと思われ、恐らく意図した挙動だと見受けられます。

とはいえせっかく共有認証情報ファイルにリージョン指定があるのにそれを使えないのはぶっちゃけ不便です。
そこでプロファイル指定と同時にリージョン指定も行う関数を作ってみました。

関数 Set-AWSCredentialWithRegion

この関数を定義しSet-AWSCredentialと同じ様に使うと同時にリージョンも指定してくれます。

Set-AWSCredentialWithRegion -ProfileName my_profile

これでAWS CLIと同じ様な使用感を得ることができます。

簡単な解説

関数の中身について簡単に解説をしておきます。

Amazon.PowerShell.Common.SettingsStore.TryGetProfile() メソッド

現在のAWS Tools for PowerShell *1では認証情報の解析処理のためにAmazon.PowerShell.Common.SettingsStore.TryGetProfile()という内部処理が実装されいてます。

  • ソースコード上はココ

用途としては完全に内部向けなのですが、恐らくテストで必要とするためStatic Publicメソッドとして定義されています。
非常にありがたいので私も使わせてもらうことにしました。

この処理では認証情報ファイルと取得したいプロファイル名を引数に取り、該当するプロファイルがあればその情報を返します。
返す情報の中にリージョンもあったので、これをそのまま使ってやります。
もちろん共有認証情報ファイルにリージョン指定が無い場合もありますのでそのへんのチェックをしたうえで最終的にSet-DefaultAWSRegionを呼び出してデフォルトリージョンを更新しています。

その他細かい点

このほかに細かい点として、関数内部でSet-AWSCredentialSet-DefaultAWSRegionを呼び出すのでスコープはGlobal決め打ちにしています。
用途から見て決め打ちで問題ないとの判断です。

あとは念のためにSet-AWSCredentialで設定した認証情報がちゃんと認証情報ファイル由来のものであるかをチェックしています。
このチェック処理は丁度良い感じで公開されている機能が無かったのでリフレクションを使っています。

最後に

以上となります。
ちょっとした関数ですがあると地味に便利ですのでぜひ使ってみてください。

脚注

  1. Ver.4系。過去バージョンでどうだったかは未調査。