AWS Tools for PowerShell の AWS STS リクエストでハマった話
こんにちは。テクニカルサポートチームのShiinaです。
はじめに
一時的に別のロールに AssumeRole して取得したクレディンシャルを利用して S3 など必要サービスにアクセスしたい場合があると思います。
Assume Role によるクレデンシャル取得は AWS Tools for PowerShell でも利用することができます。
クレデンシャル取得方法については以下をご参照ください。
Use-STSRole コマンドを利用したところ、リモートサーバーに接続できないエラーでハマってしまいました。。
原因と対処方法についてご紹介します。
前提
- インターネットへのルートがないプライベートサブネット上で EC2 インスタンスを利用している。
- STS サービスの VPC エンドポイントを利用している。
困っていた事象
AWS Tools for PowerShell の Use-STSRole コマンドを利用したところ、次のエラーメッセージが返されました。
PS C:\Users\Administrator> Use-STSRole -RoleSessionName "s3-access-role" -RoleArn "arn:aws:iam::xxxxxxxxxxxx:role/s3-read-only-role" -Region ap-northeast-1
Use-STSRole : Name resolution failure attempting to reach service in region ap-northeast-1 (as supplied to the -Region
parameter or from configured shell default).
リモート サーバーに接続できません。.
Possible causes:
- The region may be incorrectly specified (did you specify an availability zone?).
- The service may not be available in the region.
- No network connectivity.
See https://docs.aws.amazon.com/general/latest/gr/rande.html for the latest service availability across the AWS regions
.
発生場所 行:1 文字:1
+ Use-STSRole -RoleSessionName "s3-access-role" -RoleArn "arn:aws:iam:: ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (Amazon.PowerShe...seSTSRoleCmdlet:UseSTSRoleCmdlet) [Use-STSRole]、Inv
alidOperationException
+ FullyQualifiedErrorId : System.Exception,Amazon.PowerShell.Cmdlets.STS.UseSTSRoleCmdlet
AWS STS のリクエスト通信に失敗したようなメッセージに見えます。
切り分けのため、EC2 インスタンスから東京リージョンに作成した STS サービスの VPC エンドポイントに対する名前解決および TCP のコネクションを確認してみます。
確認には nslookup コマンドと Test-NetConnection コマンドを利用しました。
PS C:\Users\Administrator> nslookup sts.ap-northeast-1.amazonaws.com
サーバー: ip-10-0-0-2.ap-northeast-1.compute.internal
Address: 10.0.0.2
権限のない回答:
名前: sts.ap-northeast-1.amazonaws.com
Address: 10.0.2.228
PS C:\Users\Administrator> Test-NetConnection 10.0.2.228 -Port 443
ComputerName : 10.0.2.228
RemoteAddress : 10.0.2.228
RemotePort : 443
InterfaceAlias : イーサネット 3
SourceAddress : 10.0.2.223
TcpTestSucceeded : True
東京リージョンに作成したSTSサービスのVPCエンドポイントに対しての通信は問題はなさそうです。
原因
AWS Tools for PowerShell はデフォルトとして AWS STS のリクエストはグローバルエンドポイントである「https://sts.amazonaws.com」に送信されます。
デフォルトでは、 AWS Security Token Service (AWS STS) はグローバルサービスとして使用でき、 AWS STS すべてのリクエストはの 1
https://sts.amazonaws.com
つのエンドポイントに送信されます。
AWS STS のリクエストを東京リージョンのリージョナルエンドポイントである「https://sts.ap-northeast-1.amazonaws.com」に送信するためには、一工夫する必要がありました。
具体的には EndpointUrl パラメータでSTSのエンドポイントURLを指定するか、AWS_STS_REGIONAL_ENDPOINTS 環境変数を利用する必要があります。
やってみた
EndpointUrl パラメータを指定する方法
EndpointUrl パラメータを追加した Use-STSRole コマンドを実行してみます。
PS C:\Users\Administrator> Use-STSRole -RoleSessionName "s3-access-role" -RoleArn "arn:aws:iam::xxxxxxxxxxxx:role/s3-read-only-role" -Region ap-northeast-1 -EndpointUrl "https://sts.ap-northeast-1.amazonaws.com"
AssumedRoleUser Credentials PackedPolicySize SourceIdentit
y
--------------- ----------- ---------------- -------------
Amazon.SecurityToken.Model.AssumedRoleUser Amazon.SecurityToken.Model.Credentials 0
応答がありました!
AWS_STS_REGIONAL_ENDPOINTS 環境変数を利用する方法
AWS_STS_REGIONAL_ENDPOINTS 環境変数を利用する場合の注意点として、環境変数は他の AWS SDK との互換性があります。
他の AWS SDK を利用している場合は設定が反映されてしまうので、EndpointUrl パラメータを指定する方法をオススメします。
システム環境変数に追加してみます。
Windows のシステムの設定画面にて詳細情報を選択し、システムの詳細設定をクリックします。
システムのプロパティの詳細設定タブから環境変数を選択します。
システム環境変数側の新規ボタンを選択します。
次の変数名と変数値を入力して OK ボタンを選択します。
- 変数名:AWS_STS_REGIONAL_ENDPOINTS
- 変数値:regional
EndpointUrl パラメータを含めずに Use-STSRole コマンドを実行してみます。
PS C:\Users\Administrator> Use-STSRole -RoleSessionName "s3-access-role" -RoleArn "arn:aws:iam::xxxxxxxxxxxx:role/s3-read-only-role" -Region ap-northeast-1
AssumedRoleUser Credentials PackedPolicySize SourceIdentity
--------------- ----------- ---------------- --------------
Amazon.SecurityToken.Model.AssumedRoleUser Amazon.SecurityToken.Model.Credentials 0
応答がありました!
まとめ
AWS Tools for PowerShell の Use-STSRole コマンドでハマった件について紹介しました。
AWS STS のリクエストはデフォルトとしてグローバルエンドポイントを利用するため、ご注意ください!
最後までご覧いただきありがとうございました。
本記事が誰かのお役に立てれば幸いです。
参考