いまどき、AssumeRoleにMFA必須は当然ですよね。
awscliがMFA対応しているのは有名ですが、AWS PowershellもMFA対応していました。
プロファイルを保存してデフォルト設定します。
Set-AWSCredential -StoreAs Default -AccessKey <アクセスキー> -SecretKey <シークレットキー>
Set-AWSCredential -StoreAs AdminRole -SourceProfile Default -RoleArn <RoleARN> -MfaSerial <MFASerial>
Initialize-AWSDefaultConfiguration -ProfileName AdminRole -Region ap-northeast-1
この状態で Get-EC2Instance
とか実行するとMFA Codeを求められるので入力してください。
保存したプロファイルは毎回入力する必要はありません。
プロファイル名やリージョンは好きなものを指定してください。
アクセスキー、シークレットキー、RoleARN、MFASerialはIAMから指定された値です。
有効期間(1時間?)を過ぎるか、プロセス終了まで有効です。
子プロセスには引き継がれるようですが、兄弟プロセスには引き継がれないようです。
VSCodeの統合シェルでもOKでした。
ただし、PowerShell ISEだとMFA Codeを入力する間もなくエラーになりました。
試行錯誤したところ、下記のようにすれば大丈夫なようです。
$targetrole = Get-AWSCredential -ProfileName AdminRole
$role = Use-STSRole -RoleArn $targetrole.RoleArn -RoleSessionName $targetrole.RoleSessionName -ProfileName Default -SerialNumber $targetrole.Options.MfaSerialNumber -TokenCode (Read-Host "MFA Code")
Get-EC2Instance -Credential $role.Credentials
取得したクレデンシャルをデフォルト指定する方法をご存知の方は教えてください。