【AWS SDK for .NET】クレデンシャルとリージョンのハンドリングのアップデート
AWS Tools for Windows PowerShellとAWS SDK for .NETのバージョン3.1.73.0 (AWS SDK.Core バージョン 3.1.6.0)ではSDKアプリケーションやPowerShellスクリプトにクレデンシャルやリージョンデータを提供するための機能強化がされて、自分のSDKアプリケーションでSAMLフェデレーションによるクレデンシャルを利用することができるようになりました。さらにAmazon EC2インスタンスメタデータのクエリと自分のコードからの利用のサポートをリファクタリングしています。この変更についてみていきましょう。
SDKアップデート
クレデンシャルのハンドリング
2015年に、AWS PowerShellコマンドレットでSAMLフェデレーションのクレデンシャルの利用をサポートしました。(AWS Tools for Windows PowerShellでフェデレーションによるユーザーを新規サポートを参照してください) SDKを拡張してそれを使用して書かれたアプリケーションからもこの記事で解説しているSAMLロールプロファイルを利用できるようになりました。アプリケーションでこの機能を使用するためには、はじめにロールプロファイルをセットアップする必要があります。そして、ほかのクレデンシャルプロファイルと同様に、アプリケーションのapp.config/web.configファイルのプロファイルでAWSProfileNameのappsettingキーを参照するだけですみます。AWSクレデンシャルを取得するSAMLサポートにはSDKのセキュリティトークンサービスのアセンブリ(AWSSDK.SecurityToken.dll)がふくまれ、実行時にロードされます。アプリケーションの実行時にアセンブリが利用可能であることを確認してください。
さらに AWS_ACCESS_KEY_ID
と AWS_SECRET_ACCESS_KEY
環境変数(ほかのAWS SDKで使用されているのと同じ環境変数)からのクレデンシャルの読み取りをサポートするようにSDKがアップデートされています。 レガシーサポートのために、 AWS_SECRET_KEY
変数はまだサポートされています。
クレデンシャルがサービスクライアントのコンストラクターとして提供されなければ、SDKは使用するセットを見つけるために探索をします。このリリースでは、現在の探索テストは以下のようになっています:
- 明示的にアクセスキー/シークレットアクセスキーまたはプロファイル名がアプリケーションのapp.config/web.configファイルに明示的に見つかれば、それを使用します。
- "default"という名前のクレデンシャルプロファイルがあれば、それを使用します。(このプロファイルにはAWSクレデンシャルまたはSAMLロールプロファイルがはいります)
- 環境変数にクレデンシャルがみつかれば、それを使用します。
- 最後に、インスタンスプロファイルクレデンシャルをEC2インスタンスメタデータでチェックします。
リージョンの指定
自分のSDKアプリケーションでAWSサービスクライアントをインスタンス化するときにリージョンをセットするには、2つのオプションをつかう必要がありました:システム名(たとえば、'us-east-1')または RegionEndpoint
ヘルパープロパティ(たとえば、 RegionEndpoint.USEast
)を使用してアプリケーションコードにリージョンをハードコードするかAWSRegion appsettingキーを使用してアプリケーションのapp.config/web.configファイルでリージョンのシステム名を指定します。SDKがアップデートされて、環境変数またはコードがEC2インスタンス上で動作していればインスタンスメタデータからのリージョンの検出が可能になりました。
環境変数を使用してAWSリージョンをセットするには、 AWS_REGION
変数をサービスクライアントで使用したいリージョンのシステム名にセットするだけですみます。特定のクライアントでこれを上書きする必要があれば、サービスクライアントのコンストラクタに必要なリージョンを渡すだけです。 AWS_REGION
変数はほかのAWS SDKで使用できます。
EC2インスタンス上で動作させる場合は、SDKベースのアプリケーションは明示的な設定が見つからない場合EC2インスタンスメタデータからインスタンスが動作しているリージョンを自動検知します。これはapp.config/web.configファイルにリージョンをハードコードする必要なくコードをデプロイできるということを意味します。そのかわりにアプリケーションがAWSサービスのクライアントをインスタンス化するときにSDKによって自動検出させることができます。
クレデンシャルと同じように、リージョン情報がサービスクライアントのコンストラクタに提供されないと、SDKはリージョンを自動的に検出できるか探索します。現在のところ、テストの実行は以下のようになります:
- AWS Region appsettingキーがアプリケーションのapp.config/web.configファイルに存在すれば、それを使用します。
AWS_REGION
環境変数がセットされていれば、それを使用します。- EC2インスタンスメタデータを読んでインスタンスが動作しているリージョンの取得を試みます。
PowerShellアップデート
クレデンシャルのハンドリング
AWS_ACCESS_KEY_ID
と AWS_SECRET_ACCESS_KEY
環境変数を使用してコマンドレットにクレデンシャルを指定することができるようになりました。(たとえばローカルシステムアカウントなど、クレデンシャルプロファイルをセットアップするのが不便なところでユーザーアイデンティティによってコマンドレットを実行したい場合に便利です)
SAMLフェデレーションによる認証をコマンドレットの実行のために有効にしていれば、ADFSエンドポイントに対して認証リクエストをするときに Set-AWSProxy
コマンドレットを使用して構成されたプロキシデータの使用をサポートしています。以前は、プロキシはマシン全体のレベルでセットする必要がありました。
AWSコマンドレットを実行するとき、以下のような一連のテストでクレデンシャルを取得します:
- 明示的なクレデンシャルパラメータ(たとえば、
-AccessKey
,-SecretKey
,-SessionToken
)がコマンドレットで指定されている、または-ProfileName
パラメータを使用してプロファイルが指定されている場合は、そのクレデンシャルを使用します。-ProfileName
によって指定されたプロファイルには通常のAWSクレデンシャルまたはSAMLロールプロファイルをふくむことができます。 - 現在のシェルがデフォルトクレデンシャル($StoredAWSCredentialsvariableに保持されます)によって構成されていれば、それを使用します。
- "default"という名前のクレデンシャルプロファイルが存在すれば、それを使用します。(プロファイルには通常のAWSクレデンシャルまたはSAMLロールプロファイルをふくむことができます)
- あたらしく
AWS_ACCESS_KEY_ID
/AWS_SECRET_ACCESS_KEY
環境変数がセットされれば、そこにふくまれるクレデンシャルを使用します。 - EC2インスタンスメタデータが利用可能であれば、インスタンスプロファイルのクレデンシャルを探します。
リージョンの指定
コマンドレットの -Region
パラメータ(Set-DefaultAWSRegion
を使用したまたはシェル全体のデフォルト)を使用したリージョン指定のサポートに加えて、AWSPowerShellモジュールのコマンドレットがAWS_REGION環境変数またはEC2インスタンスメタデータからリージョンを検出できるようになりました。
ユーザーによってはEC2インスタンス上でシェルをオープンするときに Initialize-AWSDefault
コマンドレットを実行します。EC2インスタンス上でこのコマンドレットをはじめて実行するときにインスタンスメタデータからリージョンを検出できるようになり、メニューからリージョンを選択するプロンプトが出ることがなくなりました。インスタンスが動作しているリージョンとは別のリージョンでAWSサービスを使用してPowerShellスクリプトを実行したい場合は、-Regionパラメータを適切な値でコマンドレットに指定することでデフォルトの検出を上書きすることができます。シェルまたはスクリプトで Set-DefaultAWSRegion
コマンドレットを使用し続けることも、それぞれのコマンドレットに -Region
パラメータを追加してインスタンスがホストされているリージョンと異なるリージョンを直接コールすることもできます。
クレデンシャルと同じように、コマンドレットが呼び出されたときに適切なリージョンを検索します:
-Region
パラメータがコマンドレットで指定されていれば、それを使用します。- 現在のシェルにデフォルトリージョン($StoredAWSRegion変数)がふくまれていれば、それを使用します。
AWS_REGION
環境変数がセットされていれば、それを使用します。- 'default'のクレデンシャルプロファイルが存在してデフォルトのリージョン値(以前
Initalize-AWSDefault
の使用によりセットされる)がふくまれていれば、それを使用します。 - EC2インスタンスメタデータが利用可能であれば、リージョンの決定のためそれを参照します。
EC2インスタンスメタデータの読み取り
SDKとPowerShell toolsがEC2インスタンスメタデータからリージョン情報を読み取るための拡張の一部として、AWSSDK.EC2.dllアセンブリからコアランタイム(AWSSDK.Core.dll)アセンブリへとメタデータリーダークラス (Amazon.EC2.Util.EC2Metadata
)のリファクタリングを行っています。
置き換えられたクラスは Amazon.Util.EC2InstanceMetadata
です。オリジナルのクラスよりEC2インスタンスメタデータを多く読み取るために追加のヘルパーメソッドがふくまれています。たとえば、インスタンスに関連付けられた動的なデータを読み取ることができるようになっています。より詳細な情報は、を参照してください。リージョン情報はインスタンスのアイデンティティドキュメントとして知られるものに保持されます。このドキュメントはJSONフォーマットです。クラスには関連するデータを展開して RegionEndpoint
インスタンスとして返される Region
というヘルパープロパティがふくまれ、自分のアプリケーションから食え利するのをとてもかんたんにします。さらにインスタンスモニタリング、シグネチャ、PKCS7データを便利なプロパティからかんたんに読み取ることもできます。
スクリプターのこともわすれてはいません!以前、PowerShellからインスタンスメタデータを読むためには、Invoke-WebRequestコマンドレットをメタデータエンドポイントに対して実行して、自分自身でデータをパースする必要がありました。AWSPowerShellモジュールはGet-EC2InstanceMetadataという専用のコマンドレットをふくむようになりました。いくつかの例です:
PS C:\Users\Administrator> Get-EC2InstanceMetadata -Category LocalIpv4 10.232.46.188 PS C:\Users\Administrator> Get-EC2InstanceMetadata -Category AvailabilityZone us-west-2a PS C:\Users\Administrator> Get-EC2InstanceMetadata -ListCategory AmiId LaunchIndex ManifestPath AncestorAmiId BlockDeviceMapping InstanceId InstanceType LocalHostname LocalIpv4 KernelId AvailabilityZone ProductCode PublicHostname PublicIpv4 PublicKey RamdiskId Region ReservationId SecurityGroup UserData InstanceMonitoring IdentityDocument IdentitySignature IdentityPkcs7 PS C:\Users\Administrator> Get-EC2InstanceMetadata -path /public-keys/0/openssh-key ssh-rsa AAAAB3N...na27jfTV keypairname
これらの新機能があなたの役に立つことを期待しています。検討するべきその他のシナリオがあればコメントでお知らせください!
(翻訳はSA渡邉(@gentaw0)が担当しました。原文はUpdates to Credential and Region Handling)
コメント