aws sdk for sdk for .net 開発者ガイド aws identity and access management (iam) の例 91 iam...

144
AWS SDK for .NET 開発者ガイド AWS SDK for .NET: 開発者ガイド Copyright © 2018 Amazon Web Services, Inc. and/or its affiliates. All rights reserved.

Upload: lyngoc

Post on 03-Apr-2018

348 views

Category:

Documents


19 download

TRANSCRIPT

AWS SDK for .NET開発者ガイド

AWS SDK for .NET: 開発者ガイドCopyright © 2018 Amazon Web Services, Inc. and/or its affiliates. All rights reserved.

AWS SDK for .NET 開発者ガイド

Amazon's trademarks and trade dress may not be used in connection with any product or service that is not Amazon's, in any mannerthat is likely to cause confusion among customers, or in any manner that disparages or discredits Amazon. All other trademarks notowned by Amazon are the property of their respective owners, who may or may not be affiliated with, connected to, or sponsored byAmazon.

AWS SDK for .NET 開発者ガイド

Table of ContentsAWS SDK for .NET Developer Guide ................................................................................................... 1

SDK の内容 ............................................................................................................................... 1このガイドの使い方 .................................................................................................................... 1サポートされるサービスと変更履歴 ............................................................................................... 2

AWS SDK for .NET の開始方法 ............................................................................................................ 3AWS のアカウントと認証情報を作成する ....................................................................................... 3

AWS アカウントへのサインアップ ........................................................................................ 3IAM ユーザーの作成 ............................................................................................................ 3

.NET 開発環境をインストールする ................................................................................................ 4必須 .................................................................................................................................. 4

AWSSDK アセンブリをインストールする ...................................................................................... 5AWS SDK for .NET のインストール ...................................................................................... 5NuGet を使用した AWSSDK アセンブリのインストール .......................................................... 5

新しいプロジェクトを開始する ..................................................................................................... 6AWS SDK for .NET でサポートされているプラットフォーム ............................................................. 7

.NET Framework 4.5 ........................................................................................................... 7

.NET Framework 3.5 ........................................................................................................... 7

.NET Core ......................................................................................................................... 7ポータブルクラスライブラリ ................................................................................................ 7Unity のサポート ................................................................................................................ 7詳細 .................................................................................................................................. 7

AWS SDK for .NET によるプログラミング ............................................................................................. 8AWS SDK for .NET アプリケーションの設定 .................................................................................. 8

.NET Core を使用した AWS SDK for .NET の設定 ................................................................... 9AWS 認証情報の設定 ........................................................................................................ 11AWS リージョンの選択 ..................................................................................................... 20他のアプリケーションパラメータの設定 ............................................................................... 21AWS SDK for .NET の設定ファイルリファレンス .................................................................. 27

.NET の Amazon Web Services 非同期 API .................................................................................. 35.NET Framework 4.5、Windows ストア、および Windows Phone 8 の非同期 API ....................... 35.NET Framework 3.5 の非同期 API ...................................................................................... 35

再試行とタイムアウト ............................................................................................................... 41再試行 ............................................................................................................................. 42タイムアウト .................................................................................................................... 42例 ................................................................................................................................... 42

AWS SDK for .NET バージョン 3 へのコードの移行 ..................................................................... 43AWS SDK for .NET のバージョンについて ........................................................................... 43SDK のアーキテクチャの再設計 .......................................................................................... 43重要な変更 ....................................................................................................................... 43

コードの例 ....................................................................................................................................... 45AWS CloudFormation の例 ........................................................................................................ 45Amazon DynamoDB の例 ........................................................................................................... 46

低レベルモデル ................................................................................................................. 46ドキュメントモデル .......................................................................................................... 48オブジェクト永続性モデル ................................................................................................. 50詳細 ................................................................................................................................ 51Amazon DynamoDB と AWS SDK for .NET での式の使用 ....................................................... 52AWS SDK for .NET を使用した Amazon DynamoDB での JSON のサポート .............................. 61Amazon DynamoDB を使用した ASP.NET セッション状態の管理 ........................................... 63

Amazon EC2 例 ....................................................................................................................... 66Amazon EC2 インスタンスの例 .......................................................................................... 66Amazon EC2 スポットインスタンスの例 ............................................................................. 84

Amazon Glacier の例 ................................................................................................................. 89プログラミングモデル ....................................................................................................... 89

iii

AWS SDK for .NET 開発者ガイド

AWS Identity and Access Management (IAM) の例 ........................................................................ 91IAM アカウントエイリアスの管理 ....................................................................................... 92IAM ユーザーの管理 ......................................................................................................... 94IAM アクセスキーの管理 ................................................................................................... 97IAM ポリシーの使用 ....................................................................................................... 100IAM サーバー証明書の使用 .............................................................................................. 104IAM アカウント情報の一覧表示 ......................................................................................... 106IAM ロールを使用したアクセス権限の付与 ......................................................................... 107

Amazon Route 53 の例 ............................................................................................................ 111AWS SDK for .NET を使用した Amazon Simple Storage Service のプログラミング ........................... 116Amazon Simple Notification Service (Amazon SNS) の例 .............................................................. 116Amazon SQS 例 ..................................................................................................................... 118

Amazon SQS クライアントの作成 .................................................................................... 118Amazon SQS キューの作成 ............................................................................................. 119Amazon SQS のキュー URL の構築 ................................................................................. 120Amazon SQS メッセージの送信 ....................................................................................... 120Amazon SQS メッセージバッチの送信 .............................................................................. 121Amazon SQS キューからのメッセージの受信 ..................................................................... 121Amazon SQS キューからのメッセージ削除 ........................................................................ 122Amazon SQS でのロングポーリングの有効化 ..................................................................... 123Amazon SQS キューの使用 ............................................................................................. 124Amazon SQS デッドレターキューの使用 ........................................................................... 125

Amazon CloudWatch の例 ....................................................................................................... 126Amazon CloudWatch でのアラームの記述、作成、および削除 .............................................. 127Amazon CloudWatch でのアラームの使用 .......................................................................... 128Amazon CloudWatch からのメトリクスの取得 .................................................................... 130Amazon CloudWatch イベントにイベントを送信する ........................................................... 131Amazon CloudWatch Logs でのサブスクリプションフィルタの使用 ....................................... 135

AWS SDK for .NET を使用した AWS OpsWorks のプログラミング ................................................. 137AWS SDK for .NET を使用するその他の AWS のサービスのプログラミング .................................... 137

その他のリソース ............................................................................................................................ 139ドキュメント履歴 ............................................................................................................................ 140

iv

AWS SDK for .NET 開発者ガイドSDK の内容

AWS SDK for .NET Developer GuideAWS SDK for .NET を利用すると、Windows 開発者は Amazon Simple Storage Service (AmazonS3)、Amazon Elastic Compute Cloud (Amazon EC2) など、費用効果の高い、スケーラブルで信頼できるAWS のサービスを利用する .NET アプリケーションを構築できます。SDK は .NET Framework 3.5 以降をサポートする任意のプラットフォームでの開発をサポートし、Visual Studio 2010 以降を使用して SDK でアプリケーションを開発できます。

トピック• SDK の内容 (p. 1)• このガイドの使い方 (p. 1)• サポートされるサービスと変更履歴 (p. 2)

SDK の内容AWS SDK for .NET には以下のものが含まれています。

• AWS SDK for .NET の最新バージョン。• AWS SDK for .NET のこれまでのすべてのメジャーバージョン。• 複数の AWS のサービスで AWS SDK for .NET を使用する方法を示すサンプルコード。

インストールを簡単にするため、AWS では AWS Tools for Windows が提供されています。これはWindows インストールパッケージであり、次のものが含まれます。

• AWS SDK for .NET• AWS Tools for Windows PowerShell (「Tools for Windows PowerShell User Guide」を参照)• AWS Toolkit for Visual Studio (「Toolkit for Visual Studio User Guide」を参照)

AWS Tools for Windows をインストールする代わりに、NuGet を使用して、特定のアプリケーションプロジェクト用の個々の AWSSDK サービスアセンブリをダウンロードすることもできます。詳細については、「NuGet を使用した AWSSDK アセンブリのインストール (p. 5)」を参照してください。

Note

アプリケーションの実装には、Visual Studio Professional 2010 以降を使用することをお勧めします。

このガイドの使い方AWS SDK for .NET 開発者ガイドでは、AWS SDK for .NET を使用して AWS のアプリケーションを実装する方法が説明されており、以下が含まれます。

.NET 用 AWS SDK 入門 (p. 3)

AWS SDK for .NET をインストールして設定する方法。以前に AWS SDK for .NET を使用していないか、設定に問題がある場合は、ここから開始する必要があります。

1

AWS SDK for .NET 開発者ガイドサポートされるサービスと変更履歴

AWS SDK for .NET によるプログラミング (p. 8)

すべての AWS のサービスに適用される、AWS SDK for .NET を使用してアプリケーションを実装するための基本事項。このセクションでは、コードを最新バージョンの AWS SDK for .NET に移行する方法と、前のバージョンと最新バージョンの違いについても説明しています。

コードの例 (p. 45)

AWS SDK for .NET を使用して特定の AWS のサービスのアプリケーションを作成する方法を示す一連のチュートリアル、手順、および例。

その他のリソース (p. 139)

AWS と AWS SDK for .NET に関して、このガイドには含まれていない重要な情報を提供するその他のリソース。

関連ドキュメントの AWS SDK for .NET API リファレンスには、各名前空間とクラスの詳細な説明が示されています。

サポートされるサービスと変更履歴AWS SDK for .NET はほとんどの AWS インフラストラクチャ製品をサポートしており、その他のサービスも頻繁に追加されています。SDK によってサポートされる AWS サービスの一覧については、SDKREADME ファイルを参照してください。

特定のリリースでの変更点については、SDK 変更ログを参照してください。

2

AWS SDK for .NET 開発者ガイドAWS のアカウントと認証情報を作成する

AWS SDK for .NET の開始方法AWS SDK for .NET の使用を開始するには、以下のタスクを完了します。

トピック• AWS のアカウントと認証情報を作成する (p. 3)• .NET 開発環境をインストールする (p. 4)• AWSSDK アセンブリをインストールする (p. 5)• 新しいプロジェクトを開始する (p. 6)• AWS SDK for .NET でサポートされているプラットフォーム (p. 7)

AWS のアカウントと認証情報を作成するAWS SDK for .NET を使用して AWS にアクセスするには、AWS アカウントと AWS 認証情報が必要です。AWS アカウントのセキュリティを高めるため、IAM ユーザーを使用して、ルートアカウント認証情報を使用する代わりにアクセス認証情報を提供することをお勧めします。

Note

IAM ユーザーの概要と、IAM ユーザーがアカウントのセキュリティにとって重要である理由については、IAM User Guide の「ID 管理の概要: ユーザー」を参照してください。

AWS アカウントへのサインアップサインアップして AWS アカウントを作成するには

1. http://aws.amazon.com/ を開いて、[Sign Up] をクリックします。2. 画面上の指示に従ってください。サインアップ手順の一環として、通話呼び出しを受け取り、電話の

キーパッドを用いて PIN を入力することが求められます。

次に、IAM ユーザーを作成し、そのシークレットアクセスキーをダウンロード (またはコピー) します。AWS SDK for .NET を使用するには、アクセスキーとシークレットキーで構成される有効な AWS 認証情報のセットが必要です。これらのキーは、プログラムによるウェブサービスリクエストに署名し、リクエストが承認されたソースから送られたことを AWS で確認するために使用されます。アカウントを作成するときに、アカウント認証情報のセットを取得できます。ただし、これらの認証情報は AWS SDKfor .NET で使用しないことをお勧めします。その代わり、1 人以上の IAM ユーザーを作成し、それらの認証情報を使用します。Amazon EC2 インスタンスで実行するアプリケーションでは、IAM ロールを使用して一時認証情報を提供できます。

IAM ユーザーの作成IAM ユーザーを作成するには

1. IAM コンソールに移動します (最初に AWS へのサインインが必要になる場合があります)。2. サイドバーの [Users] をクリックして IAM ユーザーを表示します。3. IAM ユーザーを設定していない場合は、[Create New Users] をクリックして作成します。

3

AWS SDK for .NET 開発者ガイド.NET 開発環境をインストールする

4. AWS にアクセスするために使用するリストで、IAM ユーザーを選択します。5. [Security Credentials] タブを開き、[Create Access Key] をクリックします。

Note

特定の IAM ユーザーに対して、最大 2 つのアクティブなアクセスキーを持つことができます。IAM ユーザーがすでに 2 つのアクセスキーを持っている場合、新しいキーを作成する前にその 1 つを削除する必要があります。

6. 表示されるダイアログボックスで、[Download Credentials] をクリックして認証情報ファイルをコンピューターにダウンロードするか、[Show User Security Credentials] をクリックして IAM ユーザーのアクセスキー ID とシークレットアクセスキーを表示します (これはコピーして貼り付けることができます)。

Important

ダイアログを閉じた後でシークレットアクセスキーを取得することはできません。ただし、関連するアクセスキー ID を削除して、新しい ID を作成することはできます。

次に、AWS 共有認証情報ファイルまたは環境で、認証情報を設定します。

認証情報を処理するための推奨の手法として、SDK Store で認証情報のセットごとにプロファイルを作成します。次に、AWS Toolkit for Visual Studio、PowerShell コマンドレット、または AWS SDK for .NETを使ってプログラムでプロファイルを作成し、管理できます。これらの認証情報は暗号化され、すべてのプロジェクトから分離して保存されます。次に、アプリケーションでプロファイルを名前で参照します。認証情報は構築時に挿入されます。この手法を使用すれば、認証情報が公開サイトのプロジェクトと共に意図せずに公開されることはありません。詳細については、「Setting Up the AWS Toolkit for VisualStudio」および「AWS 認証情報の設定 (p. 11)」を参照してください。

認証情報の管理の詳細については、「AWS アクセスキーを管理するためのベストプラクティス」を参照してください。

いつでも現在のアカウントアクティビティを確認し、アカウントを管理するには、http://aws.amazon.comで [My Account/Console] を選択できます。

.NET 開発環境をインストールするAWS SDK for .NET をインストールするには、以下のものをインストールする必要があります。

必須• Microsoft .NET Framework 3.5 以降• Microsoft Visual Studio 2010 以降

Note

アプリケーションの実装には、Visual Studio Professional 2010 以降を使用することをお勧めします。

AWS SDK for .NET は AWS Toolkit for Visual Studio と共にインストールされます。これは、Visual Studioから AWS リソースを管理するためのユーザーインターフェイスを提供するプラグインであり、AWSTools for Windows PowerShell も含みます。AWS SDK for .NET および AWS Toolkit for Visual Studio をインストールする方法については、「AWS Toolkit for Visual Studio のセットアップ」を参照してください。

詳細については、「Using the AWS Toolkit for Visual Studio」を参照してください。

4

AWS SDK for .NET 開発者ガイドAWSSDK アセンブリをインストールする

AWSSDK アセンブリをインストールするAWS SDK for .NET をインストールするか、NuGet を使用して AWS のアセンブリをインストールすることで、AWSSDK アセンブリをインストールできます。

AWS SDK for .NET のインストール以下の手順では、AWS SDK for .NET、AWS Toolkit for Visual Studio、および Tools for WindowsPowerShell を含む AWS SDK for .NET をインストールする方法を説明します。

Note

AWS SDK for .NET は GitHub でも入手できます。

AWS SDK for .NET をインストールするには

1. AWS SDK for .NET にアクセスします。2. [Downloads] セクションで [Download MSI Installer] を選択してインストーラをダウンロードします。3. インストールを開始するには、ダウンロードしたインストーラを実行し、画面の手順に従います。

Note

デフォルトでは、AWS SDK for .NET は Program Files ディレクトリにインストールされ、これには管理者権限が必要です。管理者以外として AWS SDK for .NET をインストールするには、別のインストールディレクトリを選択します。

4. (オプション) NuGet を使用して個別の AWSSDK サービスアセンブリ、およびセッション状態プロバイダと追跡リスナーが含まれている AWS SDK for .NET の拡張機能をインストールできます。詳細については、「NuGet を使用した AWSSDK アセンブリのインストール (p. 5)」を参照してください。

NuGet を使用した AWSSDK アセンブリのインストールNuGet は .NET プラットフォームのパッケージ管理システムです。NuGet を使用すると、AWSSDK アセンブリと、TraceListener および SessionProvider 拡張機能を、アプリケーションに追加できます。

NuGet には常に AWSSDK アセンブリの最新バージョンが含まれていて、以前のバージョンをインストールすることもできます。NuGet はアセンブリ間の依存関係を認識し、必要なすべてのアセンブリを自動的にインストールします。NuGet を使用してインストールしたアセンブリは、Program Files ディレクトリなどの一元的な場所ではなく、ソリューションと一緒の場所に保存されます。これにより、その他のアプリケーションの互換性問題を発生させることなく、特定のアプリケーションに固有のアセンブリバージョンをインストールすることができます。NuGet の詳細については、NuGet のドキュメントを参照してください。

NuGet は、Visual Studio 2010 以降で自動的にインストールされます。以前のバージョンの Visual Studioを使用している場合は、MSDN の Visual Studio ギャラリーから NuGet を インストールできます。

NuGet は、ソリューションエクスプローラーまたはパッケージマネージャーコンソールから使用できます。

NuGet の AWSSDK パッケージNuGet のウェブサイトでは、NuGet で使用できるすべてのパッケージのページが提供されています。各パッケージのページには、パッケージマネージャーコンソールを使用してパッケージをインストールするためのサンプルコマンドラインが含まれています。各ページには、NuGet を通じて利用できるパッケージ

5

AWS SDK for .NET 開発者ガイド新しいプロジェクトを開始する

の以前のバージョンのリストも含まれています。NuGet から使用できる AWSSDK パッケージのリストについては、「AWSSDK Packages」を参照してください。

ソリューションエクスプローラーからの NuGet の使用ソリューションエクスプローラーから NuGet を使用するには

1. ソリューションエクスプローラーで、プロジェクトを右クリックして、コンテキストメニューの[NuGet パッケージの管理] を選択します。

2. [NuGet パッケージの管理] ダイアログボックスの左ペインで、[オンライン] を選択します。次に、右上の検索ボックスを使用して、インストールするパッケージを検索できます。

次の図は、[AWSSDK - Core Runtime] アセンブリパッケージを示しています。このパッケージにAWSSDK.Core アセンブリパッケージへの依存関係があることを NuGet が認識していることがわかります。AWSSDK.Core パッケージがインストールされていない場合は、NuGet によって自動的にインストールされます。

パッケージマネージャーコンソールからの NuGet の使用Visual Studio でパッケージマネージャーコンソールから NuGet を使用するには

• Visual Studio 2010

[ツール] メニューから [ライブラリ パッケージ マネージャー] を選択し、[パッケージ マネージャー コンソール] を選択します。

• Visual Studio 2012 以降

[ツール] メニューから [Nuget パッケージ マネージャー] を選択し、[パッケージ マネージャー コンソール] を選択します。

パッケージマネージャーコンソールで Install-Package コマンドを使用して、必要な AWSSDK アセンブリをインストールできます。たとえば、AWSSDK.AutoScaling アセンブリをインストールするには、次のコマンドを使用します。

PM> Install-Package AWSSDK.AutoScaling

NuGet は、AWSSDK.Core などの依存関係があるものもすべてインストールします。

以前のバージョンのパッケージをインストールするには、-Version オプションを使用して希望するパッケージのバージョンを指定します。たとえば、AWS SDK for .NET アセンブリのバージョン 3.1.0.0 をインストールするには、次のコマンドラインを使用します。

PM> Install-Package AWSSDK.Core -Version 3.1.0.0

パッケージマネージャーコンソールのコマンドの詳細については、「Package Manager ConsoleCommands (v1.3)」を参照してください。

新しいプロジェクトを開始するToolkit for Visual Studio には、さまざまな AWS のサービス用の C# プロジェクトテンプレートが含まれています。AWS のサービスを対象としたアプリケーション開発を開始する最善の方法は、テンプレートに基づいて Toolkit for Visual Studio でいずれかの例を使用することです。使用できる例のリストについては、Toolkit for Visual Studioの「AWS サービスでの作業」を参照してください。

6

AWS SDK for .NET 開発者ガイドAWS SDK for .NET でサポートされているプラットフォーム

AWS SDK for .NET でサポートされているプラットフォーム

AWS SDK for .NET には、さまざまなプラットフォームを対象とする開発者向けに、異なるアセンブリのグループが用意されています。ただし、SDK のすべての機能がそれぞれのプラットフォームで同一というわけではありません。このトピックでは、各プラットフォームでのサポートに違いについて説明します。

.NET Framework 4.5このバージョンの AWS SDK for .NET は、.NET Framework 4.5 でコンパイルされ、.NET 4.0 ランタイムで実行されます。AWS サービスクライアントは、同期または非同期の呼び出しパターンをサポートし、C# 5.0 で導入された async および await キーワードを使用します。

.NET Framework 3.5このバージョンの AWS SDK for .NET は、.NET Framework 3.5 でコンパイルされ、.NET 2.0 または .NET4.0 ランタイムで実行されます。AWS サービスクライアントは、同期または非同期の呼び出しパターンをサポートし、従来の Begin および End パターンを使用します。

Note

AWS SDK for .NET は、CLR のバージョン 2.0 でビルドされたアプリケーションで使用する場合には、連邦情報処理規格 (FIPS) に準拠していません。このような環境で FIPS 準拠の実装を代用する方法の詳細については、Microsoft のブログの「CryptoConfig」と、CLR Security チームのSecurity.Cryptography.dll の HMACSHA256 クラス (HMACSHA256Cng) を参照してください。

.NET CoreAWS SDK for .NET では、.NET Core 用に記述されたアプリケーションをサポートしています。AWS サービスクライアントは、NET Core の非同期の呼び出しパターンのみをサポートしています。これは、.NETCore 環境で非同期呼び出しのみをサポートしている Amazon S3 の TransferUtility のようなサービスクライアントの環境で構築された高レベルの抽象化の多くにも影響します。詳細については、「.NETCore を使用した AWS SDK for .NET の設定 (p. 9)」を参照してください。

ポータブルクラスライブラリAWS SDK for .NET には、ポータブルクラスライブラリの実装も含まれています。ポータブルクラスライブラリの実装では、ユニバーサル Windows プラットフォーム (UWP) や、Android と iOS の Xamarin など、複数のプラットフォームを対象にすることができます。詳細については、AWS Mobile SDK for .NETand Xamarin を参照してください。AWS サービスクライアントは、非同期の呼び出しパターンのみをサポートしています。

Unity のサポートAWS SDK for .NET では、Unity のアセンブリの生成をサポートしています。詳細については、「UnityREADME」を参照してください。

詳細• AWS SDK for .NET バージョン 3 へのコードの移行 (p. 43)

7

AWS SDK for .NET 開発者ガイドAWS SDK for .NET アプリケーションの設定

AWS SDK for .NET によるプログラミング

このセクションでは、AWS SDK for .NET を使用したソフトウェア開発に関する一般的な情報について説明します。

特定の AWS のサービス向けのソフトウェア開発については、「コード例 (p. 45)」を参照してください。

トピック• AWS SDK for .NET アプリケーションの設定 (p. 8)• .NET の Amazon Web Services 非同期 API (p. 35)• 再試行とタイムアウト (p. 41)• AWS SDK for .NET バージョン 3 へのコードの移行 (p. 43)

AWS SDK for .NET アプリケーションの設定AWS SDK for .NET アプリケーションを設定して、AWS 認証情報、ログ記録オプション、エンドポイント、または Amazon S3 を使用した署名バージョン 4 のサポートを指定できます。

アプリケーションを設定する推奨される方法としては、プロジェクトの <aws> または App.configファイルの Web.config 要素を使用します。以下の例では、AWSRegion (p. 23) およびAWSLogging (p. 22) パラメータを指定します。

<configuration> <configSections> <section name="aws" type="Amazon.AWSSection, AWSSDK.Core"/> </configSections> <aws region="us-west-2"> <logging logTo="Log4Net"/> </aws></configuration>

アプリケーションを設定するもう 1 つの方法は、プロジェクトの <appSettings> または App.configファイルの Web.config 要素を編集します。以下の例では、AWSRegion (p. 23) およびAWSLogging (p. 22) パラメータを指定します。

<configuration> <appSettings> <add key="AWSRegion" value="us-west-2"/> <add key="AWSLogging" value="log4net"/> </appSettings></configuration>

これらの設定が有効になるのは、アプリケーションが再構築された後のみです。

AWSConfigs クラスでプロパティ値を設定することによって AWS SDK for .NET アプリケーションをプログラムで設定できますが、代わりに aws 要素を使用することをお勧めします。以下の例では、AWSRegion (p. 23) および AWSLogging (p. 22) パラメータを指定します。

8

AWS SDK for .NET 開発者ガイド.NET Core を使用した AWS SDK for .NET の設定

AWSConfigs.AWSRegion = "us-west-2";AWSConfigs.Logging = LoggingOptions.Log4Net;

プログラムで定義されたパラメータは、App.config または Web.config ファイルで指定された値を上書きします。プログラムで定義されたパラメータ値は即時に有効になります。その他のパラメータ値は、新しいクライアントオブジェクトを作成した後でのみ有効になります。詳細については、「AWS 認証情報の設定 (p. 11)」を参照してください。

トピック• .NET Core を使用した AWS SDK for .NET の設定 (p. 9)• AWS 認証情報の設定 (p. 11)• AWS リージョンの選択 (p. 20)• 他のアプリケーションパラメータの設定 (p. 21)• AWS SDK for .NET の設定ファイルリファレンス (p. 27)

.NET Core を使用した AWS SDK for .NET の設定

.NET Core における最も大きな変更の 1 つは、ConfigurationManager と標準の app.config およびweb.config ファイルが削除されたことです。これらは .NET Framework および ASP.NET アプリケーションのあらゆる場所で使用されていました。従来の .NET アプリケーションの場合、AWS SDK for .NETではこの設定システムを使用して AWS の認証情報やリージョンなどを設定しているため、コードでこれを実行する必要はありません。

.NET Core の設定システムでは、あらゆる場所で任意のタイプの入力ソースが許可されています。また、設定オブジェクトは 標準の .NET アプリケーションの ConfigurationManager のようにグローバルなシングルトンではないので、AWS SDK for .NET ではここから設定を読み取ることはできません。

Note

.NET Core の設定システムの背景については、.NET Core のドキュメントの「Configuration」のトピックを参照してください。

.NET Core と併せて AWS SDK for .NET を使いやすくするために、AWSSDK.Extensions.NETCore.Setup NuGet パッケージを使用できます。これは多くの .NETCore ライブラリと同様に IConfiguration インターフェイスに拡張メソッドを追加して、AWS 設定の取得をシームレスに行えるようにします。

AWSSDK.Extensions.NETCore.Setup の使用Visual Studio で ASP.NET Core MVC アプリケーションを作成するときには、Startup.cs のコンストラクタによって設定が処理されます。さまざまな入力ソースを読み込み、ConfigurationBuilder を使用して Configuration プロパティを設定し、IConfiguration オブジェクトをビルドします。

public Startup(IHostingEnvironment env){ var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build();}

Configuration オブジェクトを使用して AWS のオプションを取得するには、まずAWSSDK.Extensions.NETCore.Setup NuGet パッケージを追加します。次に、設定ファイルにオプ

9

AWS SDK for .NET 開発者ガイド.NET Core を使用した AWS SDK for .NET の設定

ションを追加します。ConfigurationBuilder に追加されたファイルの 1 つは $"appsettings.{env.EnvironmentName}.json" であることに注意してください。プロジェクトのプロパティの [Debug] タブを見ると、このファイルが Development に設定されていることがわかります。これは設定を appsettings.Development.json ファイルに書き込むことができるため、ローカルテストの場合に非常に役に立ちます。このファイルはローカルテストの際には読み取り専用になります。EnvironmentName を Production に設定した Amazon EC2 インスタンスをデプロイするとき、このファイルは無視され、AWS SDK for .NET は Amazon EC2 インスタンス用に設定された IAM 認証情報とリージョンにフォールバックします。

以下の設定は、AWS 設定を指定するためにプロジェクトの appsettings.Development.json ファイルに追加できる値の例を示しています。

{ "AWS": { "Profile": "local-test-profile", "Region": "us-west-2" }}

ファイルで設定されている AWS オプションにコードからアクセスするには、IConfiguration に追加された GetAWSOptions 拡張メソッドを呼び出します。これらのオプションからサービスクライアントを構築するには、CreateServiceClient を呼び出します。次のコード例は、Amazon S3 サービスクライアントを作成する方法を示しています。

var options = Configuration.GetAWSOptions();IAmazonS3 client = options.CreateServiceClient<IAmazonS3>();

appsettings ファイルで指定できる値

appsettings.Development.json ファイルには次のアプリケーション設定値を設定できます。フィールド名には、以下に一覧するように大文字小文字を区別して使用する必要があります。これらの設定の詳細については、AWS.Runtime.ClientConfg クラスを参照してください。

• サービス対象• プロフィール• ProfilesLocation• SignatureVersion• RegionEndpoint• UseHttp• ServiceURL• AuthenticationRegion• AuthenticationServiceName• MaxErrorRetry• LogResponse• BufferSize• ProgressUpdateInterval• ResignRetries• AllowAutoRedirect• LogMetrics• DisableLogging• UseDualstackEndpoint

10

AWS SDK for .NET 開発者ガイドAWS 認証情報の設定

ASP.NET Core の依存関係インジェクションAWSSDK.Extensions.NETCore.Setup NuGet パッケージにも、ASP.NET Core の新しい依存関係インジェクションシステムが組み込まれています。Startup の ConfigureServices メソッドは、MVC サービスが追加されている場所です。アプリケーションが Entity Framework を使用している場合は、これが初期化される場所でもあります。

public void ConfigureServices(IServiceCollection services){ // Add framework services. services.AddMvc();}

Note

.NET Core の依存関係インジェクションの背景については、.NET Core のドキュメントのサイトを参照してください。

AWSSDK.Extensions.NETCore.Setup NuGet パッケージでは新しい拡張メソッドがIServiceCollection に追加されており、AWS サービスを依存関係インジェクションに追加するために使用できます。次のコードは、IConfiguration から読み込んだ AWS のオプションを追加して、Amazon S3 や DynamoDB をサービスのリストに追加する方法を示しています。

public void ConfigureServices(IServiceCollection services){ // Add framework services. services.AddMvc();

services.AddDefaultAWSOptions(Configuration.GetAWSOptions()); services.AddAWSService<IAmazonS3>(); services.AddAWSService<IAmazonDynamoDB>();}

ここで、MVC コントローラがコンストラクタで IAmazonS3 または IAmazonDynamoDB のいずれかをパラメータとして使用している場合、依存関係インジェクションシステムはこれらのサービスを渡します。

public class HomeController : Controller{ IAmazonS3 S3Client { get; set; }

public HomeController(IAmazonS3 s3Client) { this.S3Client = s3Client; }

...

}

AWS 認証情報の設定AWS 認証情報を安全に管理し、意図せずに認証情報が一般に公開される可能性がある手法を避ける必要があります。このトピックでは、安全性を維持するためにアプリケーションの AWS 認証情報を設定する方法について説明します。

• アカウントのルート認証情報を使用して AWS リソースにアクセスしないでください。これらの認証情報は無制限のアカウントアクセスを提供し、取り消すのが困難です。

11

AWS SDK for .NET 開発者ガイドAWS 認証情報の設定

• プロジェクトの App.config または Web.config ファイルを含めて、アプリケーションにリテラルアクセスキーを配置しないでください。これを行うと、パブリックリポジトリにプロジェクトをアップロードするなど、誤って認証情報が公開されるリスクが発生します。

Note

ここでは、AWS アカウントを作成済みであり、認証情報にアクセスできることを前提としています。作成済みでない場合は、「AWS のアカウントと認証情報を作成する (p. 3)」を参照してください。

認証情報を安全に管理するための一般的なガイドラインを次に示します。

• IAM ユーザーを作成し、AWS ルートユーザーを使用する代わりに IAM ユーザー認証情報を使用します。IAM ユーザーの認証情報は、漏洩した場合に簡単に取り消すことができます。特定のリソースとアクションのセットにユーザーを限定するポリシーを、各 IAM ユーザーに適用できます。

• アプリケーションの開発中に認証情報を管理するための推奨される手法は、IAM ユーザー認証情報のセットごとのプロファイルを SDK Store に置くことです。プレーンテキストの認証情報ファイルを使用して、認証情報を含むプロファイルを保存することもできます。次に、プロジェクトファイルに認証情報を保存するのではなく、プログラムから特定のプロファイルを参照することができます。意図せずに認証情報を公開してしまうリスクを抑えるために、SDK Store または認証情報ファイルはプロジェクトファイルとは別に保存しておく必要があります。

• Amazon Elastic Container Service (Amazon ECS) タスクにタスク用の IAM ロールを使用します。• Amazon EC2 インスタンスで実行中のアプリケーションに対して IAM ロールを使用します。• 組織外部のユーザーが利用できるアプリケーションでは、一時的な認証情報または環境変数を使用しま

す。

以下のトピックでは、AWS SDK for .NET アプリケーションの認証情報を管理する方法について説明します。安全に AWS 認証情報を管理する方法の説明については、「AWS アクセスキーを管理するためのベストプラクティス」を参照してください。

SDK Store の使用AWS SDK for .NET アプリケーションの開発中は、アプリケーションで使用する認証情報のセットごとのプロファイルを SDK Store に追加します。これにより、AWS セキュリティ認証情報が誤って公開されることを防ぎます。SDK Store は、RegisteredAccounts.json ファイルの C:\Users\<username>\AppData\Local\AWSToolkit フォルダにあります。SDK Store には次の利点があります。

• SDK Store には任意の数のアカウントから複数のプロファイルを含めることができます。• SDK Store の認証情報は暗号化され、SDK Store はユーザーのホームディレクトリに置かれます。これ

により、認証情報が誤って公開されるリスクが制限されます。• アプリケーションでそのプロファイルを名前で参照すると、関連する認証情報が実行時に参照されま

す。ソースファイルには、リテラル認証情報は含まれません。• default という名前のプロファイルを含めると、AWS SDK for .NET ではそのプロファイルが使用され

ます。これは、別のインスタンスプロファイル名を指定しない場合、または指定された名前が見つからない場合も同様です。

• SDK Store は、AWS Tools for Windows PowerShell および AWS Toolkit for Visual Studio にも認証情報を提供します。

Note

SDK Store のプロファイルは、特定ホストの特定ユーザーに固有です。これらは他のホストや他のユーザーにコピーすることはできません。そのため、SDK Store のプロファイルを本稼働アプリケーションで使用することはできません。詳細については、「認証情報とプロファイルの解決 (p. 17)」を参照してください。

12

AWS SDK for .NET 開発者ガイドAWS 認証情報の設定

SDK Store のプロファイルはいくつかの方法で管理できます。

• AWS Toolkit for Visual Studio のグラフィカルユーザーインターフェイス (GUI) を使用してプロファイルを管理します。GUI を使用して SDK Store に認証情報を追加する方法の詳細については、 AWS Toolkitfor Visual Studioの「認証情報の指定」を参照してください。

• AWS Tools for Windows PowerShell で Set-AWSCredentials コマンドレットを使用して、コマンドラインからプロファイルを管理できます。詳細については、「AWS セキュリティ認証情報の使用」を参照してください。

• Amazon.Runtime.CredentialManagement.CredentialProfile クラスを使用してプログラムからプロファイルを作成および管理できます。

次の例では、ベーシックプロファイルと SAML プロファイルを作成し、RegisterProfile メソッドを使用して SDK Store に追加する方法を示します。

プロファイルの作成と、.NET 認証情報ファイルへの保存

Amazon.Runtime.CredentialManagement.CredentialProfileOptions オブジェクトを作成し、その AccessKey および SecretKey プロパティを設定します。Amazon.Runtime.CredentialManagement.CredentialProfile オブジェクトを作成します。プロファイルと、作成した CredentialProfileOptions オブジェクトの名前を指定します。必要に応じて、プロファイルのリージョンプロパティを設定します。NetSDKCredentialsFile オブジェクトをインスタンス化し、RegisterProfile メソッドを呼び出してプロファイルを登録します。

var options = new CredentialProfileOptions{ AccessKey = "access_key", SecretKey = "secret_key"};var profile = new Amazon.Runtime.CredentialManagement.CredentialProfile("basic_profile", options);profile.Region = RegionEndpoint.USWest1;var netSDKFile = new NetSDKCredentialsFile();netSDKFile.RegisterProfile(profile);

新しいプロファイルを登録するには、RegisterProfile メソッドを使用します。アプリケーションでは通常、プロファイルごとにこのメソッドを 1 回呼び出します。

SAMLEndpoint および関連プロファイルの作成と、.NET 認証情報ファイルへの保存

Amazon.Runtime.CredentialManagement.SAMLEndpoint オブジェクトを作成します。名前とエンドポイント URI パラメータを指定します。Amazon.Runtime.CredentialManagement.SAMLEndpointManagerオブジェクトを作成します。RegisterEndpoint メソッドを呼び出して、エンドポイントを登録します。Amazon.Runtime.CredentialManagement.CredentialProfileOptions オブジェクトを作成し、その EndpointName および RoleArn プロパティを設定します。Amazon.Runtime.CredentialManagement.CredentialProfile オブジェクトを作成し、そのプロファイルと、作成した CredentialProfileOptions オブジェクトの名前を指定します。必要に応じて、プロファイルのリージョンプロパティを設定します。NetSDKCredentialsFile オブジェクトをインスタンス化し、RegisterProfile メソッドを呼び出してプロファイルを登録します。

var endpoint = new SAMLEndpoint("endpoint1", new Uri("https://some_saml_endpoint"), SAMLAuthenticationType.Kerberos);var endpointManager = new SAMLEndpointManager();endpointManager.RegisterEndpoint(endpoint);options = new CredentialProfileOptions{ EndpointName = "endpoint1",

13

AWS SDK for .NET 開発者ガイドAWS 認証情報の設定

RoleArn = "arn:aws:iam::999999999999:role/some-role"};profile = new CredentialProfile("federated_profile", options);netSDKFile = new NetSDKCredentialsFile();netSDKFile.RegisterProfile(profile);

認証情報ファイルの使用共有認証情報ファイルにプロファイルを保存することもできます。このファイルは、他の AWSSDK、AWS CLI、および AWS Tools for Windows PowerShell で使用できます。誤って認証情報が公開されるリスクを軽減するために、認証情報ファイルはプロジェクトファイルとは別に保存し、通常はユーザーのホームフォルダに置きます。認証情報ファイル中のプロファイルは平文で格納される点に注意してください。

共有認証情報ファイルのプロファイルは、2 つの方法で管理できます。

• テキストエディタを使用できます。ファイルは credentials という名前で、デフォルトの場所はユーザーのホームフォルダ内です。たとえば、ユーザー名が awsuser である場合、認証情報ファイルは C:\users\awsuser\.aws\credentials です。

認証情報ファイルのプロファイルの例は次のようになります。

[{profile_name}] aws_access_key_id = {accessKey} aws_secret_access_key = {secretKey}

For more information, see`Best Practices for Managing AWS Access Keys <http://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html>`_.

Note

default という名前のプロファイルを含めている場合、AWS SDK for .NET では、指定されたプロファイルが見つからない場合にデフォルトでそのプロファイルが使用されます。プロファイルを含む認証情報ファイルは、任意の場所に保存できます (例: C:\aws_service_credentials\credentials)。次に、プロジェクトのAWSProfilesLocation または App.config ファイルで、Web.config 属性のファイルパスを明示的に指定する必要があります。詳細については、「プロファイルの指定 (p. 18)」を参照してください。

• Amazon.Runtime.CredentialManagement 名前空間のクラスを使用して、プログラムから認証情報ファイルを管理できます。

プロファイルの作成と、共有認証情報ファイルへの保存Amazon.Runtime.CredentialManagement.CredentialProfileOptions オブジェクトを作成し、その AccessKey および SecretKey プロパティを設定します。Amazon.Runtime.CredentialManagement.CredentialProfile オブジェクトを作成します。プロファイルと、作成した CredentialProfileOptions の名前を指定します。必要に応じて、プロファイルのリージョンプロパティを設定します。Amazon.Runtime.CredentialManagement.SharedCredentialsFile オブジェクトをインスタンス化し、RegisterProfile メソッドを呼び出してプロファイルを登録します。

options = new CredentialProfileOptions{ AccessKey = "access_key", SecretKey = "secret_key"};

14

AWS SDK for .NET 開発者ガイドAWS 認証情報の設定

profile = new CredentialProfile("shared_profile", options);profile.Region = RegionEndpoint.USWest1;var sharedFile = new SharedCredentialsFile();sharedFile.RegisterProfile(profile);

新しいプロファイルを登録するには、RegisterProfile メソッドを使用します。アプリケーションでは通常、プロファイルごとにこのメソッドを 1 回呼び出します。

ソースプロファイルおよび関連するロールの継承プロファイルの作成と、認証情報ファイルへの保存

ソースプロファイルの Amazon.Runtime.CredentialManagement.CredentialProfileOptionsオブジェクトを作成し、その AccessKey および SecretKey プロパティを設定します。Amazon.Runtime.CredentialManagement.CredentialProfile オブジェクトを作成します。プロファイルと、作成した CredentialProfileOptions の名前を指定します。Amazon.Runtime.CredentialManagement.SharedCredentialsFile オブジェクトをインスタンス化し、RegisterProfile メソッドを呼び出してプロファイルを登録します。引き受けたロールプロファイルの別の Amazon.Runtime.CredentialManagement.CredentialProfileOptions オブジェクトを作成し、そのプロファイルの SourceProfile および RoleArn プロパティを設定します。引き受けたロールのAmazon.Runtime.CredentialManagement.CredentialProfile オブジェクトを作成します。プロファイルと、作成した CredentialProfileOptions の名前を指定します。

// Create the source profile and save it to the shared credentials filevar sourceProfileOptions = new CredentialProfileOptions{ AccessKey = "access_key", SecretKey = "secret_key"};var sourceProfile = new CredentialProfile("source_profile", sourceProfileOptions);sharedFile = new SharedCredentialsFile();sharedFile.RegisterProfile(sourceProfile);

// Create the assume role profile and save it to the shared credentials filevar assumeRoleProfileOptions = new CredentialProfileOptions{ SourceProfile = "source_profile", RoleArn = "arn:aws:iam::999999999999:role/some-role"};var assumeRoleProfile = new CredentialProfile("assume_role_profile", assumeRoleProfileOptions);sharedFile.RegisterProfile(assumeRoleProfile);

共有認証情報ファイルの既存のプロファイルの更新

Amazon.Runtime.CredentialManagement.SharedCredentialsFile オブジェクトを作成します。プロファイルの Region、AccessKey、SecretKey の各プロパティを設定します。TryGetProfile メソッドを呼び出します。プロファイルが存在する場合は、Amazon.Runtime.CredentialManagement.SharedCredentialsFileインスタンスを使用して RegisterProfile メソッドを呼び出し、更新されたプロファイルを登録します。

sharedFile = new SharedCredentialsFile();CredentialProfile basicProfile;if (sharedFile.TryGetProfile("basicProfile", out basicProfile)){ basicProfile.Region = RegionEndpoint.USEast1; basicProfile.Options.AccessKey = "different_access_key"; basicProfile.Options.SecretKey = "different_secret_key";

sharedFile.RegisterProfile(basicProfile);}

15

AWS SDK for .NET 開発者ガイドAWS 認証情報の設定

アプリケーションでの認証情報とプロファイルへのアクセスAmazon.Runtime.CredentialManagement.CredentialProfileStoreChain クラスを使用して、.NET 認証情報ファイルまたは共有認証情報ファイルで認証情報およびプロファイルを簡単に見つけることができます。これは、.NET SDK が認証情報とプロファイルを検索する方法です。CredentialProfileStoreChainクラスは自動的に両方の認証情報ファイルを確認します。

TryGetAWSCredentials または TryGetProfile メソッドを使用して、認証情報またはプロファイルを取得できます。ProfilesLocation プロパティにより、次のように CredentialsProfileChain の動作が決まります。

1. ProfilesLocation が null 以外または空でない場合は、ProfilesLocation プロパティのディスクパスで共有認証情報ファイルを検索します。

2. ProfilesLocation が null または空で、プラットフォームが .NET 認証情報ファイルをサポートしている場合は、.NET 認証情報ファイルを検索します。プロファイルが見つからない場合は、デフォルトの場所で共有認証情報ファイルを検索します。

3. ProfilesLocation が null または空で、プラットフォームが .NET 認証情報ファイルをサポートしていない場合は、デフォルトの場所で共有認証情報ファイルを検索します。

デフォルトの場所での SDK 認証情報ファイルまたは共有認証情報ファイルからの認証情報の取得CredentialProfileStoreChain オブジェクトおよび Amazon.Runtime.AWSCredentials オブジェクトを作成します。TryGetAWSCredentials メソッドを呼び出します。プロファイル名および認証情報を返す AWSCredentials オブジェクトを指定します。

var chain = new CredentialProfileStoreChain();AWSCredentials awsCredentials;if (chain.TryGetAWSCredentials("basic_profile", out awsCredentials)){ // use awsCredentials}

デフォルトの場所での SDK 認証情報ファイルまたは共有認証情報ファイルからのプロファイルの取得CredentialProfileStoreChain オブジェクトおよびAmazon.Runtime.CredentialManagement.CredentialProfile オブジェクトを作成します。TryGetProfileメソッドを呼び出し、プロファイル名および認証情報を返す CredentialProfile オブジェクトを指定します。

var chain = new CredentialProfileStoreChain();CredentialProfile basicProfile;if (chain.TryGetProfile("basic_profile", out basicProfile)){ // Use basicProfile}

ファイルの場所での共有認証情報ファイル形式のファイルからのAWSCredentials の取得CredentialProfileStoreChain オブジェクト作成し、認証情報ファイルのパスを指定します。AWSCredentials オブジェクトを作成します。TryGetAWSCredentials メソッドを呼び出します。プロファイル名および認証情報を返す AWSCredentials オブジェクトを指定します。

var chain = new

16

AWS SDK for .NET 開発者ガイドAWS 認証情報の設定

CredentialProfileStoreChain("c:\\Users\\sdkuser\\customCredentialsFile.ini");AWSCredentials awsCredentials;if (chain.TryGetAWSCredentials("basic_profile", out awsCredentials)){ // Use awsCredentials}

SharedCredentialsFile クラスを使用して AmazonS3Client を作成する方法Amazon.Runtime.CredentialManagement.SharedCredentialsFile クラスを使用して、特定のプロファイルの認証情報を使用する AmazonS3Client オブジェクトを作成できます。AWS SDK for .NET では、プロファイルに含まれている認証情報が自動的にロードされます。これは、App.Config で指定しているprofile とは異なる特有のプロファイルを、指定したクライアントに対して使用する場合に行うことができます。

CredentialProfile basicProfile;AWSCredentials awsCredentials;var sharedFile = new SharedCredentialsFile();if (sharedFile.TryGetProfile("basic_profile", out basicProfile) && AWSCredentialsFactory.TryGetAWSCredentials(basicProfile, sharedFile, out awsCredentials)){ using (var client = new AmazonS3Client(awsCredentials, basicProfile.Region)) { var response = client.ListBuckets(); }}

デフォルトのプロファイルを使用し、AWS SDK for .NET によってデフォルトの認証情報を自動的に使用し、クライアントオブジェクトを作成するには、次のコードを使用します。

using (var client = new AmazonS3Client(RegionEndpoint.US-West2)){ var response = client.ListBuckets();}

認証情報とプロファイルの解決AWS SDK for .NET では、次の順序で認証情報が検索され、現在のアプリケーションで使用可能な最初のセットが使用されます。

1. クライアント設定、または AWS サービスクライアントに明示的に設定される内容。2. 使用可能な場合に、AWSAccessKey および AWSSecretKey AppConfig の値から作成される

BasicAWSCredentials。3. AWSConfigs.AWSProfileName の値で指定された名前を持つ認証情報プロファイル (明示的に設定、

または AppConfig で設定)。4. default 認証情報プロファイル。5. すべて空でない場合に、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、および

AWS_SESSION_TOKEN 環境変数から作成される SessionAWSCredentials。6. 両方とも空でない場合に、AWS_ACCESS_KEY_ID および AWS_SECRET_ACCESS_KEY 環境変数から作

成される BasicAWSCredentials。7. Amazon EC2 Container Service (Amazon ECS) タスクの IAM ロール8. EC2 インスタンスメタデータ。

SDK Store のプロファイルは、特定ホストの特定ユーザーに固有です。これらは他のホストや他のユーザーにコピーすることはできません。そのため、開発用マシンの SDK Store にあるプロファイルは、他

17

AWS SDK for .NET 開発者ガイドAWS 認証情報の設定

のホストや他の開発者のマシンで再利用することはできません。アプリケーションを Amazon EC2 インスタンスで実行している場合は、「AWS SDK for .NET による EC2 インスタンスでの IAM ロールの使用 (p. 107)」での説明に従って IAM ロールを使用します。それ以外の場合は、ウェブアプリケーションがサーバー上でアクセス可能な認証情報ファイルに認証情報を保存します。

プロファイルの解決2 つの異なる認証情報ファイルタイプがあるため、それを使用するように AWS SDKfor .NET および AWS Tools for Windows PowerShell を設定する方法を理解することが重要です。AWSConfigs.AWSProfilesLocation (明示的に設定または AppConfig で設定) は、AWS SDKfor .NET が認証情報プロファイルを見つける方法を制御します。-ProfileLocation コマンドラインの引数は、AWS Tools for Windows PowerShell がプロファイルを見つける方法を制御します。両方のケースでの設定の効果を次に示します。

プロファイルの場所の値 プロファイルの解決動作

null (未設定) または空 最初に、.NET 認証情報ファイル内で指定された名前のプロファイルを検索します。プロファイルが見つからない場合は、%HOME%\.aws\credentials を検索します。プロファイルが見つからない場合は、%HOME%\.aws\config を検索します。

共有認証情報ファイル形式のファイルへのパス 指定されたファイルのみを対象に、指定された名前のプロファイルを検索します。

プロファイルの指定プロファイルは、AWS SDK for .NET アプリケーションで認証情報を使用するための推奨の方法です。プロファイルの保存場所を指定する必要はありません。名前でプロファイルを参照するだけです。AWS SDKfor .NET では、前のセクションで説明したように、該当する認証情報が取得されます。

プロファイルを指定するための推奨の方法は、アプリケーションの App.config ファイルまたはWeb.config ファイルの appSettings セクションで AWSProfileName の値を定義することです。関連する認証情報は、構築プロセス中にアプリケーションに組み込まれます。

次の例では、development という名前のプロファイルを指定します。

<configuration> <appSettings> <add key="AWSProfileName" value="development"/> </appSettings></configuration>

この例では、SDK Store にプロファイルが存在している、またはデフォルトの場所に認証情報が存在すると仮定します。

プロファイルが別の場所の認証情報ファイルに保存されている場合は、<appSettings> 要素でAWSProfilesLocation 属性値を追加してその場所を指定します。次の例では、認証情報ファイルとして C:\aws_service_credentials\credentials を指定しています。

<configuration> <appSettings> <add key="AWSProfileName" value="development"/> <add key="AWSProfilesLocation" value="C:\aws_service_credentials\credentials"/> </appSettings></configuration>

18

AWS SDK for .NET 開発者ガイドAWS 認証情報の設定

プロファイルを指定するための廃止された代替方法を次に示しています。これは、すべての方法を説明するために示していますが、推奨されません。

<configuration> <configSections> <section name="aws" type="Amazon.AWSSection, AWSSDK.Core"/> </configSections> <aws profileName="development" profilesLocation="C:\aws_service_credentials\credentials"/></configuration>

<configuration> <configSections> <section name="aws" type="Amazon.AWSSection,AWSSDK.Core"/> </configSections> <aws profileName="development" profilesLocation="C:\aws_service_credentials\credentials"/></configuration>

フェデレーションユーザーアカウントの認証情報の使用

AWS SDK for .NET (AWSSDK.Core バージョン 3.1.6.0 以降) を使用するアプリケーションでは、ActiveDirectory フェデレーションサービス (AD FS) を通じてフェデレーティッドユーザーアカウントを使用し、Security Assertion Markup Language (SAML) を使用することによって AWS ウェブサービスにアクセスできます。

フェデレーティッドアクセスサポートでは、ユーザーは Active Directory を使用して認証できます。一時的な認証情報は、自動的にユーザーに許可されます。これらの一時的な認証情報は 1 時間有効であり、アプリケーションで AWS ウェブサービスを呼び出す際に使用されます。一時的な認証情報の管理は SDK によって処理します。ドメイン結合されたユーザーアカウントでは、アプリケーションが呼び出しを行ったときに資格情報の有効期限が切れている場合に、そのユーザーは自動的に再認証され、新しい認証情報が付与されます (ドメイン結合されていないアカウントでは、ユーザーは再認証の前に認証情報の入力を求められます)。

このサポートを .NET アプリケーションで使用するには、まず PowerShell コマンドレットを使用してロールプロファイルをセットアップする必要があります。方法については、AWS Tools for WindowsPowerShell のドキュメントを参照してください。

ロールプロファイルをセットアップした後に、他の認証情報のプロファイルと同様に、AWSProfileNameキーを持つアプリケーションの App.config/Web.config ファイルでそのプロファイルを参照します。

実行時にロードされる SDK Security Token Service アセンブリ (AWSSDK.SecurityToken.dll)は、AWS 認証情報を取得するための SAML サポートを提供します。このアセンブリが実行時にアプリケーションで使用できることを確認してください。

ロールまたは一時認証情報の指定

Amazon EC2 インスタンスで実行されるアプリケーションの場合、認証情報を管理する最も安全な方法は、「AWS SDK for .NET による EC2 インスタンスでの IAM ロールの使用 (p. 107)」での説明に従って、IAM ロールを使用することです。

組織外部のユーザーに対してソフトウェア実行可能ファイルが利用可能になるアプリケーションシナリオでは、一時的なセキュリティ認証情報を使用するようにソフトウェアを設計することをお勧めします。これらの認証情報は、AWS リソースへの制限されたアクセスの提供に加えて、指定された期間後に失効するという利点があります。一時的なセキュリティ認証情報の使用方法の詳細については、以下を参照してください。

• セキュリティトークンを使用して AWS リソースへの一時的なアクセス許可を付与する• Token Vending Machine を使用して AWS モバイルアプリケーションのユーザー認証を行う

19

AWS SDK for .NET 開発者ガイドAWS リージョンの選択

2 番目の記事のタイトルはモバイルアプリケーションに関するものですが、記事には、組織外でデプロイされる AWS アプリケーションにとって有用な情報が含まれています。

プロキシ認証情報の使用ソフトウェアがプロキシを介して AWS と通信する場合、サービスの AmazonS3Config クラスで ProxyCredentials プロパティを使用して、プロキシの認証情報を指定できます。たとえば、Amazon S3 の場合は次のようなコードを使用できます。ここで、{my-username} と {my-password}は、NetworkCredential オブジェクトで指定されているプロキシのユーザー名とパスワードです。

AmazonS3Config config = new AmazonS3Config();config.ProxyCredentials = new NetworkCredential("my-username", "my-password");

SDK の前のバージョンでは ProxyUsername および ProxyPassword が使用されていましたが、これらのプロパティは廃止されました。

AWS リージョンの選択AWS リージョンにより、特定の地理的リージョンに物理的に存在する AWS サービスにアクセスすることができます。これは、冗長性と、ユーザーがアクセスする場所の近くでのデータとアプリケーションの実行を維持するために有効です。RegionEndpoint クラスを使用して AWS サービスクライアントを作成するときに、リージョンを指定できます。

特定のリージョンの Amazon EC2 クライアントをインスタンス化する例を示します。

AmazonEC2Client ec2Client = new AmazonEC2Client(RegionEndpoint.USEast1);

; のリージョンは相互に分離されています。たとえば、欧州 (アイルランド) リージョンを使用して 米国東部(バージニア北部) のリソースにアクセスすることはできません。コードで複数の AWS リージョンにアクセスする必要がある場合は、各リージョンに個別のクライアントを作成することをお勧めします。

中国 (北京) リージョンでサービスを使用するには、中国 (北京) リージョン固有のアカウントと認証情報が必要です。他の AWS リージョンのアカウントと認証情報は、中国 (北京) リージョンでは使用できません。同様に、中国 (北京) リージョンのアカウントと認証情報は他の AWS リージョンでは使用できません。中国 (北京) リージョンで利用可能なエンドポイントとプロトコルの詳細については、「中国 (北京)リージョン」を参照してください。

新しい AWS のサービスは、最初にいくつかのリージョンで開始された後で、他のリージョンでサポートされます。このような場合、新しいリージョンにアクセスするために最新の SDK をインストールする必要はありません。新しく追加されたリージョンは、クライアントごと、またはグローバルに指定できます。

クライアントごとGetBySystemName を使用して、新しいリージョンのエンドポイントを作成します。

var newRegion = RegionEndpoint.GetBySystemName("us-west-new");using (var ec2Client = new AmazonEC2Client(newRegion)){ // Make a request to EC2 using ec2Client}

また、サービスクライアント設定クラスの ServiceURL プロパティを使用して、リージョンを指定することもできます。この手法は、エンドポイントリージョンが通常のエンドポイントパターンに従っていない場合でも有効です。

var ec2ClientConfig = new AmazonEC2Config

20

AWS SDK for .NET 開発者ガイド他のアプリケーションパラメータの設定

{ // Specify the endpoint explicitly ServiceURL = "https://ec2.us-west-new.amazonaws.com"};

using (var ec2Client = new AmazonEC2Client(newRegion)){ // Make a request to EC2 using ec2Client}

グローバルリージョンは 3 つの方法でグローバルに設定できます。

AWSConfigs.AWSRegion プロパティを設定できます。

AWSConfigs.AWSRegion = "us-west-new";using (var ec2Client = new AmazonEC2Client()){ // Make request to Amazon EC2 using ec2Client}

app.config ファイルの appSettings セクションで AWSRegion キーを設定できます。

<configuration> <appSettings> <add key="AWSRegion" value="us-west-2"/> </appSettings></configuration>

AWSRegion で説明するように、aws セクションで region 属性を設定できます。

<aws region="us-west-2"/>

AWS の各サービスでサポートされているすべてのリージョンおよびエンドポイントの現在のリストを確認する方法については、Amazon Web Services General Referenceの「リージョンとエンドポイント」を参照してください。

他のアプリケーションパラメータの設定認証情報の設定 (p. 11)に加えて、その他のアプリケーションパラメータを数多く設定できます。

• AWSLogging (p. 22)• AWSLogMetrics (p. 22)• AWSRegion (p. 23)• AWSResponseLogging (p. 23)• AWS.DynamoDBContext.TableNamePrefix (p. 24)• AWS.S3.UseSignatureVersion4 (p. 24)• AWSEndpointDefinition (p. 25)• AWS のサービスによって生成されたエンドポイント (p. 25)

これらのパラメータは、アプリケーションの App.config ファイルまたは Web.config ファイルで設定できます。これらは AWS SDK for .NET API でも設定できますが、アプリケーションの .config ファイルを使用することをお勧めします。ここでは、両方のアプローチについて説明します。

21

AWS SDK for .NET 開発者ガイド他のアプリケーションパラメータの設定

後で説明する <aws> エレメントの使用方法の詳細については、「AWS SDK for .NET の設定ファイルリファレンス (p. 27)」を参照してください。

AWSLoggingSDK でイベントを記録する方法を設定します。たとえば、推奨される方法は、<aws> 要素の子要素である<logging> 要素を使用することです。

<aws> <logging logTo="Log4Net"/></aws>

または:

<add key="AWSLogging" value="log4net"/>

指定できる値は以下のとおりです。

None

イベントのログ記録を無効にします。これがデフォルト値です。log4net

log4net を使用してログを記録します。SystemDiagnostics

System.Diagnostics クラスを使用してログを記録します。

コンマで区切ることで、logTo 属性に複数の値を設定できます。次の例では、.config ファイルを使用して log4net ログと System.Diagnostics ログの両方を設定します。

<logging logTo="Log4Net, SystemDiagnostics"/>

または:

<add key="AWSLogging" value="log4net, SystemDiagnostics"/>

または、AWS SDK for .NET API を使用して、LoggingOptions 列挙の値を組み合わせ、AWSConfigs.Logging プロパティを設定します。

AWSConfigs.Logging = LoggingOptions.Log4Net | LoggingOptions.SystemDiagnostics;

この設定の変更は新しい AWS クライアントインスタンスに対してのみ有効です。

AWSLogMetricsSDK でパフォーマンスメトリクスを記録するかどうかを指定します。.config ファイルでメトリクスのログを設定するには、<logging> 要素の logMetrics 属性値を設定します。これは、<aws> 要素の子要素です。

<aws> <logging logMetrics="true"/></aws>

22

AWS SDK for .NET 開発者ガイド他のアプリケーションパラメータの設定

または、<appSettings> セクションで AWSLogMetrics キーを設定します。

<add key="AWSLogMetrics" value="true">

また、AWS SDK for .NET API でメトリクスのログ記録を設定するには、AWSConfigs.LogMetrics プロパティを設定します。

AWSConfigs.LogMetrics = true;

この設定では、すべてのクライアント/設定のデフォルトの LogMetrics プロパティを設定します。この設定の変更は新しい AWS クライアントインスタンスに対してのみ有効です。

AWSRegion明示的にリージョンを指定していないクライアントのデフォルト AWS リージョンを設定します。.config ファイルでリージョンを設定する推奨される方法は、aws 要素の region 属性値を設定することです。

<aws region="us-west-2"/>

または、<appSettings> セクションの AWSRegion キーを設定します。

<add key="AWSRegion" value="us-west-2"/>

また、AWS SDK for .NET API を使ってリージョンを設定するには、AWSConfigs.AWSRegion プロパティを設定します。

AWSConfigs.AWSRegion = "us-west-2";

特定のリージョンの AWS クライアントを作成する方法の詳細については、「AWS リージョンの選択 (p. 20)」を参照してください。この設定の変更は新しい AWS クライアントインスタンスに対してのみ有効です。

AWSResponseLoggingSDK がサービス応答を記録するタイミングを設定します。指定できる値は以下のとおりです。

Never

サービス応答を記録しません。これがデフォルト値です。Always

常にサービス応答を記録します。OnError

エラーが発生したときのみサービス応答を記録します。

.config ファイルでサービス ログを設定する推奨される方法は、<logging> 要素の logResponses 属性値を設定することです。これは、<aws> 要素の子要素です。

<aws> <logging logResponses="OnError"/></aws>

23

AWS SDK for .NET 開発者ガイド他のアプリケーションパラメータの設定

または、<appSettings> セクションの AWSResponseLogging キーを設定します。

<add key="AWSResponseLogging" value="OnError"/>

また、AWS SDK for .NET API を使ってサービス記録を設定するには、AWSConfigs.ResponseLogging プロパティを ResponseLoggingOption 列挙のいずれかの値に設定します。

AWSConfigs.ResponseLogging = ResponseLoggingOption.OnError;

この設定遺体する変更はすぐに反映されます。

AWS.DynamoDBContext.TableNamePrefix手動で設定しなかった場合に DynamoDBContext で使用されるデフォルトの TableNamePrefix を設定します。

.config ファイルでテーブル名プレフィックスを設定する推奨される方法は、<dynamoDBContext> 要素の tableNamePrefix 属性値を設定することです。この要素は <dynamoDB> 要素の子要素であり、これ自体は <aws> 要素の子要素です。

<dynamoDBContext tableNamePrefix="Test-"/>

または、<appSettings> セクションで AWS.DynamoDBContext.TableNamePrefix キーを設定します。

<add key="AWS.DynamoDBContext.TableNamePrefix" value="Test-"/>

また、AWS SDK for .NET API を使ってテーブル名プレフィックスを設定するには、AWSConfigs.DynamoDBContextTableNamePrefix プロパティを設定します。

AWSConfigs.DynamoDBContextTableNamePrefix = "Test-";

この設定への変更は、DynamoDBContextConfig および DynamoDBContext の新しく構築されたインスタンスのみに有効です。

AWS.S3.UseSignatureVersion4Amazon S3 クライアントがリクエストで署名バージョン 4 の署名を使用するかどうかを設定します。

.config ファイルで Amazon S3 の署名バージョン 4 の署名を設定する推奨される方法は、<s3> 要素のuseSignatureVersion4 属性を設定することです。これは、<aws> 要素の子要素です。

<aws> <s3 useSignatureVersion4="true"/></aws>

または、<appSettings> セクションで AWS.S3.UseSignatureVersion4 キーを true に設定します。

<add key="AWS.S3.UseSignatureVersion4" value="true"/>

また、AWS SDK for .NET API を使って署名バージョン 4 の署名を設定するには、AWSConfigs.S3UseSignatureVersion4 プロパティを true に設定します。

24

AWS SDK for .NET 開発者ガイド他のアプリケーションパラメータの設定

AWSConfigs.S3UseSignatureVersion4 = true;

デフォルトでは、この設定は false ですが、一部のケースまたは一部のリージョンではデフォルトで署名バージョン 4 が使用される場合があります。設定が true の場合、すべてのリクエストに署名バージョン4 が使用されます。この設定の変更は新しい Amazon S3 クライアントインスタンスに対してのみ有効です。

AWSEndpointDefinitionSDK がリージョンとエンドポイントを定義するカスタム設定ファイルを使用するかどうかを設定します。

.config ファイルでエンドポイント定義ファイルを設定するには、<aws> 要素のendpointDefinition 属性値を設定することをお勧めします。

<aws endpointDefinition="c:\config\endpoints.json"/>

または、<appSettings> セクションの AWSEndpointDefinition キーを設定してもかまいません。

<add key="AWSEndpointDefinition" value="c:\config\endpoints.json"/>

また、AWS SDK for .NET API を使ってエンドポイント定義ファイルを設定するには、AWSConfigs.EndpointDefinition プロパティを設定します。

AWSConfigs.EndpointDefinition = @"c:\config\endpoints.json";

ファイル名が指定されていない場合、カスタム設定ファイルは使用されません。この設定の変更は新しい AWS クライアントインスタンスに対してのみ有効です。endpoint.json ファイルは、https://github.com/aws/aws-sdk-net/blob/master/sdk/src/Core/endpoints.json で確認できます。

AWS のサービスによって生成されたエンドポイント一部の AWS のサービスはリージョンのエンドポイントを使用する代わりに、独自のエンドポイントを生成します。これらのサービスのクライアントは、そのサービスおよびリソースに固有のサービス URL を使用します。これらのサービスの 2 つの例として、Amazon CloudSearch と AWS IoT があります。次の例は、これらのサービスのエンドポイントを取得する方法を示しています。

Amazon CloudSearch エンドポイントの例

Amazon CloudSearch クライアントは、Amazon CloudSearch 設定サービスにアクセスするために使用されます。Amazon CloudSearch 設定サービスを使用して、検索ドメインを作成、設定、管理します。検索ドメインを作成するには、CreateDomainRequest オブジェクトを作成し、DomainName プロパティを指定します。リクエストオブジェクトを使用して AmazonCloudSearchClient オブジェクトを作成します。CreateDomain メソッドを呼び出します。呼び出しから返される CreateDomainResponse オブジェクトには、DocService および SearchService エンドポイントの両方を持つ DomainStatus プロパティが含まれます。AmazonCloudSearchDomainConfig オブジェクトを作成し、それを使用してAmazonCloudSearchDomainClient クラスの DocService および SearchService インスタンスを初期化します。

// Create domain and retrieve DocService and SearchService endpointsDomainStatus domainStatus;using (var searchClient = new AmazonCloudSearchClient()){ var request = new CreateDomainRequest { DomainName = "testdomain"

25

AWS SDK for .NET 開発者ガイド他のアプリケーションパラメータの設定

}; domainStatus = searchClient.CreateDomain(request).DomainStatus; Console.WriteLine(domainStatus.DomainName + " created");}

// Test the DocService endpointvar docServiceConfig = new AmazonCloudSearchDomainConfig{ ServiceURL = "https://" + domainStatus.DocService.Endpoint};using (var domainDocService = new AmazonCloudSearchDomainClient(docServiceConfig)){ Console.WriteLine("Amazon CloudSearchDomain DocService client instantiated using the DocService endpoint"); Console.WriteLine("DocService endpoint = " + domainStatus.DocService.Endpoint);

using (var docStream = new FileStream(@"C:\doc_source\XMLFile4.xml", FileMode.Open)) { var upload = new UploadDocumentsRequest { ContentType = ContentType.ApplicationXml, Documents = docStream }; domainDocService.UploadDocuments(upload); }}

// Test the SearchService endpointvar searchServiceConfig = new AmazonCloudSearchDomainConfig{ ServiceURL = "https://" + domainStatus.SearchService.Endpoint};using (var domainSearchService = new AmazonCloudSearchDomainClient(searchServiceConfig)){ Console.WriteLine("Amazon CloudSearchDomain SearchService client instantiated using the SearchService endpoint"); Console.WriteLine("SearchService endpoint = " + domainStatus.SearchService.Endpoint);

var searchReq = new SearchRequest { Query = "Gambardella", Sort = "_score desc", QueryParser = QueryParser.Simple }; var searchResp = domainSearchService.Search(searchReq);}

AWS IoT エンドポイントの例AWS IoT のエンドポイントを取得するには、AmazonIoTClient オブジェクトを作成し、DescribeEndPointメソッドを呼び出します。返される DescribeEndPointResponse オブジェクトには、EndpointAddressが含まれます。AmazonIotDataConfig オブジェクトを作成し、ServiceURL プロパティを設定します。次に、このオブジェクトを使用して AmazonIotDataClient クラスをインスタンス化します。

string iotEndpointAddress;using (var iotClient = new AmazonIoTClient()){ var endPointResponse = iotClient.DescribeEndpoint(); iotEndpointAddress = endPointResponse.EndpointAddress;}

var ioTdocServiceConfig = new AmazonIotDataConfig{ ServiceURL = "https://" + iotEndpointAddress

26

AWS SDK for .NET 開発者ガイドAWS SDK for .NET の設定ファイルリファレンス

};using (var dataClient = new AmazonIotDataClient(ioTdocServiceConfig)){ Console.WriteLine("AWS IoTData client instantiated using the endpoint from the IotClient");}nstantiated using the endpoint from the IoT client");

AWS SDK for .NET の設定ファイルリファレンス.NET プロジェクトの App.config ファイルまたは Web.config ファイルを使用すると、AWS の認証情報、ログオプション、AWS サービスエンドポイント、AWS リージョンなどの AWS の設定や、AmazonDynamoDB、Amazon EC2、Amazon S3 などの AWS のサービスの一部の設定を指定できます。以下では、適切な形式の App.config ファイルまたは Web.config ファイルを使用してこれらの設定を指定する方法について説明します。

Note

App.config ファイルまたは Web.config ファイルの <appSettings> 要素を引き続き使用して AWS の設定を指定することもできますが、後で説明するように <configSections> 要素および <aws> 要素を使用することをお勧めします<appSettings> エレメントの詳細については、「<appSettings>AWS SDK for .NET アプリケーションの設定」の (p. 8) エレメントの例を参照してください。Note

次の AWSConfigs クラスプロパティをコードファイルで使用して AWS の設定を指定することはできますが、以下のプロパティは廃止されており、将来のリリースではサポートされなくなる可能性があります。

• DynamoDBContextTableNamePrefix

• EC2UseSignatureVersion4

• LoggingOptions

• LogMetrics

• ResponseLoggingOption

• S3UseSignatureVersion4

一般に、このトピックでこれから説明するように、コードファイルで AWSConfigs クラスのプロパティを使用して AWS の設定を指定するのではなく、App.config ファイルまたはWeb.config ファイルの <configSections> 要素および <aws> 要素を使用して AWS の設定を指定することをお勧めします。前記のプロパティの詳細については、「AWSConfigsAWS SDKfor .NET アプリケーションの設定」の (p. 8) のコード例を参照してください。

トピック• AWS 設定セクションの宣言 (p. 27)• 使用できる要素 (p. 28)• 要素のリファレンス (p. 29)

AWS 設定セクションの宣言AWS の設定は、App.config または Web.config ファイルの <aws> 要素内で指定します。<aws> 要素の使用を始める前に、次の例で示すように、<section> 要素(<configSections> 要素の子要素)を作成し、その name 属性を aws に、type 属性を Amazon.AWSSection, AWSSDK.Core に設定する必要があります。

<?xml version="1.0"?>

27

AWS SDK for .NET 開発者ガイドAWS SDK for .NET の設定ファイルリファレンス

<configuration> ... <configSections> <section name="aws" type="Amazon.AWSSection, AWSSDK.Core"/> </configSections> <aws> <!-- Add your desired AWS settings declarations here. --> </aws> ...</configuration>

Visual Studio のエディタでは、<aws> 要素またはその子要素の自動コード補完機能(IntelliSense)は提供されていません。

<aws> 要素を正しくフォーマットするには、Amazon.AWSConfigs.GenerateConfigTemplate メソッドを呼び出してください。このメソッドは <aws> 要素の正規バージョンを適切な文字列として出力するので、それを利用できます。以下のセクションでは、<aws> 要素の属性と子要素について説明します。

使用できる要素AWS 設定セクションで使用できる要素の間の論理的な関係を次に示します。このリストの最新バージョンは Amazon.AWSConfigs.GenerateConfigTemplate メソッドを呼び出すことによって生成できます。このメソッドは、<aws> 要素の正規バージョンをそのまま使用できる文字列として出力します。

<aws endpointDefinition="string value" region="string value" profileName="string value" profilesLocation="string value"> <logging logTo="None, Log4Net, SystemDiagnostics" logResponses="Never | OnError | Always" logMetrics="true | false" logMetricsFormat="Standard | JSON" logMetricsCustomFormatter="NameSpace.Class, Assembly" /> <dynamoDB conversionSchema="V1 | V2"> <dynamoDBContext tableNamePrefix="string value"> <tableAliases> <alias fromTable="string value" toTable="string value" /> </tableAliases> <map type="NameSpace.Class, Assembly" targetTable="string value"> <property name="string value" attribute="string value" ignore="true | false" version="true | false" converter="NameSpace.Class, Assembly" /> </map> </dynamoDBContext> </dynamoDB> <s3 useSignatureVersion4="true | false" /> <ec2 useSignatureVersion4="true | false" /> <proxy host="string value" port="1234"

28

AWS SDK for .NET 開発者ガイドAWS SDK for .NET の設定ファイルリファレンス

username="string value" password="string value" /></aws>

要素のリファレンスAWS 設定セクションで使用できる要素のリストを次に示します。各要素について、使用できる属性と親子要素が示されています。

トピック• alias (p. 29)• aws (p. 29)• dynamoDB (p. 30)• dynamoDBContext (p. 31)• ec2 (p. 31)• logging (p. 31)• map (p. 33)• property (p. 33)• proxy (p. 34)• s3 (p. 35)

alias<alias> 要素は、1 つ以上のテーブル間マッピングのコレクションに含まれる、タイプに対して設定されているものとは異なるテーブルを指定する単一の項目を表しますこの要素は、AWS SDKfor .NET の Amazon.AWSConfigs.DynamoDBConfig.Context.TableAliases プロパティからAmazon.Util.TableAlias クラスのインスタンスにマップします。テーブル名のプレフィックスを適用する前に再マッピングが行われます。

この要素は次の属性を含むことができます:

fromTable

マップ元テーブルからマップ先テーブルへのマッピングのマップ元テーブル部分ですこの属性は、AWS SDK for .NET の Amazon.Util.TableAlias.FromTable プロパティにマップします。

toTable

マップ元テーブルからマップ先テーブルへのマッピングのマップ先テーブル部分ですこの属性は、AWS SDK for .NET の Amazon.Util.TableAlias.ToTable プロパティにマップします。

<alias> 要素の親は、<tableAliases> 要素です。

<alias> 要素には子要素は含まれません。

次に <alias> 要素の使用例を示します。

<alias fromTable="Studio" toTable="Studios" />

aws<aws> 要素は、AWS 設定セクションの最上位要素を表します。この要素は次の属性を含むことができます:

29

AWS SDK for .NET 開発者ガイドAWS SDK for .NET の設定ファイルリファレンス

endpointDefinition

AWS で使用するリージョンとエンドポイントを定義するカスタム設定ファイルへの絶対パスです。この属性は、AWS SDK for .NET の Amazon.AWSConfigs.EndpointDefinition プロパティにマップします。

profileName

サービスの呼び出しに使用される保存された AWS 認証情報のプロファイルの名前ですこの属性は、AWS SDK for .NET の Amazon.AWSConfigs.AWSProfileName プロパティにマップします。

profilesLocation

他の AWS SDK と共有される認証情報ファイルの場所への絶対パスです。デフォルトでは、認証情報ファイルは現在のユーザーのホームディレクトリにある .aws ディレクトリに格納されます。この属性は、AWS SDK for .NET の Amazon.AWSConfigs.AWSProfilesLocation プロパティにマップします。

region

明示的にリージョンを指定していないクライアントのデフォルトの AWS リージョン ID です。この属性は、AWS SDK for .NET の Amazon.AWSConfigs.AWSRegion プロパティにマップします。

<aws> 要素に親要素はありません。

<aws> 要素は次の子要素を含むことができます。

• <dynamoDB>

• <ec2>

• <logging>

• <proxy>

• <s3>

次に <aws> 要素の使用例を示します。

<aws endpointDefinition="C:\Configs\endpoints.xml" region="us-west-2" profileName="development" profilesLocation="C:\Configs"> <!-- ... --></aws>

dynamoDB

<dynamoDB> 要素は、Amazon DynamoDB の設定のコレクションを表します。この要素は、conversionSchema 属性を含むことができます。この属性は、.NET と DynamoDB オブジェクトの間の変換に使用するバージョンを表します。使用できる値は、V1 および V2 です。この属性は、AWS SDKfor .NET の Amazon.DynamoDBv2.DynamoDBEntryConversion クラスにマップします。詳細については、「DynamoDB Series - Conversion Schemas」を参照してください。

<dynamoDB> 要素の親は、<aws> 要素です。

<dynamoDB> 要素は、<dynamoDBContext> 子要素を含むことができます。

次に <dynamoDB> 要素の使用例を示します。

<dynamoDB

30

AWS SDK for .NET 開発者ガイドAWS SDK for .NET の設定ファイルリファレンス

conversionSchema="V2"> <!-- ... --></dynamoDB>

dynamoDBContext<dynamoDBContext> 要素は、Amazon DynamoDB コンテキスト固有の設定のコレクションを表します。この要素は tableNamePrefix 属性を含むことができます。この属性は、テーブル名プレフィックスが手動で設定されていない場合に DynamoDB コンテキストが使用するデフォルトのプレフィックスを表します。この属性は、AWS SDK for .NET のAmazon.AWSConfigs.DynamoDBConfig.Context.TableNamePrefix プロパティからAmazon.Util.DynamoDBContextConfig.TableNamePrefix プロパティにマップします。詳細については、「Enhancements to the DynamoDB SDK」を参照してください。

<dynamoDBContext> 要素の親は、<dynamoDB> 要素です。

<dynamoDBContext> 要素は次の子要素を含むことができます。

• <alias>(1 つまたは複数のインスタンス)• <map>(1 つまたは複数のインスタンス)

次に <dynamoDBContext> 要素の使用例を示します。

<dynamoDBContext tableNamePrefix="Test-"> <!-- ... --></dynamoDBContext>

ec2<ec2> 要素は、Amazon EC2 の設定のコレクションを表します。この要素は、useSignatureVersion4属性を含むことができます。この属性は、署名バージョン 4 の署名をすべての要求に対して使用すること (true)、または署名バージョン 4 の署名をすべての要求に対して使用しないこと (false、デフォルト) を指定します。この属性は、AWS SDK for .NETの Amazon.AWSConfigs.EC2Config.UseSignatureVersion4 プロパティからAmazon.Util.EC2Config.UseSignatureVersion4 プロパティにマップします。

<ec2> 要素の親は、 要素です。

<ec2> 要素には子要素は含まれません。

次に <ec2> 要素の使用例を示します。

<ec2 useSignatureVersion4="true" />

logging<logging> 要素は、応答ログおよびパフォーマンスメトリクスログの設定のコレクションを表します。この要素は次の属性を含むことができます:

logMetrics

パフォーマンスメトリクスをすべてのクライアントおよび設定に対して記録するか (true)、または記録しないか (false) を示します。この属性は、AWS SDKfor .NET の Amazon.AWSConfigs.LoggingConfig.LogMetrics プロパティからAmazon.Util.LoggingConfig.LogMetrics プロパティにマップします。

31

AWS SDK for .NET 開発者ガイドAWS SDK for .NET の設定ファイルリファレンス

logMetricsCustomFormatter

ログ記録メトリクスのカスタムフォーマッターのデータ型およびアセンブリ名ですこの属性は、AWSSDK for .NET の Amazon.AWSConfigs.LoggingConfig.LogMetricsCustomFormatter プロパティから Amazon.Util.LoggingConfig.LogMetricsCustomFormatter プロパティにマップします。

logMetricsFormat

ログ記録メトリクスを示す形式です (AWS SDK for .NET のAmazon.AWSConfigs.LoggingConfig.LogMetricsFormat プロパティからAmazon.Util.LoggingConfig.LogMetricsFormat プロパティにマップします)。

使用できる値は次のとおりです。JSON

JSON 形式を使用します。Standard

デフォルトの形式を使用します。logResponses

サービスの応答をいつログに記録するかを示します (AWS SDK for .NET のAmazon.AWSConfigs.LoggingConfig.LogResponses プロパティからAmazon.Util.LoggingConfig.LogResponses プロパティにマップします)。

使用できる値は次のとおりです。Always

常にサービス応答を記録します。Never

サービス応答を記録しません。OnError

エラーがあるときにのみサービス応答を記録します。logTo

ログを記録する場所を示します (AWS SDK for .NET のAmazon.AWSConfigs.LoggingConfig.LogTo プロパティから LogTo プロパティにマップします)。

使用できる値は次のとおりです。Log4Net

log4net にログを記録します。None

ログを無効にします。SystemDiagnostics

System.Diagnostics にログを記録します。

<logging> 要素の親は、<aws> 要素です。

<logging> 要素には子要素は含まれません。

次に <logging> 要素の使用例を示します。

32

AWS SDK for .NET 開発者ガイドAWS SDK for .NET の設定ファイルリファレンス

<logging logTo="SystemDiagnostics" logResponses="OnError" logMetrics="true" logMetricsFormat="JSON" logMetricsCustomFormatter="MyLib.Util.MyMetricsFormatter, MyLib" />

map<map> 要素は、.NET の型から DynamoDB のテーブルへのマッピングのコレクション内の 1 つの項目を表します (AWS SDK for .NET の Amazon.AWSConfigs.DynamoDBConfig.Context.TypeMappings プロパティから TypeMapping クラスのインスタンスにマップします)。詳細については、「Enhancementsto the DynamoDB SDK」を参照してください。

この要素は次の属性を含むことができます:

targetTable

マッピングが適用される DynamoDB のテーブルです。この属性は、AWS SDK for .NET のAmazon.Util.TypeMapping.TargetTable プロパティにマップします。

type

マッピングが適用される型とアセンブリ名ですこの属性は、AWS SDK for .NET のAmazon.Util.TypeMapping.Type プロパティにマップします。

<map> 要素の親は、<dynamoDBContext> 要素です。

<map> 要素は、<property> 子要素の 1 つまたは複数のインスタンスを含むことができます。

次に <map> 要素の使用例を示します。

<map type="SampleApp.Models.Movie, SampleDLL" targetTable="Movies"> <!-- ... --></map>

property<property> 要素は DynamoDB のプロパティを表します。(この要素は、AWS SDK for .NET のAddProperty メソッドから Amazon.Util.PropertyConfig クラスのインスタンスにマップします。) 詳細については、「Enhancements to the DynamoDB SDK」および「DynamoDB の属性」を参照してください。

この要素は次の属性を含むことができます:

attribute

範囲キーの名前など、プロパティの属性の名前ですこの属性は、AWS SDK for .NET のAmazon.Util.PropertyConfig.Attribute プロパティにマップします。

converter

このプロパティに使用する必要があるコンバーターの種類ですこの属性は、AWS SDK for .NET のAmazon.Util.PropertyConfig.Converter プロパティにマップします。

ignore

関連付けられているプロパティを無視する必要があるか (true)、またはないか (false) を示します。この属性は、AWS SDK for .NET の Amazon.Util.PropertyConfig.Ignore プロパティにマップします。

33

AWS SDK for .NET 開発者ガイドAWS SDK for .NET の設定ファイルリファレンス

name

プロパティの名前ですこの属性は、AWS SDK for .NET の Amazon.Util.PropertyConfig.Nameプロパティにマップします。

version

このプロパティが項目のバージョン番号を格納する必要があるか (true)、またはないか (false) を示します。この属性は、AWS SDK for .NET の Amazon.Util.PropertyConfig.Version プロパティにマップします。

<property> 要素の親は、<map> 要素です。

<property> 要素には子要素は含まれません。

次に <property> 要素の使用例を示します。

<property name="Rating" converter="SampleApp.Models.RatingConverter, SampleDLL" />

proxy

<proxy> 要素は、AWS SDK for .NET で使用するプロキシの設定を表します。この要素は次の属性を含むことができます:

host

プロキシサーバーのホスト名または IP アドレスですこの属性は、AWS SDK for .NET のAmazon.AWSConfigs.ProxyConfig.Host プロパティから Amazon.Util.ProxyConfig.Hostプロパティにマップします。

password

プロキシサーバーで認証するためのパスワードですこの属性は、AWS SDKfor .NET の Amazon.AWSConfigs.ProxyConfig.Password プロパティからAmazon.Util.ProxyConfig.Password プロパティにマップします。

port

プロキシのポート番号ですこの属性は、AWS SDK for .NET のAmazon.AWSConfigs.ProxyConfig.Port プロパティから Amazon.Util.ProxyConfig.Portプロパティにマップします。

username

プロキシサーバーで認証するユーザー名ですこの属性は、AWS SDK for .NETの Amazon.AWSConfigs.ProxyConfig.Username プロパティからAmazon.Util.ProxyConfig.Username プロパティにマップします。

<proxy> 要素の親は、<aws> 要素です。

<proxy> 要素には子要素は含まれません。

次に <proxy> 要素の使用例を示します。

<proxy host="192.0.2.0" port="1234" username="My-Username-Here"

34

AWS SDK for .NET 開発者ガイド.NET の Amazon Web Services 非同期 API

password="My-Password-Here" />

s3<s3> 要素は、Amazon S3 の設定のコレクションを表します。この要素は、useSignatureVersion4属性を含むことができます。この属性は、署名バージョン 4 の署名をすべての要求に対して使用すること (true)、または署名バージョン 4 の署名をすべての要求に対して使用しないこと (false、デフォルト) を指定します。この属性は、AWS SDK for .NET のAmazon.AWSConfigs.S3Config.UseSignatureVersion4 プロパティにマップします。

<s3> 要素の親は、<aws> 要素です。

<s3> 要素には子要素は含まれません。

次に <s3> 要素の使用例を示します。

<s3 useSignatureVersion4="true" />

.NET の Amazon Web Services 非同期 API.NET Framework 4.5、Windows ストア、およびWindows Phone 8 の非同期 APIAWS SDK for .NET は .NET Framework バージョン 4.5、Windows ストア、および Windows Phone 8 用に新しいタスクベースの非同期パターンを使用します。asyncおよび await キーワードを使用して、すべての AWS 製品の非同期オペレーションをブロックせずに実行、管理できます。

タスクベースの非同期パターンの詳細については、MSDN の「タスクベースの非同期パターン(TAP)」を参照してください。

.NET Framework 3.5 の非同期 APIAWS SDK for .NET では、.NET クライアントクラスで公開されているほとんどのメソッド呼び出しの非同期 (async) バージョンがサポートされています。非同期メソッドにより、サービスからの応答にコードブロックを配置することなく AWS サービスを呼び出すことができます。たとえば、Amazon S3 またはDynamoDB にデータを書き込むリクエストを行い、AWS がリクエストを処理している間に、コードで継続して他の作業を実行することができます。

非同期リクエストメソッドの構文AWS サービスに対して非同期リクエストを行うには 2 つの段階があります。1 つ目は、リクエストのBegin メソッドを呼び出すことです。このメソッドは非同期オペレーションを開始します。対応する Endのメソッドはサービスから応答を取得し、操作中に発生する可能性がある例外を処理する機会を提供します。

Note

End メソッドを呼び出す必要はありません。エラーが発生しなければ、End を呼び出すかどうかにかかわらず、非同期操作は完了します。

Begin メソッドの構文非同期の Begin メソッドは、リクエストのオブジェクトパラメータ(PutItemRequest など)を使用することに加えて、コールバック関数と状態オブジェクトという 2 つの追加のパラメータを使用しま

35

AWS SDK for .NET 開発者ガイド.NET Framework 3.5 の非同期 API

す。Begin メソッドは、サービス応答オブジェクトを返す代わりに、IAsyncResult 型の結果を返します。この型の定義については、MSDN のドキュメントを参照してください。

同期メソッド

PutItemResponse PutItem( PutItemRequest putItemRequest)

非同期メソッド

IAsyncResult BeginPutItem( GetSessionTokenRequest getSessionTokenRequest, {AsyncCallback callback}, {Object state})

AsyncCallback コールバック

非同期操作が完了すると、コールバック関数が呼び出されます。関数が呼び出された場合、IAsyncResult型の単一のパラメータを受け取ります。コールバック関数には次の署名があります。

void Callback(IAsyncResult asyncResult)

オブジェクトの状態

3 番目のパラメータである state は、asyncResult パラメータの AsyncState プロパティ(asyncResult.AsyncState)としてコールバック関数で利用できるユーザー定義オブジェクトです。

呼び出しパターン

• コールバック関数と状態オブジェクトを渡す。• コールバック関数を渡すが、状態オブジェクトの null を渡す。• コールバック関数と状態オブジェクトの両方の null を渡す。

このトピックでは、これらのパターンのそれぞれの例を示します。

IAsyncResult.AsyncWaitHandle の使用

特定の状況では、Begin メソッドを呼び出すコードは、非同期オペレーションの完了を待機するために呼び出す別のメソッドを有効にしなければならない場合があります。この場合、IAsyncResult の戻り値のIAsyncResult.AsyncWaitHandle プロパティによって返される WaitHandle をメソッドに渡すことができます。次に、このメソッドは、この WaitHandle で WaitOne を呼び出して、非同期オペレーションの完了を待機できます。

例以下のすべての例では、次の初期化コードを前提としています。

public static void TestPutObjectAsync(){ // Create a client AmazonS3Client client = new AmazonS3Client();

PutObjectResponse response; IAsyncResult asyncResult;

//

36

AWS SDK for .NET 開発者ガイド.NET Framework 3.5 の非同期 API

// Create a PutObject request // // You will need to use your own bucket name below in order // to run this sample code. // PutObjectRequest request = new PutObjectRequest { BucketName = "{PUT YOUR OWN EXISTING BUCKET NAME HERE}", Key = "Item", ContentBody = "This is sample content..." };

// // additional example code //}

コールバックの指定なし以下のコード例では、BeginPutObject を呼び出し、作業を実行し、EndPutObject を呼び出してサービス応答を取得します。EndPutObject の呼び出しは try ブロックで囲まれ、オペレーション中にスローされた可能性のある例外をキャッチします。

asyncResult = client.BeginPutObject(request, null, null);while ( ! asyncResult.IsCompleted ) { // // Do some work here //}try { response = client.EndPutObject(asyncResult);}catch (AmazonS3Exception s3Exception) { // // Code to process exception //}

シンプルなコールバック次の例では、以下のコールバック関数が定義されていることを前提としています。

public static void SimpleCallback(IAsyncResult asyncResult){ Console.WriteLine("Finished PutObject operation with simple callback");}

次のコード行は BeginPutObject を呼び出し、上記のコールバック関数を指定します。PutObject操作が完了すると、コールバック関数が呼び出されます。BeginPutObject の呼び出しは、state パラメータに null を指定します。これは、シンプルなコールバック関数は asyncResult パラメータの AsyncState プロパティにアクセスしないためです。呼び出し元のコードも、コールバック関数もEndPutObject を呼び出しません。このため、サービス応答は実質的に破棄され、オペレーション中に発生した例外は無視されます。

asyncResult = client.BeginPutObject(request, SimpleCallback, null);

クライアントを使用したコールバック次の例では、以下のコールバック関数が定義されていることを前提としています。

37

AWS SDK for .NET 開発者ガイド.NET Framework 3.5 の非同期 API

public static void CallbackWithClient(IAsyncResult asyncResult){ try { AmazonS3Client s3Client = (AmazonS3Client) asyncResult.AsyncState; PutObjectResponse response = s3Client.EndPutObject(asyncResult); Console.WriteLine("Finished PutObject operation with client callback"); } catch (AmazonS3Exception s3Exception) { // // Code to process exception // }}

次のコード行は BeginPutObject を呼び出し、上記のコールバック関数を指定します。PutObject 操作が完了すると、コールバック関数が呼び出されます。この例では、BeginPutObject の呼び出しにより、state パラメータの Amazon S3 クライアントオブジェクトが指定されます。コールバック関数は、クライアントを使用して EndPutObject メソッドを呼び出し、サーバー応答を取得します。オペレーション中に発生したすべての例外は、コールバックが EndPutObject を呼び出すときに受け取られるため、この呼び出しは try ブロック内に配置されます。

asyncResult = client.BeginPutObject(request, CallbackWithClient, client);

状態オブジェクトを使用したコールバック次の例では、以下のクラスとコールバック関数が定義されていることを前提としています。

class ClientState{ AmazonS3Client client; DateTime startTime;

public AmazonS3Client Client { get { return client; } set { client = value; } }

public DateTime Start { get { return startTime; } set { startTime = value; } }}

public static void CallbackWithState(IAsyncResult asyncResult){ try { ClientState state = asyncResult.AsyncState as ClientState; AmazonS3Client s3Client = (AmazonS3Client)state.Client; PutObjectResponse response = state.Client.EndPutObject(asyncResult); Console.WriteLine("Finished PutObject. Elapsed time: {0}", (DateTime.Now - state.Start).ToString()); } catch (AmazonS3Exception s3Exception) { // // Code to process exception // }}

38

AWS SDK for .NET 開発者ガイド.NET Framework 3.5 の非同期 API

次のコード行は BeginPutObject を呼び出し、上記のコールバック関数を指定します。PutObject操作が完了すると、コールバック関数が呼び出されます。この例では、BeginPutObject の呼び出しは、state パラメータの場合、以前に定義された ClientState クラスのインスタンスを指定します。このクラスは Amazon S3クライアントと、BeginPutObject が呼び出された時間を埋め込みます。コールバック関数は、Amazon S3 クライアントオブジェクトを使用し、EndPutObject メソッドを呼び出してサーバーの応答を取得します。また、コールバックは、オペレーションの開始時間を抽出し、これを使用して非同期処理が完了するまでにかかった時間を表示します。

前の例のように、EndPutObject が呼び出されたときに、オペレーション中に発生した例外が受け取られるため、この呼び出しは try ブロック内に配置されます。

asyncResult = client.BeginPutObject( request, CallbackWithState, new ClientState { Client = client, Start = DateTime.Now } );

完全なサンプル次のコードサンプルは、非同期リクエストメソッドを呼び出すときに使用できるパターンを示しています。

using System;using System.Collections.Generic;using System.Diagnostics;using System.IO;using System.Text;using System.Threading;

using Amazon;using Amazon.Runtime;using Amazon.S3;using Amazon.S3.Model;

namespace async_aws_net{ class ClientState { AmazonS3Client client; DateTime startTime;

public AmazonS3Client Client { get { return client; } set { client = value; } }

public DateTime Start { get { return startTime; } set { startTime = value; } } }

class Program { public static void Main(string[] args) { TestPutObjectAsync(); }

public static void SimpleCallback(IAsyncResult asyncResult) { Console.WriteLine("Finished PutObject operation with simple callback"); Console.Write("\n\n");

39

AWS SDK for .NET 開発者ガイド.NET Framework 3.5 の非同期 API

}

public static void CallbackWithClient(IAsyncResult asyncResult) { try { AmazonS3Client s3Client = (AmazonS3Client) asyncResult.AsyncState; PutObjectResponse response = s3Client.EndPutObject(asyncResult); Console.WriteLine("Finished PutObject operation with client callback"); Console.WriteLine("Service Response:"); Console.WriteLine("-----------------"); Console.WriteLine(response); Console.Write("\n\n"); } catch (AmazonS3Exception s3Exception) { // // Code to process exception // } }

public static void CallbackWithState(IAsyncResult asyncResult) { try { ClientState state = asyncResult.AsyncState as ClientState; AmazonS3Client s3Client = (AmazonS3Client)state.Client; PutObjectResponse response = state.Client.EndPutObject(asyncResult); Console.WriteLine( "Finished PutObject operation with state callback that started at {0}", (DateTime.Now - state.Start).ToString() + state.Start); Console.WriteLine("Service Response:"); Console.WriteLine("-----------------"); Console.WriteLine(response); Console.Write("\n\n"); } catch (AmazonS3Exception s3Exception) { // // Code to process exception // } }

public static void TestPutObjectAsync() { // Create a client AmazonS3Client client = new AmazonS3Client();

PutObjectResponse response; IAsyncResult asyncResult;

// // Create a PutObject request // // You will need to change the BucketName below in order to run this // sample code. // PutObjectRequest request = new PutObjectRequest { BucketName = "PUT-YOUR-OWN-EXISTING-BUCKET-NAME-HERE", Key = "Item", ContentBody = "This is sample content..." };

response = client.PutObject(request); Console.WriteLine("Finished PutObject operation for {0}.", request.Key); Console.WriteLine("Service Response:"); Console.WriteLine("-----------------");

40

AWS SDK for .NET 開発者ガイド再試行とタイムアウト

Console.WriteLine("{0}", response); Console.Write("\n\n");

request.Key = "Item1"; asyncResult = client.BeginPutObject(request, null, null); while ( ! asyncResult.IsCompleted ) { // // Do some work here // } try { response = client.EndPutObject(asyncResult); } catch (AmazonS3Exception s3Exception) { // // Code to process exception // }

Console.WriteLine("Finished Async PutObject operation for {0}.", request.Key ); Console.WriteLine("Service Response:"); Console.WriteLine("-----------------"); Console.WriteLine(response); Console.Write("\n\n");

request.Key = "Item2"; asyncResult = client.BeginPutObject(request, SimpleCallback, null);

request.Key = "Item3"; asyncResult = client.BeginPutObject(request, CallbackWithClient, client);

request.Key = "Item4"; asyncResult = client.BeginPutObject(request, CallbackWithState, new ClientState { Client = client, Start = DateTime.Now } );

Thread.Sleep( TimeSpan.FromSeconds(5) ); } }}

以下の資料も参照してください。• .NET 用 AWS SDK 入門 (p. 3)• AWS SDK for .NET によるプログラミング (p. 8)

再試行とタイムアウトAWS SDK for .NET では、AWS のサービスへの HTTP リクエストの再試行回数とタイムアウト値の数を設定できます。再試行とタイムアウトのデフォルト値がアプリケーションで適切でない場合は、特定の要件に対してそれらの値を調整できますが、それによってアプリケーションの動作にどのように影響するかを理解しておくことが重要です。

再試行とタイムアウトに使用する値を決定するには、以下の点を検討します。

• ネットワーク接続の速度が低下している場合、または AWS のサービスに到達できない場合に、AWSSDK for .NET およびアプリケーションがどのように対応するか。呼び出しがすぐに失敗するか、またはユーザーに代わって呼び出しが再試行され続けるか、どちらが適切か。

• 応答性が必要なユーザー対応アプリケーションまたはウェブサイトであるか、またはレイテンシーの増加に耐性があるバックグラウンド処理ジョブであるか。

41

AWS SDK for .NET 開発者ガイド再試行

• アプリケーションが低レイテンシーの信頼性の高いネットワークでデプロイされているか、または信頼性が低い接続でリモートの場所にデプロイされているか。

再試行AWS SDK for .NET では、サーバー側のスロットリングまたは接続中断によって失敗したリクエストが再試行されます。ClientConfig クラスの MaxErrorRetry プロパティを使用して、サービスクライアントレベルで再試行の回数を指定できます。AWS SDK for .NET では、指定した回数だけ操作が再試行された後に、失敗となり、例外がスローされます。デフォルトの再試行回数が 10 であるAmazonDynamoDBConfig クラスを除いて、デフォルトでは MaxErrorRetry プロパティは 4 に設定されています。再試行が発生すると、リクエストのレイテンシーが増加します。アプリケーションでのリクエストレイテンシーの合計とエラー発生率の制限に基づいて、再試行回数を設定する必要があります。

タイムアウトAWS SDK for .NET では、サービスクライアントレベルで、リクエストのタイムアウトとソケットの読み取り/書き込みのタイムアウト値を設定できます。これらの値は、ClientConfig クラスの Timeout プロパティと ReadWriteTimeout プロパティでそれぞれ指定されています。これらの値は、AWS サービスのクライアントオブジェクトによって作成された HttpWebRequest オブジェクトの Timeout プロパティと ReadWriteTimeout プロパティとして渡されます。デフォルトでは、Timeout の値は 100 秒であり、ReadWriteTimeout の値は 300 秒です。

ネットワークのレイテンシーが大きい場合、または操作が再試行される条件が存在する場合に、長いタイムアウト値と大きい再試行回数を使用すると、一部の SDK 操作が応答していないように見えることがあります。

Note

ポータブルクラスライブラリ (PCL) を対象としている AWS SDK for .NET のバージョンでは、HttpWebRequest クラスではなく HttpClient クラスが使用されていて、Timeout プロパティだけがサポートされています。

デフォルトのタイムアウト値の例外を次に示します。これらの値は、タイムアウト値を明示的に設定するとオーバーライドされます。

• 呼び出されるメソッドがAmazonS3Client.PutObject()、AmazonS3Client.UploadPart()、AmazonGlacierClient.UploadArchive() など、ストリームをアップロードするメソッドである場合は、Timeout と ReadWriteTimeout が最大値に設定されます。

• .NET Framework 4.5 を対象とする AWS SDK for .NET のバージョンでは、AmazonS3Client とAmazonGlacierClient のすべてのオブジェクトに対して、Timeout と ReadWriteTimeout が最大値に設定されます。

• ポータブルクラスライブラリ (PCL) を対象とする AWS SDK for .NET のバージョンでは、AmazonS3Client と AmazonGlacierClient のすべてのオブジェクトに対して、Timeout が最大値に設定されます。

例次の例では、AmazonS3Client オブジェクトに対して、2 回の最大再試行、10 秒のタイムアウト、および10 秒の読み取り/書き込みタイムアウトを指定する方法を示しています。

var client = new AmazonS3Client( new AmazonS3Config {

42

AWS SDK for .NET 開発者ガイドAWS SDK for .NET バージョン 3 へのコードの移行

Timeout = TimeSpan.FromSeconds(10), // Default value is 100 seconds ReadWriteTimeout = TimeSpan.FromSeconds(10), // Default value is 300 seconds MaxErrorRetry = 2 // Default value is 4 retries });

AWS SDK for .NET バージョン 3 へのコードの移行このトピックでは、AWS SDK for .NET のバージョン 3 での変更点、およびこのバージョンの SDK へのコードの移行方法について説明します。

AWS SDK for .NET のバージョンについてAWS SDK for .NET は当初 2009 年 11 月にリリースされ、.NET Framework 2.0 向けに設計されていました。このリリース以降、.NET は .NET Framework 4.0 および .NET Framework 4.5 に改善されています。また、新しい対象プラットフォームとして WinRT と Windows Phone が追加されています。

AWS SDK for .NET バージョン 2 では、.NET プラットフォームの新機能を利用するように更新され、WinRT と Windows Phone も対象プラットフォームとして追加されました。

AWS SDK for .NET バージョン 3 では、アセンブリをモジュール化して更新されました。

SDK のアーキテクチャの再設計バージョン 3 の AWS SDK for .NET 全体がモジュラー式に再設計されています。1 つの大きなアセンブリとしてではなく、各サービスが個別のアセンブリとして実装されます。AWS SDK for .NET 全体をアプリケーションに追加する必要はなくなりました。アプリケーションで使用する AWS サービスのアセンブリだけを追加できます。

重要な変更以下のセクションでは、バージョン 3 の AWS SDK for .NET への変更点について説明します。

AWSClientFactory の削除Amazon.AWSClientFactory クラスは削除されました。現在、サービスクライアントを作成するには、サービスクライアントのコンストラクタを使用します。たとえば、AmazonEC2Client を作成するには:

var ec2Client = new Amazon.EC2.AmazonEC2Client();

Amazon.Runtime.AssumeRoleAWSCredentials の削除Amazon.Runtime.AssumeRoleAWSCredentials クラスは、コア名前空間内にありながら AWSSecurity Token Service に依存していたこと、および長い間 SDK で使用されていなかったことから、削除されました。代わりに、Amazon.SecurityToken.AssumeRoleAWSCredentials クラスを使用してください。

S3Link からの SetACL メソッドの削除S3Link クラスは Amazon.DynamoDBv2 パッケージの一部であり、DynamoDB 項目内の参照であるオブジェクトを Amazon S3 に格納するために使用されています。これは便利な機能ですが、Amazon.S3パッケージに DynamoDB に対するコンパイル依存関係を作成するのは好ましくありませんでした。結果として、S3Link クラスで公開されている Amazon.S3 メソッドを簡素化し、SetACL メソッドを

43

AWS SDK for .NET 開発者ガイド重要な変更

MakeS3ObjectPublic メソッドに置き換えました。オブジェクトでアクセスコントロールリスト (ACL)を細かく制御する場合は、Amazon.S3 パッケージを使用します。

サポートされなくなった結果クラスの削除AWS SDK for .NET のほとんどのサービスでは、オペレーションは、リクエスト ID や結果オブジェクトなどの操作のメタデータを含む応答オブジェクトを返します。応答クラスと結果クラスを分けておくと、冗長であり、開発者は余分な入力が必要でした。バージョン 2 の AWS SDK for .NET のリリース時に、結果クラスのすべての情報を応答クラス内に移しました。また、結果クラスをサポート対象外として、その使用を非推奨にしました。バージョン 3 の AWS SDK for .NET では、これらのサポートされなくなった結果クラスを削除して SDK のサイズを減らしました。

AWS Config セクションの変更App.config または Web.config ファイルを使用して、AWS SDK for .NET の詳細な設定を行うことができます。これは、SDK アセンブリ名を参照する、次のような <aws> config セクションを通じて行います。

<configuration> <configSections> <section name="aws" type="Amazon.AWSSection, AWSSDK"/> </configSections> <aws region="us-west-2"> <logging logTo="Log4Net"/> </aws></configuration>

AWS SDK for .NET のバージョン 3 では、AWSSDK アセンブリは存在しなくなりました。共通コードはAWSSDK.Core に格納しました。そのため、App.config ファイルまたは Web.config ファイルでのAWSSDK アセンブリへの参照を、次のように AWSSDK.Core アセンブリを参照するように変更する必要があります。

<configuration> <configSections> <section name="aws" type="Amazon.AWSSection, AWSSDK.Core"/> </configSections> <aws region="us-west-2"> <logging logTo="Log4Net"/> </aws></configuration>

また、Amazon.AWSConfigs クラスで構成設定を操作できます。バージョン 3 の AWS SDK for .NET では、DynamoDB の構成設定を Amazon.AWSConfigs クラスから Amazon.AWSConfigsDynamoDB クラスに移しました。

44

AWS SDK for .NET 開発者ガイドAWS CloudFormation の例

コードの例以下の例では、AWS SDK for .NET を使用して個々の AWS のサービスを操作する方法を示します。

その他の例は GitHub から入手できます。

開始する前に、AWS SDK for .NET が設定されている (p. 3)ことを確認し、AWS SDK for .NET を使用するプログラミング (p. 8)について復習してください。

トピック• AWS CloudFormation の例 (p. 45)• Amazon DynamoDB の例 (p. 46)• Amazon EC2 例 (p. 66)• Amazon Glacier の例 (p. 89)• AWS Identity and Access Management (IAM) の例 (p. 91)• Amazon Route 53 の例 (p. 111)• AWS SDK for .NET を使用した Amazon Simple Storage Service のプログラミング (p. 116)• Amazon Simple Notification Service (Amazon SNS) の例 (p. 116)• Amazon SQS 例 (p. 118)• Amazon CloudWatch の例 (p. 126)• AWS SDK for .NET を使用した AWS OpsWorks のプログラミング (p. 137)• AWS SDK for .NET を使用するその他の AWS のサービスのプログラミング (p. 137)

AWS CloudFormation の例AWS SDK for .NET は、AWS インフラストラクチャのデプロイを想定どおりに繰り返し作成およびプロビジョニングする AWS CloudFormation をサポートします。詳細については、「AWS CloudFormation の使用開始」を参照してください。

次の例では、低レベルの API を使用して AWS CloudFormation のアクセス可能なリソースを一覧表示する方法を示します。

// using Amazon.CloudFormation;// using Amazon.CloudFormation.Model;

var client = new AmazonCloudFormationClient();var request = new DescribeStacksRequest();var response = client.DescribeStacks(request);

foreach (var stack in response.Stacks){ Console.WriteLine("Stack: {0}", stack.StackName); Console.WriteLine(" Status: {0}", stack.StackStatus); Console.WriteLine(" Created: {0}", stack.CreationTime);

var ps = stack.Parameters;

if (ps.Any()) { Console.WriteLine(" Parameters:");

foreach (var p in ps) { Console.WriteLine(" {0} = {1}",

45

AWS SDK for .NET 開発者ガイドAmazon DynamoDB の例

p.ParameterKey, p.ParameterValue); }

} }

関連する API リファレンス情報については、AWS SDK for .NET API リファレンスの「Amazon.CloudFormation」および「Amazon.CloudFormation.Model」を参照してください。

Amazon DynamoDB の例AWS SDK for .NET では、AWS によって提供される高速の NoSQL データベースサービスである AmazonDynamoDB をサポートします。SDK では、DynamoDB との通信用に 3 つのプログラムモデルが提供されています。低レベルモデル、ドキュメントモデル、オブジェクト永続性モデルです。

以下では、これらのモデルとその API を紹介し、どのような場合にどのような方法で使用するかを例で示します。また、AWS SDK for .NET での追加の DynamoDB プログラミングリソースへのリンクも提供します。

トピック• 低レベルモデル (p. 46)• ドキュメントモデル (p. 48)• オブジェクト永続性モデル (p. 50)• 詳細 (p. 51)• Amazon DynamoDB と AWS SDK for .NET での式の使用 (p. 52)• AWS SDK for .NET を使用した Amazon DynamoDB での JSON のサポート (p. 61)• Amazon DynamoDB を使用した ASP.NET セッション状態の管理 (p. 63)

低レベルモデル低レベルプログラミングモデルは、DynamoDB サービスに対する直接呼び出しをラップしています。このモデルには、Amazon.DynamoDBv2 名前空間からアクセスします。

低レベルモデルは、3 つのモデルの中で最も多くのコードを記述する必要があります。たとえば、.NETデータ型を DynamoDB の同等の型に変換する必要があります。ただし、このモデルを使用するとほとんどの機能にアクセスできます。

以下の例では、低レベルモデルを使用して DynamoDB でのテーブルの作成、テーブルの変更、テーブルへの項目の挿入を行う方法を示します。

テーブルの作成次の例では、AmazonDynamoDBClient クラスの CreateTable メソッドを使用してテーブルを作成します。CreateTable メソッドでは、必要な項目属性名、プライマリキーの定義、スループット容量などの特性を含む CreateTableRequest クラスのインスタンスを使用します。CreateTable メソッドは、CreateTableResponse クラスのインスタンスを返します。

// using Amazon.DynamoDBv2;// using Amazon.DynamoDBv2.Model;

var client = new AmazonDynamoDBClient();

var request = new CreateTableRequest{

46

AWS SDK for .NET 開発者ガイド低レベルモデル

TableName = "AnimalsInventory", AttributeDefinitions = new List<AttributeDefinition> { new AttributeDefinition { AttributeName = "Id", // "S" = string, "N" = number, and so on. AttributeType = "N" }, new AttributeDefinition { AttributeName = "Type", AttributeType = "S" } }, KeySchema = new List<KeySchemaElement> { new KeySchemaElement { AttributeName = "Id", // "HASH" = hash key, "RANGE" = range key. KeyType = "HASH" }, new KeySchemaElement { AttributeName = "Type", KeyType = "RANGE" }, }, ProvisionedThroughput = new ProvisionedThroughput { ReadCapacityUnits = 10, WriteCapacityUnits = 5 }, };

var response = client.CreateTable(request);

Console.WriteLine("Table created with request ID: " + response.ResponseMetadata.RequestId);

テーブルを変更する準備が整っていることの確認テーブルを変更または修正する前に、テーブルを変更する準備が整っていることを確認する必要があります。次の例では、低レベルモデルを使用して DynamoDB のテーブルの準備が整っていることを確認する方法を示します。この例では、チェック対象のテーブルは AmazonDynamoDBClient クラスの DescribeTable メソッドを使用して参照されています。5 秒ごとに、コードはテーブルのTableStatus プロパティの値を調べます。ステータスが ACTIVE に設定されると、テーブルは変更できる状態です。

// using Amazon.DynamoDBv2;// using Amazon.DynamoDBv2.Model;

var client = new AmazonDynamoDBClient(); var status = "";

do{ // Wait 5 seconds before checking (again). System.Threading.Thread.Sleep(TimeSpan.FromSeconds(5)); try {

47

AWS SDK for .NET 開発者ガイドドキュメントモデル

var response = client.DescribeTable(new DescribeTableRequest { TableName = "AnimalsInventory" });

Console.WriteLine("Table = {0}, Status = {1}", response.Table.TableName, response.Table.TableStatus);

status = response.Table.TableStatus; } catch (ResourceNotFoundException) { // DescribeTable is eventually consistent. So you might // get resource not found. }

} while (status != TableStatus.ACTIVE);

テーブルへの項目の挿入次の例では、低レベルモデルを使用して DynamoDB のテーブルに 2 つの項目を挿入します。各項目は、PutItemRequest クラスのインスタンスを使用して、AmazonDynamoDBClient クラスの PutItemメソッドによって挿入されます。PutItemRequest クラスの 2 つのインスタンスはそれぞれ、項目を挿入するテーブルの名前と一連の項目属性値を取得します。

// using Amazon.DynamoDBv2;// using Amazon.DynamoDBv2.Model;

var client = new AmazonDynamoDBClient();

var request1 = new PutItemRequest{ TableName = "AnimalsInventory", Item = new Dictionary<string, AttributeValue> { { "Id", new AttributeValue { N = "1" }}, { "Type", new AttributeValue { S = "Dog" }}, { "Name", new AttributeValue { S = "Fido" }} }};

var request2 = new PutItemRequest{ TableName = "AnimalsInventory", Item = new Dictionary<string, AttributeValue> { { "Id", new AttributeValue { N = "2" }}, { "Type", new AttributeValue { S = "Cat" }}, { "Name", new AttributeValue { S = "Patches" }} }}; client.PutItem(request1);client.PutItem(request2);

ドキュメントモデルドキュメントプログラミングモデルは、DynamoDB のデータを操作する簡単な手段を提供します。このモデルは、特にテーブルおよびテーブル内の項目にアクセスすることを目的に作られています。このモデルには、Amazon.DynamoDBv2.DocumentModel 名前空間からアクセスします。

48

AWS SDK for .NET 開発者ガイドドキュメントモデル

低レベルプログラミングと比べると、ドキュメントモデルの方が DynamoDB データに対するコーディングが容易です。たとえば、多くの .NET データ型を DynamoDB の同等のデータ型に変換する必要がありません。ただし、このモデルでは、低レベルプログラミングモデルほど多くの機能にはアクセスできません。たとえば、このモデルを使用して、テーブルの項目を作成、取得、更新、削除することはできます。しかし、テーブルを作成するには、低レベルモデルを使用する必要があります。オブジェクト永続性モデルと比較すると、このモデルの方が .NET オブジェクトを保存、ロード、クエリするために多くのコードを作成する必要があります。

次の例では、ドキュメントモデルを使用して DynamoDB のテーブルの項目を挿入および取得する方法を示します。

テーブルへの項目の挿入次の例では、Table クラスの PutItem メソッドを使用してテーブルに項目を挿入しています。PutItemメソッドは、Document クラスのインスタンスを受け取ります。Document クラスは、初期化された属性の単純なコレクションです。項目を挿入するテーブルを特定するには、Table クラスの LoadTable メソッドを呼び出し、AmazonDynamoDBClient クラスのインスタンスと DynamoDB の対象テーブルの名前を指定します。

// using Amazon.DynamoDBv2;// using Amazon.DynamoDBv2.DocumentModel;

var client = new AmazonDynamoDBClient();var table = Table.LoadTable(client, "AnimalsInventory");var item = new Document();

item["Id"] = 3;item["Type"] = "Horse";item["Name"] = "Shadow";

table.PutItem(item);

テーブルからの項目の取得次の例では、Table クラスの GetItem メソッドを使用して項目を取得しています。取得する項目を特定するために、GetItem メソッドでは対象項目のハッシュおよび範囲プライマリキーを使用しています。Table クラスの LoadTable メソッドで項目を取得するテーブルを特定するには、AmazonDynamoDBClient クラスのインスタンスと DynamoDB の対象テーブルの名前を使用します。

// using Amazon.DynamoDBv2;// using Amazon.DynamoDBv2.DocumentModel;

var client = new AmazonDynamoDBClient();var table = Table.LoadTable(client, "AnimalsInventory");var item = table.GetItem(3, "Horse");

Console.WriteLine("Id = " + item["Id"]);Console.WriteLine("Type = " + item["Type"]);Console.WriteLine("Name = " + item["Name"]);

前の例では、Id、Type、Name の属性値を WriteLine メソッドの文字列に暗黙的に変換しています。DynamoDBEntry クラスのさまざまな AsType メソッドを使用すると、明示的に変換できます。たとえば、Primitive データ型の Id の属性値を、AsInt メソッドを使用して整数に明示的に変換できます。

int id = item["Id"].AsInt();

49

AWS SDK for .NET 開発者ガイドオブジェクト永続性モデル

または、(int) を使用することで簡単に明示的なキャストを実行できます。

int id = (int)item["Id"];

オブジェクト永続性モデルオブジェクト永続性プログラミングは、DynamoDB での .NET オブジェクトの保存、ロード、クエリを特に目的にして作られています。このモデルには、Amazon.DynamoDBv2.DataModel 名前空間からアクセスします。

3 つのモデルの中で、オブジェクト永続性モデルは、DynamoDB データの保存、ロード、クエリに関しては常にコーディングが最も簡単です。たとえば、DynamoDB のデータ型を直接操作できます。ただし、このモデルでアクセスできるのは、DynamoDB の .NET オブジェクトを保存、ロード、クエリする操作だけです。たとえば、このモデルを使用して、テーブルの項目を作成、取得、更新、削除することはできます。ただし、最初に低レベルモデルを使用してテーブルを作成してから、このモデルを使用して .NET クラスをテーブルにマッピングする必要があります。

以下の例では、項目を表す .NET クラスを定義する方法、.NET クラスのインスタンスを使用して項目を挿入する方法、.NET オブジェクトを使用して DynamoDB のテーブルから項目を取得する方法を示します。

テーブルで項目を表す .NET クラスの定義次の例では、DynamoDBTable 属性がテーブル名を指定しているのに対し、DynamoDBHashKey およびDynamoDBRangeKey 属性はテーブルのハッシュおよび範囲プライマリキーをモデル化しています。

// using Amazon.DynamoDBv2.DataModel;

[DynamoDBTable("AnimalsInventory")]class Item{ [DynamoDBHashKey] public int Id { get; set; } [DynamoDBRangeKey] public string Type { get; set; } public string Name { get; set; }}

.NET クラスのインスタンスの使用によるテーブルへの項目の挿入上の例では、項目は DynamoDBContext クラスの Save メソッドによって挿入されます。このメソッドは、項目を表す .NET クラスの初期化されたインスタンスを受け取ります (DynamoDBContext クラスのインスタンスは、AmazonDynamoDBClient クラスのインスタンスで初期化されます)。

// using Amazon.DynamoDBv2;// using Amazon.DynamoDBv2.DataModel; var client = new AmazonDynamoDBClient();var context = new DynamoDBContext(client);var item = new Item{ Id = 4, Type = "Fish", Name = "Goldie"};

context.Save(item);

50

AWS SDK for .NET 開発者ガイド詳細

.NET オブジェクトのインスタンスの使用によるテーブルからの項目の取得上の例では、項目は DynamoDBContext クラスの Load メソッドで取得されます。このメソッドは、取得する項目のハッシュおよび範囲プライマリキーを表す .NET クラスの部分的に初期化されたインスタンスを受け取ります (前に示したように、DynamoDBContext クラスのインスタンスはAmazonDynamoDBClient クラスのインスタンスで初期化されます)。

// using Amazon.DynamoDBv2;// using Amazon.DynamoDBv2.DataModel;

var client = new AmazonDynamoDBClient();var context = new DynamoDBContext(client);var item = context.Load<Item>(4, "Fish");

Console.WriteLine("Id = {0}", item.Id);Console.WriteLine("Type = {0}", item.Type);Console.WriteLine("Name = {0}", item.Name);

詳細|sdk-net| を使用した |DDB| 情報のプログラミングと例**

• DynamoDB API• DynamoDB Series Kickoff• DynamoDB Series - Document Model• DynamoDB Series - Conversion Schemas• DynamoDB Series - Object Persistence Model• DynamoDB Series - Expressions• Amazon DynamoDB と AWS SDK for .NET での式の使用 (p. 52)• AWS SDK for .NET による Amazon DynamoDB での JSON のサポート (p. 61)• Amazon DynamoDB を使用した ASP.NET セッション状態の管理 (p. 63)

低レベルモデル情報と例

• AWS SDK for .NET の低レベル API を使用した、テーブルの操作• AWS SDK for .NET の低レベル API を使用した、項目の操作• AWS SDK for .NET 低レベル API を使用したテーブルのクエリ• AWS SDK for .NET の低レベル API を使用したテーブルのスキャン• AWS SDK for .NET 低レベル API を使用したローカルセカンダリインデックスの使用方法• AWS SDK for .NET 低レベル API を使用したグローバルセカンダリインデックスの使用方法

ドキュメントモデル情報と例

• DynamoDB データ型• DynamoDBEntry• .NET ドキュメントモデル

オブジェクト永続性モデル情報と例

51

AWS SDK for .NET 開発者ガイドAmazon DynamoDB と AWS SDK for .NET での式の使用

• .NET: オブジェクト永続性モデル

Amazon DynamoDB と AWS SDK for .NET での式の使用次のコード例では、AWS SDK for .NET を使用して式で DynamoDB をプログラミングする方法を示します。式は、DynamoDB テーブルの項目から読み取る属性を示します。また、項目を書き込むときも式を使用して、満たす必要がある条件(条件付き更新とも呼ばれます)と、属性を更新する方法を示します。更新の例として、属性を新しい値で置き換えたり、新しいデータをリストやマップに追加したりします。詳細については、「式を使用した項目の読み取りと書き込み」を参照してください。

トピック• サンプルデータ (p. 52)• 式と項目のプライマリキーを使用して単一の項目を取得する (p. 55)• 式およびテーブルのプライマリキーを使用して複数の項目を取得する (p. 55)• 式および他の項目属性を使って複数の項目を取得する (p. 56)• 項目の出力 (p. 57)• 式を使用して項目を作成または置換する (p. 58)• 式を使用して項目を更新する (p. 60)• 式を使用して項目を削除する (p. 60)• 詳細 (p. 61)

サンプルデータこのトピックのコード例では、ProductCatalog という名前の DynamoDB テーブルに存在する次の 2つの項目を例として使用します。これらの項目は、架空の自転車店のカタログの製品エントリに関する情報を示します。これらの項目は、「導入事例: ProductCatalog 項目」で提供されている例に基づきます。BOOL、L、M、N、NS、S、SS などのデータ型記述子は、JSON データ形式でのデータ型に対応します。

{ "Id": { "N": "205" }, "Title": { "S": "20-Bicycle 205" }, "Description": { "S": "205 description" }, "BicycleType": { "S": "Hybrid" }, "Brand": { "S": "Brand-Company C" }, "Price": { "N": "500" }, "Gender": { "S": "B" }, "Color": { "SS": [

52

AWS SDK for .NET 開発者ガイドAmazon DynamoDB と AWS SDK for .NET での式の使用

"Red", "Black" ] }, "ProductCategory": { "S": "Bike" }, "InStock": { "BOOL": true }, "QuantityOnHand": { "N": "1" }, "RelatedItems": { "NS": [ "341", "472", "649" ] }, "Pictures": { "L": [ { "M": { "FrontView": { "S": "http://example/products/205_front.jpg" } } }, { "M": { "RearView": { "S": "http://example/products/205_rear.jpg" } } }, { "M": { "SideView": { "S": "http://example/products/205_left_side.jpg" } } } ] }, "ProductReviews": { "M": { "FiveStar": { "SS": [ "Excellent! Can't recommend it highly enough! Buy it!", "Do yourself a favor and buy this." ] }, "OneStar": { "SS": [ "Terrible product! Do not buy this." ] } } }},{ "Id": { "N": "301" }, "Title": {

53

AWS SDK for .NET 開発者ガイドAmazon DynamoDB と AWS SDK for .NET での式の使用

"S": "18-Bicycle 301" }, "Description": { "S": "301 description" }, "BicycleType": { "S": "Road" }, "Brand": { "S": "Brand-Company C" }, "Price": { "N": "185" }, "Gender": { "S": "F" }, "Color": { "SS": [ "Blue", "Silver" ] }, "ProductCategory": { "S": "Bike" }, "InStock": { "BOOL": true }, "QuantityOnHand": { "N": "3" }, "RelatedItems": { "NS": [ "801", "822", "979" ] }, "Pictures": { "L": [ { "M": { "FrontView": { "S": "http://example/products/301_front.jpg" } } }, { "M": { "RearView": { "S": "http://example/products/301_rear.jpg" } } }, { "M": { "SideView": { "S": "http://example/products/301_left_side.jpg" } } } ] }, "ProductReviews": { "M": {

54

AWS SDK for .NET 開発者ガイドAmazon DynamoDB と AWS SDK for .NET での式の使用

"FiveStar": { "SS": [ "My daughter really enjoyed this bike!" ] }, "ThreeStar": { "SS": [ "This bike was okay, but I would have preferred it in my color.", "Fun to ride." ] } } }}

式と項目のプライマリキーを使用して単一の項目を取得する次の例では、Amazon.DynamoDBv2.AmazonDynamoDBClient.GetItem メソッドと一連の式を使用して、Id が 205 である項目を取得して出力します。項目の属性のうち返されるものは、Id、Title、Description、Color、RelatedItems、Pictures、ProductReviews だけです。

// using Amazon.DynamoDBv2;// using Amazon.DynamoDBv2.Model;

var client = new AmazonDynamoDBClient();var request = new GetItemRequest{ TableName = "ProductCatalog", ProjectionExpression = "Id, Title, Description, Color, #ri, Pictures, #pr", ExpressionAttributeNames = new Dictionary<string, string> { { "#pr", "ProductReviews" }, { "#ri", "RelatedItems" } }, Key = new Dictionary<string, AttributeValue> { { "Id", new AttributeValue { N = "205" } } },};var response = client.GetItem(request);

// PrintItem() is a custom function.PrintItem(response.Item);

前の例で、ProjectionExpression プロパティは返される属性を指定しています。ExpressionAttributeNames プロパティで、プレースホルダー #pr は ProductReviews 属性を表し、プレースホルダー #ri は RelatedItems 属性を表します。PrintItem の呼び出しは、「項目の出力 (p. 57)」で説明されているようにカスタム関数を参照します。

式およびテーブルのプライマリキーを使用して複数の項目を取得する次の例では、Amazon.DynamoDBv2.AmazonDynamoDBClient.Query メソッドと一連の式を使用して、Id が 301 で Price の値が 150 より大きい項目を取得して出力します。返される項目の属性は、Id、Title、および ProductReviews のすべての ThreeStar 属性だけです。

// using Amazon.DynamoDBv2;// using Amazon.DynamoDBv2.Model;

var client = new AmazonDynamoDBClient();

55

AWS SDK for .NET 開発者ガイドAmazon DynamoDB と AWS SDK for .NET での式の使用

var request = new QueryRequest{ TableName = "ProductCatalog", KeyConditions = new Dictionary<string,Condition> { { "Id", new Condition() { ComparisonOperator = ComparisonOperator.EQ, AttributeValueList = new List<AttributeValue> { new AttributeValue { N = "301" } } } } }, ProjectionExpression = "Id, Title, #pr.ThreeStar", ExpressionAttributeNames = new Dictionary<string, string> { { "#pr", "ProductReviews" }, { "#p", "Price" } }, ExpressionAttributeValues = new Dictionary<string,AttributeValue> { { ":val", new AttributeValue { N = "150" } } }, FilterExpression = "#p > :val"};var response = client.Query(request);

foreach (var item in response.Items){ // Write out the first page of an item's attribute keys and values. // PrintItem() is a custom function. PrintItem(item); Console.WriteLine("=====");}

前の例で、ProjectionExpression プロパティは返される属性を指定しています。ExpressionAttributeNames プロパティで、プレースホルダー #pr は ProductReviews 属性を表し、プレースホルダー #p は Price 属性を表します。#pr.ThreeStar は、ThreeStar 属性だけを返すように指定します。ExpressionAttributeValues プロパティは、プレースホルダー :val が値 150を表すことを指定します。 FilterExpression プロパティは、#p(Price)が :val(150)より大きくなければならないことを指定します。PrintItem の呼び出しは、「項目の出力 (p. 57)」で説明されているようにカスタム関数を参照します。

式および他の項目属性を使って複数の項目を取得する次の例では、Amazon.DynamoDBv2.AmazonDynamoDBClient.Scan メソッドと一連の式を使用して、ProductCategory が Bike であるすべての項目を取得して出力します。返される項目の属性は、Id、Title、および ProductReviews のすべての属性だけです。

// using Amazon.DynamoDBv2;// using Amazon.DynamoDBv2.Model;

var client = new AmazonDynamoDBClient();var request = new ScanRequest{ TableName = "ProductCatalog", ProjectionExpression = "Id, Title, #pr", ExpressionAttributeValues = new Dictionary<string,AttributeValue> { { ":catg", new AttributeValue { S = "Bike" } } },

56

AWS SDK for .NET 開発者ガイドAmazon DynamoDB と AWS SDK for .NET での式の使用

ExpressionAttributeNames = new Dictionary<string, string> { { "#pr", "ProductReviews" }, { "#pc", "ProductCategory" } }, FilterExpression = "#pc = :catg", };var response = client.Scan(request);

foreach (var item in response.Items){ // Write out the first page/scan of an item's attribute keys and values. // PrintItem() is a custom function. PrintItem(item); Console.WriteLine("=====");}

前の例で、ProjectionExpression プロパティは返される属性を指定しています。ExpressionAttributeNames プロパティで、プレースホルダー #pr は ProductReviews 属性を表し、プレースホルダー #pc は ProductCategory 属性を表します。ExpressionAttributeValuesプロパティは、プレースホルダー :catg が値 Bike を表すことを指定します。 FilterExpression プロパティは、#pc(ProductCategory)が :catg(Bike)と等しくなければならないことを示します。PrintItem の呼び出しは、「項目の出力 (p. 57)」で説明されているようにカスタム関数を参照します。

項目の出力次の例では、項目の属性と値を出力する方法を示します。この例は、式と項目のプライマリキーを使用して単一の項目を取得する (p. 55)、式およびテーブルのプライマリキーを使用して複数の項目を取得する (p. 55)、および、式および他の項目属性を使って複数の項目を取得する (p. 56)の各方法について説明した前述の例で使用されています。

// using Amazon.DynamoDBv2.Model;

// Writes out an item's attribute keys and values.public static void PrintItem(Dictionary<string, AttributeValue> attrs){ foreach (KeyValuePair<string, AttributeValue> kvp in attrs) { Console.Write(kvp.Key + " = "); PrintValue(kvp.Value); }}

// Writes out just an attribute's value.public static void PrintValue(AttributeValue value){ // Binary attribute value. if (value.B != null) { Console.Write("Binary data"); } // Binary set attribute value. else if (value.BS.Count > 0) { foreach (var bValue in value.BS) { Console.Write("\n Binary data"); } } // List attribute value. else if (value.L.Count > 0)

57

AWS SDK for .NET 開発者ガイドAmazon DynamoDB と AWS SDK for .NET での式の使用

{ foreach (AttributeValue attr in value.L) { PrintValue(attr); } } // Map attribute value. else if (value.M.Count > 0) { Console.Write("\n"); PrintItem(value.M); } // Number attribute value. else if (value.N != null) { Console.Write(value.N); } // Number set attribute value. else if (value.NS.Count > 0) { Console.Write("{0}", string.Join("\n", value.NS.ToArray())); } // Null attribute value. else if (value.NULL) { Console.Write("Null"); } // String attribute value. else if (value.S != null) { Console.Write(value.S); } // String set attribute value. else if (value.SS.Count > 0) { Console.Write("{0}", string.Join("\n", value.SS.ToArray())); } // Otherwise, boolean value. else { Console.Write(value.BOOL); } Console.Write("\n");}

前の例では、各属性値に含まれる複数のデータ型固有のプロパティを評価して、属性を出力する正しい形式を決定しています。このようなプロパティとしては B、BOOL、BS、L、M、N、NS、NULL、S、SSなどがあり、これらは JSON データ形式に対応しています。 B、N、NULL、S などのプロパティでは、対応するプロパティが null ではない場合、属性は対応する null ではないデータ型になります。BS、L、M、NS、SS などのプロパティでは、Count がゼロより大きい場合、属性は対応するゼロ値ではないデータ型になります。属性のすべてのデータ型固有プロパティが null であるか、または Count がゼロに等しい場合、属性は BOOL データ型に対応します。

式を使用して項目を作成または置換する次の例では、Amazon.DynamoDBv2.AmazonDynamoDBClient.PutItem メソッドと一連の式を使用して、Title が 18-Bicycle 301 である項目を更新します。項目が存在しない場合、新しい項目が追加されます。

// using Amazon.DynamoDBv2;// using Amazon.DynamoDBv2.Model;

58

AWS SDK for .NET 開発者ガイドAmazon DynamoDB と AWS SDK for .NET での式の使用

var client = new AmazonDynamoDBClient();var request = new PutItemRequest{ TableName = "ProductCatalog", ExpressionAttributeNames = new Dictionary<string, string> { { "#title", "Title" } }, ExpressionAttributeValues = new Dictionary<string, AttributeValue> { { ":product", new AttributeValue { S = "18-Bicycle 301" } } }, ConditionExpression = "#title = :product", // CreateItemData() is a custom function. Item = CreateItemData()};client.PutItem(request);

前の例で、ExpressionAttributeNames プロパティは、プレースホルダー #title が Title 属性を表すことを指定します。ExpressionAttributeValues プロパティは、プレースホルダー:product が値 18-Bicycle 301 を表すことを指定します。 ConditionExpression プロパティは、#title(Title)が :product(18-Bicycle 301)と等しくなければならないことを示します。CreateItemData の呼び出しは、次のカスタム関数を参照します。

// using Amazon.DynamoDBv2.Model;

// Provides a sample item that can be added to a table.public static Dictionary<string, AttributeValue> CreateItemData(){ var itemData = new Dictionary<string, AttributeValue> { { "Id", new AttributeValue { N = "301" } }, { "Title", new AttributeValue { S = "18\" Girl's Bike" } }, { "BicycleType", new AttributeValue { S = "Road" } }, { "Brand" , new AttributeValue { S = "Brand-Company C" } }, { "Color", new AttributeValue { SS = new List<string>{ "Blue", "Silver" } } }, { "Description", new AttributeValue { S = "301 description" } }, { "Gender", new AttributeValue { S = "F" } }, { "InStock", new AttributeValue { BOOL = true } }, { "Pictures", new AttributeValue { L = new List<AttributeValue>{ { new AttributeValue { M = new Dictionary<string,AttributeValue>{ { "FrontView", new AttributeValue { S = "http://example/products/301_front.jpg" } } } } }, { new AttributeValue { M = new Dictionary<string,AttributeValue>{ { "RearView", new AttributeValue {S = "http://example/products/301_rear.jpg" } } } } }, { new AttributeValue { M = new Dictionary<string,AttributeValue>{ { "SideView", new AttributeValue { S = "http://example/products/301_left_side.jpg" } } } } } } } }, { "Price", new AttributeValue { N = "185" } }, { "ProductCategory", new AttributeValue { S = "Bike" } }, { "ProductReviews", new AttributeValue { M = new Dictionary<string,AttributeValue>{ { "FiveStar", new AttributeValue { SS = new List<string>{ "My daughter really enjoyed this bike!" } } }, { "OneStar", new AttributeValue { SS = new List<string>{ "Fun to ride.", "This bike was okay, but I would have preferred it in my color." } } } } } }, { "QuantityOnHand", new AttributeValue { N = "3" } }, { "RelatedItems", new AttributeValue { NS = new List<string>{ "979", "822", "801" } } } };

return itemData;

59

AWS SDK for .NET 開発者ガイドAmazon DynamoDB と AWS SDK for .NET での式の使用

}

前の例では、サンプルデータを含む項目の例が呼び出し元に返されます。JSON データ形式に対応するBOOL、L、M、N、NS、S、SS などのデータ型を使用して、一連の属性および対応する値が作成されます。

式を使用して項目を更新する次の例では、Amazon.DynamoDBv2.AmazonDynamoDBClient.UpdateItem メソッドと一連の式を使用して、Id が 301 である項目の Title を 18" Girl's Bike に変更します。

// using Amazon.DynamoDBv2;// using Amazon.DynamoDBv2.Model;

var client = new AmazonDynamoDBClient();var request = new UpdateItemRequest{ TableName = "ProductCatalog", Key = new Dictionary<string,AttributeValue> { { "Id", new AttributeValue { N = "301" } } }, ExpressionAttributeNames = new Dictionary<string, string> { { "#title", "Title" } }, ExpressionAttributeValues = new Dictionary<string, AttributeValue> { { ":newproduct", new AttributeValue { S = "18\" Girl's Bike" } } }, UpdateExpression = "SET #title = :newproduct"};client.UpdateItem(request);

前の例で、ExpressionAttributeNames プロパティは、プレースホルダー #title が Title 属性を表すことを指定します。ExpressionAttributeValues プロパティは、プレースホルダー:newproduct が値 18" Girl's Bike を表すことを指定します。 UpdateExpression プロパティは、#title(Title)を :newproduct(18" Girl's Bike)に変更することを指定します。

式を使用して項目を削除する次の例では、Amazon.DynamoDBv2.AmazonDynamoDBClient.DeleteItem メソッドと一連の式を使用して、Id が 301 で Title が 18-Bicycle 301 である項目を削除します。

// using Amazon.DynamoDBv2;// using Amazon.DynamoDBv2.Model;

var client = new AmazonDynamoDBClient();var request = new DeleteItemRequest{ TableName = "ProductCatalog", Key = new Dictionary<string,AttributeValue> { { "Id", new AttributeValue { N = "301" } } }, ExpressionAttributeNames = new Dictionary<string, string> { { "#title", "Title" } }, ExpressionAttributeValues = new Dictionary<string, AttributeValue> { { ":product", new AttributeValue { S = "18-Bicycle 301" } }

60

AWS SDK for .NET 開発者ガイドAWS SDK for .NET を使用した Amazon

DynamoDB での JSON のサポート

}, ConditionExpression = "#title = :product"};client.DeleteItem(request);

前の例で、ExpressionAttributeNames プロパティは、プレースホルダー #title が Title 属性を表すことを指定します。ExpressionAttributeValues プロパティは、プレースホルダー:product が値 18-Bicycle 301 を表すことを指定します。 ConditionExpression プロパティは、#title(Title)が :product(18-Bicycle 301)と等しくなければならないことを示します。

詳細詳細な説明とコード例については、以下を参照してください。

• DynamoDB Series - Expressions• プロジェクト式を使用した項目属性へのアクセス• 属性の名前および値でのプレースホルダーの使用• 条件式を使用した条件の指定• 更新式を使用した項目および属性の変更• AWS SDK for .NET の低レベル API を使用した、項目の操作• AWS SDK for .NET 低レベル API を使用したテーブルのクエリ• AWS SDK for .NET の低レベル API を使用したテーブルのスキャン• AWS SDK for .NET 低レベル API を使用したローカルセカンダリインデックスの使用方法• AWS SDK for .NET 低レベル API を使用したグローバルセカンダリインデックスの使用方法

AWS SDK for .NET を使用した Amazon DynamoDBでの JSON のサポートAWS SDK for .NET は Amazon DynamoDB と併せて使用することで JSON データをサポートします。これにより、簡単に DynamoDB テーブルから JSON 形式のデータを取得したり、テーブルに JSON ドキュメントを挿入したりできます。

トピック• JSON 形式のデータを DynamoDB テーブルから取得する (p. 61)• JSON 形式のデータを DynamoDB テーブルに挿入する (p. 62)• DynamoDB データ型の JSON への変換 (p. 62)• 詳細 (p. 63)

JSON 形式のデータを DynamoDB テーブルから取得する次の例では、JSON 形式のデータを DynamoDB テーブルから取得する方法を示します。

// using Amazon.DynamoDBv2;// using Amazon.DynamoDBv2.DocumentModel;

var client = new AmazonDynamoDBClient();var table = Table.LoadTable(client, "AnimalsInventory");var item = table.GetItem(3, "Horse");

var jsonText = item.ToJson();Console.Write(jsonText);

61

AWS SDK for .NET 開発者ガイドAWS SDK for .NET を使用した Amazon

DynamoDB での JSON のサポート

// Output:// {"Name":"Shadow","Type":"Horse","Id":3}

var jsonPrettyText = item.ToJsonPretty();Console.WriteLine(jsonPrettyText); // Output:// {// "Name" : "Shadow",// "Type" : "Horse",// "Id" : 3// }

この例では、Document クラスの ToJson メソッドを使用してテーブルの項目を JSON 形式の文字列に変換しています。項目を取得するには、Table クラスの GetItem メソッドを使用します。取得する項目を特定するには、この例では、対象項目のハッシュおよび範囲プライマリキーを GetItem メソッドで使用しています。Table クラスの LoadTable メソッドで項目を取得するテーブルを特定するには、AmazonDynamoDBClient クラスのインスタンスと DynamoDB の対象テーブルの名前を使用します。

JSON 形式のデータを DynamoDB テーブルに挿入する次の例では、JSON 形式を使用して DynamoDB テーブルに項目を挿入する方法を示します。

// using Amazon.DynamoDBv2;// using Amazon.DynamoDBv2.DocumentModel;

var client = new AmazonDynamoDBClient();var table = Table.LoadTable(client, "AnimalsInventory");var jsonText = "{\"Id\":6,\"Type\":\"Bird\",\"Name\":\"Tweety\"}";var item = Document.FromJson(jsonText);

table.PutItem(item);

この例では、Document クラスの FromJson メソッドを使用して JSON 形式の文字列を項目に変換しています。項目は、Table クラスの PutItem メソッドによってテーブルに挿入されます。このメソッドは、項目を含む Document クラスのインスタンスを使用します。項目を挿入するテーブルを特定するには、Table クラスの LoadTable メソッドを呼び出し、AmazonDynamoDBClient クラスのインスタンスと DynamoDB の対象テーブルの名前を指定します。

DynamoDB データ型の JSON への変換Document クラスの ToJson メソッドを呼び出すとき、および結果の JSON データで FromJson メソッドを呼び出して JSON データを Document クラスのインスタンスに変換するときは常に、一部のDynamoDB データ型が意図したとおりに変換されません。具体的には次のとおりです。

• DynamoDB のセット(SS、NS、BS 型)は、JSON の配列に変換されます。• DynamoDB のバイナリスカラーおよびセット(B、BS 型)は、base64 でエンコードされた JSON 文字

列または文字列のリストに変換されます。

この場合は、Document クラスの DecodeBase64Attributes メソッドを呼び出して、base64でエンコードされた JSON データを正しいバイナリ表現に置き換える必要があります。次の例では、Document クラスのインスタンスの Picture という名前の base64 でエンコードされたバイナリスカラー項目属性を、正しいバイナリ表現で置き換えています。また、この例では、Document クラスの同じインスタンスの RelatedPictures という名前の base64 でエンコードされたバイナリセット項目属性に対しても同じことを行っています。

item.DecodeBase64Attributes("Picture", "RelatedPictures");

62

AWS SDK for .NET 開発者ガイドAmazon DynamoDB を使用し

た ASP.NET セッション状態の管理

詳細AWS SDK for .NET による DynamoDB を使用した JSON のプログラミングの詳細と例については、次を参照してください。

• DynamoDB JSON Support• Amazon DynamoDB Update - JSON, Expanded Free Tier, Flexible Scaling, Larger Items

Amazon DynamoDB を使用した ASP.NET セッション状態の管理ASP.NET アプリケーションは、セッション状態のデータをメモリに格納する場合があります。ただし、この方法は十分な拡張性がありません。アプリケーションが複数のウェブサーバーを対象とする規模に拡大した後、セッション状態をサーバー間で共有する必要があります。一般的な対応策は、Microsoft SQLServer を使用して専用のセッション状態サーバーをセットアップすることですが、この方法にも欠点があります。他のマシンの管理が必要になり、セッション状態サーバーが単一障害点となります。また、セッション状態サーバー自体がパフォーマンスのボトルネックとなる可能性があります。

DynamoDB (Amazon Web Services (AWS) の NoSQL データベースストア) を使用すると、各ウェブサーバーを対象としたセッション状態の共有に対して効果的なソリューションが実現され、これらの欠点が回避されます。

Note

使用するソリューションに関係なく、Amazon DynamoDB では項目のサイズに制限が適用されることに注意してください。DynamoDB に保存するどのレコードも、この制限を超えることはできません。詳細については、DynamoDB Developer Guideの「DynamoDB での制限」を参照してください。

AWS SDK for .NET には、ASP.NET セッション状態プロバイダーが含まれているAWS.SessionProvider.dll が付属しています。また、AmazonDynamoDBSessionProviderSample サンプルも含まれています。このサンプルは、Amazon DynamoDB をセッション状態プロバイダとして使用する方法を示します。

ASP.NET アプリケーションでセッション状態を使用する方法の詳細については、MSDN のドキュメントを参照してください。

ASP.NET_SessionState テーブルの作成アプリケーションを起動すると、そのアプリケーションは Amazon DynamoDB テーブル(デフォルト名はASP.NET_SessionState)を探します。最初にアプリケーションを実行する前に、このテーブルを作成することをお勧めします。

ASP.NET_SessionState テーブルを作成するには

1. [Create Table] を選択します。[Create Table] ウィザードが開きます。2. [Table name] テキストボックスに「ASP.NET_SessionState」と入力します。3. [Primary key] フィールドに「SessionId」と入力し、そのタイプを「String」に設定します。4. すべてのオプションを入力したら、[Create] を選択します。

ステータスが CREATING から ACTIVE に変わったら、ASP.NET_SessionState テーブルは使用できる状態になります。

63

AWS SDK for .NET 開発者ガイドAmazon DynamoDB を使用し

た ASP.NET セッション状態の管理

Note

テーブルを事前に作成しない場合、初期化時にセッション状態プロバイダーによってテーブルが作成されます。セッション状態テーブルの設定パラメータとして機能する属性のリストについては、下記の web.config オプションを参照してください。プロバイダーがテーブルを作成する場合は、これらのパラメータを使用します。

セッション状態プロバイダーの設定DynamoDB をセッション状態サーバーとして使用するように ASP.NET アプリケーションを設定するには

1. Visual Studio ASP.NET プロジェクトに、AWSSDK.dll と AWS.SessionProvider.dll への参照を追加します。これらのアセンブリは、AWS SDK for .NET (p. 5) をインストールすると利用できます。NuGet (p. 5) を使用してこれらのアセンブリをインストールすることもできます。

SDK の以前のバージョンでは、セッション状態プロバイダーの機能は AWS.Extension.dll に含まれていました。使いやすさを向上させるために、この機能は AWS.SessionProvider.dll に移動されました。詳細については、ブログ投稿「AWS.Extension の名前変更」を参照してください。

2. アプリケーションの Web.config ファイルを編集します。system.web 要素で、既存のsessionState 要素を次の XML フラグメントに置き換えます。

<sessionState timeout="20" mode="Custom" customProvider="DynamoDBSessionStoreProvider"> <providers> <add name="DynamoDBSessionStoreProvider" type="Amazon.SessionProvider.DynamoDBSessionStateStore" AWSProfileName="{profile_name}" Region="us-west-2" /> </providers></sessionState>

プロファイルは、セッション状態の保存と取得のために DynamoDB との通信で使用される AWS 認証情報を表します。AWS SDK for .NET を使用していて、アプリケーションの Web.config ファイルのappSettings セクションでプロファイルを指定している場合は、providers セクションでプロファイルを指定する必要はありません。AWS の .NET クライアントコードが実行時にプロファイルを検出します。詳細については、「AWS SDK for .NET アプリケーションの設定 (p. 8)」を参照してください。

ウェブサーバーが、EC2 インスタンスの IAM ロールを使用するように設定されている Amazon EC2インスタンスで実行されている場合は、Web.config ファイルで認証情報を指定する必要はありません。この場合、AWS .NET クライアントは IAM ロール認証情報を使用します。詳細については、「IAMロールを使用したアクセスの許可 (p. 107)」と「セキュリティ上の考慮事項 (p. 65)」を参照してください。

Web.config オプション

providers ファイルの Web.config セクションで、次の設定属性を使用できます。

AWSAccessKey

使用するアクセスキー ID。これは、providers セクションまたは appSettings セクションで設定できます。この設定を使用しないことをお勧めします。代わりに、AWSProfileName を使用して認証情報を指定し、プロファイルを指定してください。

AWSSecretKey

使用するシークレットキー。これは、providers セクションまたは appSettings セクションで設定できます。この設定を使用しないことをお勧めします。代わりに、AWSProfileName を使用して認証情報を指定し、プロファイルを指定してください。

64

AWS SDK for .NET 開発者ガイドAmazon DynamoDB を使用し

た ASP.NET セッション状態の管理

AWSProfileName

使用する認証情報に関連付けられるプロファイルの名前。詳細については、「AWS SDK for .NET アプリケーションの設定 (p. 8)」を参照してください。

リージョン

必須の string 属性。Amazon DynamoDB を使用する AWS リージョンです。AWS リージョンの一覧については、「リージョンとエンドポイント: DynamoDB」を参照してください。

アプリケーション

オプションの string 属性。Application 属性の値は、テーブルのセッションデータをパーティション分割するために使用されます。これにより、テーブルを複数のアプリケーションで使用することができます。

オプションの string 属性。セッションデータの格納に使用されるテーブルの名前。デフォルト:ASP.NET_SessionState。

ReadCapacityUnits

オプションの int 属性。プロバイダーがテーブルを作成する際に使用する読み取りキャパシティーユニット。デフォルトは 10 です。

WriteCapacityUnits

オプションの int 属性。プロバイダーがテーブルを作成する際に使用する書き込みキャパシティーユニット。デフォルトは 5 です。

CreateIfNotExist

オプションの boolean 属性。CreateIfNotExist 属性は、テーブルがない場合にプロバイダーがテーブルを自動作成するかどうかを制御します。デフォルトは true です。このフラグが false に設定され、テーブルが存在しない場合は、例外がスローされます。

セキュリティに関する考慮事項DynamoDB テーブルを作成し、アプリケーションを設定した後は、どのセッションプロバイダーでもセッションを使用できるようになります。

セキュリティのベストプラクティスとして、IAM ユーザーの認証情報を使用してアプリケーションを実行することをお勧めします。IAM マネジメントコンソールまたは AWS Toolkit for Visual Studio のいずれかを使用して、IAM ユーザーを作成し、アクセスポリシーを定義できます。

セッション状態プロバイダーでは、セッションデータを保存するテーブルに対して、DeleteItem、DescribeTable、GetItem、PutItem、UpdateItem、の各オペレーションの呼び出しが可能になっている必要があります。次のサンプルポリシーを使用して、us-east-1 で実行している DynamoDBのインスタンスのプロバイダが必要とするオペレーションだけを使用できるように、IAM ユーザーを制限することができます。

{ "Version" : "2012-10-17","Statement" : [ { "Sid" : "1", "Effect" : "Allow", "Action" : [ "dynamodb:DeleteItem", "dynamodb:DescribeTable", "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:UpdateItem" ],

65

AWS SDK for .NET 開発者ガイドAmazon EC2 例

"Resource" : "arn:aws:dynamodb:|region_api_default|:{<YOUR-AWS-ACCOUNT-ID>}:table/ASP.NET_SessionState" } ]}

Amazon EC2 例AWS SDK for .NET は Amazon EC2 をサポートします。Amazon EC2 は、ユーザーがソフトウェアシステムを構築しホストするための、コンピューティング能力を自在に拡張および縮小できるウェブサービスです (実際には Amazon のデータセンター内のサーバー)。Amazon EC2 の API は、AWSSDK.EC2 アセンブリによって提供されます。

Amazon EC2 インスタンスの例は、Amazon EC2 の使用を開始するためのものです。

Amazon EC2 スポットインスタンスの例では、スポットインスタンスの使用方法を示します。これは、未使用の Amazon EC2 キャパシティーに対してお客様から価格を提示していただき、入札値段がその時点のスポット料金を上回っている限り、お客様がインスタンスを実行できるというシステムです。AmazonEC2 のスポット価格は、需要と供給に基づいて定期的に変動しますが、お客様の入札価格がその価格以上ならば、空いているスポットインスタンスにアクセスできます。詳細については、Amazon EC2User Guide for Linux Instancesの「スポットインスタンス」および Amazon EC2 User Guide for WindowsInstancesの「スポットインスタンス」を参照してください。

トピック• Amazon EC2 インスタンスの例 (p. 66)• Amazon EC2 スポットインスタンスの例 (p. 84)

Amazon EC2 インスタンスの例AWS SDK for .NET を使用して Amazon EC2 の機能にアクセスできます。たとえば、Amazon EC2 インスタンスを作成、開始、終了できます。

サンプルコードは C# で書かれていますが、互換性のある任意の言語で AWS SDK for .NET を使用できます。AWS Toolkit for Visual Studio のインストール時に、一連の C# プロジェクトテンプレートがインストールされます。したがって、このプロジェクトを開始する最も簡単な方法は、Visual Studio を開き、[File]、[New Project]、[AWS Sample Projects]、[Compute and Networking]、[AWS EC2 Sample] の順に選択することです。

前提条件

始める前に、AWS アカウントを作成し、AWS の認証情報を設定してください。詳細については、「AWSSDK for .NET の開始方法 (p. 3)」を参照してください。

トピック• Amazon EC2 クライアントの作成 (p. 67)• Amazon EC2 のセキュリティグループの作成 (p. 67)• Amazon EC2 キーペアでの作業 (p. 71)• Amazon EC2 インスタンスの起動 (p. 73)• Amazon EC2 インスタンスの削除 (p. 78)• Amazon EC2 でのリージョンとアベイラビリティーゾーンの使用 (p. 79)• Amazon EC2 で VPC エンドポイントを使用する (p. 80)• Amazon EC2 の Elastic IP アドレスの使用 (p. 82)

66

AWS SDK for .NET 開発者ガイドAmazon EC2 インスタンスの例

Amazon EC2 クライアントの作成インスタンスやセキュリティグループなどの EC2 リソースを管理するための Amazon EC2 クライアントを作成します。このクライアントは、AmazonEC2Client オブジェクトで表され、以下のように作成できます。

var ec2Client = new AmazonEC2Client();

クライアントオブジェクトのアクセス許可は、App.config ファイルで指定したプロファイルにアタッチされているポリシーによって決まります。デフォルトでは、App.config で指定されているリージョンを使用します。 異なるリージョンを使用するには、適切な RegionEndpoint 値をコンストラクタに渡します。詳細については、Amazon Web Services General Referenceの「リージョンとエンドポイント: EC2」を参照してください。

Amazon EC2 のセキュリティグループの作成Amazon EC2 では、セキュリティグループは 1 つ以上の EC2 インスタンスのネットワークトラフィックを制御する仮想ファイアウォールとして機能します。デフォルトでは、Amazon EC2 はインバウンドトラフィックを許可しないセキュリティグループとインスタンスを関連付けます。EC2 インスタンスが特定のトラフィックを受け付けるセキュリティグループを作成できます。たとえば、EC2 Windows インスタンスに接続する必要がある場合は、RDP トラフィックを許可するようにセキュリティグループを設定する必要があります。セキュリティグループは、Amazon EC2 コンソールまたは AWS SDK for .NET を使って作成できます。

EC2-Classic または EC2-VPC で使用するセキュリティグループを作成します。EC2-Classic と EC2-VPCの詳細については、Amazon EC2 User Guide for Windows Instancesの「サポートされているプラットフォーム」を参照してください。

または、Amazon EC2 コンソールを使ってセキュリティグループを作成することもできます。詳細については、Amazon EC2 User Guide for Windows Instancesの「Amazon EC2 の追加セキュリティグループ」を参照してください。

セキュリティグループの列挙セキュリティグループを列挙して、セキュリティグループが存在するかどうかを確認できます。

セキュリティグループを列挙するには

セキュリティグループの完全なリストを取得するには、パラメータなしの DescribeSecurityGroups を使用します。

次の例では、リージョン内のセキュリティグループをすべて列挙します。

static void EnumerateSecurityGroups(AmazonEC2Client ec2Client){ var request = new DescribeSecurityGroupsRequest(); var response = ec2Client.DescribeSecurityGroups(request); List<SecurityGroup> mySGs = response.SecurityGroups; foreach (SecurityGroup item in mySGs) { Console.WriteLine("Security group: " + item.GroupId); Console.WriteLine("\tGroupId: " + item.GroupId); Console.WriteLine("\tGroupName: " + item.GroupName); Console.WriteLine("\tVpcId: " + item.VpcId);

Console.WriteLine(); }}

67

AWS SDK for .NET 開発者ガイドAmazon EC2 インスタンスの例

特定の VPC のセキュリティグループを列挙するには

DescribeSecurityGroups とフィルタを使用します。

次の例では、指定した VPC に属するセキュリティグループだけを取得します。

static void EnumerateVpcSecurityGroups(AmazonEC2Client ec2Client, string vpcID){ Filter vpcFilter = new Filter { Name = "vpc-id", Values = new List<string>() { vpcID } };

var request = new DescribeSecurityGroupsRequest(); request.Filters.Add(vpcFilter); var response = ec2Client.DescribeSecurityGroups(request); List<SecurityGroup> mySGs = response.SecurityGroups; foreach (SecurityGroup item in mySGs) { Console.WriteLine("Security group: " + item.GroupId); Console.WriteLine("\tGroupId: " + item.GroupId); Console.WriteLine("\tGroupName: " + item.GroupName); Console.WriteLine("\tVpcId: " + item.VpcId);

Console.WriteLine(); }}

既存のセキュリティグループと同じ名前でセキュリティグループを作成しようとすると、CreateSecurityGroup は例外をスローします。これを回避するため、次の例では、名前を指定してセキュリティグループを検索し、見つかった場合は、適切な SecurityGroup オブジェクトを返します。

EC2-Classic 用セキュリティグループを作成するには

CreateSecurityGroupRequest オブジェクトを作成し、初期化します。GroupName および Descriptionプロパティに、名前と説明をそれぞれ割り当てます。

CreateSecurityGroup メソッドは CreateSecurityGroupResponse オブジェクトを返します。応答から新しいセキュリティグループの識別子を取得した後、DescribeSecurityGroups とセキュリティグループの識別子を使用して、セキュリティグループの SecurityGroup オブジェクトを取得できます。

static SecurityGroup CreateEc2SecurityGroup( AmazonEC2Client ec2Client, string secGroupName){ // See if a security group with the specified name already exists Filter nameFilter = new Filter(); nameFilter.Name = "group-name"; nameFilter.Values= new List<string>() { secGroupName };

var describeRequest = new DescribeSecurityGroupsRequest(); describeRequest.Filters.Add(nameFilter); var describeResponse = ec2Client.DescribeSecurityGroups(describeRequest);

// If a match was found, return the SecurityGroup object for the security group if(describeResponse.SecurityGroups.Count > 0) { return describeResponse.SecurityGroups[0]; }

// Create the security group

68

AWS SDK for .NET 開発者ガイドAmazon EC2 インスタンスの例

var createRequest = new CreateSecurityGroupRequest(); createRequest.GroupName = secGroupName; createRequest.Description = "My sample security group for EC2-Classic";

var createResponse = ec2Client.CreateSecurityGroup(createRequest);

var Groups = new List<string>() { createResponse.GroupId }; describeRequest = new DescribeSecurityGroupsRequest() { GroupIds = Groups }; describeResponse = ec2Client.DescribeSecurityGroups(describeRequest); return describeResponse.SecurityGroups[0];}

EC2-VPC 用セキュリティグループを作成するには

CreateSecurityGroupRequest オブジェクトを作成し、初期化します。GroupName、Description、VpcId の各プロパティに値を割り当てます。

CreateSecurityGroup メソッドは CreateSecurityGroupResponse オブジェクトを返します。応答から新しいセキュリティグループの識別子を取得した後、DescribeSecurityGroups とセキュリティグループの識別子を使用して、セキュリティグループの SecurityGroup オブジェクトを取得できます。

static SecurityGroup CreateVpcSecurityGroup( AmazonEC2Client ec2Client, string vpcId, string secGroupName){ // See if a security group with the specified name already exists Filter nameFilter = new Filter(); nameFilter.Name = "group-name"; nameFilter.Values = new List<string>() { secGroupName };

var describeRequest = new DescribeSecurityGroupsRequest(); describeRequest.Filters.Add(nameFilter); var describeResponse = ec2Client.DescribeSecurityGroups(describeRequest);

// If a match was found, return the SecurityGroup object for the security group if (describeResponse.SecurityGroups.Count > 0) { return describeResponse.SecurityGroups[0]; }

// Create the security group var createRequest = new CreateSecurityGroupRequest(); createRequest.GroupName = secGroupName; createRequest.Description = "My sample security group for EC2-VPC"; createRequest.VpcId = vpcId;

var createResponse = ec2Client.CreateSecurityGroup(createRequest);

var Groups = new List<string>() { createResponse.GroupId }; describeRequest = new DescribeSecurityGroupsRequest() { GroupIds = Groups }; describeResponse = ec2Client.DescribeSecurityGroups(describeRequest); return describeResponse.SecurityGroups[0];}

次の手順を使用して、TCP ポート 3389(RDP)のインバウンドトラフィックを許可するルールを追加します。これにより、Windows インスタンスに接続できます。Linux インスタンスを起動する場合は、代わりに TCP ポート 22(SSH)を使用します。

Note

サービスを使用して、ローカルコンピュータのパブリック IP アドレスを取得できます。たとえば、次のサービスが提供されています。http://checkip.amazonaws.com/IP アドレスを提供する別

69

AWS SDK for .NET 開発者ガイドAmazon EC2 インスタンスの例

のサービスを検索するには、検索フレーズ「what is my IP address」を使用します。ISP 経由で、またはファイアウォールの内側から静的な IP アドレスなしで接続している場合は、クライアントコンピュータで使用されている IP アドレスの範囲を見つける必要があります。

このセクションの例は、前のセクションの例の続きです。secGroup は既存のセキュリティグループとします。

セキュリティグループにルールを追加するには

1. IpPermission オブジェクトを作成し、初期化します。

string ipRange = "1.1.1.1/1";List<string> ranges = new List<string>() { ipRange };

var ipPermission = new IpPermission();ipPermission.IpProtocol = "tcp";ipPermission.FromPort = 3389;ipPermission.ToPort = 3389;ipPermission.IpRanges = ranges;

IpProtocol

IP プロトコルです。FromPort および ToPort

ポート範囲の開始と終了です。この例では 1 つのポート 3389 を指定し、RDP 経由での Windowsとの通信に使用します。

IpRanges

CIDR 表記での IP アドレスまたはアドレス範囲です。便宜上、この例では 72.21.198.64/24を使用しており、これは 1 つの IP アドレスに対するネットワークトラフィックを許可します。http://checkip.amazonaws.com/ を使用して独自の IP アドレスを決定できます。

2. AuthorizeSecurityGroupIngressRequest オブジェクトを作成し、初期化します。

var ingressRequest = new AuthorizeSecurityGroupIngressRequest();ingressRequest.GroupId = secGroup.GroupId;ingressRequest.IpPermissions.Add(ipPermission);

GroupId

セキュリティグループの識別子。IpPermissions

ステップ 1 からの IpPermission オブジェクトです。3. (オプション)次のステップに進む前に、IpPermissions コレクションにルールを追加できます。4. AuthorizeSecurityGroupIngressRequest オブジェクトを AuthorizeSecurityGroupIngress メソッドに渡

すと、AuthorizeSecurityGroupIngressResponse オブジェクトが返されます。一致するルールが既にある場合、AmazonEC2Exception がスローされます。

try{ var ingressResponse = ec2Client.AuthorizeSecurityGroupIngress(ingressRequest); Console.WriteLine("New RDP rule for: " + ipRange);}catch (AmazonEC2Exception ex){ // Check the ErrorCode to see if the rule already exists if ("InvalidPermission.Duplicate" == ex.ErrorCode)

70

AWS SDK for .NET 開発者ガイドAmazon EC2 インスタンスの例

{ Console.WriteLine("An RDP rule for: {0} already exists.", ipRange); } else { // The exception was thrown for another reason, so re-throw the exception throw; }}

Amazon EC2 キーペアでの作業Amazon EC2 は公開キー暗号化を使用し、ログイン情報の暗号化と復号を行います。パブリックキー暗号はパブリックキーを使用してデータを暗号化し、受信者はプライベートキーを使用してデータを復号します。パブリックキーとプライベートキーは、キーペアと呼ばれます。EC2 インスタンスを起動するときはキーペアを指定し、インスタンスに接続するときはキーペアのプライベートキーを指定する必要があります。キーペアを作成することも、他のインスタンスを起動するときに使用したキーペアを使用することもできます。詳細については、Amazon EC2 User Guide for Windows Instancesの「Amazon EC2 のキーペア」を参照してください。この例では、キーペアの作成、キーペアの説明、これらの AmazonEC2Clientのメソッドを使用したキーペアの削除の方法を示します。

• CreateKeyPair• DeleteKeyPair• DescribeKeyPairs

キーペアを作成してプライベートキーを保存する

新しいキーペアを作成するときは、返されたプライベートキーを保存する必要があります。後でプライベートキーを取得することはできません。

CreateKeyPairRequest オブジェクトを作成し、初期化します。KeyName プロパティにキーペアの名前を設定します。

CreateKeyPair メソッドに要求オブジェクトを渡すと、CreateKeyPairResponse オブジェクトが返されます。指定した名前のキーペアが既に存在する場合、AmazonEC2Exception がスローされます。

応答オブジェクトには、新しいキーの KeyPair オブジェクトを含む CreateKeyPairResponse オブジェクトが含まれます。KeyPair オブジェクトの KeyMaterial プロパティには、キーペアの暗号化されていないプライベートキーが含まれます。プライベートキーを安全な場所に .pem ファイルとして保存します。このファイルは、インスタンスに接続するときに必要になります。この例は、指定されたファイル名でプライベートキーを保存します。

public static void CreateKeyPair( AmazonEC2Client ec2Client, string keyPairName, string privateKeyFile){ var request = new CreateKeyPairRequest(); request.KeyName = keyPairName;

try { var response = ec2Client.CreateKeyPair(request); Console.WriteLine(); Console.WriteLine("New key: " + keyPairName);

// Save the private key in a .pem file using (FileStream s = new FileStream(privateKeyFile, FileMode.Create))

71

AWS SDK for .NET 開発者ガイドAmazon EC2 インスタンスの例

using (StreamWriter writer = new StreamWriter(s)) { writer.WriteLine(response.KeyPair.KeyMaterial); } } catch (AmazonEC2Exception ex) { // Check the ErrorCode to see if the key already exists if("InvalidKeyPair.Duplicate" == ex.ErrorCode) { Console.WriteLine("The key pair \"{0}\" already exists.", keyPairName); } else { // The exception was thrown for another reason, so re-throw the exception. throw; } }}

.. _enumerate-key-pairs:

キーペアの列挙キーペアを列挙し、キーペアがあるかどうかをチェックできます。

キーペアの完全なリストを取得するには、パラメータを指定しないで DescribeKeyPairs メソッドを使用します。

public static void EnumerateKeyPairs(AmazonEC2Client ec2Client){ var request = new DescribeKeyPairsRequest(); var response = ec2Client.DescribeKeyPairs(request);

foreach (KeyPairInfo item in response.KeyPairs) { Console.WriteLine("Existing key pair: " + item.KeyName); }}

.. _delete-key-pairs:

キーペアの削除AmazonEC2Client インスタンスから DeleteKeyPair を呼び出してキーペアを削除できます。

キーペアの名前を含む DeleteKeyPairRequest を、AmazonEC2Client オブジェクトの DeleteKeyPair メソッドに渡します。

public static void DeleteKeyPair( AmazonEC2Client ec2Client, KeyPair keyPair){ try { // Delete key pair created for sample ec2Client.DeleteKeyPair(new DeleteKeyPairRequest { KeyName = keyPair.KeyName }); } catch (AmazonEC2Exception ex) { // Check the ErrorCode to see if the key already exists if ("InvalidKeyPair.NotFound" == ex.ErrorCode) {

72

AWS SDK for .NET 開発者ガイドAmazon EC2 インスタンスの例

Console.WriteLine("The key pair \"{0}\" was not found.", keyPair.KeyName); } else { // The exception was thrown for another reason, so re-throw the exception throw; } }}

Amazon EC2 インスタンスの起動同じ Amazon Machine Image (AMI) からまったく同じに設定された 1 つ以上の Amazon EC2 インスタンスを起動するには、以下の手順を使用します。EC2 インスタンスを作成した後は、ステータスを確認できます。EC2 インスタンスが実行した後は、それに接続できます。

EC2-Classic または VPC での EC2 インスタンスの起動EC2-Classic または VPC でインスタンスを起動できます。EC2-Classic と EC2-VPC の詳細については、Amazon EC2 User Guide for Windows Instancesの「サポートされているプラットフォーム」を参照してください。

EC2-Classic で EC2 インスタンスを起動するには

1. RunInstancesRequest オブジェクトを作成して初期化します。指定した AMI、キーペア、およびセキュリティグループが、クライアントオブジェクトを作成したときに指定したリージョンに存在することを確認します。

string amiID = "ami-e189c8d1";string keyPairName = "my-sample-key";

List<string> groups = new List<string>() { mySG.GroupId };var launchRequest = new RunInstancesRequest(){ ImageId = amiID, InstanceType = InstanceType.T1Micro, MinCount = 1, MaxCount = 1, KeyName = keyPairName, SecurityGroupIds = groups};

ImageId

AMI の ID。パブリック AMI のリストについては、「Amazon マシンイメージ」を参照してください。

InstanceType

指定した AMI と互換性のあるインスタンスタイプ。詳細については、Amazon EC2 User Guidefor Windows Instancesの「インスタンスタイプ」を参照してください。

MinCount

起動する EC2 インスタンスの最小数。ターゲットアベイラビリティーゾーンで Amazon EC2 が起動できるインスタンスより多い場合、Amazon EC2 はインスタンスを起動しません。

MaxCount

起動する EC2 インスタンスの最大数。ターゲットアベイラビリティーゾーンで Amazon EC2 が起動できるインスタンスより多い場合、Amazon EC2 は MinCount より多くて可能な最大数のインスタンスを起動します。1 から、インスタンスタイプに対して許可されているインスタンス

73

AWS SDK for .NET 開発者ガイドAmazon EC2 インスタンスの例

の最大数の間で起動できます。詳細については、Amazon EC2 の「よくある質問」の「AmazonEC2 で実行できるインスタンス数の上限は」を参照してください。KeyName

EC2 キーペアの名前。キーペアを指定せずにインスタンスを起動すると、接続できません。詳細については、「Amazon EC2 のキーペアでの作業 (p. 71)」を参照してください。

SecurityGroupIds

1 つ以上のセキュリティグループの識別子。詳細については、「Amazon EC2 のセキュリティグループの作成 (p. 67)」を参照してください。

2. (オプション)IAM ロール (p. 107)でインスタンスを起動するには、RunInstancesRequest オブジェクトで IAM インスタンスプロファイルを指定します。

IAM ユーザーは、以下のポリシーによってアクセス権限が付与されていないと、IAM ロールでインスタンスを起動できません。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "iam:PassRole", "iam:ListInstanceProfiles", "ec2:*" ], "Resource": "*" }] }

たとえば、次のスニペットは、 という名前の IAM ロールの IamInstanceProfileSpecificationwinapp-instance-role-1 オブジェクトをインスタンス化して設定します。

var instanceProfile = new IamInstanceProfile();instanceProfile.Id = "winapp-instance-role-1";

RunInstancesRequest オブジェクトでこのインスタンスプロファイルを指定するには、次の行を追加します。

launchRequest.IamInstanceProfile = instanceProfile;

3. リクエストオブジェクトを RunInstances メソッドに渡してインスタンスを起動します。インスタンスの管理に必要なため、インスタンスの ID を保存します。

新しいインスタンスのインスタンス ID を取得するには、返された RunInstancesResponse オブジェクトを使用します。Reservation.Instances プロパティには、正常に起動した EC2 インスタンスごとに 1 つずつ、Instance オブジェクトのリストが含まれます。InstanceIdInstance オブジェクトの プロパティから、各インスタンスの ID を取得できます。

var launchResponse = ec2Client.RunInstances(launchRequest);var instances = launchResponse.Reservation.Instances;var instanceIds = new List<string>();foreach (Instance item in instances){ instanceIds.Add(item.InstanceId); Console.WriteLine(); Console.WriteLine("New instance: " + item.InstanceId); Console.WriteLine("Instance state: " + item.State.Name);}

74

AWS SDK for .NET 開発者ガイドAmazon EC2 インスタンスの例

EC2 インスタンスを VPC 内で起動するには

1. VPC のサブネットで Elastic Network Interface を作成して初期化します。

string subnetID = "subnet-cb663da2";

List<string> groups = new List<string>() { mySG.GroupId };var eni = new InstanceNetworkInterfaceSpecification(){ DeviceIndex = 0, SubnetId = subnetID, Groups = groups, AssociatePublicIpAddress = true};List<InstanceNetworkInterfaceSpecification> enis = new List<InstanceNetworkInterfaceSpecification>() {eni};

DeviceIndex

ネットワークインターフェイスのアタッチメント用の、インスタンス上のデバイスのインデックス。

SubnetId

インスタンスを起動するサブネットの ID。GroupIds

1 つまたは複数のセキュリティグループ。詳細については、「Amazon EC2 のセキュリティグループの作成 (p. 67)」を参照してください。

AssociatePublicIpAddress

VPC のインスタンスにパブリック IP アドレスを自動的に割り当てるかどうかを示します。2. RunInstancesRequest オブジェクトを作成して初期化します。指定した AMI、キーペア、およびセ

キュリティグループが、クライアントオブジェクトを作成したときに指定したリージョンに存在することを確認します。

string amiID = "ami-e189c8d1";string keyPairName = "my-sample-key";

var launchRequest = new RunInstancesRequest(){ ImageId = amiID, InstanceType = InstanceType.T1Micro, MinCount = 1, MaxCount = 1, KeyName = keyPairName, NetworkInterfaces = enis};

ImageId

AMI の ID。Amazon が提供しているパブリック AMI のリストについては、「Amazon マシンイメージ」を参照してください。

InstanceType

指定した AMI と互換性のあるインスタンスタイプ。詳細については、Amazon EC2 User Guidefor Windows Instancesの「インスタンスタイプ」を参照してください。

75

AWS SDK for .NET 開発者ガイドAmazon EC2 インスタンスの例

MinCount

起動する EC2 インスタンスの最小数。ターゲットアベイラビリティーゾーンで Amazon EC2 が起動できるインスタンスより多い場合、Amazon EC2 はインスタンスを起動しません。

MaxCount

起動する EC2 インスタンスの最大数。ターゲットアベイラビリティーゾーンで Amazon EC2 が起動できるインスタンスより多い場合、Amazon EC2 は MinCount より多くて可能な最大数のインスタンスを起動します。1 から、インスタンスタイプに対して許可されているインスタンスの最大数の間で起動できます。詳細については、Amazon EC2 の「よくある質問」の「AmazonEC2 で実行できるインスタンス数の上限は」を参照してください。

KeyName

EC2 キーペアの名前。キーペアを指定せずにインスタンスを起動すると、接続できません。詳細については、「Amazon EC2 のキーペアでの作業 (p. 71)」を参照してください。

NetworkInterfaces

1 つ以上のネットワークインターフェイス。3. (オプション)IAM ロール (p. 107)でインスタンスを起動するには、RunInstancesRequest オブ

ジェクトで IAM インスタンスのプロファイルを指定します。

IAM ユーザーは、以下のポリシーによってアクセス権限が付与されていないと、IAM ロールでインスタンスを起動できません。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "iam:PassRole", "iam:ListInstanceProfiles", "ec2:*" ], "Resource": "*" }]}

たとえば、次のスニペットは、 という名前の IAM ロールの IamInstanceProfileSpecificationwinapp-instance-role-1 オブジェクトをインスタンス化して設定します。

var instanceProfile = new IamInstanceProfileSpecification();instanceProfile.Name = "winapp-instance-role-1";

RunInstancesRequest オブジェクトでこのインスタンスプロファイルを指定するには、次の行を追加します。

launchRequest.IamInstanceProfile = instanceProfile;

4. リクエストオブジェクトを RunInstances メソッドに渡してインスタンスを起動します。インスタンスの管理に必要なので、インスタンスの ID を保存します。

新しいインスタンスのインスタンス ID のリストを取得するには、返された RunInstancesResponseオブジェクトを使用します。Reservation.Instances プロパティには、正常に起動した EC2 インスタンスごとに 1 つずつ、Instance オブジェクトのリストが含まれます。InstanceIdInstance オブジェクトの プロパティから、各インスタンスの ID を取得できます。

RunInstancesResponse launchResponse = ec2Client.RunInstances(launchRequest);

76

AWS SDK for .NET 開発者ガイドAmazon EC2 インスタンスの例

List<String> instanceIds = new List<string>();foreach (Instance instance in launchResponse.Reservation.Instances){ Console.WriteLine(instance.InstanceId); instanceIds.Add(instance.InstanceId);}

インスタンスの状態の確認

インスタンスの現在の状態を取得するには、以下の手順を使用します。最初、インスタンスの状態はpending です。インスタンスが running 状態になった後、インスタンスに接続できます。

1. DescribeInstancesRequest オブジェクトを作成して設定し、インスタンスのインスタンス ID をInstanceIds プロパティに割り当てます。また、Filter プロパティを使用して、特定のユーザー指定タグを持つインスタンスなど、特定のインスタンスへのリクエストを制限できます。

var instanceRequest = new DescribeInstancesRequest();instanceRequest.InstanceIds = new List<string>();instanceRequest.InstanceIds.Add(instanceId);

2. DescribeInstances メソッドを呼び出して、ステップ 1 のリクエストオブジェクトを渡します。メソッドは、インスタンスに関する情報を含む DescribeInstancesResponse オブジェクトを返します。

var response = ec2Client.DescribeInstances(instanceRequest);

3. DescribeInstancesResponse.Reservations プロパティには予約のリストが含まれます。この場合、予約は 1 つのみです。各予約には、Instance オブジェクトのリストが含まれます。この場合、インスタンスはやはり 1 つのみです。インスタンスのステータスは State プロパティから取得できます。

Console.WriteLine(response.Reservations[0].Instances[0].State.Name);

実行中のインスタンスへの接続

インスタンスが実行状態になった後、適切なリモートクライアントを使用してリモート接続できます。

Linux インスタンスの場合は、SSH クライアントを使用します。インスタンスの SSH ポート(22)がトラフィックに対して開かれていることを確認する必要があります。インスタンスのパブリック IP アドレスまたはパブリック DNS 名と、インスタンスの起動に使用されたキーペアのプライベート部分が必要です。詳細については、Amazon EC2 User Guide for Linux Instancesの「Linux インスタンスへの接続」を参照してください。

Windows インスタンスの場合は、RDP クライアントを使用します。インスタンスの RDP ポート(3389)がトラフィックに対して開かれていることを確認する必要があります。インスタンスのパブリック IP アドレスまたは DNS 名と、管理者パスワード必要です。管理者パスワードは、GetPasswordData およびGetPasswordDataResult.GetDecryptedPassword メソッドで取得します。これらのメソッドには、インスタンスの起動に使用したキーペアのプライベート部分が必要です。詳細については、:ec2-ug-win:「<problematic>`</problematic>RDP を使用して Windows インスタンスに接続する<connecting_to_windows_instance>`」(Amazon EC2User Guide for Windows Instances) を参照してください。次の例では、Windows インスタンスのパスワードを取得する方法を示します。

public static string GetWindowsPassword( AmazonEC2Client ec2Client,

77

AWS SDK for .NET 開発者ガイドAmazon EC2 インスタンスの例

string instanceId, FileInfo privateKeyFile){ string password = "";

var request = new GetPasswordDataRequest(); request.InstanceId = instanceId;

var response = ec2Client.GetPasswordData(request); if (null != response.PasswordData) { using (StreamReader sr = new StreamReader(privateKeyFile.FullName)) { string privateKeyData = sr.ReadToEnd(); password = response.GetDecryptedPassword(privateKeyData); } } else { Console.WriteLine("The password is not available. The password for " + "instance {0} is either not ready, or it is not a Windows instance.", instanceId); }

return password;}

EC2 インスタンスが必要なくなったときは、「Amazon EC2 インスタンスの削除 (p. 78)」を参照してください。

Amazon EC2 インスタンスの削除Amazon EC2 インスタンスが必要なくなったときは、それらを終了できます。

EC2 インスタンスを削除するには

public static void TerminateInstance( AmazonEC2Client ec2Client, string instanceId){ var request = new TerminateInstancesRequest(); request.InstanceIds = new List<string>() { instanceId };

try { var response = ec2Client.TerminateInstances(request); foreach (InstanceStateChange item in response.TerminatingInstances) { Console.WriteLine("Terminated instance: " + item.InstanceId); Console.WriteLine("Instance state: " + item.CurrentState.Name); } } catch(AmazonEC2Exception ex) { // Check the ErrorCode to see if the instance does not exist. if ("InvalidInstanceID.NotFound" == ex.ErrorCode) { Console.WriteLine("Instance {0} does not exist.", instanceId); } else { // The exception was thrown for another reason, so re-throw the exception. throw;

78

AWS SDK for .NET 開発者ガイドAmazon EC2 インスタンスの例

} }}

1. TerminateInstancesRequest オブジェクトを作成し、初期化します。2. インスタンスを削除するには、TerminateInstancesRequest.InstanceIds プロパティに、1 つ

以上のインスタンス ID のリストを設定します。3. TerminateInstances メソッドにリクエストオブジェクトを渡します。指定されたインスタンスが存在

しない場合、AmazonEC2Exception がスローされます。4. 次のように TerminateInstancesResponse オブジェクトを使用して、終了したインスタンスのリスト

を取得できます。

Amazon EC2 でのリージョンとアベイラビリティーゾーンの使用この .NET の例は、以下の方法を示します。

• アベイラビリティーゾーンの詳細を取得する• リージョンについての詳細を取得する

シナリオ

Amazon EC2 は、世界各地のロケーションでホスティングされています。これらのロケーションは、リージョンとアベイラビリティーゾーンから構成されています。それぞれのリージョンは地理別に分類された地域であり、アベイラビリティーゾーンと呼ばれる複数の独立したロケーションを持っています。Amazon EC2 では、複数のロケーションにインスタンスとデータを配置することができます。

AWS SDK for .NET と、AmazonEC2Client クラスの以下のメソッドを使用して、リージョンとアベイラビリティーゾーンに関する詳細を取得できます。

• DescribeAvailabilityZones• DescribeRegions

リージョンとアベイラビリティーゾーンの詳細については、Amazon EC2 User Guide for WindowsInstancesの「リージョンとアベイラビリティーゾーン」を参照してください。

アベイラビリティーゾーンの記述

AmazonEC2Client インスタンスを作成し、DescribeAvailabilityZones メソッドを呼び出します。返されるDescribeAvailabilityZonesResponse オブジェクトには、アベイラビリティーゾーンのリストが含まれています。

public static void DescribeAvailabilityZones(){ Console.WriteLine("Describe Availability Zones"); AmazonEC2Client client = new AmazonEC2Client(); DescribeAvailabilityZonesResponse response = client.DescribeAvailabilityZones(); var availZones = new List<AvailabilityZone>(); availZones = response.AvailabilityZones; foreach (AvailabilityZone az in availZones) { Console.WriteLine(az.ZoneName); }}

79

AWS SDK for .NET 開発者ガイドAmazon EC2 インスタンスの例

リージョンの記述

AmazonEC2Client インスタンスを作成し、DescribeRegions メソッドを呼び出します。返されるDescribeRegionsResponse オブジェクトには、リージョンのリストが含まれています。

public static void DescribeRegions(){ Console.WriteLine("Describe Regions"); AmazonEC2Client client = new AmazonEC2Client(); DescribeRegionsResponse response = client.DescribeRegions(); var regions = new List<Region>(); regions = response.Regions; foreach (Region region in regions) { Console.WriteLine(region.RegionName); }}

Amazon EC2 で VPC エンドポイントを使用するこの .NET 例は、VPC エンドポイントを作成、記述、変更、削除する方法を示しています。

シナリオ

VPC エンドポイントにより、VPC とアカウントの他の AWS のサービスとをプライベートに接続できます。VPC からサービスへのアクセスを制御するエンドポイントにアタッチするポリシーを指定できます。また、エンドポイントを使用する VPC ルートテーブルも指定できます。

この例では、次の AmazonEC2Client メソッドを使用します。

• CreateVpcEndpoint• DescribeVpcEndpoints• ModifyVpcEndpoint• DeleteVpcEndpoints

VPC エンドポイントの作成

次の例では、Amazon Simple Storage Service (S3) の VPC エンドポイントを作成します。

AmazonEC2Client インスタンスを作成します。VPC エンドポイントを作成できるように、新しい VPC を作成します。

コンストラクタのパラメータとして IPv4 CIDR ブロックを指定して、CreateVpcRequest オブジェクトを作成します。CreateVpcRequest を使用し、CreateVpc メソッドを使用して VPC を作成します。そのVPC を使用して CreateVpcEndpointRequest オブジェクトをインスタンス化し、エンドポイントのサービス名を指定します。次に、そのリクエストオブジェクトを使用して CreateVpcEndpoint メソッドを呼び出し、VpcEndpoint を作成します。

public static void CreateVPCEndpoint(){ AmazonEC2Client client = new AmazonEC2Client(); CreateVpcRequest vpcRequest = new CreateVpcRequest("10.32.0.0/16"); CreateVpcResponse vpcResponse = client.CreateVpc(vpcRequest); Vpc vpc = vpcResponse.Vpc; CreateVpcEndpointRequest endpointRequest = new CreateVpcEndpointRequest(); endpointRequest.VpcId = vpc.VpcId; endpointRequest.ServiceName = "com.amazonaws.us-west-2.s3";

80

AWS SDK for .NET 開発者ガイドAmazon EC2 インスタンスの例

CreateVpcEndpointResponse cVpcErsp = client.CreateVpcEndpoint(endpointRequest); VpcEndpoint vpcEndPoint = cVpcErsp.VpcEndpoint;}

VPC エンドポイントの記述

AmazonEC2Client インスタンスを作成します。次に、DescribeVpcEndpointsRequest オブジェクトを作成し、返す結果の最大数を 5 に制限します。その DescribeVpcEndpointsRequest オブジェクトを使用して、DescribeVpcEndpoints メソッドを呼び出します。返される DescribeVpcEndpointsResponse には、VPC エンドポイントのリストが含まれます。

public static void DescribeVPCEndPoints(){ AmazonEC2Client client = new AmazonEC2Client(); DescribeVpcEndpointsRequest endpointRequest = new DescribeVpcEndpointsRequest(); endpointRequest.MaxResults = 5; DescribeVpcEndpointsResponse endpointResponse = client.DescribeVpcEndpoints(endpointRequest); List<VpcEndpoint> endpointList = endpointResponse.VpcEndpoints; foreach (VpcEndpoint vpc in endpointList) { Console.WriteLine("VpcEndpoint ID = " + vpc.VpcEndpointId); List<string> routeTableIds = vpc.RouteTableIds; foreach (string id in routeTableIds) { Console.WriteLine("\tRoute Table ID = " + id); }

}}

VPC エンドポイントの変更

次の例では、指定された VPC エンドポイントの属性を変更します。エンドポイントに関連付けられたポリシーを変更し、エンドポイントに関連付けられたルートテーブルを追加、削除できます。

AmazonEC2Client インスタンスを作成します。VPC エンドポイントの ID と、それに追加するルートテーブルの ID を使用して、ModifyVpcEndpointRequest オブジェクトを作成します。ModifyVpcEndpointRequest オブジェクトの ModifyVpcEndpoint メソッドを呼び出します。返される ModifyVpcEndpointResponse オブジェクトには、変更リクエストが成功したかどうかを示す HTTPステータスコードが含まれます。

public static void ModifyVPCEndPoint(){ AmazonEC2Client client = new AmazonEC2Client(); ModifyVpcEndpointRequest modifyRequest = new ModifyVpcEndpointRequest(); modifyRequest.VpcEndpointId = "vpce-17b05a7e"; modifyRequest.AddRouteTableIds = new List<string> { "rtb-c46f15a3" }; ModifyVpcEndpointResponse modifyResponse = client.ModifyVpcEndpoint(modifyRequest); HttpStatusCode status = modifyResponse.HttpStatusCode; if (status.ToString() == "OK") Console.WriteLine("ModifyHostsRequest succeeded"); else Console.WriteLine("ModifyHostsRequest failed");

VPC エンドポイントの削除

1 つまたは複数の VPC エンドポイントを削除できます。エンドポイントを削除すると、エンドポイントに関連付けられていたルートテーブル内のエンドポイントルートも削除されます。

81

AWS SDK for .NET 開発者ガイドAmazon EC2 インスタンスの例

AmazonEC2Client インスタンスを作成します。DescribeVpcEndpoints メソッドを使用して、EC2 クライアントに関連付けられている VPC エンドポイントをリストします。VPC エンドポイントのリストを使用して、VPC エンドポイント ID のリストを作成します。そのリストを使用して、DeleteVpcEndpoints メソッドで使用する DeleteVpcEndpointsRequest オブジェクトを作成します。

private static void DeleteVPCEndPoint(){ AmazonEC2Client client = new AmazonEC2Client(); DescribeVpcEndpointsRequest endpointRequest = new DescribeVpcEndpointsRequest(); endpointRequest.MaxResults = 5; DescribeVpcEndpointsResponse endpointResponse = client.DescribeVpcEndpoints(endpointRequest); List<VpcEndpoint> endpointList = endpointResponse.VpcEndpoints; var vpcEndPointListIds = new List<string>(); foreach (VpcEndpoint vpc in endpointList) { Console.WriteLine("VpcEndpoint ID = " + vpc.VpcEndpointId); vpcEndPointListIds.Add(vpc.VpcEndpointId); } DeleteVpcEndpointsRequest deleteRequest = new DeleteVpcEndpointsRequest(); deleteRequest.VpcEndpointIds = vpcEndPointListIds; client.DeleteVpcEndpoints(deleteRequest);}

Amazon EC2 の Elastic IP アドレスの使用この .NET の例は、以下の方法を示します。

• Elastic IP アドレスの説明を取得する• Elastic IP アドレスを Amazon EC2 インスタンスに割り当て、関連付ける• Elastic IP アドレスを解放する

シナリオ

Elastic IP アドレスは、動的なクラウドコンピューティングのために設計された静的 IP アドレスです。Elastic IP アドレスは AWS アカウントに関連付けられ、インターネットからアクセス可能なパブリック IP アドレスです。

Amazon EC2 インスタンスにパブリック IP アドレスがない場合、Elastic IP アドレスをインスタンスに関連付けて、インターネットとの通信を有効にできます。

この例では、AWS SDK for .NET を使用し、Amazon EC2 クライアントクラスのこれらのメソッドによりElastic IP アドレスを管理します。

• DescribeAddresses• AllocateAddress• AssociateAddress• ReleaseAddress

Amazon EC2 の Elastic IP アドレスの詳細については、Amazon EC2 User Guide for Windows Instancesの「Elastic IP アドレス」を参照してください。

Elastic IP アドレスの記述

AmazonEC2Client オブジェクトを作成します。次に、パラメータとして渡す DescribeAddressesRequestオブジェクトを作成し、VPC でそれらのオブジェクトによって返されたアドレスをフィルタリングし

82

AWS SDK for .NET 開発者ガイドAmazon EC2 インスタンスの例

ます。すべての Elastic IP アドレスの説明を取得するには、パラメータからフィルタを省略します。次に、AmazonEC2Client オブジェクトの DescribeAddresses メソッドを呼び出します。

public void DescribeElasticIps(){ using (var client = new AmazonEC2Client(RegionEndpoint.USWest2)) { var addresses = client.DescribeAddresses(new DescribeAddressesRequest { Filters = new List<Filter> { new Filter { Name = "domain", Values = new List<string> { "vpc" } } } }).Addresses;

foreach(var address in addresses) { Console.WriteLine(address.PublicIp); Console.WriteLine("\tAllocation Id: " + address.AllocationId); Console.WriteLine("\tPrivate IP Address: " + address.PrivateIpAddress); Console.WriteLine("\tAssociation Id: " + address.AssociationId); Console.WriteLine("\tInstance Id: " + address.InstanceId); Console.WriteLine("\tNetwork Interface Owner Id: " + address.NetworkInterfaceOwnerId); } }}

Elastic IP アドレスの割り当てと関連付け

AmazonEC2Client オブジェクトを作成します。次に、Elastic IP アドレスの割り当てに使用されるパラメータの AllocateAddressRequest オブジェクトを作成します。この場合は、ドメインが VPC であることを指定します。AmazonEC2Client オブジェクトの AllocateAddress メソッドを呼び出します。

成功すると、返される AllocateAddressResponse オブジェクトには、割り当てられた Elastic IP アドレスを識別する AllocationId プロパティが含まれます。

Amazon EC2 インスタンスに Elastic IP アドレスを関連付けるために使用されるパラメータの AssociateAddressRequest オブジェクトを作成します。新しく割り当てられたアドレスからの AllocationId および Amazon EC2 インスタンスの InstanceId を含めます。次に、AmazonEC2Client オブジェクトの AssociateAddress メソッドを呼び出します。

public void AllocateAndAssociate(string instanceId){ using (var client = new AmazonEC2Client(RegionEndpoint.USWest2)) { var allocationId = client.AllocateAddress(new AllocateAddressRequest { Domain = DomainType.Vpc }).AllocationId;

Console.WriteLine("Allocation Id: " + allocationId);

var associationId = client.AssociateAddress(new AssociateAddressRequest { AllocationId = allocationId, InstanceId = instanceId }).AssociationId;

83

AWS SDK for .NET 開発者ガイドAmazon EC2 スポットインスタンスの例

Console.WriteLine("Association Id: " + associationId); }}

Elastic IP アドレスを解放する

AmazonEC2Client オブジェクトを作成します。次に、Elastic IP アドレスの解放に使用されるパラメータの ReleaseAddressRequest オブジェクトを作成します。この場合は、Elastic IP アドレスのAllocationId を指定します。Elastic IP アドレスを解放すると、Amazon EC2 インスタンスから関連付けが解除されます。Amazon EC2 サービスオブジェクトの ReleaseAddress メソッドを呼び出します。

public void Release(string allocationId){ using (var client = new AmazonEC2Client(RegionEndpoint.USWest2)) { client.ReleaseAddress(new ReleaseAddressRequest { AllocationId = allocationId }); }}

Amazon EC2 スポットインスタンスの例このトピックでは、Amazon EC2 スポットインスタンスで AWS SDK for .NET を使用する方法を説明します。

トピック• 概要 (p. 84)• 前提条件 (p. 85)• 認証情報のセットアップ (p. 85)• スポットリクエストの提出 (p. 85)• スポットリクエストの状態の特定 (p. 87)• スポットリクエストとインスタンスのクリーンアップ (p. 87)

概要スポットインスタンスとは、Amazon EC2 の未使用キャパシティに対してお客様から価格を提示していただき、入札値段がその時点のスポット価格を上回っている限り、お客様がインスタンスを実行できるというシステムです。Amazon EC2 のスポット価格は、需要と供給に基づいて定期的に変動しますが、お客様の入札価格がその価格以上ならば、空いているスポットインスタンスにアクセスできます。オンデマンドインスタンスやリザーブドインスタンスと同様に、スポットインスタンスは、より多くのコンピューティング能力を得るためのもう 1 つの選択肢を提供します。

スポットインスタンスを利用すると、バッチ処理、科学研究、画像処理、動画エンコーディング、データと Web のクローリング、財務分析、テストなどの Amazon EC2 のアプリケーションのコストを大幅に削減できます。また、スポットインスタンスは大量のコンピューティング容量を必要としながら、緊急性は低い場合に便利なオプションです。

スポットインスタンスを使用するには、スポットインスタンスリクエストを提出し、このときにインスタンス時間当たりいくらまで支払えるかを指定します。これが入札価格です。入札価格がその時点のスポット料金を超えている場合は、リクエストが受理されてインスタンスを実行できるようになります。このインスタンスの実行は、お客様がインスタンスを終了した時点と、スポット料金が入札価格を上回った時点

84

AWS SDK for .NET 開発者ガイドAmazon EC2 スポットインスタンスの例

のいずれか早い方までとなります。スポットインスタンスは、このチュートリアルで示すようにプログラムで終了するか、AWS マネジメントコンソールまたは AWS Toolkit for Visual Studio を使用して削除できます。

次の 2 つの点に注意してください。

1. 時間当たりの支払い金額が入札価格を下回ることもよくあります。Amazon EC2 のスポット価格は、提出されるリクエストや空きインスタンスの変動に応じて、定期的に変更されます。お客様それぞれの入札価格の方が上かどうかにかかわらず、どのお客様もその期間の同一のスポット料金をお支払いいただきます。したがって、お客様が支払う金額は入札価格を下回ることもありますが、入札価格を超えることはありません。

2. スポットインスタンスを実行しているときに、お客様の入札価格がその時点のスポット料金以上ではなくなった場合は、そのインスタンスは終了となります。このため、お客様の作業負荷とアプリケーションに、この便宜的な(ただし、一時的である可能性のある)容量を利用できる柔軟性があるかどうか確認することをお勧めします。

スポットインスタンスは、稼働中、他の Amazon EC2 インスタンスとまったく同じように動作します。また、他の Amazon EC2 インスタンスと同様に、スポットインスタンスは不要になったときに終了することができます。お客様がインスタンスを終了した場合は、使用時間の端数分についても料金をいただきます (オンデマンドやリザーブドのインスタンスと同様です)。ただし、スポット価格がお客様の入札価格を超えたために Amazon EC2 によってインスタンスが終了した場合、使用時間の端数分の料金は発生しません。

このチュートリアルでは、.NET プログラミング環境を使用して以下の作業を行う方法について説明します。

• スポットリクエストを提出する• スポットリクエストが受理されたかどうかを判断する• スポットリクエストをキャンセルする• 関連するインスタンスを終了させる

前提条件このチュートリアルは、AWS にサインアップして、.NET 開発環境をセットアップし、AWS SDKfor .NET をインストールしていることを前提としています。Microsoft Visual Studio の開発環境を使用する場合は、AWS Toolkit for Visual Studio もインストールすることをお勧めします。環境のセットアップ方法については、「AWS SDK for .NET の開始方法 (p. 3)」を参照してください。

認証情報のセットアップAWS の認証情報を SDK で使用する方法については、「AWS 認証情報の設定 (p. 11)」を参照してください。

スポットリクエストの提出スポットリクエストを提出するには、最初に使用するインスタンスタイプ、Amazon マシンイメージ(AMI)、最高入札価格を決定する必要があります。セキュリティグループも指定する必要があります。これにより、必要に応じてインスタンスにログインできます。セキュリティグループを作成する方法については、「Amazon EC2 のセキュリティグループを作成する (p. 67)」を参照してください。

選択できるインスタンスタイプにはさまざまなものがあります。すべての一覧については、Amazon EC2インスタンスタイプのページを参照してください。このチュートリアルでは、t1.micro を使用します。また、現在の Windows AMI の ID を取得します。詳細については、Amazon EC2 User Guide for WindowsInstancesの「AMI の検索」を参照してください。

85

AWS SDK for .NET 開発者ガイドAmazon EC2 スポットインスタンスの例

スポットインスタンス入札のアプローチは多数あります。さまざまなアプローチの概要については、スポットインスタンスの入札の動画をご覧ください。ただし、ここでは初めての方のために、3 つの一般的な戦略について説明します。その 3 つとは、「コストがオンデマンド価格より低くなるように入札する」、「計算処理の結果の価値に基づいて入札する」、「できるだけ早く計算キャパシティーを獲得できるように入札する」です。

コストをオンデマンドよりも低くする

実行完了までに何時間も、あるいは何日間もかかるバッチ処理ジョブがあるとします。ただし、いつ開始していつ終了するかについては、特に決められていないものとします。このジョブを完了するためのコストを、オンデマンドインスタンスを使用する場合よりも低くできるかどうかを考えます。インスタンスタイプのスポット価格の履歴を、AWS マネジメントコンソール または Amazon EC2 APIを使用して調べます。詳細については、「View Spot Price History」を参照してください。使用したいインスタンスタイプの、特定のアベイラビリティーゾーンでの価格履歴を分析した後は、入札のアプローチとして次の 2 つも考えられます。• スポット料金の範囲の上限(ただしオンデマンド価格よりは下)で入札します。このようにすれ

ば、この 1 回限りのスポットリクエストが受理される可能性が高くなり、ジョブが完了するまで連続して実行できるからです。

• または、価格範囲の下限で入札し、1 つの永続リクエストで次々とインスタンスを起動するよう計画を立てます。これらのインスタンスの実行時間を合計すると、ジョブを完了するのに十分な長さとなり、合計コストも低くなります。 (この作業を自動化する方法については、このチュートリアルで後ほど説明します)

結果の価値以上は支払わない

データ処理ジョブを実行するとします。このジョブの結果の価値は判明しており、計算コストに換算してどれくらいになるかもわかっています。使用するインスタンスタイプのスポット料金履歴の分析が完了した後で、入札価格を選択します。計算時間のコストがこのジョブの結果の価値を上回ることがないように、価格を決定します。永続リクエストを作成し、スポット料金が入札価格以下となったときに断続的に実行するよう設定します。

計算キャパシティーをすぐに獲得する

追加のキャパシティーが突然、短期間だけ必要になることがあり、オンデマンドインスタンスではそのキャパシティーを獲得できないとします。使用するインスタンスタイプのスポット料金履歴の分析が完了した後で、履歴の価格の最大値を超える価格で入札します。このようにすれば、リクエストがすぐに受理される可能性が高まり、計算が完了するまで連続して計算できるようになります。

入札価格を選択すると、スポットインスタンスをリクエストできる状態になります。このチュートリアルでは、オンデマンド価格(0.03 USD)で入札します。これは、受理される可能性を最大にするためです。利用できるインスタンスのタイプと、インスタンスのオンデマンド料金を調べるには、Amazon EC2 の料金表のページを参照してください。

スポットインスタンスをリクエストするには、これまでに指定したパラメータを使用してリクエストを作成します。初めに、RequestSpotInstanceRequest オブジェクトを作成します。このリクエストオブジェクトには、入札価格と起動したいインスタンスの数が必要です。さらに、リクエストのLaunchSpecification を設定する必要があります。これには、インスタンスタイプ、AMI ID、およびスポットインスタンスに使用するセキュリティグループの名前が含まれます。リクエストの内容を設定した後、RequestSpotInstances メソッドを呼び出してスポットインスタンスリクエストを作成します。次の例では、スポットインスタンスをリクエストする方法を示します。

public static SpotInstanceRequest RequestSpotInstance( AmazonEC2Client ec2Client, string amiId, string securityGroupName, InstanceType instanceType, string spotPrice, int instanceCount)

86

AWS SDK for .NET 開発者ガイドAmazon EC2 スポットインスタンスの例

{ var request = new RequestSpotInstancesRequest();

request.SpotPrice = spotPrice; request.InstanceCount = instanceCount;

var launchSpecification = new LaunchSpecification(); launchSpecification.ImageId = amiId; launchSpecification.InstanceType = instanceType;

launchSpecification.SecurityGroups.Add(securityGroupName);

request.LaunchSpecification = launchSpecification;

var result = ec2Client.RequestSpotInstances(request);

return result.SpotInstanceRequests[0];}

スポットリクエスト ID は、SpotInstanceRequestIdSpotInstanceRequest オブジェクトの メンバーに含まれます。

このコードを実行すると、新しいスポットインスタンスリクエストが発行されます。

Note

スポットインスタンスが起動されるとお客様への課金が発生するので、料金を抑えるために、リクエストを作成した場合はキャンセルし、インスタンスを起動した場合は終了してください。

他にも、スポットリクエストの設定に使用できるオプションがあります。詳細については、AWS SDKfor .NETの「RequestSpotInstances」を参照してください。

スポットリクエストの状態の特定次に、最後のステップに進む前に、スポットリクエストの状態が Active になるのを待つ必要があります。スポットリクエストの状態を特定するには、DescribeSpotInstanceRequests メソッドを使用して、モニタリング対象のスポットリクエスト ID の状態を取得します。

public static SpotInstanceState GetSpotRequestState( AmazonEC2Client ec2Client, string spotRequestId){ // Create the describeRequest object with all of the request ids // to monitor (e.g. that we started). var request = new DescribeSpotInstanceRequestsRequest(); request.SpotInstanceRequestIds.Add(spotRequestId);

// Retrieve the request we want to monitor. var describeResponse = ec2Client.DescribeSpotInstanceRequests(request);

SpotInstanceRequest req = describeResponse.SpotInstanceRequests[0];

return req.State;}

スポットリクエストとインスタンスのクリーンアップ最後のステップは、リクエストとインスタンスのクリーンアップです。未完了リクエストのキャンセルと、インスタンスの削除の両方を行うことが重要です。リクエストをキャンセルするだけではインスタン

87

AWS SDK for .NET 開発者ガイドAmazon EC2 スポットインスタンスの例

スは終了しないので、引き続きお客様への課金が発生することになります。インスタンスを削除すると、スポットリクエストがキャンセルされることもありますが、場合によっては(たとえば、持続的入札を使用した場合)、インスタンスを終了しただけでは、リクエストが再度受理されるのを停止できないことがあります。したがって、アクティブな入札のキャンセルと実行中インスタンスの削除の両方を行うことをお勧めします。

スポットリクエストをキャンセルするには、CancelSpotInstanceRequests メソッドを使用します。次の例では、スポットリクエストをキャンセルする方法を示します。

public static void CancelSpotRequest( AmazonEC2Client ec2Client, string spotRequestId){ var cancelRequest = new CancelSpotInstanceRequestsRequest();

cancelRequest.SpotInstanceRequestIds.Add(spotRequestId);

ec2Client.CancelSpotInstanceRequests(cancelRequest);}

インスタンスを削除するには、TerminateInstances メソッドを使用します。次の例では、アクティブなスポットインスタンスのインスタンス ID を取得してインスタンスを削除する方法を示します。

public static void TerminateSpotInstance( AmazonEC2Client ec2Client, string spotRequestId){ var describeRequest = new DescribeSpotInstanceRequestsRequest(); describeRequest.SpotInstanceRequestIds.Add(spotRequestId);

// Retrieve the request we want to monitor. var describeResponse = ec2Client.DescribeSpotInstanceRequests(describeRequest);

if (SpotInstanceState.Active == describeResponse.SpotInstanceRequests[0].State) { string instanceId = describeResponse.SpotInstanceRequests[0].InstanceId;

var terminateRequest = new TerminateInstancesRequest(); terminateRequest.InstanceIds = new List<string>() { instanceId };

try { var terminateResponse = ec2Client.TerminateInstances(terminateRequest); } catch (AmazonEC2Exception ex) { // Check the ErrorCode to see if the instance does not exist. if ("InvalidInstanceID.NotFound" == ex.ErrorCode) { Console.WriteLine("Instance {0} does not exist.", instanceId); } else { // The exception was thrown for another reason, so re-throw the exception. throw; } } }}

アクティブなインスタンスの削除について詳しくは、「Amazon EC2 インスタンスの削除 (p. 78)」を参照してください。

88

AWS SDK for .NET 開発者ガイドAmazon Glacier の例

Amazon Glacier の例AWS SDK for .NET は、頻繁に使用されないデータ (コールドデータ) に最適化されたストレージサービスである Amazon Glacier をサポートします。このサービスは、データのアーカイブとバックアップ用に、セキュリティ機能を備えた耐久性が高く極めてローコストのストレージを提供します。詳細については、Amazon Glacier 開発者ガイドをご覧ください。

以下では、AWS SDK for .NET での Amazon Glacier プログラミングモデルについて説明します。

プログラミングモデルAWS SDK for .NET では Amazon Glacier 用に 2 つのプログラミングモデルが提供されています。以下では、これらのモデルの概要と、これらのモデルを使用する理由および使用方法について説明します。

トピック• 低レベル API (p. 89)• 高レベル API (p. 91)

低レベル APIAWS SDK for .NET では Amazon Glacier でのプログラミング用に低レベルの API が提供されています。低レベル API は、Amazon Glacier によってサポートされる基礎の REST API に緊密にマップしています。低レベル API では、Amazon Glacier の各 REST 操作に対して、対応するメソッド、リクエスト情報を提供するリクエストオブジェクト、および Amazon Glacier の応答を処理する応答オブジェクトが提供されています。低レベル API は、基本となる Amazon Glacier 操作の最も完全な実装です。

次の例では、低レベル API を使用して Amazon Glacier のアクセス可能なボールトをリストする方法を示します。

// using Amazon.Glacier;// using Amazon.Glacier.Model;

var client = new AmazonGlacierClient();var request = new ListVaultsRequest();var response = client.ListVaults(request);

foreach (var vault in response.VaultList){ Console.WriteLine("Vault: {0}", vault.VaultName); Console.WriteLine(" Creation date: {0}", vault.CreationDate); Console.WriteLine(" Size in bytes: {0}", vault.SizeInBytes); Console.WriteLine(" Number of archives: {0}", vault.NumberOfArchives); try { var requestNotifications = new GetVaultNotificationsRequest { VaultName = vault.VaultName }; var responseNotifications = client.GetVaultNotifications(requestNotifications);

Console.WriteLine(" Notifications:"); Console.WriteLine(" Topic: {0}", responseNotifications.VaultNotificationConfig.SNSTopic);

var events = responseNotifications.VaultNotificationConfig.Events;

89

AWS SDK for .NET 開発者ガイドプログラミングモデル

if (events.Any()) { Console.WriteLine(" Events:");

foreach (var e in events) { Console.WriteLine("{0}", e); } } else { Console.WriteLine(" No events set."); } } catch (ResourceNotFoundException) { Console.WriteLine(" No notifications set."); } var requestJobs = new ListJobsRequest{ VaultName = vault.VaultName }; var responseJobs = client.ListJobs(requestJobs); var jobs = responseJobs.JobList; if (jobs.Any()) { Console.WriteLine(" Jobs:");

foreach (var job in jobs) { Console.WriteLine(" For job ID: {0}", job.JobId); Console.WriteLine("Archive ID: {0}", job.ArchiveId); Console.WriteLine("Archive size in bytes: {0}", job.ArchiveSizeInBytes.ToString()); Console.WriteLine("Completed: {0}", job.Completed); Console.WriteLine("Completion date: {0}", job.CompletionDate); Console.WriteLine("Creation date: {0}", job.CreationDate); Console.WriteLine("Inventory size in bytes: {0}", job.InventorySizeInBytes); Console.WriteLine("Job description: {0}", job.JobDescription); Console.WriteLine("Status code: {0}", job.StatusCode.Value); Console.WriteLine("Status message: {0}", job.StatusMessage); }

} else { Console.WriteLine(" No jobs."); }

}

その他の例については、以下を参照してください。

• AWS SDK for .NET の使用

90

AWS SDK for .NET 開発者ガイドAWS Identity and Access Management (IAM) の例

• ボールトの作成• ボールトメタデータの取得• ボールトインベントリのダウンロード• ボールト通知の設定• ボールトを削除する• 1 回のオペレーションでアーカイブをアップロードする• パート単位での大きなアーカイブのアップロード• アーカイブのダウンロード• アーカイブの削除

関連する API リファレンス情報については、Amazon.Glacier および Amazon.Glacier を参照してください。

高レベル APIAWS SDK for .NET では Amazon Glacier でのプログラミング用に高レベルの API が提供されています。アプリケーションの開発を簡素化するため、これらの高レベル API では、アーカイブのアップロードや、アーカイブまたはボールトインベントリのダウンロードなど、一部の操作の高レベルの抽象化が提供されています。

例については、Amazon Glacier 開発者ガイドの次のトピックを参照してください。

• AWS SDK for .NET の使用• ボールトの作成• ボールトを削除する• ボールトにアーカイブをアップロードする• アーカイブのアップロード• パート単位での大きなアーカイブのアップロード• ボールトからアーカイブをダウンロードする• アーカイブのダウンロード• ボールトからアーカイブを削除する• アーカイブの削除

関連する API リファレンス情報については、AWS SDK for .NET API Reference の「Amazon.Glacier.Transfer」を参照してください。

AWS Identity and Access Management (IAM) の例AWS SDK for .NET は、AWS の顧客が AWS でユーザーとユーザーのアクセス権限を管理できるようにするウェブサービスである IAM をサポートします。

サンプルコードは C# で書かれていますが、互換性のある任意の言語で AWS SDK for .NET を使用できます。AWS Toolkit for Visual Studio のインストール時に、一連の C# プロジェクトテンプレートがインストールされます。したがって、このプロジェクトを開始する最も簡単な方法は、Visual Studio を開き、[File]、[New Project]、[AWS Sample Projects]、[Deployment and Management]、[AWS Identity andAccess Management User] の順に選択することです。

91

AWS SDK for .NET 開発者ガイドIAM アカウントエイリアスの管理

関連する API リファレンス情報については、「Amazon.IdentityManagement」および「Amazon.IdentityManagement.Model」を参照してください。

前提条件

始める前に、AWS アカウントを作成し、AWS の認証情報を設定してください。詳細については、「AWSSDK for .NET の開始方法 (p. 3)」を参照してください。

トピック• IAM アカウントエイリアスの管理 (p. 92)• IAM ユーザーの管理 (p. 94)• IAM アクセスキーの管理 (p. 97)• IAM ポリシーの使用 (p. 100)• IAM サーバー証明書の使用 (p. 104)• IAM アカウント情報の一覧表示 (p. 106)• IAM ロールを使用したアクセス権限の付与 (p. 107)

IAM アカウントエイリアスの管理以下の .NET 例では、次の方法を示します。

• AWS アカウント ID のアカウントエイリアスを作成する• AWS アカウント ID のアカウントエイリアスを一覧表示する• AWS アカウント ID のアカウントエイリアスを削除する

シナリオサインインページの URL に、AWS アカウント ID ではなく企業の名前または他のわかりやすい識別子を含めるには、AWS アカウント ID のエイリアスを作成します。AWS アカウントのエイリアスを作成すると、サインインページの URL は変更され、エイリアスが組み込まれます。

次の例は、AmazonIdentityManagementServiceClient クラスのこれらのメソッドを使用して、AWS アカウントエイリアスを管理する方法を示します。

• CreateAccountAlias• ListAccountAliases• DeleteAccountAlias

IAM アカウントエイリアスの詳細については、IAM User Guideの「AWS アカウント ID とその別名」を参照してください。

アカウントエイリアスを作成するAmazonIdentityManagementServiceClient オブジェクトを作成します。次に、使用する新しいアカウントエイリアスを含む CreateAccountAliasRequest オブジェクトを作成します。AmazonIAMClient オブジェクトの CreateAccountAlias メソッドを呼び出します。アカウントエイリアスを作成した場合は、コンソールで新しいエイリアスを表示します。名前が既に存在している場合は、コンソールに例外メッセージを書き込みます。

public static void CreateAccountAlias()

92

AWS SDK for .NET 開発者ガイドIAM アカウントエイリアスの管理

{ try { var iamClient = new AmazonIdentityManagementServiceClient(); var request = new CreateAccountAliasRequest(); request.AccountAlias = "my-aws-account-alias-2017"; var response = iamClient.CreateAccountAlias(request); if (response.HttpStatusCode.ToString() == "OK") Console.WriteLine(request.AccountAlias + " created."); else Console.WriteLine("HTTpStatusCode returned = " + response.HttpStatusCode.ToString()); } catch (Exception e) { Console.WriteLine(e.Message); }}

アカウントエイリアスを一覧表示するAmazonIdentityManagementServiceClient オブジェクトを作成します。次に、ListAccountAliasesRequestオブジェクトを作成します。AmazonIAMClient オブジェクトの ListAccountAliases メソッドを呼び出します。アカウントエイリアスが存在している場合は、コンソールで表示します。

アカウントエイリアスが存在していない場合は、コンソールに例外メッセージを書き込みます。

Note

アカウントエイリアスは 1 つのみ存在できます。

public static void ListAccountAliases(){ try { var iamClient = new AmazonIdentityManagementServiceClient(); var request = new ListAccountAliasesRequest(); var response = iamClient.ListAccountAliases(request); List<string> aliases = response.AccountAliases; foreach (string account in aliases) { Console.WriteLine("The account alias is: " + account); } } catch (Exception e) { Console.WriteLine(e.Message); }}

アカウントエイリアスを削除するAmazonIdentityManagementServiceClient オブジェクトを作成します。次に、削除するアカウントエイリアスを含む DeleteAccountAliasRequest オブジェクトを作成します。AmazonIAMClient オブジェクトのDeleteAccountAlias メソッドを呼び出します。アカウントエイリアスを削除した場合は、コンソールの情報を削除します。名前が存在しない場合は、コンソールに例外メッセージを書き込みます。

public static void DeleteAccountAlias(){ try

93

AWS SDK for .NET 開発者ガイドIAM ユーザーの管理

{ var iamClient = new AmazonIdentityManagementServiceClient(); var request = new DeleteAccountAliasRequest(); request.AccountAlias = "my-aws-account-alias-2017"; var response = iamClient.DeleteAccountAlias(request); if (response.HttpStatusCode.ToString() == "OK") Console.WriteLine(request.AccountAlias + " deleted."); else Console.WriteLine("HTTpStatusCode returned = " + response.HttpStatusCode.ToString()); } catch (NoSuchEntityException e) { Console.WriteLine(e.Message); }}

IAM ユーザーの管理この .NET の例では、IAM ユーザーのリストの取得、IAM ユーザーの作成と削除、および IAM ユーザー名の更新の方法を示します。

AmazonIdentityManagementServiceClient クラスのこれらのメソッドを使用して、IAM でユーザーを作成および管理できます。

• CreateUser• ListUsers• UpdateUser• GetUser• DeleteUser

IAM ユーザーの詳細については、IAM User Guide の「IAM ユーザー」を参照してください。

作成できる IAM ユーザーの数の制限については、IAM User Guideの「IAM エンティティに関する制限事項」を参照してください。

AWS アカウントのユーザーの作成AmazonIdentityManagementServiceClient オブジェクトを作成します。次に、新しいユーザーに使用するユーザー名を含む CreateUserRequest オブジェクトを作成します。AmazonIAMClient オブジェクトのCreateUser メソッドを呼び出します。現在ユーザー名が存在しない場合、コンソールでユーザーの名前とARN を表示します。名前が既に存在している場合は、そのことを示すメッセージをコンソールに書き込みます。

var client = new AmazonIdentityManagementServiceClient();var request = new CreateUserRequest{ UserName = "DemoUser"};

try{ var response = client.CreateUser(request);

Console.WriteLine("User Name = '{0}', ARN = '{1}'", response.User.UserName, response.User.Arn);}catch (EntityAlreadyExistsException)

94

AWS SDK for .NET 開発者ガイドIAM ユーザーの管理

{ Console.WriteLine("User 'DemoUser' already exists.");}

AWS アカウントのすべてのユーザーの一覧表示この例では、指定したパスのプレフィックスを持つ IAM ユーザーが一覧表示されます。パスのプレフィックスを指定しない場合、AWS アカウントのすべてのユーザーが返されます。ユーザーが存在しない場合は、空のリストが返されます。

AmazonIdentityManagementServiceClient オブジェクトを作成します。次に、ユーザーの一覧表示に必要なパラメータを含む ListUsersRequest オブジェクトを作成します。MaxItems パラメータによって返される数を 10 に制限します。AmazonIdentityManagementServiceClient オブジェクトの ListUsers メソッドを呼び出します。コンソールに、各ユーザーの名前と作成日を書き込みます。

public static void ListUsers(){ var iamClient = new AmazonIdentityManagementServiceClient(); var requestUsers = new ListUsersRequest() { MaxItems = 10 }; var responseUsers = iamClient.ListUsers(requestUsers);

foreach (var user in responseUsers.Users) { Console.WriteLine("User " + user.UserName + " Created: " + user.CreateDate.ToShortDateString()); }

}

ユーザー名の更新この例は、指定された IAM ユーザーの名前またはパスを更新する方法を示します。IAM ユーザーのパスまたは名前変更の影響について十分に理解してください。詳細については、IAM User Guideの「IAM ユーザーの名前の変更」を参照してください。

AmazonIdentityManagementServiceClient オブジェクトを作成します。次に、UpdateUserRequestオブジェクトを作成し、現在および新しいユーザー名をパラメータとして指定します。AmazonIdentityManagementServiceClient オブジェクトの UpdateUser メソッドを呼び出します。

public static void UpdateUser(){ var client = new AmazonIdentityManagementServiceClient(); var request = new UpdateUserRequest { UserName = "DemoUser", NewUserName = "NewUser" };

try { var response = client.UpdateUser(request);

} catch (EntityAlreadyExistsException) { Console.WriteLine("User 'NewUser' already exists."); }}

95

AWS SDK for .NET 開発者ガイドIAM ユーザーの管理

ユーザーに関する情報の取得この例では、ユーザーの作成日、パス、一意の ID、ARN を含む、指定された IAM ユーザーに関する情報を取得する方法を示します。ユーザー名を指定しない場合、この API に対するリクエストに署名するために使用される AWS アクセスキー ID に基づいて、ユーザー名が暗黙的に決定されます。

AmazonIdentityManagementServiceClient オブジェクトを作成します。次に、情報を取得するユーザー名を含む GetUserRequest オブジェクトを作成します。AmazonIdentityManagementServiceClient オブジェクトの GetUser メソッドを呼び出して、情報を取得します。ユーザーが存在しない場合は、例外がスローされます。

public static void GetUser(){ var client = new AmazonIdentityManagementServiceClient(); var request = new GetUserRequest() { UserName = "DemoUser" };

try { var response = client.GetUser(request); Console.WriteLine("Creation date: " + response.User.CreateDate.ToShortDateString()); Console.WriteLine("Password last used: " + response.User.PasswordLastUsed.ToShortDateString()); Console.WriteLine("UserId = " + response.User.UserId);

} catch (NoSuchEntityException) { Console.WriteLine("User 'DemoUser' does not exist."); }}

ユーザーを削除するこの例は、指定された IAM ユーザーを削除する方法を示しています。ユーザーはいずれのグループにも属していることはできず、アクセスキー、署名用証明書、またはアタッチされたポリシーを持つことはできません。

AmazonIdentityManagementServiceClient オブジェクトを作成します。次に、必要なパラメータを含むDeleteUserRequest オブジェクトを作成します。これは、削除するユーザー名で構成されます。これを削除するには、AmazonIdentityManagementServiceClient オブジェクトの DeleteUser メソッドを呼び出します。ユーザーが存在しない場合は、例外がスローされます。

public static void DeleteUser(){ var client = new AmazonIdentityManagementServiceClient(); var request = new DeleteUserRequest() { UserName = "DemoUser" };

try { var response = client.DeleteUser(request);

} catch (NoSuchEntityException) {

96

AWS SDK for .NET 開発者ガイドIAM アクセスキーの管理

Console.WriteLine("User DemoUser' does not exist."); }}

IAM アクセスキーの管理これらの .NET 例では、次の方法を示します。

• ユーザーのアクセスキーを作成する• アクセスキーが最後に使用された日付を取得する• アクセスキーのステータスを更新する• アクセスキーを削除する

シナリオユーザーが AWS SDK for .NET からプログラムで AWS を呼び出すには、独自のアクセスキーが必要です。このニーズを満たすために、IAM ユーザーのアクセスキー (アクセスキー ID およびシークレットアクセスキー) を作成、修正、表示、および更新できます。デフォルトでは、アクセスキーを作成したときのステータスは Active です。これは、ユーザーが API コールにそのアクセスキーを使用できることを意味します。

C# コードは AWS SDK for .NET を使用し、AmazonIdentityManagementServiceClient クラスのこれらのメソッドを使用して IAM アクセスキーを管理します。

• CreateAccessKey• ListAccessKeys• GetAccessKeyLastUsed• UpdateAccessKey• DeleteAccessKey

IAM アクセスキーの詳細については、IAM User Guideの「IAM ユーザーのアクセスキーの管理」を参照してください。

ユーザーのアクセスキーを作成するCreateAccessKey メソッドを呼び出し、IAM アクセスキーの例に対して S3UserReadOnlyAccessというアクセスキーを作成します。CreateAccessKey CreateAccessKey method first createsa user named :code:`S3UserReadOnlyAccess メソッドは、CreateUser を呼び出すことによって、読み込みアクセス権限を持つ、:code:`S3UserReadOnlyAccess という名前のユーザーを最初に作成します。次に、新しいアクセスキーを作成するために必要な UserName パラメータを含むAmazonIdentityManagementServiceClient オブジェクトおよび CreateAccessKeyRequest オブジェクトを作成します。次に、AmazonIdentityManagementServiceClient オブジェクトの CreateAccessKeyメソッドを呼び出します。

public static void CreateAccessKey(){ try { CreateUser(); var iamClient = new AmazonIdentityManagementServiceClient(); // Create an access key for the IAM user that can be used by the SDK var accessKey = iamClient.CreateAccessKey(new CreateAccessKeyRequest { // Use the user created in the CreateUser example UserName = "S3UserReadOnlyAccess"

97

AWS SDK for .NET 開発者ガイドIAM アクセスキーの管理

}).AccessKey;

} catch (LimitExceededException e) { Console.WriteLine(e.Message); }}

public static User CreateUser(){ var iamClient = new AmazonIdentityManagementServiceClient(); try { // Create the IAM user var readOnlyUser = iamClient.CreateUser(new CreateUserRequest { UserName = "S3UserReadOnlyAccess" }).User;

// Assign the read-only policy to the new user iamClient.PutUserPolicy(new PutUserPolicyRequest { UserName = readOnlyUser.UserName, PolicyName = "S3ReadOnlyAccess", PolicyDocument = S3_READONLY_POLICY }); return readOnlyUser; } catch (EntityAlreadyExistsException e) { Console.WriteLine(e.Message); var request = new GetUserRequest() { UserName = "S3UserReadOnlyAccess" };

return iamClient.GetUser(request).User;

}}

ユーザーのアクセスキーを一覧表示するユーザーのアクセスキーを取得するために必要なパラメータを含むAmazonIdentityManagementServiceClient オブジェクトおよび ListAccessKeysRequest オブジェクトを作成します。これには、IAM ユーザーの名前と、オプションで、一覧表示するアクセスキーペアの最大数が含まれます。AmazonIdentityManagementServiceClient オブジェクトの ListAccessKeys メソッドを呼び出します。

public static void ListAccessKeys(){

var iamClient = new AmazonIdentityManagementServiceClient(); var requestAccessKeys = new ListAccessKeysRequest { // Use the user created in the CreateAccessKey example UserName = "S3UserReadOnlyAccess", MaxItems = 10 }; var responseAccessKeys = iamClient.ListAccessKeys(requestAccessKeys); Console.WriteLine(" Access keys:");

98

AWS SDK for .NET 開発者ガイドIAM アクセスキーの管理

foreach (var accessKey in responseAccessKeys.AccessKeyMetadata) { Console.WriteLine(" {0}", accessKey.AccessKeyId); }}

アクセスキーが最後に使用された日付を取得するアクセスキーを一覧表示するために必要な UserName パラメータを含むAmazonIdentityManagementServiceClient オブジェクトおよび ListAccessKeysRequest オブジェクトを作成します。AmazonIdentityManagementServiceClient オブジェクトの ListAccessKeys メソッドを呼び出します。返されるアクセスキーをループし、各キーの AccessKeyId を表示し、それを使用してGetAccessKeyLastUsedRequest オブジェクトを作成します。GetAccessKeyLastUsed メソッドを呼び出して、コンソールで最後にキーが使用された日時を表示します。

public static void GetAccessKeysLastUsed(){

var iamClient = new AmazonIdentityManagementServiceClient(); var requestAccessKeys = new ListAccessKeysRequest { // Use the user we created in the CreateUser example UserName = "S3UserReadOnlyAccess" }; var responseAccessKeys = iamClient.ListAccessKeys(requestAccessKeys); Console.WriteLine(" Access keys:");

foreach (var accessKey in responseAccessKeys.AccessKeyMetadata) { Console.WriteLine(" {0}", accessKey.AccessKeyId); GetAccessKeyLastUsedRequest request = new GetAccessKeyLastUsedRequest() { AccessKeyId = accessKey.AccessKeyId }; var response = iamClient.GetAccessKeyLastUsed(request); Console.WriteLine("Key last used " + response.AccessKeyLastUsed.LastUsedDate.ToLongDateString()); }}

アクセスキーのステータスを更新するAmazonIdentityManagementServiceClient オブジェクトおよびキーを一覧表示するユーザー名を含む ListAccessKeysRequest オブジェクトを作成します。この例のユーザー名は、他の例で作成されたユーザーです。AmazonIdentityManagementServiceClient の ListAccessKeys メソッドを呼び出します。返される ListAccessKeysResponse にはそのユーザーのアクセスキーのリストが含まれます。リストの最初のアクセスキーを使用します。UpdateAccessKeyRequestオブジェクトを作成し、UserName、AccessKeyId、および Status パラメータを指定します。AmazonIdentityManagementServiceClient オブジェクトの UpdateAccessKey メソッドを呼び出します。

public static void UpdateKeyStatus(){ // This example changes the status of the key specified by its index in the list of access keys // Optionally, you could change the keynumber parameter to be an AccessKey ID var iamClient = new AmazonIdentityManagementServiceClient(); var requestAccessKeys = new ListAccessKeysRequest { UserName = "S3UserReadOnlyAccess" }; var responseAccessKeys = iamClient.ListAccessKeys(requestAccessKeys); UpdateAccessKeyRequest updateRequest = new UpdateAccessKeyRequest

99

AWS SDK for .NET 開発者ガイドIAM ポリシーの使用

{ UserName = "S3UserReadOnlyAccess", AccessKeyId = responseAccessKeys.AccessKeyMetadata[0].AccessKeyId, Status = StatusType.Active }; iamClient.UpdateAccessKey(updateRequest); Console.WriteLine(" Access key " + updateRequest.AccessKeyId + " updated");}

アクセスキーを削除するAmazonIdentityManagementServiceClient オブジェクトおよびパラメータとして使用するユーザー名を含む ListAccessKeysRequest オブジェクトを作成します。AmazonIdentityManagementServiceClientの ListAccessKeys メソッドを呼び出します。返される ListAccessKeysResponse にはそのユーザーのアクセスキーのリストが含まれます。AmazonIdentityManagementServiceClient の DeleteAccessKeyメソッドを呼び出してリストの各アクセスキーを削除します。

public static void DeleteAccessKeys(){// Delete all the access keys created for the examples var iamClient = new AmazonIdentityManagementServiceClient(); var requestAccessKeys = new ListAccessKeysRequest { // Use the user created in the CreateUser example UserName = "S3UserReadOnlyAccess" }; var responseAccessKeys = iamClient.ListAccessKeys(requestAccessKeys); Console.WriteLine(" Access keys:");

foreach (var accessKey in responseAccessKeys.AccessKeyMetadata) { Console.WriteLine(" {0}", accessKey.AccessKeyId); iamClient.DeleteAccessKey(new DeleteAccessKeyRequest { UserName = "S3UserReadOnlyAccess", AccessKeyId = accessKey.AccessKeyId }); Console.WriteLine("Access Key " + accessKey.AccessKeyId + " deleted"); }

}

IAM ポリシーの使用次の例は、その方法を示しています。

• IAM ポリシーの作成と削除• ロールからの IAM ポリシーのアタッチおよびデタッチ

シナリオポリシーを作成することで、ユーザーにアクセス許可を付与します。ポリシーは、ユーザーが実行できるアクションと、それらのアクションが影響を与えることができるリソースを登録したドキュメントです。明示的に許可されていないアクションやリソースはすべて、デフォルトで拒否されます。ポリシーを作成し、ユーザー、ユーザーのグループ、ユーザーが引き受けるロール、およびリソースにアタッチできます。

AWS SDK for .NET を使用してポリシーを作成および削除し、AmazonIdentityManagementServiceClientクラスのこれらのメソッドを使用して、ロールポリシーをアタッチまたはデタッチします。

100

AWS SDK for .NET 開発者ガイドIAM ポリシーの使用

• CreatePolicy• GetPolicy• ListAttachedRolePolicies• AttachRolePolicy• DetachRolePolicy

IAM ユーザーの詳細については、IAM User Guideの「アクセス管理の概要: アクセス許可とポリシー」を参照してください。

IAM ポリシーの作成AmazonIdentityManagementServiceClient オブジェクトを作成します。次に、新しいポリシーの作成に必要なパラメータを含む CreatePolicy オブジェクトを作成します。これは、新しいポリシーおよびポリシードキュメントに使用する名前で構成されます。指定された GenerateRolePolicyDocument メソッドを呼び出してポリシードキュメントを作成します。CreatePolicy メソッド呼び出しから返ると、CreatePolicyResponse にはポリシー ARN が含まれ、コンソールに表示されます。以下の例で使用できるように、これを書き留めておいてください。

public static void CreatePolicyExample(){ var client = new AmazonIdentityManagementServiceClient(); // GenerateRolePolicyDocument is a custom method string policyDoc = GenerateRolePolicyDocument();

var request = new CreatePolicyRequest { PolicyName = "DemoEC2Permissions", PolicyDocument = policyDoc };

try { var createPolicyResponse = client.CreatePolicy(request); Console.WriteLine("Make a note, Policy named " + createPolicyResponse.Policy.PolicyName + " has Arn: : " + createPolicyResponse.Policy.Arn); } catch (EntityAlreadyExistsException) { Console.WriteLine ("Policy 'DemoEC2Permissions' already exits."); }

}

public static string GenerateRolePolicyDocument(){ // using Amazon.Auth.AccessControlPolicy;

// Create a policy that looks like this: /* { "Version" : "2012-10-17", "Id" : "DemoEC2Permissions", "Statement" : [ { "Sid" : "DemoEC2PermissionsStatement", "Effect" : "Allow", "Action" : [ "s3:Get*",

101

AWS SDK for .NET 開発者ガイドIAM ポリシーの使用

"s3:List*" ], "Resource" : "*" } ] } */

var actionGet = new ActionIdentifier("s3:Get*"); var actionList = new ActionIdentifier("s3:List*"); var actions = new List<ActionIdentifier>();

actions.Add(actionGet); actions.Add(actionList);

var resource = new Resource("*"); var resources = new List<Resource>();

resources.Add(resource);

var statement = new Amazon.Auth.AccessControlPolicy.Statement(Amazon.Auth.AccessControlPolicy.Statement.StatementEffect.Allow) { Actions = actions, Id = "DemoEC2PermissionsStatement", Resources = resources }; var statements = new List<Amazon.Auth.AccessControlPolicy.Statement>();

statements.Add(statement);

var policy = new Policy { Id = "DemoEC2Permissions", Version = "2012-10-17", Statements = statements };

return policy.ToJson();}

IAM ポリシーの取得AmazonIdentityManagementServiceClient オブジェクトを作成します。次に、ポリシーの取得に必要なパラメータと、前の例の CreatePolicy メソッドで返されたポリシー ARN を含む GetPolicyRequest オブジェクトを作成します。

GetPolicy メソッドを呼び出します。

public static void GetPolicy(){ var client = new AmazonIdentityManagementServiceClient(); var request = new GetPolicyRequest { PolicyArn = "arn:aws:iam::123456789:policy/DemoEC2Permissions" };

try { var response = client.GetPolicy(request); Console.WriteLine("Policy " + response.Policy.PolicyName + "successfully retrieved");

102

AWS SDK for .NET 開発者ガイドIAM ポリシーの使用

} catch (NoSuchEntityException) { Console.WriteLine ("Policy 'DemoEC2Permissions' does not exist."); }

}

管理ロールポリシーのアタッチAmazonIdentityManagementServiceClient オブジェクトを作成します。次に、ロールにポリシーをアタッチするために必要なパラメータ、ロール名、および GenerateRolePolicyDocument メソッドで返された JSON ポリシーを含む AttachRolePolicy オブジェクトを作成します。必ず、AWS アカウントに関連付けられたロールからの有効なロールを使用してください。

public static void AttachRolePolicy(){ var client = new AmazonIdentityManagementServiceClient(); string policy = GenerateRolePolicyDocument(); CreateRoleRequest roleRequest = new CreateRoleRequest() { RoleName = "tester", AssumeRolePolicyDocument = policy };

var request = new AttachRolePolicyRequest() { PolicyArn = "arn:aws:iam::123456789:policy/DemoEC2Permissions", RoleName = "tester" }; try { var response = client.AttachRolePolicy(request); Console.WriteLine("Policy DemoEC2Permissions attached to Role TestUser"); } catch (NoSuchEntityException) { Console.WriteLine ("Policy 'DemoEC2Permissions' does not exist"); } catch (InvalidInputException) { Console.WriteLine ("One of the parameters is incorrect"); }}

管理ロールポリシーのデタッチAmazonIdentityManagementServiceClient オブジェクトを作成します。次に、ロールにポリシーをアタッチするために必要なパラメータ、ロール名、および GenerateRolePolicyDocument メソッドで返された JSON ポリシーを含む DetachRolePolicy オブジェクトを作成します。必ず、前の例でポリシーをアタッチするために使用したロールを使用してください。

public static void DetachRolePolicy(){ var client = new AmazonIdentityManagementServiceClient(); string policy = GenerateRolePolicyDocument(); CreateRoleRequest roleRequest = new CreateRoleRequest() {

103

AWS SDK for .NET 開発者ガイドIAM サーバー証明書の使用

RoleName = "tester", AssumeRolePolicyDocument = policy };

var request = new DetachRolePolicyRequest() { PolicyArn = "arn:aws:iam::123456789:policy/DemoEC2Permissions", RoleName = "tester" }; try { var response = client.DetachRolePolicy(request); Console.WriteLine("Policy DemoEC2Permissions detached from Role 'tester'"); } catch (NoSuchEntityException e) { Console.WriteLine (e.Message); } catch (InvalidInputException i) { Console.WriteLine (i.Message); }}

IAM サーバー証明書の使用以下の .NET 例では、次の方法を示します。

• サーバー証明書の一覧表示• サーバー証明書の取得• サーバー証明書の更新• サーバー証明書の削除

シナリオこれらの例では、HTTPS 接続のサーバー証明書を管理するための基本タスクを実行します。ウェブサイトまたは AWS のアプリケーションへの HTTPS 接続を有効にするには、SSL/TLS サーバー証明書が必要です。外部プロバイダーから入手した証明書をウェブサイトまたは AWS のアプリケーションで使用するには、証明書を IAM にアップロードするか、AWS Certificate Manager にインポートする必要があります。

これらの例では、AWS SDK for .NET を使用し、AmazonIdentityManagementServiceClient クラスのこれらのメソッドによりメッセージを送受信します。

• ListServerCertificates• GetServerCertificate• UpdateServerCertificate• DeleteServerCertificate

サーバー証明書の詳細については、IAM User Guideの「サーバー証明書の使用」を参照してください。

サーバー証明書の一覧表示AmazonIdentityManagementServiceClient オブジェクトを作成します。次に、ListServerCertificatesRequest オブジェクトを作成します。

104

AWS SDK for .NET 開発者ガイドIAM サーバー証明書の使用

必須のパラメータはありません。AmazonIdentityManagementServiceClient オブジェクトのListServerCertificates メソッドを呼び出します。

public static void ListCertificates(){ try { var iamClient = new AmazonIdentityManagementServiceClient(); var request = new ListServerCertificatesRequest(); var response = iamClient.ListServerCertificates(request); foreach (KeyValuePair<string, string> kvp in response.ResponseMetadata.Metadata) { Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value); } } catch(Exception e) { Console.WriteLine(e.Message); }}

サーバー証明書の取得AmazonIdentityManagementServiceClient オブジェクトを作成します。次に、GetServerCertificateRequest オブジェクトを作成し、ServerCertificateName を指定します。AmazonIdentityManagementServiceClient オブジェクトの GetServerCertificate メソッドを呼び出します。

public static void GetCertificate(){ try { var iamClient = new AmazonIdentityManagementServiceClient(); var request = new GetServerCertificateRequest(); request.ServerCertificateName = "CERTIFICATE_NAME"; var response = iamClient.GetServerCertificate(request); Console.WriteLine("CertificateName = " + response.ServerCertificate.ServerCertificateMetadata.ServerCertificateName); Console.WriteLine("Certificate Arn = " + response.ServerCertificate.ServerCertificateMetadata.Arn); } catch (Exception e) { Console.WriteLine(e.Message); }}

サーバー証明書の更新AmazonIdentityManagementServiceClient オブジェクトを作成します。次に、UpdateServerCertificateRequest オブジェクトを作成し、ServerCertificateName およびNewServerCertificateName を指定します。AmazonIdentityManagementServiceClient オブジェクトの UpdateServerCertificate メソッドを呼び出します。

public static void UpdateCertificate(){ try {

105

AWS SDK for .NET 開発者ガイドIAM アカウント情報の一覧表示

var iamClient = new AmazonIdentityManagementServiceClient(); var request = new UpdateServerCertificateRequest(); request.ServerCertificateName = "CERTIFICATE_NAME"; request.NewServerCertificateName = "NEW_Certificate_NAME"; var response = iamClient.UpdateServerCertificate(request); if (response.HttpStatusCode.ToString() == "OK") Console.WriteLine("Update succesful"); else Console.WriteLine("HTTpStatusCode returned = " + response.HttpStatusCode.ToString()); } catch (Exception e) { Console.WriteLine(e.Message); }

}

サーバー証明書の削除AmazonIdentityManagementServiceClient オブジェクトを作成します。次に、DeleteServerCertificateRequest オブジェクトを作成し、ServerCertificateName を指定します。AmazonIdentityManagementServiceClient オブジェクトの DeleteServerCertificate メソッドを呼び出します。

public static void DeleteCertificate(){ try { var iamClient = new AmazonIdentityManagementServiceClient(); var request = new DeleteServerCertificateRequest(); request.ServerCertificateName = "CERTIFICATE_NAME"; var response = iamClient.DeleteServerCertificate(request); if (response.HttpStatusCode.ToString() == "OK") Console.WriteLine(request.ServerCertificateName + " deleted"); else Console.WriteLine("HTTpStatusCode returned = " + response.HttpStatusCode.ToString()); } catch (Exception e) { Console.WriteLine(e.Message); }}

IAM アカウント情報の一覧表示AWS SDK for .NET は、AWS の顧客が AWS でユーザーとユーザーのアクセス権限を管理できるようにするウェブサービスである IAM をサポートします。

次の例では、低レベルの API を使用して IAM のアクセス可能なユーザーアカウントをリストする方法を示します。各ユーザーアカウントについて、関連するグループ、ポリシー、およびアクセスキー ID もリストされます。

public static void ListUsers(){ var iamClient = new AmazonIdentityManagementServiceClient(); var requestUsers = new ListUsersRequest(); var responseUsers = iamClient.ListUsers(requestUsers);

106

AWS SDK for .NET 開発者ガイドIAM ロールを使用したアクセス権限の付与

foreach (var user in responseUsers.Users) { Console.WriteLine("For user {0}:", user.UserName); Console.WriteLine(" In groups:");

var requestGroups = new ListGroupsForUserRequest { UserName = user.UserName }; var responseGroups = iamClient.ListGroupsForUser(requestGroups);

foreach (var group in responseGroups.Groups) { Console.WriteLine(" {0}", group.GroupName); }

Console.WriteLine(" Policies:");

var requestPolicies = new ListUserPoliciesRequest { UserName = user.UserName }; var responsePolicies = iamClient.ListUserPolicies(requestPolicies);

foreach (var policy in responsePolicies.PolicyNames) { Console.WriteLine(" {0}", policy); }

var requestAccessKeys = new ListAccessKeysRequest { UserName = user.UserName }; var responseAccessKeys = iamClient.ListAccessKeys(requestAccessKeys);

Console.WriteLine(" Access keys:");

foreach (var accessKey in responseAccessKeys.AccessKeyMetadata) { Console.WriteLine(" {0}", accessKey.AccessKeyId); } }}

関連する API リファレンス情報については、「Amazon.IdentityManagement」および「Amazon.IdentityManagement.Model」を参照してください。

IAM ロールを使用したアクセス権限の付与この .NET の例は、以下の方法を示します。

• Amazon S3 からオブジェクトを取得するサンプルプロジェクトを作成する• IAM ロールを作成する• Amazon EC2 インスタンスを起動して IAM ロールを指定する• Amazon EC2 インスタンスでサンプルを実行する

シナリオAWS へのリクエストはすべて、AWS が発行した認証情報を使用して暗号で署名される必要があります。したがって、Amazon EC2 インスタンスで実行するソフトウェア用の認証情報を管理するための戦略が必

107

AWS SDK for .NET 開発者ガイドIAM ロールを使用したアクセス権限の付与

要です。これらの認証情報を、ソフトウェアに継続してアクセスできる方法で、安全に配信、保存、およびローテーションする必要があります。

IAM ロールにより、EC2 インスタンスで実行しているソフトウェアの AWS 認証情報を効果的に管理することができます。IAM ロールを作成し、ソフトウェアに必要なアクセス許可を使用してそのロールを設定します。IAM ロールの使用の利点については、Amazon EC2 User Guide for Windows Instancesの「Amazon EC2 の IAM ロール」および IAM User Guideの「ロール (委任とフェデレーション)」を参照してください。

アクセス権限を使用するには、ソフトウェアで AWS サービス用のクライアントオブジェクトを作成します。コンストラクタは、認証情報プロバイダーチェーンで認証情報を探します。.NET の場合、認証情報プロバイダーチェーンは次のとおりです。

• App.config ファイル• EC2 インスタンスの IAM ロールに関連付けられているインスタンスメタデータ

クライアントが App.config で認証情報を見つけることができなかった場合、インスタンスメタデータから IAM ロールに関連付けれらたものと同じアクセス許可を持つ一時的な認証情報を取得します。認証情報は、アプリケーションソフトウェアに代わってコンストラクタによって保存され、そのクライアントオブジェクトから AWS を呼び出す際に使用されます。この認証情報は一時的で、最終的には失効しますが、SDK クライアントは定期的に認証情報を更新して、アクセスを有効にし続けます。この定期的な更新が、アプリケーションソフトウェアに意識されることはまったくありません。

以下の例では、設定する AWS 認証情報を使用して Amazon S3 からオブジェクトを取得するサンプルプログラムを示します。IAM ロールを作成して AWS の認証情報を提供します。最後に、インスタンスで実行しているサンプルプログラムに AWS 認証情報を提供する IAM ロールでインスタンスを起動します。

Amazon S3 からオブジェクトを取得するサンプルを作成する次のサンプルコードでは、アクセスできる Amazon S3バケットのテキストファイルと、Amazon S3 へのアクセスを提供する AWS 認証情報が必要です。

Amazon S3 バケットの作成およびオブジェクトのアップロードの詳細については、Amazon S3 入門ガイドを参照してください。AWS 認証情報の詳細については、「AWS 認証情報の設定 (p. 11)」を参照してください。

using System;using System.Collections.Specialized;using System.IO;

using Amazon;using Amazon.S3;using Amazon.S3.Model;

namespace Aws3Sample{ class S3Sample { public static void Main(string[] args) { ReadS3File("bucket-name", "s3-file-name", "output-file-name");

Console.WriteLine("Press enter to continue"); Console.ReadLine(); }

public static void ReadS3File( string bucketName, string keyName,

108

AWS SDK for .NET 開発者ガイドIAM ロールを使用したアクセス権限の付与

string filename) {

string responseBody = "";

try { using (var s3Client = new AmazonS3Client()) { Console.WriteLine("Retrieving (GET) an object");

var request = new GetObjectRequest() { BucketName = bucketName, Key = keyName };

using (var response = s3Client.GetObject(request)) using (var responseStream = response.ResponseStream) using (var reader = new StreamReader(responseStream)) { responseBody = reader.ReadToEnd(); } }

using (var s = new FileStream(filename, FileMode.Create)) using (var writer = new StreamWriter(s)) { writer.WriteLine(responseBody); } } catch (AmazonS3Exception s3Exception) { Console.WriteLine(s3Exception.Message, s3Exception.InnerException); } } }}

サンプルコードをテストするには

1. Visual Studio を開き、AWS コンソールプロジェクトを作成します。2. AWSSDK.S3 パッケージをプロジェクトに追加します。3. Program.cs ファイル内のコードをサンプルコードに置き換えます。4. 以下の値を置き換えます。

bucket-name

Amazon S3 バケットの名前。s3-file-name

バケット内のテキストファイルのパスと名前。output-file-name

ファイルを書き込む先のパスとファイル名。5. コンパイルして、サンプルプログラムを実行します。プログラムは成功すると、次の出力を表示

し、&; のテキストファイルから取得したテキストを含む s3Object.txts3 ファイルをローカルドライブに作成します。

Retrieving (GET) an object

109

AWS SDK for .NET 開発者ガイドIAM ロールを使用したアクセス権限の付与

プログラムが失敗した場合は、バケットへのアクセス権限がある認証情報を使用していることを確認してください。

6. (オプション)認証情報をセットアップしていない実行中の Windows インスタンスに、サンプルプログラムを転送します。プログラムを実行し、認証情報が見つからないため失敗することを確認します。

IAM ロールの作成Amazon S3 にアクセスするための適切なアクセス権限を持つ IAM ロールを作成します。

IAM ロールを作成するには

Amazon EC2 コンソールまたは AWS SDK for .NET を使用して、IAM ロールで EC2 インスタンスを起動できます。

• コンソールの使用: Amazon EC2 User Guide for Windows Instancesの「Windows インスタンスを起動する」の指示に従います。[Review Instance Launch] ページでは、[Edit instance details] を選択します。[IAM role] では、前に作成した IAM ロールを指定します。指示にしたがって手順を完了します。インスタンスに接続するには、セキュリティグループとキーペアを作成するか、または既存のものを使用する必要があります。

• AWS SDK for .NET の使用: 「Amazon EC2 インスタンスを起動する (p. 73)」を参照してください。

IAM ユーザーは、以下のポリシーによってアクセス権限が付与されていないと、IAM ロールでインスタンスを起動できません。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "iam:PassRole", "iam:ListInstanceProfiles", "ec2:*" ], "Resource": "*" }]}

EC2 インスタンスにサンプルプログラムを転送するには、次の手順で説明するように、AWS マネジメントコンソールを使用してインスタンスに接続します。

Note

または、Toolkit for Visual Studio を使用して接続し (AWS Toolkit for Visual Studio の「AmazonEC2 インスタンスへの接続」を参照)、ローカルドライブからインスタンスにファイルをコピーします。インスタンスでローカルドライブを使用できるように、リモートデスクトップセッションが自動的に設定されます。

1. IAM コンソールを開きます。2. ナビゲーションペインで [Roles] を選択し、続いて [Create New Role] を選択します。3. ロールの名前を入力し、[Next Step] を選択します。EC2 インスタンスを起動するときに必要になるた

め、この名前を忘れないでください。4. [AWS Service Roles] で [Amazon EC2] を選択します。[Select Policy Template] にある [Amazon S3

Read Only Access] を選択します。ポリシーを確認し、[Next Step] を選択します。

110

AWS SDK for .NET 開発者ガイドAmazon Route 53 の例

5. ロール情報を確認し、[Create Role] を選択します。

EC2 インスタンスでサンプルプログラムを実行するには

1. Amazon EC2 コンソールを開きます。2. EC2 インスタンスのパスワードを取得します。

• ナビゲーションペインで、[Instances] を選択します。インスタンスを選択し、以下を選択します。

接続.

a. [Connect To Your Instance] ダイアログボックスで、[Get Password] を選択します(インスタンスの起動後、パスワードが利用可能になるまでに数分かかります)。

b. [Browse] を選択し、インスタンスの起動時に作成したプライベートキーファイルを探します。ファイルを選択して [Open] を選択すると、ファイルの内容がコンテンツボックスにコピーされます。

c. [Decrypt Password] を選択します。インスタンスのデフォルトの管理者パスワードが [ConnectTo Your Instance] ダイアログボックスに表示され、以前のパスワードが [Get Password] へのリンクに置き換えられます。

d. デフォルトの管理者パスワードを記録するか、クリップボードにコピーします。このパスワードはインスタンスに接続するのに必要です。

3. EC2 インスタンスに接続します。

a. [Download Remote Desktop File] を選択します。ブラウザで要求されたら、.rdp ファイルを保存します。終了したら、[Close] を選択して [Connect To Your Instance] ダイアログボックスを閉じます。

b. ダウンロードしたディレクトリに移動し、.rdp ファイルを右クリックして [Edit] を選択します。[Local Resources] タブの [Local devices and resources] で、[More] を選択します。 [Drives] を選択してローカルドライブをインスタンスで使用できるようにします。次に、[OK] を選択します。

c. [Connect] を選択してインスタンスに接続します。リモート接続の発行元が不明であるという警告が表示されることがあります。

d. メッセージが表示されたら、以前記録またはコピーしたデフォルトの [Administrator] アカウントとデフォルトの管理者パスワードを使って、インスタンスにサインインします。

コンテンツをコピーアンドペーストすると、データが破損することがあります。サインインしようとしたときに "Password Failed" というエラーが発生した場合は、パスワードを手動で入力してください。詳細については、Amazon EC2 User Guide for Windows Instancesの「RDP を使用して Windows インスタンスに接続する」および「Windows インスタンスのトラブルシューティング」を参照してください。

4. ローカルドライブからインスタンスに、プログラムと AWS アセンブリ(AWSSDK.Core.dll およびAWSSDK.S3.dll)をコピーします。

5. プログラムを実行し、IAM ロールによって提供された認証情報が正常に使用されることを確認します。

Retrieving (GET) an object

Amazon Route 53 の例AWS SDK for .NET は Amazon Route 53 をサポートします。これはドメインネームシステム (DNS) ウェブサービスであり、Amazon Elastic Compute Cloud (Amazon EC2)、Elastic Load Balancing、AmazonSimple Storage Service (Amazon S3) などのアマゾン ウェブ サービス (AWS) 製品を使用するインフラス

111

AWS SDK for .NET 開発者ガイドAmazon Route 53 の例

トラクチャへの安全で信頼できるルーティングを提供します。Route 53を使用すると、ユーザーを AWS外のインフラストラクチャにルーティングすることもできます。このトピックでは、AWS SDK for .NETを使用して Route 53 ホストゾーンを作成し、新しいリソースレコードセットをそのゾーンに追加する方法を説明します。

Note

このトピックでは、Route 53 の使用方法を既に理解していて、AWS SDK for .NET をインストールしてあるものとします。Route 53 の詳細については、Amazon Route 53 開発者ガイドを参照してください。AWS SDK for .NET のインストール方法については、「AWS SDK for .NET の使用開始 (p. 3)」を参照してください。

基本的な手順は次のとおりです。

ホストゾーンを作成し、そのレコードセットを更新するには

1. ホストゾーンの作成.2. 1 つ以上のレコードセットと、各セットに対して実行するアクションについての指示を含む、変更バッ

チを作成します。3. 変更バッチを格納した変更リクエストをホストゾーンに送信します。4. 変更を監視して完了を確認します。

この例は、AWS SDK for .NET を使用して基本レコードセットに対してこの手順を実装する方法を示す、簡単なコンソールアプリケーションです。

この例を実行するには

1. Visual Studio の [File] メニューで [New] を選択し、[Project] を選択します。2. [AWS Empty Project] テンプレートを選択し、プロジェクトの名前と場所を指定します。3. アプリケーションのデフォルトの認証情報プロファイルと AWS リージョンを指定します。これらは、

プロジェクトの App.config ファイルに追加されます。この例では、リージョンは 米国東部(バージニア北部) に、プロファイルはデフォルトに設定されているものとします。プロファイルの詳細については、「AWS 認証情報の設定 (p. 11)」を参照してください。

4. program.cs を開き、using 宣言および Main のコードを、以下の例の対応するコードに置き換えます。デフォルトの認証情報プロファイルとリージョンを使用している場合、アプリケーションをそのままコンパイルして実行できます。それ以外の場合は、例の後の注で説明されているように、適切なプロファイルとリージョンを指定する必要があります。

using System;using System.Collections.Generic;using System.Threading;

using Amazon;using Amazon.Route53;using Amazon.Route53.Model;

namespace Route53_RecordSet{ //Create a hosted zone and add a basic record set to it class recordset { public static void Main(string[] args) { string domainName = "www.example.org";

//[1] Create an Amazon Route 53 client object var route53Client = new AmazonRoute53Client();

112

AWS SDK for .NET 開発者ガイドAmazon Route 53 の例

//[2] Create a hosted zone var zoneRequest = new CreateHostedZoneRequest() { Name = domainName, CallerReference = "my_change_request" };

var zoneResponse = route53Client.CreateHostedZone(zoneRequest);

//[3] Create a resource record set change batch var recordSet = new ResourceRecordSet() { Name = domainName, TTL = 60, Type = RRType.A, ResourceRecords = new List<ResourceRecord> { new ResourceRecord { Value = "192.0.2.235" } } };

var change1 = new Change() { ResourceRecordSet = recordSet, Action = ChangeAction.CREATE };

var changeBatch = new ChangeBatch() { Changes = new List<Change> { change1 } };

//[4] Update the zone's resource record sets var recordsetRequest = new ChangeResourceRecordSetsRequest() { HostedZoneId = zoneResponse.HostedZone.Id, ChangeBatch = changeBatch };

var recordsetResponse = route53Client.ChangeResourceRecordSets(recordsetRequest);

//[5] Monitor the change status var changeRequest = new GetChangeRequest() { Id = recordsetResponse.ChangeInfo.Id };

while (ChangeStatus.PENDING == route53Client.GetChange(changeRequest).ChangeInfo.Status) { Console.WriteLine("Change is pending."); Thread.Sleep(15000); }

Console.WriteLine("Change is complete."); Console.ReadKey(); } }}

以下のセクションの番号は、前の例のコメントに対応しています。

[1] クライアントオブジェクトを作成する

オブジェクトには次の情報が必要です:

113

AWS SDK for .NET 開発者ガイドAmazon Route 53 の例

AWS リージョン

クライアントのメソッドを呼び出すと、基盤の HTTP リクエストはこのエンドポイントに送信されます。

認証情報プロファイル

プロファイルでは、使用するアクションに対するアクセス権限が許可されている必要があります(この例では Route 53 アクション)。アクセス権限のないアクションを呼び出すと失敗します。詳細については、「AWS 認証情報の設定 (p. 11)」を参照してください。

http://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Route53/TRoute53Route53Client.htmlAmazonRoute53Clienthttp://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html クラスでは、Amazon Route 53 アクションを呼び出すために使用する一連のパブリックメソッドがサポートされています。AmazonRoute53Client クラスの新しいインスタンスをインスタンス化することによって、クライアントオブジェクトを作成します。複数のコンストラクタがあります。

[2] ホストゾーンを作成する

ホストゾーンは、従来の DNS ゾーンファイルと同じ目的に使用されます。ホストゾーンは、単一のドメイン名でまとめて管理されるリソースレコードセットのコレクションを表します。

ホストゾーンを作成するには1. CreateHostedZoneRequest オブジェクトを作成し、以下のリクエストパラメータを指定します。こ

の例では使用されないオプションパラメータも 2 つあります。Name

(必須)登録するドメイン名。この例では www.example.com。このドメイン名は例示のみを目的としたものです。ドメイン名レジストラに登録することはできませんが、学習目的でホストゾーンを作成するためには使用できます。

CallerReference

(必須)リクエスト ID として機能し、失敗したリクエストの再試行に使用できる、任意のユーザー定義文字列。このアプリケーションを複数回実行する場合は、CallerReference の値を変更する必要があります。

1. CreateHostedZoneRequest オブジェクトを、クライアントオブジェクトの CreateHostedZoneメソッドに渡します。このメソッドは、ゾーンを識別する HostedZone.Id プロパティなど、リクエストに関する情報が含まれている http://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/Route53/TRoute53CreateHostedZoneResponse.htmlCreateHostedZoneResponse オブジェクトを返します。

[3] リソースレコードセットの変更バッチを作成する

1 つのホストゾーンに複数のリソースレコードセットを作成できます。各セットでは、ドメインのトラフィックのサブセット(E メールリクエストなど)をルーティングする方法を指定します。1 つのリクエストでゾーンの複数のリソースレコードセットを更新できます。最初に、すべての更新をChangeBatch オブジェクトにパッケージ化します。この例では、更新を 1 つだけ指定し、基本リソースレコードセットをゾーンに追加しますが、ChangeBatch オブジェクトは複数のリソースレコードセットの更新を格納できます。

ChangeBatch オブジェクトを作成するには1. 更新するリソースレコードセットごとに ResourceRecordSet オブジェクトを作成します。指

定するプロパティのグループは、リソースレコードセットの種類によって異なります。各リソースレコードセットによって使用されるプロパティの詳細については、「Amazon Route53 リソースレコードセットの作成時または編集時に指定する値」を参照してください。 例のResourceRecordSet オブジェクトは基本リソースレコードセットを表し、以下の必須プロパティを指定します。Name

ドメインまたはサブドメインの名前。この例では www.example.com。

114

AWS SDK for .NET 開発者ガイドAmazon Route 53 の例

TTL

再帰的な DNS リゾルバーでこのリソースレコードセットに関する情報をキャッシュしておく時間(秒単位)。この例では 60 秒。

Type

DNS レコードタイプ。この例では A。完全なリストについては、「サポートされる DNS リソースレコードタイプ」を参照してください。

ResourceRecords

1 つ以上の ResourceRecord オブジェクトのリスト。各オブジェクトには、DNS レコードタイプに応じた DNS レコード値が格納されます。A レコードタイプの場合、レコード値は IPv4 アドレスであり、この例では標準的なアドレスの例 192.0.2.235 に設定されます。

2. 各リソースレコードセットに対して Change オブジェクトを作成し、以下のプロパティを設定します。ResourceRecordSet

前のステップで作成した ResourceRecordSet オブジェクト。Action

このリソースレコードセットに対して実行するアクション。CREATE、DELETE、またはUPSERT。 これらのアクションの詳細については、Elements を参照してください。この例ではホストゾーンに新しいリソースレコードセットを作成するので、Action を CREATE に設定します。

3. ChangeBatch オブジェクトを作成し、その Changes プロパティに、前のステップで作成したChange オブジェクトのリストを設定します。

[4] ゾーンのリソースレコードセットを更新する

リソースレコードセットを更新するには、次のように ChangeBatch オブジェクトをホストゾーンに渡します。

ホストゾーンのリソースレコードセットを更新するには1. 次のプロパティを設定して ChangeResourceRecordSetsRequest オブジェクトを作成します。

HostedZoneId

ホストゾーンの ID。この例では、CreateHostedZoneResponse オブジェクトで返された IDに設定します。既存のホストゾーンの ID を取得するには、ListHostedZones を呼び出します。

ChangeBatch

更新を含む ChangeBatch オブジェクト。2. ChangeResourceRecordSetsRequest オブジェクトを、クライアントオブジェクトの

ChangeResourceRecordSets メソッドに渡します。リクエストの進行状況の監視に使用できるリクエスト ID を含む ChangeResourceRecordSetsResponse オブジェクトが返されます。

[5] 更新のステータスを監視する

通常、リソースレコードセットの更新がシステム全体に伝達されるまで 1 分程度かかります。次のようにして、更新の進行状況を監視し、完了したことを確認できます。

更新のステータスを監視するには1. GetChangeRequest オブジェクトを作成し、その Id プロパティ

に、ChangeResourceRecordSets によって返されたリクエスト ID を設定します。2. 待機ループを使用して、クライアントオブジェクトの GetChange メソッドを定期的に呼び出し

ます。GetChange は、更新の進行中は PENDING を返し、更新が完了した後は INSYNC を返します。すべてのメソッド呼び出しに、同じ GetChangeRequest オブジェクトを使用できます。

115

AWS SDK for .NET 開発者ガイドAWS SDK for .NET を使用した Amazon

Simple Storage Service のプログラミング

AWS SDK for .NET を使用した Amazon SimpleStorage Service のプログラミング

AWS SDK for .NET は、インターネット用のストレージである Amazon Simple Storage Service (AmazonS3) をサポートします。また、ウェブスケールのコンピューティングを開発者が簡単に利用できるよう設計されています。詳細については、「Amazon S3 」を参照してください。

以下のリンクでは、AWS SDK for .NET を使用する Amazon S3 のプログラミングの例を説明しています。

• Amazon S3 のプログラミングに対する AWS SDK for .NET の使用• AWS アカウントまたは IAM ユーザーの認証情報を使用したリクエストの実行• IAM ユーザーの一時的な認証情報を使用したリクエストの実行• フェデレーションユーザーの一時的な認証情報を使用したリクエストの実行• ACL の管理• バケットの作成• オブジェクトのアップロード• 高レベル API でのマルチパートアップロード• 低レベル API でのマルチパートアップロード• オブジェクトのリスト作成• キーのリスト表示• オブジェクトの取得• オブジェクトのコピー• マルチパートアップロード API を使用したオブジェクトのコピー• オブジェクトの削除• 複数のオブジェクトの削除• オブジェクトの復元• 通知用のバケットの設定• オブジェクトのライフサイクルの管理• 署名付きオブジェクト URL の生成• ウェブサイトの管理• Cross-Origin Resource Sharing (CORS) の有効化• サーバー側暗号化の指定• お客様が用意した暗号化キーを使用したサーバー側暗号化の指定

Amazon Simple Notification Service (Amazon SNS)の例

AWS SDK for .NET は、アプリケーション、エンドユーザー、およびデバイスでクラウドからすぐに通知を送受信できるようにするウェブサービスである Amazon Simple Notification Service (Amazon SNS) をサポートします。詳細については、「Amazon SNS」を参照してください。

次の例では、低レベルの API を使用して Amazon SNS のアクセス可能なトピックをリストする方法を示します。この例では、デフォルトのクライアントコンストラクタを使用しています。このコンストラクタでは、アプリケーションのデフォルト設定からロードされるか、またはそれが失敗した場合に EC2 インスタンスのインスタンスプロファイルサービスからロードされる、認証情報を使用してAmazonSimpleNotificationServiceClient が構築されます。

116

AWS SDK for .NET 開発者ガイドAmazon Simple Notification Service (Amazon SNS) の例

// using Amazon.SimpleNotificationService;// using Amazon.SimpleNotificationService.Model;

var client = new AmazonSimpleNotificationServiceClient();var request = new ListTopicsRequest();var response = new ListTopicsResponse();

do{ response = client.ListTopics(request);

foreach (var topic in response.Topics) { Console.WriteLine("Topic: {0}", topic.TopicArn);

var subs = client.ListSubscriptionsByTopic( new ListSubscriptionsByTopicRequest { TopicArn = topic.TopicArn });

var ss = subs.Subscriptions;

if (ss.Any()) { Console.WriteLine(" Subscriptions:");

foreach (var sub in ss) { Console.WriteLine(" {0}", sub.SubscriptionArn); } }

var attrs = client.GetTopicAttributes( new GetTopicAttributesRequest { TopicArn = topic.TopicArn }).Attributes;

if (attrs.Any()) { Console.WriteLine(" Attributes:");

foreach (var attr in attrs) { Console.WriteLine(" {0} = {1}", attr.Key, attr.Value); } }

Console.WriteLine(); }

request.NextToken = response.NextToken;

} while (!string.IsNullOrEmpty(response.NextToken));

関連する API リファレンス情報については、AWS SDK for .NET API リファレンスの「Amazon.SimpleNotificationService」、「Amazon.SimpleNotificationService.Model」、および「Amazon.SimpleNotificationService.Util」を参照してください。

117

AWS SDK for .NET 開発者ガイドAmazon SQS 例

Amazon SQS 例AWS SDK for .NET は Amazon SQS をサポートします。これは、システム内の他のコンポーネントとの間のメッセージまたはワークフローを処理するメッセージキューイングサービスです。詳細については、「Amazon SQS 」を参照してください。

以下の概念、チュートリアル、および例では、AWS SDK for .NET を使用して Amazon SQS キューを作成、使用する方法を示します。

サンプルコードは C# で書かれていますが、互換性のある任意の言語で AWS SDK for .NET を使用できます。AWS SDK for .NET は、一連の C# プロジェクトテンプレートをインストールします。したがって、このプロジェクトを開始する最もシンプルな方法は、Visual Studio を開き、[File]、[New Project]、[AWSSample Projects]、[App Services]、[AWS SQS Sample] の順に選択することです。

前提条件タスク

始める前に、AWS アカウントを作成し、AWS の認証情報を設定してください。詳細については、「AWSSDK for .NET の開始方法 (p. 3)」を参照してください。

関連する API リファレンス情報については、AWS SDK for .NET Referenceの 「Amazon.SQS」、「Amazon.SQS.Model」、および「Amazon.SQS.Util」を参照してください。

トピック• Amazon SQS クライアントの作成 (p. 118)• Amazon SQS キューの作成 (p. 119)• Amazon SQS のキュー URL の構築 (p. 120)• Amazon SQS メッセージの送信 (p. 120)• Amazon SQS メッセージバッチの送信 (p. 121)• Amazon SQS キューからのメッセージの受信 (p. 121)• Amazon SQS キューからのメッセージ削除 (p. 122)• Amazon SQS でのロングポーリングの有効化 (p. 123)• Amazon SQS キューの使用 (p. 124)• Amazon SQS デッドレターキューの使用 (p. 125)

Amazon SQS クライアントの作成Amazon SQS キューを作成し、使用するためには、Amazon SQS クライアントが必要です。クライアントを設定する前に、App.Config ファイルを作成して、AWS の認証情報を指定します。

認証情報を指定するには、ファイルの appSettings セクションで適切なプロファイルを参照します。

次の例では、my_profile という名前のプロファイルを指定します。認証情報とプロファイルの詳細については、「AWS SDK for .NET アプリケーションの設定 (p. 8)」を参照してください。

<?xml version="1.0"?><configuration> <configSections> <section name="aws" type="Amazon.AWSSection, AWSSDK.Core"/> </configSections> <aws profileName="my_profile"/> <startup>

118

AWS SDK for .NET 開発者ガイドAmazon SQS キューの作成

<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup></configuration>

このファイルを作成すると、Amazon SQS クライアントを作成し、初期化する準備が整います。

Amazon SQS クライアントを作成し、初期化するには

クライアントを使用して Amazon SQS キューを作成できるようになりました。キューの作成の詳細については、「Amazon SQS キューの作成 (p. 119)」を参照してください。

1. 次のように、AmazonSQSConfig インスタンスを作成および初期化し、ServiceURL プロパティをプロトコルとサービスエンドポイントで設定します。

var sqsConfig = new AmazonSQSConfig();

sqsConfig.ServiceURL = "http://sqs.us-west-2.amazonaws.com";

2. 次のように、AmazonSQSConfig インスタンスを使用して AmazonSQSClient インスタンスを作成し、初期化します。

var sqsClient = new AmazonSQSClient(sqsConfig);

Amazon SQS キューの作成Amazon SQS キューの作成は、SQS マネジメントコンソールを使用して実行できる管理タスクです。ただし、AWS SDK for .NET を使用して、Amazon SQS キューをプログラムで作成することもできます。

Amazon SQS キューを作成するには

Amazon SQS でのキューの動作の詳細については、「SQS キューのしくみ」を参照してください。

キュー URL の詳細については、「Amazon SQS キュー URL (p. 120)」を参照してください。

1. CreateQueueRequest インスタンスを作成し、初期化します。次のように、キューに名前を付け、キューメッセージの可視性タイムアウトを指定します。

var createQueueRequest = new CreateQueueRequest();

createQueueRequest.QueueName = "MySQSQueue";var attrs = new Dictionary<string, string>();attrs.Add(QueueAttributeName.VisibilityTimeout, "10");createQueueRequest.Attributes = attrs;

キュー名は、英数字、ハイフン、およびアンダースコアのみで構成する必要があります。

キューのメッセージは、指定された可視性タイムアウトを超えない限り、キューに残ったままです。キューのデフォルトの可視性タイムアウトは 30 秒です。可視性タイムアウトの詳細については、「可視性タイムアウト」を参照してください。設定できるさまざまキュー属性の詳細については、「SetQueueAttributes」を参照してください。

2. リクエストを作成したら、それをパラメータとして CreateQueue に渡します。このメソッドは、次のように CreateQueueResponse オブジェクトを返します。

var createQueueResponse = sqsClient.CreateQueue(createQueueRequest);

119

AWS SDK for .NET 開発者ガイドAmazon SQS のキュー URL の構築

Amazon SQS のキュー URL の構築キューメッセージを送信、受信、および削除するには、キュー URL が必要です。キュー URL は次の形式で作成されます。

https://{REGION_ENDPOINT}/queue.|api-domain|/{YOUR_ACCOUNT_NUMBER}/{YOUR_QUEUE_NAME}

AWS アカウント番号を確認するには、「セキュリティ認証情報」を参照してください。アカウント番号は、ページの右上の [Account Number] の下にあります。

メッセージのキューへの送信の詳細については、「Amazon SQS メッセージの送信 (p. 120)」を参照してください。

キューからのメッセージの受信の詳細については、「Amazon SQS キューからのメッセージの受信 (p. 121)」を参照してください。

キューからのメッセージの削除の詳細については、「Amazon SQS キューからのメッセージの削除 (p. 122)」を参照してください。

Amazon SQS メッセージの送信AWS SDK for .NET を使用して、Amazon SQS にメッセージを送信できます。

Important

キューの分散性が原因となり、Amazon SQS では、メッセージが送信されたときと同じ順序で受信できるかどうかは保証されません。メッセージの順序を維持する必要がある場合は、各メッセージ内に順序の情報を入力してください。これにより、受信時にメッセージを並べ換えることができます。

Amazon SQS キューへのメッセージを終了するには

キューからのメッセージの削除の詳細については、「Amazon SQS キューからのメッセージの削除 (p. 122)」を参照してください。

キューからのメッセージの受信の詳細については、「Amazon SQS キューからのメッセージの受信 (p. 121)」を参照してください。

1. SendMessageRequest インスタンスを作成し、初期化します。キュー名と送信するメッセージを指定します。次に例を示します。

sendMessageRequest.QueueUrl = myQueueURL; sendMessageRequest.MessageBody = "{YOUR_QUEUE_MESSAGE}";

キュー URL の詳細については、「Amazon SQS キュー URL (p. 120)」を参照してください。

各キューメッセージは Unicode 文字のみで構成する必要があります。また、サイズは最大で 64 KB になります。キューメッセージの詳細については、Amazon SQS API Referenceの「SendMessage」を参照してください。

2. リクエストを作成したら、それをパラメータとして SendMessage メソッドに渡します。このメソッドは、SendMessageResponse オブジェクトを返します。次に例を示します。

var sendMessageResponse = sqsClient.SendMessage(sendMessageRequest);

送信されたメッセージは、可視性タイムアウトが超過するまで、またはキューからメッセージが削除されるまで、キューに保持されます。可視性タイムアウトの詳細については、「可視性タイムアウト」を参照してください。

120

AWS SDK for .NET 開発者ガイドAmazon SQS メッセージバッチの送信

Amazon SQS メッセージバッチの送信AWS SDK for .NET を使用して、Amazon SQS キューにバッチメッセージを送信できます。SendMessageBatch メソッドは、指定されたキューに最大 10 通のメッセージを配信します。これはSendMessage のバッチバージョンです。

FIFO キューの場合、1 つのバッチ内の複数のメッセージが、送信される順序にキューに入れられます。

バッチメッセージの送信に関する詳細については、Amazon SQS API Referenceの「SendMessageBatch」を参照してください。

Amazon SQS キューにバッチメッセージを送信するには

1. AmazonSQSClient インスタンスを作成し、SendMessageBatchRequest オブジェクトを初期化します。キュー名と送信するメッセージを指定します。次に例を示します。

AmazonSQSClient client = new AmazonSQSClient();var sendMessageBatchRequest = new SendMessageBatchRequest{ Entries = new List<SendMessageBatchRequestEntry> { new SendMessageBatchRequestEntry("message1", "FirstMessageContent"), new SendMessageBatchRequestEntry("message2", "SecondMessageContent"), new SendMessageBatchRequestEntry("message3", "ThirdMessageContent") }, QueueUrl = "SQS_QUEUE_URL"};

キュー URL の詳細については、「Amazon SQS キュー URL (p. 120)」を参照してください。

各キューメッセージは Unicode 文字のみで構成する必要があります。また、サイズは最大で 64 KB になります。キューメッセージの詳細については、Amazon SQS API Referenceの「SendMessage」を参照してください。

2. リクエストを作成したら、それをパラメータとして SendMessageBatch メソッドに渡します。このメソッドは、各メッセージの固有の ID と、正常に送信された各メッセージの内容を含むSendMessageBatchResponse オブジェクトを返します。また、メッセージが送信されなかった場合にメッセージ ID、メッセージの内容、および送信者の障害フラグが返されます。

SendMessageBatchResponse response = client.SendMessageBatch(sendMessageBatchRequest);Console.WriteLine("Messages successfully sent:");foreach (var success in response.Successful){ Console.WriteLine(" Message id : {0}", success.MessageId); Console.WriteLine(" Message content MD5 : {0}", success.MD5OfMessageBody);}

Console.WriteLine("Messages failed to send:");foreach (var failed in response.Failed){ Console.WriteLine(" Message id : {0}", failed.Id); Console.WriteLine(" Message content : {0}", failed.Message); Console.WriteLine(" Sender's fault? : {0}", failed.SenderFault);}

Amazon SQS キューからのメッセージの受信AWS SDK for .NET を使用して、Amazon SQS キューからメッセージを受信できます。

121

AWS SDK for .NET 開発者ガイドAmazon SQS キューからのメッセージ削除

Amazon SQS キューからメッセージを受信するには

キューへのメッセージの送信の詳細については、「Amazon SQS メッセージの送信 (p. 120)」を参照してください。

キューからのメッセージの削除の詳細については、「Amazon SQS キューからのメッセージの削除 (p. 122)」を参照してください。

1. ReceiveMessageRequest インスタンスを作成し、初期化します。次のように、メッセージを受信するキュー URL を指定します。

var receiveMessageRequest = new ReceiveMessageRequest();

receiveMessageRequest.QueueUrl = myQueueURL;

キュー URL の詳細については、「Amazon SQS キュー URL (p. 120)」を参照してください。2. 次のように、リクエストオブジェクトをパラメータとして ReceiveMessage メソッドに渡します。

var receiveMessageResponse = sqsClient.ReceiveMessage(receiveMessageRequest);

このメソッドは、キューに含まれるメッセージのリストを含む ReceiveMessageResponse インスタンスを返します。

3. ReceiveMessageResponse.ReceiveMessageResult プロパティに含まれるReceiveMessageResponse オブジェクトには、受信したメッセージのリストが含まれます。このリストを繰り返し、ProcessMessage メソッドを呼び出して各メッセージを処理します。

foreach (var message in result.Messages){ ProcessMessage(message); // Go to a method to process messages.}

ProcessMessage メソッドは ReceiptHandle プロパティを使用して、メッセージの受信ハンドルを取得します。この受信ハンドルを使用して、メッセージの可視性タイムアウトを変更するか、キューからメッセージを削除できます。メッセージの可視性タイムアウトを変更する方法の詳細については、「ChangeMessageVisibility」を参照してください。

Amazon SQS キューからのメッセージ削除AWS SDK for .NET を使用して、Amazon SQS からメッセージを削除できます。

Amazon SQS キューからメッセージを削除するには

メッセージのキューへの送信の詳細については、「Amazon SQS メッセージの送信 (p. 120)」を参照してください。

キューからのメッセージの受信の詳細については、「Amazon SQS キューからのメッセージの受信 (p. 121)」を参照してください。

1. DeleteMessageRequest オブジェクトを作成し、初期化します。次のように、メッセージを削除するAmazon SQS キューと、削除するメッセージの受信ハンドルを指定します。

var deleteMessageRequest = new DeleteMessageRequest();

deleteMessageRequest.QueueUrl = queueUrl;

122

AWS SDK for .NET 開発者ガイドAmazon SQS でのロングポーリングの有効化

deleteMessageRequest.ReceiptHandle = recieptHandle;

2. リクエストオブジェクトをパラメータとして DeleteMessage メソッドに渡します。このメソッドは次のように DeleteMessageResponse オブジェクトを返します。

var response = sqsClient.DeleteMessage(deleteMessageRequest);

無条件で DeleteMessage を呼び出すと、可視性のタイムアウト設定にかかわらず、メッセージがキューから削除されます。可視性タイムアウトの詳細については、「可視性タイムアウト」を参照してください。

Amazon SQS でのロングポーリングの有効化ロングポーリングは、レスポンスの送信前にメッセージがキューで使用可能になるまで Amazon SQS が指定された時間待機できるようにすることで、空のレスポンス数を削減します。また、ロングポーリングは、サーバーをサンプリングするのではなくすべてのサーバーをクエリして、偽の空のレスポンスを排除します。ロングポーリングを有効にするには、受信したメッセージについてゼロ以外の待機時間を指定する必要があります。これを行うには、受信時のメッセージの WaitTimeSeconds パラメータを設定して、キューの ReceiveMessageWaitTimeSeconds パラメータを設定します。この .NET 例では、新しく作成したキューまたは既存のキューに対して、またはメッセージの受信時に Amazon SQS でロングポーリングを有効にする方法を示します。

これらの例では、AmazonSQSClient クラスの次のメソッドを使用してロングポーリングを有効にします。

• CreateQueue• SetQueueAttributes• ReceiveMessage

ロングポーリングの詳細については、Amazon SQS Developer Guideの「Amazon SQS ロングポーリング」を参照してください。

キューの作成時にロングポーリングを有効化するAmazonSQSClient サービスオブジェクトを作成します。ReceiveMessageWaitTimeSeconds プロパティのゼロ以外の値を含めて、キューの作成に必要なプロパティを含む CreateQueueRequest オブジェクトを作成します。

CreateQueue メソッドを呼び出します。これで、キューに対してロングポーリングが有効になります。

AmazonSQSClient client = new AmazonSQSClient();var request = new CreateQueueRequest{ QueueName = "SQS_QUEUE_NAME", Attributes = new Dictionary<string, string> { { "ReceiveMessageWaitTimeSeconds", "20"} }};var response = client.CreateQueue(request);Console.WriteLine("Created a queue with URL : {0}", response.QueueUrl);

既存のキューでロングポーリングを有効にするAmazonSQSClient サービスオブジェクトを作成します。ReceiveMessageWaitTimeSeconds プロパティに対するゼロ以外の値と、キューの URL を含めて、キューの属性を設定するために必要なプロパティ

123

AWS SDK for .NET 開発者ガイドAmazon SQS キューの使用

を含む SetQueueAttributesRequest を作成します。SetQueueAttributes メソッドを呼び出します。これで、キューに対してロングポーリングが有効になります。

AmazonSQSClient client = new AmazonSQSClient();

var request = new SetQueueAttributesRequest{ Attributes = new Dictionary<string, string> { { "ReceiveMessageWaitTimeSeconds", "20"} }, QueueUrl = "SQS_QUEUE_URL"};

var response = client.SetQueueAttributes(request);

メッセージの受信AmazonSQSClient サービスオブジェクトを作成します。WaitTimeSeconds パラメータのゼロ以外の値、およびキューの URL を含めて、メッセージの受信に必要なプロパティを含むReceiveMessageRequest オブジェクトを作成します。ReceiveMessage メソッドを呼び出します。

public void OnMessageReceipt(){ AmazonSQSClient client = new AmazonSQSClient();

var request = new ReceiveMessageRequest { AttributeNames = { "SentTimestamp" }, MaxNumberOfMessages = 1, MessageAttributeNames = { "All" }, QueueUrl = "SQS_QUEUE_URL", WaitTimeSeconds = 20 };

var response = client.ReceiveMessage(request);}

Amazon SQS キューの使用Amazon SQS は、デフォルトのキュータイプとして「標準」を提供します。標準キューでは、1 秒あたりのトランザクションの数をほぼ無制限にできます。標準キューは、少なくとも 1 回のメッセージ配信をサポートします。ただし、メッセージの複数のコピーが誤った順序で配信される場合があります。標準キューは、全般的にメッセージが送信順に配信されるベストエフォート型の順序を提供します。

アプリケーションが、順不同で複数回到達するメッセージを処理できる限りは、多くのシナリオで標準メッセージキューを使用できます。

このコード例では、:code:<problematic>`</problematic>AmazonSQSClient`class: のこれらのメソッドを使用して、キューを使用する方法を示しています。

• ListQueues: メッセージキューのリストを取得します• GetQueueUrl: 特定のキューの URL を取得します• DeleteQueue: キューを削除します

Amazon SQS メッセージの詳細については、Amazon SQS Developer Guideの「Amazon SQS キューの操作」を参照してください。

124

AWS SDK for .NET 開発者ガイドAmazon SQS デッドレターキューの使用

キューを一覧表示するキューの一覧表示に必要なプロパティを含む ListQueuesRequest オブジェクトを作成します。これはデフォルトでは空のオブジェクトになります。ListQueuesRequest をパラメータとして ListQueues メソッドを呼び出して、キューの一覧を取得します。呼び出しで返される ListQueuesResponse には、すべてのキューの URL が含まれます。

AmazonSQSClient client = new AmazonSQSClient();

ListQueuesResponse response = client.ListQueues(new ListQueuesRequest());foreach (var queueUrl in response.QueueUrls){ Console.WriteLine(queueUrl);}

キューの URL の取得キューを識別するために必要なプロパティを含む GetQueueUrlRequest オブジェクトを作成します。これには、URL が必要なキューの名前を含める必要があります。GetQueueUrlRequest オブジェクトをパラメータとして使用して、GetQueueUrl メソッドを呼び出します。呼び出しにより、指定したキューの URLを含む GetQueueUrlResponse オブジェクトが返されます。

AmazonSQSClient client = new AmazonSQSClient();

var request = new GetQueueUrlRequest{ QueueName = "SQS_QUEUE_NAME"};

GetQueueUrlResponse response = client.GetQueueUrl(request);Console.WriteLine("The SQS queue's URL is {1}", response.QueueUrl);

キューの削除削除するキューの URL を含む DeleteQueueRequest オブジェクトを作成します。DeleteQueueRequestオブジェクトをパラメータとして使用して、DeleteQueue メソッドを呼び出します。

AmazonSQSClient client = new AmazonSQSClient();

var request = new DeleteQueueRequest{ QueueUrl = "SQS_QUEUE_URL"};

client.DeleteQueue(request);

Amazon SQS デッドレターキューの使用この例は、キューを使用して、キューが処理できない他のキューからメッセージを受信および保持する方法を示しています。

デッドレターキューは、正常に処理できないメッセージの送信先として他の (送信元) キューが使用できるキューです。これらのメッセージは、処理が成功しなかった理由を判断するためにデッドレターキューに分離できます。デッドレターキューにメッセージを送信する各ソースキューを、個別に設定する必要があります。1 つのデッドレターキューを複数のキューの送信先とすることができます。

この例では、AmazonSQSClient オブジェクトは SetQueueAttributesRequest メソッドを使用して、デッドレターキューを使うようにソースキューを設定します。

125

AWS SDK for .NET 開発者ガイドAmazon CloudWatch の例

Amazon SQS デッドレターキューの詳細については、Amazon SQS Developer Guideの「Amazon SQSデッドレターキューの使用」を参照してください。

ソースキューの設定このコード例では、デッドレターキューとして機能するキューを作成済みであることを前提としています。キューの作成の詳細については、「Amazon SQS キューの作成 (p. 119)」を参照してください。デッドレターキューの作成後は、デッドレターキューに未処理のメッセージをルーティングするように他のキューを設定する必要があります。これを行うには、デッドレターキューとして使用するキューと、デッドレターキューにルーティングされる前に個別のメッセージで受信する最大数を識別する再処理ポリシーを指定します。

AmazonSQSClient オブジェクトを作成して、キューの属性を設定します。デッドレターキューの ARNと、maxReceiveCount の値の両方を指定する RedrivePolicy プロパティを含めて、キューの属性の更新に必要なプロパティを含む SetQueueAttributesRequest オブジェクトを作成します。お客様が設定するURL ソースキューも指定します。SetQueueAttributes メソッドを呼び出します。

AmazonSQSClient client = new AmazonSQSClient();

var setQueueAttributeRequest = new SetQueueAttributesRequest{ Attributes = new Dictionary<string, string> { {"RedrivePolicy", @"{ ""deadLetterTargetArn"" : ""DEAD_LETTER_QUEUE_ARN"", ""maxReceiveCount"" : ""10""}" } }, QueueUrl = "SOURCE_QUEUE_URL"};

client.SetQueueAttributes(setQueueAttributeRequest)

Amazon CloudWatch の例Amazon CloudWatch は、AWS リソースと、AWS で実行されているアプリケーションをリアルタイムでモニタリングするウェブサービスです。CloudWatch を使用してメトリクスを収集し、追跡できます。メトリクスとは、リソースやアプリケーションに関して測定できる変数です。CloudWatch アラームは、ユーザーが定義したルールに基づいて、通知を送信したり、モニタリングしているリソースに自動的に変更を加えたりします。

これらの例のコードは C# で書かれていますが、互換性のある任意の言語で AWS SDK for .NET を使用できます。AWS Toolkit for Visual Studio のインストール時に、一連の C# プロジェクトテンプレートがインストールされます。このプロジェクトを開始する最も簡単な方法は、Visual Studio を開き、[File]、[NewProject]、[AWS Sample Projects]、[Deployment and Management]、[AWS CloudWatch Example] の順に選択することです。

前提条件タスク

始める前に、AWS アカウントを作成し、AWS の認証情報を設定してください。詳細については、「AWSSDK for .NET の開始方法 (p. 3)」を参照してください。

トピック• Amazon CloudWatch でのアラームの記述、作成、および削除 (p. 127)• Amazon CloudWatch でのアラームの使用 (p. 128)• Amazon CloudWatch からのメトリクスの取得 (p. 130)• Amazon CloudWatch イベントにイベントを送信する (p. 131)

126

AWS SDK for .NET 開発者ガイドAmazon CloudWatch でのアラー

ムの記述、作成、および削除

• Amazon CloudWatch Logs でのサブスクリプションフィルタの使用 (p. 135)

Amazon CloudWatch でのアラームの記述、作成、および削除この .NET の例は、以下の方法を示します。

• CloudWatch アラームを記述する• メトリクスに基づいて CloudWatch アラームを作成する• CloudWatch アラームを削除する

シナリオ1 つのアラームで、指定した期間中、1 つのメトリクスを監視します。このアラームは、複数の期間にわたる一定のしきい値とメトリクスの値の関係性に基づき、1 つ以上のアクションを実行します。次の例は、AmazonCloudWatchClient クラスのこれらのメソッドを使用して、CloudWatch でアラームを記述、作成、および削除する方法を示します。

• DescribeAlarms• PutMetricAlarm• DeleteAlarms

CloudWatch アラームの詳細については、CloudWatch User Guideの「Amazon CloudWatch アラームの作成」を参照してください。

前提条件タスクこの例をセットアップして実行するには、まず以下の条件を満たす必要があります。

• Amazon CloudWatch を使用するようにセットアップします。• AWS SDK for .NET をセットアップおよび設定します。

アラームを作成するAmazonCloudWatchClient インスタンスおよび DescribeAlarmsRequest オブジェクトを作成し、INSUFFICIENT_DATA 状態で返されるアラームを制限します。次に、AmazonCloudWatchClientオブジェクトの DescribeAlarms メソッドを呼び出します。

using (var cloudWatch = new AmazonCloudWatchClient(RegionEndpoint.USWest2)){ var request = new DescribeAlarmsRequest(); request.StateValue = "INSUFFICIENT_DATA"; request.AlarmNames = new List<string> { "Alarm1", "Alarm2" }; do { var response = cloudWatch.DescribeAlarms(request); foreach(var alarm in response.MetricAlarms) { Console.WriteLine(alarm.AlarmName); } request.NextToken = response.NextToken; } while (request.NextToken != null);

127

AWS SDK for .NET 開発者ガイドAmazon CloudWatch でのアラームの使用

}

メトリクスに基づいてアラームを作成するAmazonCloudWatchClient インスタンスと、メトリクス (この場合は、Amazon EC2 インスタンスの CPU使用率) に基づくアラームを作成するために必要なパラメータ用の PutMetricAlarmRequest オブジェクトを作成します。

残りのパラメータは、メトリクスがしきい値である 70 パーセントを超えたときにアラームをトリガーするように設定されます。

次に、AmazonCloudWatchClient オブジェクトの PutMetricAlarm メソッドを呼び出します。

var client = new AmazonCloudWatchClient(RegionEndpoint.USWest2);client.PutMetricAlarm(new PutMetricAlarmRequest{ AlarmName = "Web_Server_CPU_Utilization", ComparisonOperator = ComparisonOperator.GreaterThanThreshold, EvaluationPeriods = 1, MetricName = "CPUUtilization", Namespace = "AWS/EC2", Period = 60, Statistic = Statistic.Average, Threshold = 70.0, ActionsEnabled = true, AlarmActions = new List<string> { "arn:aws:swf:us-west-2:" + "customerAccount" + ":action/actions/AWS_EC2.InstanceId.Reboot/1.0" }, AlarmDescription = "Alarm when server CPU exceeds 70%", Dimensions = new List<Dimension> { new Dimension { Name = "InstanceId", Value = "INSTANCE_ID" } }, Unit = StandardUnit.Seconds};

アラームの削除AmazonCloudWatchClient インスタンスと、削除するアラームの名前を保持する DeleteAlarmsRequest オブジェクトを作成します。次に、AmazonCloudWatchClient オブジェクトの DeleteAlarms メソッドを呼び出します。

using (var cloudWatch = new AmazonCloudWatchClient(RegionEndpoint.USWest2)){ var response = cloudWatch.DeleteAlarms( new DeleteAlarmsRequest { AlarmNames = new List<string> { "Alarm1", "Alarm2" }; });}

Amazon CloudWatch でのアラームの使用この .NET 例では、CloudWatch アラームに基づいて自動的に Amazon EC2 インスタンスの状態を変更する方法を示します。

シナリオアラームアクションを使用して、Amazon EC2 インスタンスを自動的に停止、終了、再起動、または復旧するアラームを作成できます。今後インスタンスを実行する必要がなくなったときに、停止または終了ア

128

AWS SDK for .NET 開発者ガイドAmazon CloudWatch でのアラームの使用

クションを使用できます。再起動と復元アクションを使用して、自動的にそのインスタンスを再起動できます。

この例では、Amazon EC2 インスタンスの再起動をトリガーするアラームアクションをCloudWatch で定義するために .NET を使用します。このメソッドは AWS SDK for .NET を使用して、AmazonCloudWatchClient クラスのこれらのメソッドにより Amazon EC2 インスタンスを管理します。

• EnableAlarmActions• DisableAlarmActions

CloudWatch アラームアクションの詳細については、CloudWatch User Guide の「インスタンスを停止、終了、再起動、または復旧するアラームを作成する」を参照してください。

前提条件タスクこの例をセットアップして実行するには、まず以下の条件を満たす必要があります。

• Amazon CloudWatch を使用するようにセットアップします。• AWS SDK for .NET をセットアップおよび設定します。

アラームアクションを作成し、有効にします。1. AmazonCloudWatchClient インスタンスと、アラーム作成のパラメータを保持する

PutMetricAlarmRequest オブジェクトを作成し、ActionsEnabled を true に指定して、アラームがトリガーするアクションの ARN の配列を指定します。AmazonCloudWatchClient オブジェクトのPutMetricAlarm メソッドを呼び出します。これにより、存在しない場合はアラームが作成され、存在する場合はアラームが更新されます。

using (var client = new AmazonCloudWatchClient(RegionEndpoint.USWest2)){ client.PutMetricAlarm(new PutMetricAlarmRequest { AlarmName = "Web_Server_CPU_Utilization", ComparisonOperator = ComparisonOperator.GreaterThanThreshold, EvaluationPeriods = 1, MetricName = "CPUUtilization", Namespace = "AWS/EC2", Period = 60, Statistic = Statistic.Average, Threshold = 70.0, ActionsEnabled = true, AlarmActions = new List<string> { "arn:aws:swf:us-west-2:" + "customerAccount" + ":action/actions/AWS_EC2.InstanceId.Reboot/1.0" }, AlarmDescription = "Alarm when server CPU exceeds 70%", Dimensions = new List<Dimension> { new Dimension { Name = "InstanceId", Value = "instanceId" } }, Unit = StandardUnit.Seconds });}

2. PutMetricAlarm が正常に完了したら、CloudWatch アラームの名前を含むEnableAlarmActionsRequest オブジェクトを作成します。EnableAlarmActions メソッドを呼び出して、アラームアクションを有効にします。

client.EnableAlarmActions(new EnableAlarmActionsRequest

129

AWS SDK for .NET 開発者ガイドAmazon CloudWatch からのメトリクスの取得

{ AlarmNames = new List<string> { "Web_Server_CPU_Utilization" }});

3. CPUUtilization カスタムメトリクスを含む MetricDatum オブジェクトを作成します。CPUUtilizationメトリクスのデータポイントを送信するのに必要な MetricData パラメータを含むPutMetricDataRequest オブジェクトを作成します。PutMetricData メソッドを呼び出します。

MetricDatum metricDatum = new MetricDatum{ MetricName = "CPUUtilization" };PutMetricDataRequest putMetricDatarequest = new PutMetricDataRequest{ MetricData = new List<MetricDatum> { metricDatum }};client.PutMetricData(putMetricDatarequest);

アラームのアクションの無効化AmazonCloudWatchClient インスタンスと、CloudWatch アラームの名前を含むDisableAlarmActionsRequest オブジェクトを作成します。DisableAlarmActions メソッドを呼び出して、このアラームのアクションを無効にします。

using (var client = new AmazonCloudWatchClient(RegionEndpoint.USWest2)){ client.DisableAlarmActions(new DisableAlarmActionsRequest { AlarmNames = new List<string> { "Web_Server_CPU_Utilization" } });}

Amazon CloudWatch からのメトリクスの取得この例では、以下の方法を示します。

• CloudWatch メトリクスのリストを取得する• CloudWatch カスタムメトリクスをパブリッシュする

シナリオメトリクスとは、システムのパフォーマンスに関するデータです。Amazon EC2 インスタンスや独自のアプリケーションメトリクスなど、一部のリソースの詳細モニタリングを有効にできます。この例では、.NET を使用して、公開された CloudWatch メトリクスのリストを取得し、AmazonCloudWatchClientクラスのこれらのメソッドにより、CloudWatch メトリクスにデータポイントを公開します。

• ListMetrics• PutMetricData

CloudWatch メトリクスの詳細については、CloudWatch User Guideの「Amazon CloudWatch メトリクスの使用」を参照してください。

前提条件タスクこの例をセットアップして実行するには、まず以下の条件を満たす必要があります。

130

AWS SDK for .NET 開発者ガイドAmazon CloudWatch イベントにイベントを送信する

• Amazon CloudWatch を使用するようにセットアップします。• AWS SDK for .NET をセットアップおよび設定します。

メトリクスの一覧表示AWS/Logs 名前空間内のメトリクスを一覧表示するために必要なパラメータを含む ListMetricsRequestオブジェクトを作成します。AmazonCloudWatchClient インスタンス ListMetrics メソッドを呼び出して、IncomingLogEvents メトリクスを一覧表示します。

var logGroupName = "LogGroupName";DimensionFilter dimensionFilter = new DimensionFilter(){ Name = logGroupName};var dimensionFilterList = new List<DimensionFilter>();dimensionFilterList.Add(dimensionFilter);

var dimension = new Dimension{ Name = "UniquePages", Value = "URLs"};using (var cw = new AmazonCloudWatchClient(RegionEndpoint.USWest2)){ var listMetricsResponse = cw.ListMetrics(new ListMetricsRequest { Dimensions = dimensionFilterList, MetricName = "IncomingLogEvents", Namespace = "AWS/Logs" }); Console.WriteLine(listMetricsResponse.Metrics);}

カスタムメトリクスの送信PAGES_VISITED カスタムメトリクスのデータポイントを送信するのに必要なパラメータを含むPutMetricDataRequest オブジェクトを作成します。AmazonCloudWatchClient インスタンスからPutMetricData メソッドを呼び出します。

using (var cw = new AmazonCloudWatchClient(RegionEndpoint.USWest2)){ cw.PutMetricData(new PutMetricDataRequest { MetricData = new List<MetricDatum>{new MetricDatum { MetricName = "PagesVisited", Dimensions = new List<Dimension>{dimension}, Unit = "None", Value = 1.0 }}, Namespace = "SITE/TRAFFIC" });}

Amazon CloudWatch イベントにイベントを送信するこの .NET コード例では、以下の方法を示します。

• スケジュールされたルールを作成および更新し、イベントをトリガーする

131

AWS SDK for .NET 開発者ガイドAmazon CloudWatch イベントにイベントを送信する

• イベントに対応する AWS Lambda 関数のターゲットを追加する• ターゲットに一致するイベントを送信する

シナリオAmazon CloudWatch Events は、さまざまなターゲットに対する AWS リソースの変更を示すシステムイベントのほぼリアルタイムのストリームを提供します。簡単なルールを使用して、一致したイベントを 1つ以上のターゲット関数またはストリームに振り分けることができます。この .NET の例では、イベントをトリガーするために使用されるルールの作成および更新、イベントに対応する 1 つまたは複数のターゲットの定義、および処理のため一致するイベントのターゲットへの送信を行う方法を示します。

コードは AmazonCloudWatchEventsClient クラスのこれらのメソッドを使用してインスタンスを管理します。

• PutRule• PutTargets• PutEvents

Amazon CloudWatch Events の詳細については、CloudWatch Events User Guideの「PutEvents を使用したイベントの追加」を参照してください。

前提条件タスクこの例をセットアップして実行するには、まず以下の条件を満たす必要があります。

• Amazon CloudWatch を使用するようにセットアップします。• AWS SDK for .NET をセットアップおよび設定します。• イベントの対象となる Hello World 設計図を使用して Lambda 関数を作成します。その方法について

は、CloudWatch Events User Guideの「ステップ 1: AWS Lambda 関数を作成する」を参照してください。

IAM ロールを作成して例を実行する次の例では、ポリシーで CloudWatch イベントにアクセス許可を付与し、信頼されたエンティティとしてevents.amazonaws.com を含む IAM ロールが必要です。この例では、CWEvents というロールを作成し、その信頼関係とロールポリシーを設定します。

static void Main(){ var client = new AmazonIdentityManagementServiceClient(); // Create a role and it's trust relationship policy var role = client.CreateRole(new CreateRoleRequest { RoleName = "CWEvents", AssumeRolePolicyDocument = @"{""Statement"":[{""Principal"":{""Service"":[""events.amazonaws.com""]}," + @"""Effect"":""Allow"",""Action"":[""sts:AssumeRole""]}]}" }).Role; // Create a role policy and add it to the role string policy = GenerateRolePolicyDocument(); var request = new CreatePolicyRequest { PolicyName = "DemoCWPermissions", PolicyDocument = policy };

132

AWS SDK for .NET 開発者ガイドAmazon CloudWatch イベントにイベントを送信する

try { var createPolicyResponse = client.CreatePolicy(request); } catch (EntityAlreadyExistsException) { Console.WriteLine ("Policy 'DemoCWPermissions' already exits."); } var request2 = new AttachRolePolicyRequest() { PolicyArn = "arn:aws:iam::192484417122:policy/DemoCWPermissions", RoleName = "CWEvents" }; try { var response = client.AttachRolePolicy(request2); //managedpolicy Console.WriteLine("Policy DemoCWPermissions attached to Role TestUser"); } catch (NoSuchEntityException) { Console.WriteLine ("Policy 'DemoCWPermissions' does not exist"); } catch (InvalidInputException) { Console.WriteLine ("One of the parameters is incorrect"); }

}public static string GenerateRolePolicyDocument(){ /* This method produces the following managed policy: "Version": "2012-10-17", "Statement": [ { "Sid": "CloudWatchEventsFullAccess", "Effect": "Allow", "Action": "events:*", "Resource": "*" }, { "Sid": "IAMPassRoleForCloudWatchEvents", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::*:role/AWS_Events_Invoke_Targets" } ] } */ var actionList = new ActionIdentifier("events:*"); var actions = new List<ActionIdentifier>(); actions.Add(actionList); var resource = new Resource("*"); var resources = new List<Resource>(); resources.Add(resource); var statement = new Amazon.Auth.AccessControlPolicy.Statement (Amazon.Auth.AccessControlPolicy.Statement.StatementEffect.Allow) { Actions = actions, Id = "CloudWatchEventsFullAccess", Resources = resources }; var statements = new List<Amazon.Auth.AccessControlPolicy.Statement>(); statements.Add(statement);

133

AWS SDK for .NET 開発者ガイドAmazon CloudWatch イベントにイベントを送信する

var actionList2 = new ActionIdentifier("iam:PassRole"); var actions2 = new List<ActionIdentifier>(); actions2.Add(actionList2); var resource2 = new Resource("arn:aws:iam::*:role/AWS_Events_Invoke_Targets"); var resources2 = new List<Resource>(); resources2.Add(resource2); var statement2 = new Amazon.Auth.AccessControlPolicy.Statement(Amazon.Auth.AccessControlPolicy.Statement.StatementEffect.Allow) { Actions = actions2, Id = "IAMPassRoleForCloudWatchEvents", Resources = resources2 };

statements.Add(statement2); var policy = new Policy { Id = "DemoEC2Permissions", Version = "2012-10-17", Statements = statements }; return policy.ToJson();}

スケジュールされたルールの作成以下を含む、新しいスケジュールされたルールを指定するために必要なパラメータを含むAmazonCloudWatchEventsClient インスタンスと PutRuleRequest オブジェクトを作成します。

• ルールの名前• 以前に作成した IAM ロールの ARN• 5 分ごとにルールのトリガーをスケジュールする式

PutRule メソッドを呼び出してルールを作成します。PutRuleResponse は、新しいルールまたは更新されたルールの ARN を返します。

AmazonCloudWatchEventsClient client = new AmazonCloudWatchEventsClient();

var putRuleRequest = new PutRuleRequest{ Name = "DEMO_EVENT", RoleArn = "IAM_ROLE_ARN", ScheduleExpression = "rate(5 minutes)", State = RuleState.ENABLED};

var putRuleResponse = client.PutRule(putRuleRequest);Console.WriteLine("Successfully set the rule {0}", putRuleResponse.RuleArn);

Lambda 関数のターゲットを追加する作成した Lambda 関数の ARN を含めて、ターゲットをアタッチするルールを指定するために必要なパラメータを含む、AmazonCloudWatchEventsClient インスタンスと PutTargetsRequest オブジェクトを作成します。AmazonCloudWatchClient インスタンスの PutTargets メソッドを呼び出します。

AmazonCloudWatchEventsClient client = new AmazonCloudWatchEventsClient();

var putTargetRequest = new PutTargetsRequest{

134

AWS SDK for .NET 開発者ガイドAmazon CloudWatch Logs でのサブスクリプションフィルタの使用

Rule = "DEMO_EVENT", Targets = { new Target { Arn = "LAMBDA_FUNCTION_ARN", Id = "myCloudWatchEventsTarget"} }};client.PutTargets(putTargetRequest);

イベントの送信イベントを送信するのに必要なパラメータを含む、AmazonCloudWatchEventsClient インスタンスおよびPutEventsRequest オブジェクトを作成します。イベントごとに、イベントのソース、イベントの影響を受けるリソースの ARN、およびイベントの詳細を含めます。AmazonCloudWatchClient インスタンスのPutEvents メソッドを呼び出します。

AmazonCloudWatchEventsClient client = new AmazonCloudWatchEventsClient();

var putEventsRequest = new PutEventsRequest{ Entries = new List<PutEventsRequestEntry> { new PutEventsRequestEntry { Detail = @"{ ""key1"" : ""value1"", ""key2"" : ""value2"" }", DetailType = "appRequestSubmitted", Resources = { "RESOURCE_ARN" }, Source = "com.compnay.myapp" } }};client.PutEvents(putEventsRequest);

Amazon CloudWatch Logs でのサブスクリプションフィルタの使用この .NET の例は、以下の方法を示します。

• CloudWatch Logs でのサブスクリプションフィルタの一覧表示• CloudWatch Logs でのサブスクリプションフィルタの作成または削除

シナリオサブスクリプションにより、CloudWatch ログからのログイベントのリアルタイムフィードにアクセスし、カスタム処理、分析、他のシステムへのロードを行うために、Amazon Kinesis Data Streams や AWSLambda などの他のサービスにそのフィードを配信することができます。サブスクリプションフィルタにより、AWS リソースに配信されるログイベントをフィルタリングするために使用するパターンを定義できます。この例では、CloudWatch Logs でサブスクリプションフィルタを一覧表示、作成、削除する方法を示します。ログイベントの送信先は Lambda 関数です。

この例では、AWS SDK for .NET を使用し、AmazonCloudWatchLogsClient クラスのこれらのメソッドによりサブスクリプションフィルタを管理します。

• DescribeSubscriptionFilters

135

AWS SDK for .NET 開発者ガイドAmazon CloudWatch Logs でのサブスクリプションフィルタの使用

• PutSubscriptionFilter• DeleteSubscriptionFilter

CloudWatch Logs サブスクリプションの詳細については、CloudWatch Logs User Guideの「サブスクリプションを使用したログデータのリアルタイム処理」を参照してください。

前提条件タスクこの例をセットアップして実行するには、まず以下の条件を満たす必要があります。

• Amazon CloudWatch を使用するようにセットアップします。• AWS SDK for .NET をセットアップおよび設定します。

既存のサブスクリプションのフィルタの記述AmazonCloudWatchLogsClient オブジェクトを作成します。既存のフィルタを記述するために必要なパラメータを含む DescribeSubscriptionFiltersRequest オブジェクトを作成します。記述するフィルタのロググループ名と最大数を含めます。DescribeSubscriptionFilters メソッドを呼び出します。

public static void DescribeSubscriptionFilters(){ var client = new AmazonCloudWatchLogsClient(); var request = new Amazon.CloudWatchLogs.Model.DescribeSubscriptionFiltersRequest() { LogGroupName = "GROUP_NAME", Limit = 5 }; try { var response = client.DescribeSubscriptionFilters(request); } catch (Amazon.CloudWatchLogs.Model.ResourceNotFoundException e) { Console.WriteLine(e.Message); }}

サブスクリプションフィルタを作成するAmazonCloudWatchLogsClient オブジェクトを作成します。送信先の Lambda 関数の ARN、フィルタの名前、フィルタリングの文字列パターン、ロググループの名前を含めて、フィルタの作成に必要なパラメータを含む PutSubscriptionFilterRequest オブジェクトを作成します。PutSubscriptionFilter メソッドを呼び出します。

public static void PutSubscriptionFilters(){ var client = new AmazonCloudWatchLogsClient(); var request = new Amazon.CloudWatchLogs.Model.PutSubscriptionFilterRequest() { DestinationArn = "LAMBDA_FUNCTION_ARN", FilterName = "FILTER_NAME", FilterPattern = "ERROR", LogGroupName = "Log_Group" }; try { var response = client.PutSubscriptionFilter(request);

136

AWS SDK for .NET 開発者ガイドAWS SDK for .NET を使用した

AWS OpsWorks のプログラミング

} catch (InvalidParameterException e) { Console.WriteLine(e.Message); }}

サブスクリプションフィルタの削除AmazonCloudWatchLogsClient オブジェクトを作成します。フィルタ名とロググループ名を含めて、フィルタの削除に必要なパラメータを含む DeleteSubscriptionFilterRequest オブジェクトを作成します。DeleteSubscriptionFilter メソッドを呼び出します。

public static void DeleteSubscriptionFilter(){ var client = new AmazonCloudWatchLogsClient(); var request = new Amazon.CloudWatchLogs.Model.DeleteSubscriptionFilterRequest() { LogGroupName = "GROUP_NAME", FilterName = "FILTER" }; try { var response = client.DeleteSubscriptionFilter(request); } catch (Amazon.CloudWatchLogs.Model.ResourceNotFoundException e) { Console.WriteLine(e.Message); }}

AWS SDK for .NET を使用した AWS OpsWorks のプログラミング

AWS SDK for .NET では、スタックとアプリケーションの作成および管理するためのシンプルで柔軟性のある方法を提供する AWS OpsWorks がサポートされています。AWS OpsWorks を使用すると、AWSリソースのプロビジョニング、AWS リソースの設定の管理、AWS リソースへのアプリケーションのデプロイ、および AWS リソースの状態のモニタリングを行うことができます。詳細については、「AWSOpsWorks」を参照してください。

SDK では、AWS OpsWorks を使用したプログラミング用の API が提供されています。通常、これらのAPI を構成する要求と応答が対応した一連のオブジェクトは、対応するサービスレベルの構造に焦点を当てた HTTP ベースの API 呼び出しに対応しています。

関連する API リファレンス情報については、『AWS SDK for .NET リファレンス』の「Amazon.OpsWorks」と「Amazon.OpsWorks.Model」を参照してください。

AWS SDK for .NET を使用するその他の AWS のサービスのプログラミング

AWS SDK for .NET では、この章でこれまでに説明したもの以外の AWS のサービスのプログラミングをサポートしています。AWS SDK for .NET での特定のサービスのプログラミングについては、AWS SDKfor .NET API Reference を参照してください。

137

AWS SDK for .NET 開発者ガイドAWS SDK for .NET を使用するその他の AWS のサービスのプログラミング

個別の AWS のサービス用の名前空間に加えて、AWS SDK for .NET では以下の API も提供されています。

AWS SDK for .NET に関するその他の一般的なプログラミング情報には、次のものが含まれます。

• Overriding Endpoints in the AWS SDK for .NET• .NET Object Lifecycles

138

AWS SDK for .NET 開発者ガイド

その他のリソースAWS SDK for .NET のホームページ

AWS SDK for .NET の詳細については、SDK のホームページ (http://aws.amazon.com/sdk-for-net/) を参照してください。

SDK リファレンスドキュメント

SDK リファレンスドキュメントでは、SDK に付属するすべてのコードを参照し検索することができます。詳細なドキュメントと使用例が用意されており、メソッドソースを参照することもできます。詳細については、『AWS SDK for .NET リファレンス』を参照してください。

AWS フォーラム

AWS フォーラムにアクセスして、質問したり意見や要望を述べてください。各ドキュメントページには、関連のフォーラムに移動できる [Go to the forums] ボタンがあります。AWS の技術者がフォーラムを見ていて、質問や意見、要望、問題に対応しています。また、いずれのフォーラムについても、RSS フィードにサブスクライブできます。

AWS Toolkit for Visual Studio

Microsoft Visual Studio IDE を使用している場合は、『AWS Toolkit for Visual Studio User Guide』を参照してください。

139

AWS SDK for .NET 開発者ガイド

ドキュメント履歴『AWS SDK for .NET 開発者ガイド』の最新リリース以降の重要な変更点を次の表にまとめています。

ドキュメントの最新メジャー更新日: 2015 年 7 月 28 日

変更 | 説明 リリース日

新しい SDK バージョン| AWS SDK for .NET のバージョン 3 がリリースされました。

2015 年 28 月 7 日

140