AWS Tools for PowerShell で MFAを用いたAssume Roleによるクレデンシャル取得を行なってみた

2017.03.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

好物はインフラとフロントエンドのかじわらゆたかです。

AWS CLIではAssume Roleによるクレデンシャル取得はConfigファイルに設定することで、
自動的に取得したクレデンシャルでコマンドの実行を行うことが可能です。

AWS CLIがAssumeRoleによる自動クレデンシャル取得とMFAに対応しました!

AWS Tools for PowerShellでも同様にできるだろと思ったらそんなことはなく、
自動取得の無い一昔まえに戻されたと言った内容になります。

クロスアカウントなAWS CLI処理でハマった話

AWS Tools for PowerShellでAssumeRoleによるクレデンシャル取得

AWS Tools for PowerShellのバージョンは以下のバージョンで確認を行なっています。

PS C:\> Get-AWSPowerShellVersion

AWS Tools for Windows PowerShell
Version 3.3.57.0
Copyright 2012-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.

Amazon Web Services SDK for .NET
Core Runtime Version 3.3.8.2
Copyright 2009-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.

Release notes: https://aws.amazon.com/releasenotes/PowerShell

This software includes third party software subject to the following copyrights:
- Logging from log4net, Apache License
[http://logging.apache.org/log4net/license.html]

MFAを用いない場合、AWS Tools for PowerShellでAssumeRoleによるクレデンシャル取得はAWSの公式ドキュメントに記載されている方法で取得できます。

Tools for Windows PowerShell で一時的なセキュリティ認証情報を使用する

MFAを用いてAssumeRoleから取得する場合は、以前のAWS CLIでやっていたと同様にSerialNumberとTokenCodeといったパラメータにMFAのARNとMFAの数字を入れる必要があります。

AWSの公式ドキュメントの例に付け加えると、以下のようになります。

PS C:\> $role = Use-STSRole -RoleArn arn:aws:iam::123456789012:role/MySampleRole -RoleSessionName RoleSession1 -StoredCredentials IAM-user-name -SerialNumber arn:aws:iam::987654321098:mfa/user-mfa -TokenCode 123456

あとは、$roleに取得したCredential情報が入っているので、それを用いてAWS Toolsのコマンドを実行します。

PS C:\> Get-EC2Instance -Region ap-northeast-1 -Credential $role.Credentials
(出力結果については省略します。)

まとめ

AWS Tools for PowerShellでは自動的にAssumeRoleでCredentialを自動で取得し、
コマンドを実行すると言った事はまだできない模様です。

今回の記事の用に、実行前にクレデンシャルを取得すると言った事は行えるため、
AssumeRoleすることができないわけではないのですが、
AWS CLIに比べると一手間かかってしまうと言った事になります。  

また、AWS SDK for .NETのissue等も見ては見ましたが、
AWS CLIの用に自動で取得するといった流れはまだ無さそうでした。

参考

AWS Security Token Service: Use-STSRole Cmdlet Cmdlet | AWS Tools for PowerShell