« Amazon Elasticsearch ServiceでElasticsearchのバージョンを1.5から2.3に移行する方法 | メイン | AWS Black Belt Online Seminar「公共分野でAWSを活用する方法」の資料公開 »

【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_IDAWS_SECRET_ACCESS_KEY環境変数(ほかのAWS SDKで使用されているのと同じ環境変数)からのクレデンシャルの読み取りをサポートするようにSDKがアップデートされています。 レガシーサポートのために、 AWS_SECRET_KEY変数はまだサポートされています。

クレデンシャルがサービスクライアントのコンストラクターとして提供されなければ、SDKは使用するセットを見つけるために探索をします。このリリースでは、現在の探索テストは以下のようになっています:

  1. 明示的にアクセスキー/シークレットアクセスキーまたはプロファイル名がアプリケーションのapp.config/web.configファイルに明示的に見つかれば、それを使用します。
  2. "default"という名前のクレデンシャルプロファイルがあれば、それを使用します。(このプロファイルにはAWSクレデンシャルまたはSAMLロールプロファイルがはいります)
  3. 環境変数にクレデンシャルがみつかれば、それを使用します。
  4. 最後に、インスタンスプロファイルクレデンシャルを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はリージョンを自動的に検出できるか探索します。現在のところ、テストの実行は以下のようになります:

  1. AWS Region appsettingキーがアプリケーションのapp.config/web.configファイルに存在すれば、それを使用します。
  2. AWS_REGION環境変数がセットされていれば、それを使用します。
  3. EC2インスタンスメタデータを読んでインスタンスが動作しているリージョンの取得を試みます。

PowerShellアップデート

クレデンシャルのハンドリング

AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY環境変数を使用してコマンドレットにクレデンシャルを指定することができるようになりました。(たとえばローカルシステムアカウントなど、クレデンシャルプロファイルをセットアップするのが不便なところでユーザーアイデンティティによってコマンドレットを実行したい場合に便利です)

SAMLフェデレーションによる認証をコマンドレットの実行のために有効にしていれば、ADFSエンドポイントに対して認証リクエストをするときに Set-AWSProxyコマンドレットを使用して構成されたプロキシデータの使用をサポートしています。以前は、プロキシはマシン全体のレベルでセットする必要がありました。

AWSコマンドレットを実行するとき、以下のような一連のテストでクレデンシャルを取得します:

  1. 明示的なクレデンシャルパラメータ(たとえば、-AccessKey, -SecretKey, -SessionToken)がコマンドレットで指定されている、または -ProfileNameパラメータを使用してプロファイルが指定されている場合は、そのクレデンシャルを使用します。 -ProfileNameによって指定されたプロファイルには通常のAWSクレデンシャルまたはSAMLロールプロファイルをふくむことができます。
  2. 現在のシェルがデフォルトクレデンシャル($StoredAWSCredentialsvariableに保持されます)によって構成されていれば、それを使用します。
  3. "default"という名前のクレデンシャルプロファイルが存在すれば、それを使用します。(プロファイルには通常のAWSクレデンシャルまたはSAMLロールプロファイルをふくむことができます)
  4. あたらしく AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY環境変数がセットされれば、そこにふくまれるクレデンシャルを使用します。
  5. EC2インスタンスメタデータが利用可能であれば、インスタンスプロファイルのクレデンシャルを探します。

リージョンの指定

コマンドレットの -Regionパラメータ(Set-DefaultAWSRegionを使用したまたはシェル全体のデフォルト)を使用したリージョン指定のサポートに加えて、AWSPowerShellモジュールのコマンドレットがAWS_REGION環境変数またはEC2インスタンスメタデータからリージョンを検出できるようになりました。

ユーザーによってはEC2インスタンス上でシェルをオープンするときに Initialize-AWSDefaultコマンドレットを実行します。EC2インスタンス上でこのコマンドレットをはじめて実行するときにインスタンスメタデータからリージョンを検出できるようになり、メニューからリージョンを選択するプロンプトが出ることがなくなりました。インスタンスが動作しているリージョンとは別のリージョンでAWSサービスを使用してPowerShellスクリプトを実行したい場合は、-Regionパラメータを適切な値でコマンドレットに指定することでデフォルトの検出を上書きすることができます。シェルまたはスクリプトで Set-DefaultAWSRegionコマンドレットを使用し続けることも、それぞれのコマンドレットに -Regionパラメータを追加してインスタンスがホストされているリージョンと異なるリージョンを直接コールすることもできます。

クレデンシャルと同じように、コマンドレットが呼び出されたときに適切なリージョンを検索します:

  1. -Regionパラメータがコマンドレットで指定されていれば、それを使用します。
  2. 現在のシェルにデフォルトリージョン($StoredAWSRegion変数)がふくまれていれば、それを使用します。
  3. AWS_REGION環境変数がセットされていれば、それを使用します。
  4. 'default'のクレデンシャルプロファイルが存在してデフォルトのリージョン値(以前 Initalize-AWSDefaultの使用によりセットされる)がふくまれていれば、それを使用します。
  5. 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

コメント

Twitter, Facebook

このブログの最新情報はTwitterFacebookでもお知らせしています。お気軽にフォローください。

2018年4 月

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30