AWS SDK for Java バージョン 2 - 開発者ガイド...AWS SDK for Java バージョン 2...

125
AWS SDK for Java バージョン 2 開発者ガイド AWS SDK for Java バージョン 2: 開発者ガイド Copyright © 2020 Amazon Web Services, Inc. and/or its affiliates. All rights reserved.

Transcript of AWS SDK for Java バージョン 2 - 開発者ガイド...AWS SDK for Java バージョン 2...

AWS SDK for Java バージョン 2開発者ガイド

AWS SDK for Java バージョン 2: 開発者ガイドCopyright © 2020 Amazon Web Services, Inc. and/or its affiliates. All rights reserved.

AWS SDK for Java バージョン 2 開発者ガイド

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

AWS SDK for Java バージョン 2 開発者ガイド

Table of ContentsAWS SDK for Java 2.0 開発者ガイド ................................................................................................... 1

バージョン 2.x の新機能 .............................................................................................................. 11.x のサポート ........................................................................................................................... 1追加のリソース .......................................................................................................................... 1この SDK への貢献 ..................................................................................................................... 2Eclipse IDE サポート .................................................................................................................. 2Android 向け AWS アプリケーションの開発 ................................................................................... 2

ご利用開始にあたって ......................................................................................................................... 3AWS にサインアップし、IAM ユーザーを作成する ......................................................................... 3SDK をダウンロードする ............................................................................................................. 4

前提条件 ............................................................................................................................ 4プロジェクトへの SDK のダウンロード ................................................................................. 4SDK をコンパイルする ........................................................................................................ 4Java 開発環境のインストール .............................................................................................. 5JVM の選択 ....................................................................................................................... 5

AWS 認証情報とリージョンのセットアップ .................................................................................... 5AWS 認証情報の設定 .......................................................................................................... 6IMDS 認証情報の更新 ......................................................................................................... 6AWS リージョンの設定 ....................................................................................................... 7

Apache Maven での SDK の使用 ................................................................................................. 7新しい Maven パッケージを作成する .................................................................................... 8Maven 依存関係として SDK を設定する ................................................................................ 9AWS の依存関係を含む JAR ファイルを作成する .................................................................. 10プロジェクトをビルドする ................................................................................................. 11

Gradle とともに SDK を使用する .............................................................................................. 11SDK の使用 ..................................................................................................................................... 13

サービスクライアントの作成 ..................................................................................................... 13クライアントビルダーの取得 .............................................................................................. 13DefaultClient の使用 .......................................................................................................... 14クライアントのライフサイクル ........................................................................................... 14

AWS 認証情報の提供と取得 ...................................................................................................... 14デフォルトの認証情報プロバイダーチェーンを使用する ......................................................... 14特定の認証情報プロバイダーまたはプロバイダーチェーンを使用する ....................................... 16認証情報を明示的に指定する .............................................................................................. 17

AWS リージョンの選択 ............................................................................................................ 17リージョンの選択 .............................................................................................................. 18特定のエンドポイントの選択 .............................................................................................. 18環境に基づく AWS リージョンの自動的な決定 ...................................................................... 18AWS リージョンでのサービス可用性の確認 .......................................................................... 19

クライアント設定 ...................................................................................................................... 19HTTP トランスポートの設定 ............................................................................................. 20SDK 起動時間のパフォーマンスの向上設定 ......................................................................... 21

非同期プログラミング .............................................................................................................. 21非ストリーミングオペレーション ........................................................................................ 22ストリーミングオペレーション ........................................................................................... 24高度なオペレーション ....................................................................................................... 25

HTTP/2 のプログラミング ......................................................................................................... 26例外処理 ................................................................................................................................. 27

非チェック例外を使用する理由 ........................................................................................... 27SdkServiceException (およびサブクラス) ............................................................................. 27SdkClientException ............................................................................................................ 27

AWS SDK for Java 呼び出しのログ記録 ...................................................................................... 28Log4J JAR を追加する ...................................................................................................... 28Log4j 設定ファイル ........................................................................................................... 28

iii

AWS SDK for Java バージョン 2 開発者ガイド

クラスパスの設定 .............................................................................................................. 28サービス固有のエラーと警告 .............................................................................................. 29リクエストおよびレスポンスの概要のログ記録 ...................................................................... 29詳細なワイヤログ記録 ....................................................................................................... 30

Amazon EC2 の IAM ロールを設定する (詳細設定) ....................................................................... 30デフォルトプロバイダーチェーンと Amazon EC2 インスタンスプロファイル ............................ 31ウォークスルー: Amazon EC2 インスタンスでの IAM ロールの使用 ......................................... 31

コードの例 ....................................................................................................................................... 33Amazon CloudWatch の例 .......................................................................................................... 33

CloudWatch からメトリクスを取得する .............................................................................. 34カスタムメトリクスデータを発行する ................................................................................. 35CloudWatch アラームを使用する ........................................................................................ 36CloudWatch でアラームアクションを使用する ..................................................................... 38CloudWatch にイベントを送信する .................................................................................... 39

Amazon DynamoDB の例 ........................................................................................................... 42DynamoDB のテーブルの操作 ............................................................................................ 42DynamoDB の項目の操作 .................................................................................................. 48

Amazon EC2 の例 .................................................................................................................... 53Amazon EC2 インスタンスの管理 ...................................................................................... 53Amazon EC2 の Elastic IP アドレスの使用 .......................................................................... 57リージョンとアベイラビリティーゾーンの使用 ..................................................................... 59Amazon EC2 のキーペアでの作業 ...................................................................................... 61Amazon EC2 でのセキュリティグループの使用 .................................................................... 63

AWS Identity and Access Management (IAM) の例 ........................................................................ 66IAM アクセスキーの管理 ................................................................................................... 66IAM ユーザーの管理 ......................................................................................................... 70IAM アカウントエイリアスの使用 ....................................................................................... 72IAM ポリシーの使用 ......................................................................................................... 74IAM サーバー証明書の使用 ................................................................................................ 78

Amazon Kinesis の例 ................................................................................................................ 81Amazon Kinesis データストリームへのサブスクライブ .......................................................... 81

Amazon Lambda の例 ............................................................................................................... 86サービスオペレーション .................................................................................................... 86

Amazon S3 の例 ....................................................................................................................... 89バケットオペレーション .................................................................................................... 89オブジェクトオペレーション .............................................................................................. 93

Amazon S3 の署名付きの例 ....................................................................................................... 99署名付き URL の生成とオブジェクトのアップロード ............................................................. 99署名付きオブジェクトの取得 ............................................................................................. 100

Amazon SQS の例 .................................................................................................................. 102キューオペレーション ...................................................................................................... 102メッセージオペレーション ................................................................................................ 105

Amazon Transcribe の例 .......................................................................................................... 107Amazon Transcribe の使用 .............................................................................................. 107

ページ分割の例 ....................................................................................................................... 111同期ページ分割 ............................................................................................................... 111非同期ページ分割 ............................................................................................................ 113

セキュリティ .................................................................................................................................. 118データ保護 ............................................................................................................................. 118Identity and Access Management .............................................................................................. 119コンプライアンス検証 .............................................................................................................. 119弾力 ...................................................................................................................................... 120インフラストラクチャセキュリティ ........................................................................................... 120

ドキュメント履歴 ............................................................................................................................ 121

iv

AWS SDK for Java バージョン 2 開発者ガイドバージョン 2.x の新機能

AWS SDK for Java 2.0 開発者ガイドAWS SDK for Java には、Amazon Web Services 用の Java API が用意されています。この SDK を使用すると、Amazon S3、Amazon EC2、DynamoDB などで動作する Java アプリケーションを簡単に構築できます。AWS SDK for Java には、新しいサービスのサポートが定期的に追加されています。特定のバージョンにおける変更点や機能の一覧は、「変更ログ」を表示してください。

バージョン 2.x の新機能AWS SDK for Java 2.0 は、1.x コードベースより大幅に変更されています。本バージョンは Java 8 以降に構築されており、要望の声が高い機能が複数追加されています。このバージョンでは、ノンブロッキングI/O がサポートされており、実行時にさまざまな HTTP 実装をプラグインすることができます。詳細については、「AWS ブログ」を参照してください。1.11.x から 2.x へのアプリケーションの移行のガイダンスについては、「移行ガイド」を参照してください。

2.x の対象外であるその他の機能の詳細については、GitHub の問題を参照してください。コメントやフィードバックをお送りください。

• 高度なライブラリ• S3 Transfer manager• S3 暗号化クライアント• DynamoDB Object Mapper• DynamoDB ドキュメント API• DynamoDB 暗号化クライアント• SQS のクライアント側のバッファリング

• ウェーター• SDK のメトリクス• 進行状況のリスナー

1.x のサポート1.x バージョンの AWS SDK for Java は、現在もサポートされています。他のメジャーバージョンの AWSSDK の展開方法と同様に、最終本番のリリースに向けて、今後も 1.x のサポートの詳細を共有していきます。

追加のリソースこのガイドに加えて、以下の AWS SDK for Java 開発者のための貴重なオンラインリソースもあります。

• AWS SDK for Java 2.x リファレンス• Java 開発者ブログ• Java 開発者フォーラム• GitHub:

• ドキュメントソース• SDK ソース

1

AWS SDK for Java バージョン 2 開発者ガイドこの SDK への貢献

• AWS Code Sample Catalog• @awsforjava (Twitter)

この SDK への貢献また、開発者は、次のチャネルを使用してフィードバックを送信することができます。

• GitHub で問題を送信:• ドキュメントに関する問題を送信• SDK に関する問題を送信

• AWS SDK for Java 2.x の Gitter チャネルで SDK に関する非公式チャットに参加• [email protected] までフィードバック (匿名) をお寄せください。この E メール

は、AWS SDK for Java チームによって確認されます。• ドキュメントまたは SDK のソース GitHub リポジトリにプルリクエストを送信して、SDK 開発にご協力

ください。

Eclipse IDE サポート現在、AWS Toolkit for Eclipse では AWS SDK for Java 2.0 をサポートしていません。AWS SDK for Java2.0 で AWS Toolkit for Eclipse を使用するには、Eclipse で Maven ツールを使用して、2.x SDK の依存関係を追加する必要があります。

Android 向け AWS アプリケーションの開発Amazon Web Services では、Android 開発者向けに、Android 開発専用の SDK である AWS Mobile SDKfor Android を提供しています。詳細なドキュメントについては、「AWS Mobile SDK for Android 開発者ガイド」を参照してください。

2

AWS SDK for Java バージョン 2 開発者ガイドAWS にサインアップし、IAM ユーザーを作成する

AWS SDK for Java 2.0 の開始方法このセクションでは、AWS SDK for Java のインストール方法、セットアップ方法、および使用方法に関する情報を示します。

トピック• AWS にサインアップし、IAM ユーザーを作成する (p. 3)• AWS SDK for Java 2.0 のダウンロード (p. 4)• 開発用の AWS 認証情報とリージョンのセットアップ (p. 5)• Apache Maven での SDK の使用 (p. 7)• Gradle とともに SDK を使用する (p. 11)

AWS にサインアップし、IAM ユーザーを作成するAWS SDK for Java を使用して Amazon Web Services (AWS) にアクセスするには、AWS アカウントとAWS 認証情報が必要です。AWS アカウントのセキュリティを高めるため、アクセス認証情報を指定する場合は、AWS アカウント認証情報ではなく、IAM ユーザーを使用することをお勧めします。

Note

IAM ユーザーの概要と、IAM ユーザーがアカウントのセキュリティを高める上で重要である理由については、『Amazon Web Services General Reference』の「AWS セキュリティ認証情報」を参照してください。

AWS にサインアップするには

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

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

次に、IAM ユーザーを作成し、そのシークレットアクセスキーをダウンロード (またはコピー) します。

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

1. IAM コンソールに移動します (最初に AWS へのサインインが必要になる場合があります)。2. サイドバーの [Users (ユーザー)] をクリックして IAM ユーザーを表示します。3. IAM ユーザーを設定していない場合は、[新規ユーザーの作成] をクリックして作成します。4. AWS にアクセスするために使用するリストで、IAM ユーザーを選択します。5. [Security Credentials (セキュリティ認証情報)] タブを開き、[Create Access Key (アクセスキーの作

成)] をクリックします。

Note

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

6. 表示されるダイアログボックスで、[認証情報のダウンロード] ボタンをクリックして認証情報ファイルをコンピュータにダウンロードするか、[ユーザーのセキュリティ認証情報を表示] をクリックして

3

AWS SDK for Java バージョン 2 開発者ガイドSDK をダウンロードする

IAM ユーザーのアクセスキー ID とシークレットアクセスキーを表示します (コピーアンドペーストできます)。

Important

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

次に、AWS 共有の認証情報ファイルまたはその環境で、認証情報を設定 (p. 5)します。

AWS SDK for Java 2.0 のダウンロードこのトピックでは、AWS SDK for Java をプロジェクトにダウンロードする方法について説明します。

前提条件AWS SDK for Java を使用するには、以下が必要です。

• 適切な Java 開発環境 (p. 5)。• AWS アカウントおよびアクセスキー。手順については、「AWS にサインアップし、IAM ユーザーを作

成する (p. 3)」を参照してください。• AWS 認証情報 (アクセスキー) を環境に設定済みであること。または、AWS CLI などの SDK で使用さ

れている共有認証情報ファイルを使用すること。詳細については、「開発用の AWS 認証情報とリージョンのセットアップ (p. 5)」を参照してください。

プロジェクトへの SDK のダウンロードビルドシステムまたは IDE に応じて、次のいずれかの方法を使用し、Apache Maven または Gradle を使用して SDK をプロジェクトにダウンロードします。

• Apache Maven – Apache Maven を使用する場合は、必要な SDK コンポーネントのみ、または SDK 全体 (推奨されていません) をプロジェクトの依存関係として指定できます。「Apache Maven での SDKの使用 (p. 7)」を参照してください。

• Gradle – Gradle を使用する場合、Gradle プロジェクトに Maven 部品表 (BOM) をインポートして SDKの依存関係を自動的に管理することができます。「Gradle で SDK を使用する (p. 11)」を参照してください。

Note

アーティファクトソースとして MavenCentral をサポートするビルドシステムはいずれも使用できます。ただし、開発者プレビュー用にダウンロード可能な zip は提供されません。

上記の方法のいずれかを使用する場合 (Maven を使用するなど)、AWS JAR ファイルをダウンロードしてインストールする必要はありません (次のセクションをスキップできます)。Apache Ant またはその他の方法で、別の IDE を使用してプロジェクトをビルドする予定の場合は、次のセクションで示している手順に従って SDK をダウンロードして展開します。

SDK をコンパイルするAWS SDK for Java をビルドするには、Maven を使用します。Maven は、1 つのステップで必要な依存関係をすべてダウンロードし、SDK を構築およびインストールします。インストールの手順と詳細については、「http://maven.apache.org/」を参照してください。

4

AWS SDK for Java バージョン 2 開発者ガイドJava 開発環境のインストール

SDK をコンパイルするには

1. 「AWS SDK for Java 2.x (GitHub)」を開きます。

Note

また、バージョン 1.0 の SDK も「AWS SDK for Java 1.x (GitHub)」より入手できます。2. [Clone or download (クローンまたはダウンロード)] ボタンをクリックして、ダウンロードオプション

を選択します。3. ターミナルウィンドウで、SDK ソースをダウンロードしたディレクトリに移動します。4. 次のコマンド (Maven が必要) を使用して SDK をビルドおよびインストールします。

mvn clean install

.jar ファイルが target ディレクトリで構築されます。5. (オプション) 次のコマンドを使用して API リファレンスのドキュメントを構築します。

mvn javadoc:javadoc

ドキュメントは、各サービスの target/site/apidocs/ ディレクトリに構築されます。

Java 開発環境のインストールAWS SDK for Java には Java 8.0 以降が必要です。最新の Java SE Development Kit ソフトウェアはhttp://www.oracle.com/technetwork/java/javase/downloads/ からダウンロードできます。

AWS SDK for Java は OpenJDK と Amazon Corretto (Open Java Development Kit (OpenJDK) のディストリビューション) でも機能します。最新の OpenJDK バージョンは https://openjdk.java.net/install/index.html からダウンロードしてください。最新の Amazon Corretto 8 または Amazon Corretto 11 バージョンは https://aws.amazon.com/corretto/ からダウンロードしてください。

JVM の選択AWS SDK for Java が搭載されたサーバーベースのアプリケーションで最高のパフォーマンスを得るには、64 ビットバージョンの Java Virtual Machine (JVM) を使うことをお勧めします。この JVM は、実行時にお客様が -Client オプションを指定しても、サーバーモードでのみ稼働します。

開発用の AWS 認証情報とリージョンのセットアップ

AWS SDK for Java でサポートされている任意のサービスに接続するには、AWS 認証情報を指定する必要があります。AWS SDK と CLI では、システムまたはユーザーの環境変数やローカルの AWS 設定ファイルなど、さまざまな場所にある AWS 認証情報を検索するためにプロバイダーチェーンが使用されています。

このトピックでは、AWS SDK for Java を使用して、ローカルアプリケーション開発用に AWS 認証情報をセットアップするための基本情報について説明します。Amazon EC2 インスタンス内で使用するための認証情報をセットアップする必要がある場合、または開発に Eclipse IDE を使用している場合は、以下のトピックを参照してください。

5

AWS SDK for Java バージョン 2 開発者ガイドAWS 認証情報の設定

• EC2 インスタンスを使用している場合は、「Amazon EC2 の IAM ロールを設定する (詳細設定) (p. 30)」の説明に従って、IAM ロールを作成し、そのロールへのアクセス許可を EC2 インスタンスに付与します。

• AWS Toolkit for Eclipse を使用して、Eclipse 内で AWS 認証情報をセットアップします。『AWS Toolkitfor Eclipse ユーザーガイド』の「AWS 認証情報の設定」を参照してください。

AWS 認証情報の設定AWS SDK for Java で使用する認証情報はさまざまな方法で設定できます。推奨されている方法は以下のとおりです。

• 次の場所にあるローカルシステム上の AWS 認証プロファイルファイルで認証情報を設定する• Linux, macOS, or Unix での ~/.aws/credentials• Windows の場合は C:\Users\USERNAME\.aws\credentials

このファイルには次の形式の行が含まれています。

[default]aws_access_key_id = your_access_key_idaws_secret_access_key = your_secret_access_key

your_access_key_id および your_secret_access_key の値は、独自の AWS 認証情報の値に置き換えてください。

• AWS_ACCESS_KEY_ID および AWS_SECRET_ACCESS_KEY 環境変数を設定する

Linux, macOS, or Unix でこれらの変数を設定するには、export を使用します。

export AWS_ACCESS_KEY_ID=your_access_key_idexport AWS_SECRET_ACCESS_KEY=your_secret_access_key

Windows でこれらの変数を設定するには、set を使用します。

set AWS_ACCESS_KEY_ID=your_access_key_idset AWS_SECRET_ACCESS_KEY=your_secret_access_key

• EC2 インスタンスの場合、IAM ロールを指定し、そのロールへのアクセスを EC2 インスタンスに提供します。この仕組みの詳細については、「Amazon EC2 User Guide for Linux Instances」の「AmazonEC2 の IAM ロール」を参照してください。

これらのいずれかの方法を使用して AWS 認証情報を設定すると、AWS SDK for Java によって、デフォルトの認証情報プロバイダーチェーンを使用して自動的にロードされます。Java アプリケーションでのAWS 認証情報の使用の詳細については、「AWS 認証情報の提供と取得 (p. 14)」を参照してください。

IMDS 認証情報の更新AWS SDK for Java は、認証情報の有効期限に関係なく、バックグラウンドで 1 分ごとに IMDS 認証情報を更新するオプトインをサポートしています。これにより、認証情報をより頻繁に更新できるようになり、IMDS に到達できないことで認識される AWS の可用性に影響が出る可能性が低くなります。

1. // Refresh credentials using a background thread, automatically every minute. This will log an error if IMDS is down during 2. // a refresh, but your service calls will continue using the cached credentials until the credentials are refreshed

6

AWS SDK for Java バージョン 2 開発者ガイドAWS リージョンの設定

3. // again one minute later. 4. 5. InstanceProfileCredentialsProvider credentials = 6. InstanceProfileCredentialsProvider.builder() 7. .asyncCredentialUpdateEnabled(true) 8. .build(); 9. 10. S3Client client = S3Client.builder() 11. .credentialsProvider(credentials) 12. .build(); 13. 14. // This is new: When you are done with the credentials provider, you must close it to release the background thread. 15. credentials.close();

AWS リージョンの設定AWS SDK for Java で AWS のサービスにアクセスするには、使用するデフォルトの AWS リージョンを設定する必要があります。最適なパフォーマンスを得るために、地理的に近いリージョンを選択します。

Note

リージョンを選択しない場合、リージョンが必要なサービスの呼び出しは失敗します。

認証情報の設定と同様の方法でデフォルトの AWS リージョンを設定できます。

• ローカルシステムの次の場所にある AWS Config ファイルで AWS リージョンを設定します。• Linux, macOS, or Unix での ~/.aws/config• Windows の場合は C:\Users\USERNAME\.aws\config

このファイルには次の形式の行が含まれています。

[default]region = your_aws_region

your_aws_region を目的の AWS リージョン ("us-west-2" など) に置き換えます。• AWS_REGION 環境変数を設定します。

Linux, macOS, or Unix では、export を使用します。

export AWS_REGION=your_aws_region

Windows では、set を使用します。

set AWS_REGION=your_aws_region

your_aws_region は目的の AWS リージョン名です。

リージョンの選択の詳細については、「AWS リージョンの選択 (p. 17)」を参照してください。

Apache Maven での SDK の使用Apache Maven を使用して、AWS SDK for Java プロジェクトの設定およびビルド、SDK 自体のビルドを行うことができます。

7

AWS SDK for Java バージョン 2 開発者ガイド新しい Maven パッケージを作成する

Note

このトピックのガイダンスを使用するには、Maven をインストールしている必要があります。まだインストールしていない場合は、http://maven.apache.org/ にアクセスし、ダウンロードしてインストールしてください。

新しい Maven パッケージを作成するMaven の基本パッケージを作成するには、ターミナル (コマンドライン) ウィンドウを開き、次のコマンドを実行します。

mvn -B archetype:generate \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DgroupId=org.example.basicapp \ -DartifactId=myapp

org.example.basicapp をアプリケーションの完全パッケージ名前空間に置き換えます。myapp をプロジェクト名 (この名前がプロジェクトのディレクトリ名になる) に置き換えます。

では、デフォルトで quickstart アーキタイプを使用してプロジェクトテンプレートが作成されます。Java1.5 プロジェクトが作成されます。AWS Java SDK バージョン 2 との互換性が確保できるように、アプリケーションを Java 1.8 にアップデートする必要があります。Java 1.8 にアップデートするには、pom.xmlファイルに以下を追加します。

<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins></build>

-DarchetypeArtifactId コマンドに archetype:generate 引数を追加すると、特定のアーキタイプを選択して使用できます。pom.xml ファイルをアップデートするステップをスキップするには、最初からJava 1.8 プロジェクトを作成する以下のアーキタイプを使用します。

mvn archetype:generate -B \ -DarchetypeGroupId=pl.org.miki \ -DarchetypeArtifactId=java8-quickstart-archetype \ -DarchetypeVersion=1.0.0 \ -DgroupId=com.example \ -DartifactId=sdk-sandbox \ -Dversion=1.0 \ -Dpackage=com.example

使用できるアーキタイプは他にもあります。 に同梱されているアーキタイプのリストについては、「Maven アーキタイプ」を参照してください。

Note

プロジェクトの作成と設定の詳細については、「Maven 入門ガイド」を参照してください。

8

AWS SDK for Java バージョン 2 開発者ガイドMaven 依存関係として SDK を設定する

Maven 依存関係として SDK を設定するプロジェクトで AWS SDK for Java を使用するには、プロジェクトの pom.xml ファイルで SDK を依存関係として宣言する必要があります。個々のコンポーネント (p. 9)または SDK 全体 (p. 9)をインポートできます。SDK 全体ではなく必要なコンポーネントのみインポートすることを強くお勧めします。

個別に SDK モジュールを指定する (推奨)個別に SDK モジュールを選択するには、AWS SDK for Java の Maven 用の部品表 (BOM) を使用します。これにより、指定したモジュールで同じバージョンの SDK が使用され、互いに互換性があることが保証されます。

BOM を使用するには、<dependencyManagement> セクションをアプリケーションの pom.xml ファイルに追加します。依存関係として bom 追加し、使用する SDK のバージョンを指定します。AWS SDK forJava 2.x リファレンスで最新バージョンを見つけます。

<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.X.X</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies></dependencyManagement>

Maven Central で使用可能な最新バージョンの AWS SDK for Java BOM を表示するには、https://mvnrepository.com/artifact/software.amazon.awssdk/bom を参照してください。また、このページには、BOM により管理され、プロジェクトの <dependencies> ファイルの pom.xml セクション内に含めることができるモジュール (依存関係) も表示されます。

アプリケーションで使用する個々のモジュールを SDK から選択できるようになりました。BOM で SDKバージョンを既に宣言しているため、各コンポーネントのバージョン番号を指定する必要はありません。

<dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>kinesis</artifactId> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>dynamodb</artifactId> </dependency></dependencies>

AWS コードカタログを参照して、特定の AWS のサービスで使用する依存関係を確認することもできます。特定のサービス例の下の POM ファイルを参照してください。たとえば、AWS S3 サービスの依存関係に関心がある場合は、GitHub の完全な例を参照してください(/java2/example_code/s3 の下の POM を参照してください)。

すべての SDK モジュールをインポートする (推奨されません)SDK 全体を依存関係にする場合は、BOM メソッドを使用しないでください。pom.xml で次のように宣言するだけです。AWS SDK for Java 2.x リファレンスで最新バージョンを見つけます。

<dependencies>

9

AWS SDK for Java バージョン 2 開発者ガイドAWS の依存関係を含む JAR ファイルを作成する

<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>aws-sdk-java</artifactId> <version>2.X.X</version> </dependency></dependencies>

AWS の依存関係を含む JAR ファイルを作成するMaven を使用して、個々の SDK モジュールを含む単一の JAR ファイルを作成できます。JAR ファイルを作成するには、POM ファイルを正しく設定する必要があります。まず、含める AWS モジュールごとに、依存関係要素を使用してそのモジュールを参照する必要があります (次の例を参照)。次に、POM ファイル内にも org.apache.maven.plugins プラグインを含める必要があります。POM ファイルを設定したら、次のコマンドを使用できます。

mvn package

次の POM ファイルは、AWS の依存関係を含む単一の JAR ファイルを作成します。作成の完了後、ターゲット フォルダに JAR ファイルがあります。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>localdomain.localhost.tutorial</groupId><artifactId>java-archive</artifactId><version>1.0-SNAPSHOT</version><name>AWS JAR</name><properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version></properties><build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <id>create-my-bundle</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </execution> </executions> </plugin> </plugins></build>

10

AWS SDK for Java バージョン 2 開発者ガイドプロジェクトをビルドする

<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.5.10</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies></dependencyManagement><dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>ec2</artifactId> <version>2.5.10</version> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>pinpoint</artifactId> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>dynamodb</artifactId> <version>2.5.10</version> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>sqs</artifactId> </dependency> </dependencies></project>

プロジェクトをビルドするプロジェクトをセットアップしたら、Maven の package コマンドを使用してそのプロジェクトをビルドすることができます。

mvn package

このコマンドでは、.jar ディレクトリに target ファイルが作成されます。

Gradle とともに SDK を使用するGradle プロジェクトで AWS SDK for Java を使用するには、SDK の Maven 部品表 (BOM) をビルドファイルにインポートし、プロジェクトの SDK 依存関係を管理します。

Gradle 5.0 以上用 SDK を設定するには

1. ファイルの dependencyManagement セクションに BOM を追加します。

11

AWS SDK for Java バージョン 2 開発者ガイドGradle とともに SDK を使用する

dependencies { implementation platform('software.amazon.awssdk:bom:2.5.29')

// Declare SDK dependencies without version ...}

2. dependencies セクションで使用する SDK モジュールを指定します。

dependencies { implementation 'software.amazon.awssdk:kinesis' testCompile group: 'junit', name: 'junit', version: '4.11'}

Gradle は BOM の情報を使用して、正しいバージョンの SDK 依存関係を自動的に解決します。

完成した build.gradle ファイルは次のようになります。

group 'aws.test' version '1.0'

apply plugin: 'java'

sourceCompatibility = 1.8

repositories { mavenCentral() }

dependencies { implementation platform('software.amazon.awssdk:bom:2.5.29') implementation 'software.amazon.awssdk:kinesis' testImplementation group: 'junit', name: 'junit', version: '4.11'

}

Note

BOM を使用した SDK の依存関係の指定の詳細については、「Apache Maven とともに SDK を使用する (p. 7)」を参照してください。

12

AWS SDK for Java バージョン 2 開発者ガイドサービスクライアントの作成

AWS SDK for Java 2.0 の使用このセクションでは、SDK で使用する可能性のあるすべてのサービスに適用される AWS SDK for Java でのプログラミングに関する重要な一般情報を提供します。

トピック• サービスクライアントの作成 (p. 13)• AWS 認証情報の提供と取得 (p. 14)• AWS リージョンの選択 (p. 17)• クライアント設定 (p. 19)• 非同期プログラミング (p. 21)• HTTP/2 のプログラミング (p. 26)• 例外処理 (p. 27)• AWS SDK for Java 呼び出しのログ記録 (p. 28)• Amazon EC2 の IAM ロールを設定する (詳細設定) (p. 30)

サービスクライアントの作成Amazon Web Services にリクエストを行うには、最初にサービスクライアントのオブジェクトを作成します。バージョン 2.x の SDK では、サービスクライアントビルダーを使用する場合にのみクライアントを作成できます。

それぞれの AWS のサービスには、API サービス内の各アクション用のメソッドを備えたサービスインターフェイスがあります。たとえば、Amazon DynamoDB のサービスインターフェイスは、DynamoDbClient という名前です。各サービスインターフェイスには、静的ファクトリビルダーメソッドが用意されており、サービスインターフェイスの実装を構築する際に使用できます。

クライアントビルダーの取得クライアントのインスタンスを取得するには、静的ファクトリメソッド (builder) を使用します。次に、以下の例に示すようにビルダーのセッターを使用して、カスタマイズします。

AWS SDK for Java 2.0 2.0 では、セッターの名前に with プレフィックスは付いていません。

DynamoDbClient client = DynamoDbClient.builder() .region(Region.US_WEST_2) .credentialsProvider(ProfileCredentialsProvider.builder() .profileName("myProfile") .build()) .build();

Note

fluent setter メソッドでは builder オブジェクトが返るため、利便性とコードの可読性を高めるためにメソッドの呼び出しをチェーンすることができます。必要なプロパティを設定後、buildメソッドを呼び出してクライアントを作成することができます。作成後のクライアントはイミュータブルです。異なる設定でクライアントを作成する唯一の方法は、新しいクライアントを構築することです。

13

AWS SDK for Java バージョン 2 開発者ガイドDefaultClient の使用

DefaultClient の使用このクライアントビルダーには、create という名前の別のファクトリメソッドがあります。このメソッドでは、サービスクライアントがデフォルト設定で作成されます。デフォルトのプロバイダーチェーンを使用して認証情報と AWS リージョンをロードします。アプリケーションを実行している環境から認証情報またはリージョンが決定できない場合、create の呼び出しは失敗します。認証情報とリージョンの決定に関する詳細については、「AWS 認証情報の提供と取得 (p. 14)」および「AWS リージョンの選択 (p. 17)」を参照してください。

デフォルトクライアントを作成するにはDynamoDbClient client = DynamoDbClient.create();

クライアントのライフサイクルSDK のサービスクライアントはスレッドセーフです。最高のパフォーマンスを得るには、長期間使用するオブジェクトとしてこれらを処理します。各クライアントには、クライアントがガーベージコレクションの対象になった場合にリリースされる独自の接続プールリソースを備えています。AWS SDK for Java2.0 のクライアントの AutoClosable インターフェイスが拡張されました。ベストプラクティスについては、close メソッドを呼び出してクライアントを明示的に閉じます。

クライアントを閉じるにはDynamoDbClient client = DynamoDbClient.create();client.close();

AWS 認証情報の提供と取得Amazon Web Services (AWS) にリクエストを送信するには、AWS SDK for Java に AWS 認証情報を提供する必要があります。これを行うには、次の方法を使用します。

• デフォルトの認証情報プロバイダーチェーンを使用する (推奨)。• 特定の認証情報プロバイダーまたはプロバイダーチェーンを使用します。• 認証情報を明示的に指定する。

これらの方法のそれぞれについて、以下のセクションで説明します。

デフォルトの認証情報プロバイダーチェーンを使用する引数を指定せずに新しいサービスクライアントを初期化すると、AWS SDK for Java は AWS 認証情報の検索を試みます。これには、DefaultCredentialsProvider クラスによって実装されたデフォルトの認証情報プロバイダーチェーンが使用されます。

次の例では、デフォルトの認証情報プロバイダーチェーンを使用する新しいサービスクライアントを作成します。

S3Client s3 = S3Client.builder() .region(Region.US_WEST_2)

14

AWS SDK for Java バージョン 2 開発者ガイドデフォルトの認証情報プロバイダーチェーンを使用する

.build();

認証情報の取得順序デフォルトの認証情報プロバイダーチェーンが認証情報の取得を試みる場合、次の順序で使用されます。

1. Java のシステムプロパティ – aws.accessKeyId および aws.secretAccessKeyAWS SDK for Javaは SystemPropertyCredentialsProvider を使用してこれらの認証情報を読み込みます。

2. 環境変数 – AWS_ACCESS_KEY_ID および AWS_SECRET_ACCESS_KEYAWS SDK for Java はEnvironmentVariableCredentialsProvider クラスを使用してこれらの認証情報を読み込みます。

3. デフォルトの認証情報プロファイルファイル – このファイルの特定の場所はプラットフォームごとに異なりますが、通常は ~/.aws/credentials にあります。このファイルは、多数の AWS SDK、およびAWS CLI によって共有されます。AWS SDK for Java は ProfileCredentialsProvider を使用してこれらの認証情報を読み込みます。

AWS CLI によって提供される aws configure コマンドを使用して、認証情報ファイルを作成できます。または、テキストエディタでファイルを編集して作成できます。認証情報ファイル形式に関する情報については、「AWS 認証情報のファイル形式 (p. 16)」を参照してください。

4. Amazon ECS コンテナの認証情報 – 環境変数 AWS_CONTAINER_CREDENTIALS_RELATIVE_URIが設定されている場合に、Amazon ECS から読み込まれます。AWS SDK for Java はContainerCredentialsProvider を使用してこれらの認証情報を読み込みます。

5. インスタンスプロファイル認証情報 – Amazon EC2 インスタンスで使用され、Amazon EC2 メタデータサービスによって提供されます。AWS SDK for Java は InstanceProfileCredentialsProvider を使用してこれらの認証情報を読み込みます。

認証情報の設定AWS 認証情報を使用するには、上記の場所の少なくとも 1 つに認証情報を指定します。認証情報の設定の詳細については、以下のトピックを参照してください。

• 環境またはデフォルトの認証情報プロファイルファイルで認証情報を指定するには、「開発用の AWS認証情報とリージョンのセットアップ (p. 5)」を参照してください。

• Java システムプロパティの設定については、公式の Java Tutorials ウェブサイトにある「SystemProperties」チュートリアルを参照してください。

• EC2 インスタンスでインスタンスプロファイル認証情報をセットアップして使用する方法については、「Amazon EC2 の IAM ロールを設定する (詳細設定) (p. 30)」を参照してください。

別の認証情報プロファイルの設定AWS SDK for Java ではデフォルトプロファイルが使用されますが、認証情報ファイルでどのプロファイルが提供されるかをカスタマイズする方法があります。

AWS_PROFILE 環境変数を使用して、SDK によってロードされるプロファイルを変更できます。

たとえば、Linux, macOS, or Unix の場合は、次のコマンドを実行してプロファイルを myProfile に変更します。

export AWS_PROFILE="myProfile"

Windows で、次のコマンドを実行します。

set AWS_PROFILE="myProfile"

15

AWS SDK for Java バージョン 2 開発者ガイド特定の認証情報プロバイダーまた

はプロバイダーチェーンを使用する

AWS_PROFILE 環境変数を設定した場合、正式にサポートされているすべての AWS SDK およびツール(例: AWS CLI、AWS Tools for PowerShell) における認証情報のロードに影響を及ぼします。Java アプリケーションのプロファイルのみを変更する場合は、代わりにシステムプロパティ aws.profile を使用します。

別の認証情報ファイルの場所の設定AWS SDK for Java はデフォルトの認証情報ファイルの場所から AWS 認証情報を自動的に読み込みます。ただし、認証情報ファイルへのフルパスを使用して AWS_CREDENTIAL_PROFILES_FILE 環境変数を設定することで、場所を指定することもできます。

この機能を使用して、AWS SDK for Java が認証情報ファイルを検索する場所を一時的に変更できます。たとえば、コマンドラインでこの変数を設定します。また、ユーザーまたはシステム環境で環境変数を設定して、そのユーザー固有で、またはシステム全体で変更することもできます。

認証情報ファイルのデフォルトの場所を上書きするには

• AWS 認証情報ファイルの場所に AWS_CREDENTIAL_PROFILES_FILE 環境変数を設定します。• Linux, macOS, or Unix では、export を使用します。

export AWS_CREDENTIAL_PROFILES_FILE=path/to/credentials_file

• Windows では、set を使用します。

set AWS_CREDENTIAL_PROFILES_FILE=path/to/credentials_file

AWS 認証情報ファイルの形式aws configure コマンドを使用して AWS 認証情報ファイルを作成すると、このコマンドは次の形式のファイルを作成します。

[default]aws_access_key_id={YOUR_ACCESS_KEY_ID}aws_secret_access_key={YOUR_SECRET_ACCESS_KEY}

[profile2]aws_access_key_id={YOUR_ACCESS_KEY_ID}aws_secret_access_key={YOUR_SECRET_ACCESS_KEY}

プロファイル名では角括弧 (例: [default]) に続いて、キーと値のペアとして、そのプロファイルの設定可能なフィールドを指定します。認証情報ファイルには複数のプロファイルを含めることができます。追加または編集するには、aws configure --profile PROFILE_NAME を使用して、設定するプロファイルを選択します。アクセスキーやシークレットアクセスキーのほか、aws_session_token フィールドを使用してセッショントークンを指定することができます。

特定の認証情報プロバイダーまたはプロバイダーチェーンを使用するクライアントビルダーを使用して、デフォルトの認証情報プロバイダーチェーンとは異なる認証情報プロバイダーを指定できます。

AwsCredentialsProvider インターフェイスを入力として受け取るクライアントビルダーに、認証情報プロバイダーまたはプロバイダーチェーンのインスタンスを指定します。

16

AWS SDK for Java バージョン 2 開発者ガイド認証情報を明示的に指定する

次の例では、EnvironmentVariableCredentialsProvider という名前の環境認証情報を使用する新しいサービスクライアントを作成します。

S3Client s3 = S3Client.builder() .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .build();

AWS SDK for Java で提供される認証情報プロバイダーおよびプロバイダーチェーンの詳細なリストについては、AwsCredentialsProvider の「既知のすべての実装クラス」を参照してください。

Note

AwsCredentialsProvider インターフェイスを実装する独自の認証情報プロバイダーを使用して作成した認証情報プロバイダーまたはプロバイダーチェーンを指定します。

認証情報を明示的に指定するデフォルトの認証情報チェーン、または特定あるいはカスタムのプロバイダーやプロバイダーチェーンがコードに対して機能しない場合は、目的の認証情報を指定できます。AWS アカウント認証情報、IAM認証情報、または AWS Security Token Service (AWS STS) から取得した一時的な認証情報を指定できます。AWS STS を使用して一時的な認証情報を取得した場合、この方法を使用して、AWS アクセス用の認証情報を指定します。

Important

セキュリティの観点から、AWS アクセスには AWS アカウント認証情報ではなく IAM アカウント認証情報を使用することを強くお勧めします。詳細については、『Amazon Web ServicesGeneral Reference』の「AWS セキュリティ認証情報」を参照してください。

AWS クライアントに明示的に認証情報を指定するには

1. AwsCredentials インターフェイスを提供するクラス (AwsSessionCredentials など) をインスタンス化します。接続に使用する AWS アクセスキーおよびシークレットキーを指定します。

2. AwsCredentials オブジェクトを使用して StaticCredentialsProvider を作成します。3. StaticCredentialsProvider を使用してクライアントビルダーを設定し、クライアントをビルド

します。

次の例では、指定した認証情報を使用する新しいサービスクライアントを作成します。

AwsSessionCredentials awsCreds = AwsSessionCredentials.create( "your_access_key_id_here", "your_secret_key_id_here", "your_session_token_here");

S3Client s32 = S3Client.builder() .credentialsProvider(StaticCredentialsProvider.create(awsCreds)) .build();

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

17

AWS SDK for Java バージョン 2 開発者ガイドリージョンの選択

AWS SDK for Java 2.0 のバージョン 1.x 以降では、異なるリージョン関連のクラスは 1 つの Region クラスにまとめられています。このクラスは、リージョンに関するメタデータの取得や、リージョン内でサービスが使用可能かどうかのチェックなど、リージョンに関するすべてのアクションで使用できます。

リージョンの選択リージョン名を指定することができます。これにより、SDK によって、適切なエンドポイントが自動的に選択されます。

リージョンを明示的に設定するには、Region クラスで定義されている定数を使用することをお勧めします。これは、公開されている利用可能なすべてのリージョンを列挙したものです。そのクラスのリージョンが設定されたクライアントを作成するには、以下のコードを使用します。

Ec2Client ec2 = Ec2Client.builder() .region(Region.US_WEST_2) .build();

使用するリージョンが Region クラスの定数でない場合は、of メソッドを使用して新しいリージョンを作成することができます。この機能を使用することで、SDK をアップグレードせずに、新しいリージョンにアクセスすることができます。

Region newRegion = Region.of("us-east-42");Ec2Client ec2 = Ec2Client.builder() .region(newRegion) .build();

Note

ビルダーを使用してクライアントをビルドした後、そのクライアントはイミュータブルとなり、リージョンは変更不可能です。同じサービスで複数の AWS リージョンを使用している場合は、複数のクライアント (— リージョンごとに 1 つ) を作成する必要があります。

特定のエンドポイントの選択各 AWS クライアントは、endpointOverride メソッドを呼び出して、リージョン内の特定のエンドポイントを使用するように設定できます。

たとえば、欧州 (アイルランド) リージョン を使用するように Amazon EC2 クライアントを設定するには、次のコードを使用します。

Ec2Client ec2 = Ec2Client.builder() .region(Region.EU_WEST_1) .endpointOverride(URI.create("https://ec2.eu-west-1.amazonaws.com")) .build();

すべての AWS のサービスで使用されるリージョンと対応するエンドポイントの最新リストについては、「リージョンとエンドポイント」を参照してください。

環境に基づく AWS リージョンの自動的な決定Amazon EC2 または AWS Lambda で実行する場合に、コードが実行されているリージョンと同じリージョンを使用するようにクライアントを構成することができます。そうすることによって、コードとそれが実行される環境が分離され、レイテンシーの低減や冗長化のために複数のリージョンにデプロイすることが容易になります。

18

AWS SDK for Java バージョン 2 開発者ガイドAWS リージョンでのサービス可用性の確認

認証情報/リージョンのデフォルトプロバイダーチェーンを使用して環境からリージョンを決定するには、クライアントビルダーの create メソッドを使用します。

Ec2Client ec2 = Ec2Client.create();

region メソッドを使用してリージョンを明示的に設定しない場合は、SDK によってリージョンのデフォルトプロバイダーチェーンが確認され、使用するリージョンが判断されます。

デフォルトリージョンプロバイダーチェーンリージョンルックアップ手順は以下のとおりです。

1. ビルダー自体で region を使用して設定されている明示的なリージョンは、その他の設定より優先されます。

2. AWS_REGION 環境変数が確認されます。設定されている場合は、そのリージョンを使用してクライアントが設定されます。

Note

この環境変数は Lambda コンテナによって設定されます。3. SDK は AWS の共有設定ファイル (通常は ~/.aws/config にある) を確認します。リージョンプロパ

ティがあると、SDK はこのプロパティを使用します。• AWS_CONFIG_FILE 環境変数を使用すると、共有設定ファイルの場所をカスタマイズできます。• AWS_PROFILE 環境変数または aws.profile システムプロパティを使用して、SDK によってロードさ

れるプロファイルをカスタマイズできます。4. SDK は、Amazon EC2 インスタンスのメタデータサービスを使用して現在実行中の Amazon EC2 イン

スタンスのリージョンを決定しようとします。5. この時点で SDK によってリージョンがまだ見つかっていない場合は、クライアント作成が失敗し、例

外が発生します。

AWS アプリケーション開発の一般的なアプローチとしては、ローカル開発では共有設定ファイル (「デフォルトの認証情報プロバイダーチェーンを使用する (p. 14)」を参照) を使用してリージョンを設定し、AWS インフラストラクチャでの実行時には、リージョンのデフォルトプロバイダーチェーンに依存してリージョンを決定します。これによって、クライアントの作成が大幅に簡略化され、アプリケーションの性が維持されます。

AWS リージョンでのサービス可用性の確認AWS の特定のサービスがリージョンで使用できるかどうかを確認するには、確認が必要なサービスで、serviceMetadata メソッドおよび region メソッドを使用します。

DynamoDbClient.serviceMetadata().regions().forEach(System.out::println);

指定できるリージョンについて Region クラスのドキュメントを参照し、クエリするサービスのエンドポイントプレフィックスを使用します。

クライアント設定AWS SDK for Java では、デフォルトのクライアント設定を変更することができます。これは、HTTP トランスポートのクライアント設定などの設定を指定する場合に役立ちます。このセクションでは、そのような設定について説明します。

19

AWS SDK for Java バージョン 2 開発者ガイドHTTP トランスポートの設定

トピック• HTTP トランスポートの設定 (p. 20)• SDK 起動時間のパフォーマンスの向上設定 (p. 21)

HTTP トランスポートの設定HTTP トランスポートの設定を行うには、NettyNioAsyncHttpClient (非同期クライアント) またはApacheHttpClient (同期クライアント) を使用します。これらのクライアントで設定できるオプションの詳細なリストについては、「AWS SDK for Java 2.x リファレンス」を参照してください。

Note

Apache HTTPClient の詳細については、「HttpClient の概要」を参照してください。

NettyNioAsyncHttpClient を使用するには、netty-nio-client の依存関係を POM に追加します。

POM エントリ

<dependency> <artifactId>netty-nio-client</artifactId> <groupId>software.amazon.awssdk</groupId> <version>2.0.0</version> </dependency>

最大接続数開くことができる HTTP 接続の最大数は、maxConcurrency メソッドを使用して設定できます。maxPendingConnectionAcquires メソッドでは、最大同時実行数に達した時点でキューを追加することができる最大リクエストを設定することができます。

• maxConcurrency のデフォルト値は 50 です。• maxPendingConnectionAcquires のデフォルト値は 10_000 です。

Important

同時トランザクション数に最大接続数を設定します。接続の競合およびパフォーマンスの低下を回避します。

SDK でライフサイクルを管理できるように HTTP クライアントビルダーを使用します。サービスクライアントがシャットダウンされると、HTTP クライアントは閉じられます。

インポート

import software.amazon.awssdk.http.async.SdkAsyncHttpClient;import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient;import software.amazon.awssdk.services.kinesis.KinesisAsyncClient;

コード

KinesisAsyncClient client = KinesisAsyncClient.builder() .httpClientBuilder(NettyNioAsyncHttpClient.builder() .maxConcurrency(100)

20

AWS SDK for Java バージョン 2 開発者ガイドSDK 起動時間のパフォーマンスの向上設定

.maxPendingConnectionAcquires(10_000)) .build();

HTTP クライアントを直接サービスクライアントに渡すこともできます (ライフサイクルを自分で管理する場合)。

コード

SdkAsyncHttpClient httpClient = NettyNioAsyncHttpClient.builder() .maxConcurrency(100) .maxPendingConnectionAcquires(10_000) .build();

KinesisAsyncClient kinesisClient = KinesisAsyncClient.builder() .httpClient(httpClient) .build();

httpClient.close();

SDK 起動時間のパフォーマンスの向上設定AWS SDK for Java 2.0 における改善点の 1 つには、Lambda の Java 関数の SDK 起動時間があります。これは、Java Lambda 関数が起動して、最初のリクエストに応答するまでにかかる時間です。

バージョン 2.x には、この改善に貢献する 3 点の変更が含まれています。

• Jackson-jr を使用します。これは、初期化時間を短縮するシリアル化ライブラリです。• 日付時刻オブジェクトで java.time.libraries を使用します。• ログファサードで Slf4j に切り替わりました。

クライアントビルダーで特定の設定値を指定することで、追加の SDK 起動時間を導入できます。上記は、アプリケーションが初期化するために探す必要となる情報量を削減することで、それぞれ一部の時間を短縮します。

Note

この値を指定すると、コードの一部の移植性が失われます。たとえば、AWS リージョンを指定すると、コードは変更なしで他のリージョンを実行しません。

例: SDK 最小起動時間のクライアント設定

Region region = Region.US_WEST_2;3Client S3 = S3Client.builder() .region(region) .build();

非同期プログラミングAWS SDK for Java 2.0 は、いくつかのスレッドにわたって高い同時実行性を実装するノンブロッキングの非同期クライアントです。AWS SDK for Java 1.11.x には、スレッドプール周辺のラッパーである非同期クライアントと、ノンブロッキング I/O の利点を完全には提供しないブロッキング同期クライアントがあります。

21

AWS SDK for Java バージョン 2 開発者ガイド非ストリーミングオペレーション

同期メソッドは、クライアントがサービスからのレスポンスを受信するまでスレッドの実行をブロックします。非同期メソッドはすぐに応答を返し、レスポンスを待機せずに呼び出しスレッドに制御を戻します。

非同期メソッドはレスポンスが可能になる前に応答を返すため、準備ができたらレスポンスを得るための手段が必要になります。AWS SDK for Java 2.0 非同期クライアントメソッドでは、準備ができるとレスポンスにアクセスすることを許可する CompletableFuture オブジェクトが返されます。

非ストリーミングオペレーション非ストリーミングオペレーションの場合、非同期メソッド呼び出しは同期メソッドに似ています。AWSSDK for Java の非同期メソッドは、将来の非同期オペレーションの結果を含む CompletableFuture オブジェクトを返します。

結果が出力される場合に完了するアクションを指定して、CompletableFuture whenComplete() メソッドを呼び出します。CompletableFuture には Future インターフェイスが実装されているため、あわせて get() メソッドを呼び出すことで応答オブジェクトも取得できます。

テーブルのリストを取得する Amazon DynamoDB 関数を呼び出す非同期オペレーションの例を以下に示します。このオペレーションでは、ListTablesResponse オブジェクトを保持できる CompletableFutureが返されます。非同期の呼び出しが完了した場合にのみ、whenComplete() への呼び出しで定義されるアクションが行われます。

インポート

import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;import software.amazon.awssdk.services.dynamodb.model.ListTablesRequest;import software.amazon.awssdk.services.dynamodb.model.ListTablesResponse;import software.amazon.awssdk.utils.FunctionalUtils;

import java.util.List;import java.util.concurrent.CompletableFuture;

コード

public class DynamoDBAsync {

public static void main(String[] args) throws InterruptedException { // Creates a default async client with credentials and regions loaded from the environment DynamoDbAsyncClient client = DynamoDbAsyncClient.create(); CompletableFuture<ListTablesResponse> response = client.listTables(ListTablesRequest.builder() .build());

// Map the response to another CompletableFuture containing just the table names CompletableFuture<List<String>> tableNames = response.thenApply(ListTablesResponse::tableNames); // When future is complete (either successfully or in error) handle the response tableNames.whenComplete((tables, err) -> { try { if (tables != null) { tables.forEach(System.out::println); } else { // Handle error err.printStackTrace(); } } finally {

22

AWS SDK for Java バージョン 2 開発者ガイド非ストリーミングオペレーション

// Lets the application shut down. Only close the client when you are completely done with it. client.close(); } });

tableNames.join(); }}

次のコード例は、非同期クライアントを使用してテーブルから項目を取得する方法を示しています。DynamoDbAsyncClient の getItem メソッドを呼び出して、指定する項目のテーブル名とプライマリキー値を持つ GetItemRequest オブジェクトを渡します。これは通常、オペレーションに必要なデータを渡す方法です。この例では、文字列値が渡されることに注意してください。

インポート

import software.amazon.awssdk.services.dynamodb.model.GetItemRequest;import software.amazon.awssdk.services.dynamodb.model.AttributeValue;import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;import java.util.HashMap;import java.util.Map;import java.util.Set;import java.util.stream.Collectors;import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;

コード

//Get both input argumentsString tableName = args[0];String name = args[1];System.out.format("Retrieving item \"%s\" from \"%s\"\n", name, tableName );

HashMap<String, AttributeValue> keyToGet = new HashMap<String, AttributeValue>();

keyToGet.put("Name", AttributeValue.builder().s(name).build());

try {

DynamoDbAsyncClient client = DynamoDbAsyncClient.create();

//Create a GetItemRequest instance GetItemRequest request = GetItemRequest.builder() .key(keyToGet) .tableName(tableName) .build();

//Invoke the DynamoDbAsyncClient object's getItem java.util.Collection<software.amazon.awssdk.services.dynamodb.model.AttributeValue> returnedItem = client.getItem(request).join().item().values();

//Convert Set to Map Map<String, AttributeValue> map = returnedItem.stream().collect(Collectors.toMap(AttributeValue::s, s->s)); Set<String> keys = map.keySet(); for (String key : keys) { System.out.format("%s: %s\n", key, map.get(key).toString()); }

} catch (DynamoDbException e) { System.err.println(e.getMessage());

23

AWS SDK for Java バージョン 2 開発者ガイドストリーミングオペレーション

System.exit(1);}

GitHub で完全な例をご覧ください。

ストリーミングオペレーションストリーミングオペレーションでは、コンテンツを増分で渡すには AsyncRequestBody、レスポンスを受信および処理するには AsyncResponseTransformer を渡す必要があります。

次の例では、PutObject オペレーションを使用して、ファイルを Amazon S3 に非同期的にアップロードします。

インポート

import software.amazon.awssdk.core.async.AsyncRequestBody;import software.amazon.awssdk.services.s3.S3AsyncClient;import software.amazon.awssdk.services.s3.model.PutObjectRequest;import software.amazon.awssdk.services.s3.model.PutObjectResponse;import software.amazon.awssdk.utils.FunctionalUtils;

import java.nio.file.Paths;import java.util.concurrent.CompletableFuture;

コード

public class S3AsyncOps {

private static final String BUCKET = "sample-bucket"; private static final String KEY = "testfile.in";

public static void main(String[] args) { S3AsyncClient client = S3AsyncClient.create(); CompletableFuture<PutObjectResponse> future = client.putObject( PutObjectRequest.builder() .bucket(BUCKET) .key(KEY) .build(), AsyncRequestBody.fromFile(Paths.get("myfile.in")) ); future.whenComplete((resp, err) -> { try { if (resp != null) { System.out.println("my response: " + resp); } else { // Handle error err.printStackTrace(); } } finally { // Lets the application shut down. Only close the client when you are completely done with it. client.close(); } });

future.join(); }}

24

AWS SDK for Java バージョン 2 開発者ガイド高度なオペレーション

次の例では、GetObject オペレーションを使用して、Amazon S3 から非同期的にファイルを取得します。

インポート

import software.amazon.awssdk.core.async.AsyncResponseTransformer;import software.amazon.awssdk.services.s3.S3AsyncClient;import software.amazon.awssdk.services.s3.model.GetObjectRequest;import software.amazon.awssdk.services.s3.model.GetObjectResponse;import software.amazon.awssdk.utils.FunctionalUtils;

import java.nio.file.Paths;import java.util.concurrent.CompletableFuture;

コード

public class S3AsyncStreamOps {

private static final String BUCKET = "sample-bucket"; private static final String KEY = "testfile.out";

public static void main(String[] args) { S3AsyncClient client = S3AsyncClient.create(); final CompletableFuture<GetObjectResponse> futureGet = client.getObject( GetObjectRequest.builder() .bucket(BUCKET) .key(KEY) .build(), AsyncResponseTransformer.toFile(Paths.get("myfile.out"))); futureGet.whenComplete((resp, err) -> { try { if (resp != null) { System.out.println(resp); } else { // Handle error err.printStackTrace(); } } finally { // Lets the application shut down. Only close the client when you are completely done with it client.close(); } });

futureGet.join(); }}

高度なオペレーションAWS SDK for Java 2.0 は、非同期イベント駆動型ネットワークアプリケーションフレームワークである Netty を使用して I/O スレッドを処理します。AWS SDK for Java 2.0 は Netty の背後にExecutorService を作成し、HTTP クライアントリクエストから Netty クライアントに返された Futureを完了します。この抽象化により、開発者がスレッドを停止またはスリープすることを選択した場合、アプリケーションが非同期プロセスをブレークするリスクが軽減されます。デフォルトでは、非同期クライアントごとに 50 のスレッドが生成され、ExecutorService 内のキューで管理されます。

上級ユーザーは、構築時に次のオプションを使用して、非同期クライアントを作成するときにスレッドプールサイズを指定できます。

25

AWS SDK for Java バージョン 2 開発者ガイドHTTP/2 のプログラミング

コード

S3AsyncClient clientThread = S3AsyncClient.builder() .asyncConfiguration( b -> b.advancedOption(SdkAdvancedAsyncClientOption .FUTURE_COMPLETION_EXECUTOR, Executors.newFixedThreadPool(10) ) ) .build();

パフォーマンスを最適化するには、独自のスレッドプールエグゼキュターを管理し、クライアントの設定時に含めます。

ThreadPoolExecutor executor = new ThreadPoolExecutor(50, 50, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10_000), new ThreadFactoryBuilder() .threadNamePrefix("sdk-async-response").build());

// Allow idle core threads to time outexecutor.allowCoreThreadTimeOut(true);

S3AsyncClient clientThread = S3AsyncClient.builder() .asyncConfiguration( b -> b.advancedOption(SdkAdvancedAsyncClientOption .FUTURE_COMPLETION_EXECUTOR, executor ) ) .build();

スレッドプールをまったく使用しない場合は、スレッドプールエグゼキュターを使用する代わりにRunnable::run を使用します。

S3AsyncClient clientThread = S3AsyncClient.builder() .asyncConfiguration( b -> b.advancedOption(SdkAdvancedAsyncClientOption .FUTURE_COMPLETION_EXECUTOR, Runnable::run ) ) .build();

HTTP/2 のプログラミングHTTP/2 は HTTP プロトコルのメジャーバージョンです。この新しいバージョンには、パフォーマンスを向上させるために次のようないくつかの機能強化が図られています。

• より効率的なデータ転送を実現するバイナリデータのエンコーディング。• ヘッダーの圧縮により、クライアントによってダウンロードされるオーバーヘッドバイトが減り、クラ

イアントにコンテンツをより速く提供できます。これは特に、既に帯域幅の制限を受けているモバイルクライアントで役立ちます。

• 双方向非同期通信 (多重化) により、複数の接続ではなく 1 回の接続で同時にクライアントと AWS 間の複数のリクエストおよびレスポンスメッセージをフライト状態にすることができ、これによりパフォーマンスが向上します。

26

AWS SDK for Java バージョン 2 開発者ガイド例外処理

最新の SDK にアップグレードする開発者は、使用中のサービスでサポートされている場合、自動的にHTTP/2 を使用します。新しいプログラミングインターフェイスはシームレスに HTTP/2 を活用して、アプリケーションを構築するための新しい方法を提供します。

AWS SDK for Java 2.0 は、HTTP/2 プロトコルを実装するイベントストリーミング用の新しい API を備えています。これらの新しい API の使用方法の例については、「AWS SDK for Java を使用する Kinesis の例 (p. 81)」を参照してください。

例外処理AWS SDK for Java によって例外がスローされる仕組みとタイミングを理解することは、SDK を使用して高品質なアプリケーションを構築するために重要なことです。以下のセクションでは、SDK によってスローされる例外のさまざまなケース、および例外の適切な処理方法について説明します。

非チェック例外を使用する理由AWS SDK for Java では、次の理由で、チェック例外ではなく実行時例外 (非チェック例外) が使用されます。

• 懸念がない場合には例外ケースの処理を強制的に適用せずに (さらにコードを冗長にすることなく)、開発者がエラーを細かく制御できるようにするため。

• サイズの大きいアプリケーションで、チェック例外に関連する拡張性の問題が発生するのを防ぐため。

一般的に、チェック例外は小規模なアプリケーションでは役立ちますが、アプリケーションのサイズが大きくなり、複雑化すると、チェック例外が問題となる場合があります。

SdkServiceException (およびサブクラス)SdkServiceException は、AWS SDK for Java を使用する場合に最も多く発生する例外です。この例外は、AWS のサービスからのエラーレスポンスを表します。たとえば、存在しない Amazon EC2 インスタンスを終了しようとすると、EC2 からエラーレスポンスが返り、そのエラーレスポンスの詳細はすべて、スローされる SdkServiceException に含まれます。場合によっては、SdkServiceException のサブクラスがスローされ、開発者は catch ブロックを使用して、エラーケースの処理を細かく制御できるようになります。

SdkServiceException が発生した場合、リクエストは AWS サービスに適切に送信されましたが、正常に処理できませんでした。これは、リクエストのパラメータに含まれるエラーまたはサービス側の問題が原因です。

SdkServiceException では次のような情報がわかります。

• 返された HTTP ステータスコード• 返された AWS エラーコード• サービスからの詳細なエラーメッセージ• 失敗したリクエストの AWS リクエスト ID

SdkClientExceptionSdkClientException は、AWS にリクエストを送信しようとしたとき、または AWS からのレスポンスを解析しようとしたときに、Java クライアントコード内で問題が発生したことを示していま

27

AWS SDK for Java バージョン 2 開発者ガイドAWS SDK for Java 呼び出しのログ記録

す。SdkClientException は、一般的に SdkServiceException よりも深刻な例外で、クライアントが AWS のサービスに対するサービス呼び出しを実行できないという重大な問題を示しています。たとえば、いずれかのクライアントでオペレーションを呼び出そうとしたときに、ネットワーク接続が利用できない場合、AWS SDK for Java は SdkClientException をスローします。

AWS SDK for Java 呼び出しのログ記録AWS SDK for Java は、Slf4j を使用して実装されます。これは、実行時にいくつかのログ記録システムのうちのいずれかを使用できるようにする抽象化レイヤーです。

サポートされるログ記録システムには、Java ロギング フレームワークや Apache Log4j などがあります。このトピックでは Log4j の使用方法を示します。SDK のログ記録機能は、アプリケーションコードを変更せずに使用できます。

Log4j の詳細については、「Apache ウェブサイト」を参照してください。

Log4J JAR を追加するSDK で Log4j を使用するには、「Log4j ウェブサイト」より Log4j JAR をダウンロードするか、pom.xmlファイルに Log4j の依存関係を追加して Maven を使用する必要があります。SDK に JAR は含まれていません。

Log4j 設定ファイルLog4j では、設定ファイル log4j2.xml を使用します。設定ファイルの例を次に示します。この設定ファイルで使用する値の詳細については、「Log4j 設定のマニュアル」を参照してください。

この設定ファイルをクラスパス上のディレクトリに置きます。Log4j JAR ファイルと log4j2.xml ファイルは、同じディレクトリに配置しないでください。

log4j2.xml 設定ファイルは、ログ記録レベル、ログ記録出力の送信先 (例: ファイルまたはコンソール)、出力形式などのプロパティを指定します。ログ記録レベルは、ロガーによって生成される出力の詳細度です。Log4j では、複数のログ記録階層の概念をサポートしています。ログ記録レベルは、階層ごとに個別に設定されます。次の 2 つのログ記録階層が AWS SDK for Java で使用できます。

• software.amazon.awssdk• org.apache.http.wire

クラスパスの設定Log4j JAR ファイルと log4j2.xml ファイルはいずれも、クラスパス上に配置する必要があります。Mavenで Sl4j の log4j バインディングを設定するには、pom.xml に以下を追加します。

<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId></dependency><dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId></dependency><dependency> <groupId>org.apache.logging.log4j</groupId>

28

AWS SDK for Java バージョン 2 開発者ガイドサービス固有のエラーと警告

<artifactId>log4j-slf4j-impl</artifactId></dependency>

Eclipse IDE を使用している場合は、メニューを開き、[プロジェクト] | [プロパティ] | [Java Build Path(Java ビルドパス)] に移動して、クラスパスを設定します。

サービス固有のエラーと警告クライアントライブラリからの重要なメッセージを取得するために、"software.amazon.awssdk" ロガー階層は必ず "WARN" に設定しておくことをお勧めします。たとえば、アプリケーションで InputStream が正しく閉じられなかったためにリソースがリークされる可能性があると Amazon S3 クライアントによって検出されると、S3 クライアントは警告メッセージを使用してログに報告します。これにより、リクエストやレスポンスの処理でクライアントに問題が発生した場合、メッセージが必ずログに記録されます。

次の log4j2.xml ファイルでは、rootLogger が WARN に設定されています。これにより、"software.amazon.awssdk" 階層のすべてのロガーで生成される警告やエラーメッセージを取り込むことができます。また、明示的に software.amazon.awssdk ロガーを WARN に設定することもできます。

<Configuration status="WARN"> <Appenders> <Console name="ConsoleAppender" target="SYSTEM_OUT"> <PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c:%L - %m%n" /> </Console> </Appenders>

<Loggers> <Root level="WARN"> <AppenderRef ref="ConsoleAppender"/> </Root> <Logger name="software.amazon.awssdk" level="WARN" /> </Loggers></Configuration>

リクエストおよびレスポンスの概要のログ記録AWS サービスに対する各リクエストによって、一意の AWS リクエスト ID が生成されます。このリクエスト ID は、AWS サービスでのリクエストの処理方法に関する問題が発生した場合に役立ちます。サービスの呼び出しが失敗した場合でも、AWS リクエスト ID は、SDK の Exception オブジェクトを使用してプログラムで利用することができます。また、AWS リクエスト ID は、"software.amazon.awssdk.request"ロガーの DEBUG ログレベルを介して報告することもできます。

次の log4j2.xml ファイルでは、リクエストとレスポンスの要約が有効になっています。

<Configuration status="WARN"> <Appenders> <Console name="ConsoleAppender" target="SYSTEM_OUT"> <PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c:%L - %m%n" /> </Console> </Appenders>

<Loggers> <Root level="WARN"> <AppenderRef ref="ConsoleAppender"/> </Root> <Logger name="software.amazon.awssdk" level="WARN" /> <Logger name="software.amazon.awssdk.request" level="DEBUG" /> </Loggers></Configuration>

29

AWS SDK for Java バージョン 2 開発者ガイド詳細なワイヤログ記録

ログ出力の例を次に示します。

2018-01-28 19:31:56 [main] DEBUG software.amazon.awssdk.request:Logger.java:78 - Sending Request: software.amazon.awssdk.http.DefaultSdkHttpFullRequest@3a80515c

詳細なワイヤログ記録場合によっては、AWS SDK for Java によって送受信されたリクエストとレスポンスを詳細に表示すると役立つことがあります。この情報にアクセスする必要がある場合は、Apache HttpClient ロガーを使用して、一時的に有効にすることができます。apache.http.wire ロガーの DEBUG レベルを有効にすると、すべてのリクエストデータとレスポンスデータに対するログ記録が有効になります。

Warning

ワイヤログファイルはデバッグの目的でのみ使用することをお勧めします。この機能を使用して機密データを記録することができるため、本稼働環境ではこの機能を無効にします。HTTPS 呼び出しの場合でも、リクエストやレスポンスは暗号化せずに記録されます。リクエスト (例: ファイルを Amazon S3 にアップロード) やレスポンスのサイズが大きい場合は、詳細なワイヤログ記録によって、アプリケーションのパフォーマンスに大きな影響を与えることがあります。

次の log4j2.xml ファイルでは、Apache HttpClient で完全なワイヤログ記録が有効になっています。

<Configuration status="WARN"> <Appenders> <Console name="ConsoleAppender" target="SYSTEM_OUT"> <PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c:%L - %m%n" /> </Console> </Appenders>

<Loggers> <Root level="WARN"> <AppenderRef ref="ConsoleAppender"/> </Root> <Logger name="software.amazon.awssdk" level="WARN" /> <Logger name="software.amazon.awssdk.request" level="DEBUG" /> <Logger name="org.apache.http.wire" level="DEBUG" /> </Loggers></Configuration>

他にも、log4j-1.2-api に対する Maven の依存性は、内部で 1.2 を使用する際に Apache とのワイヤロギングに必要です。ワイヤロギングを有効にしている場合は、pom.xml ファイルに以下を追加します。

<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-1.2-api</artifactId></dependency>

Amazon EC2 の IAM ロールを設定する (詳細設定)AWS のサービスへのリクエストはすべて、AWS が発行した認証情報を使用して暗号で署名される必要があります。IAM ロールを使用することで、Amazon EC2 インスタンスから AWS リソースへのセキュアなアクセスを簡単に付与できます。

このトピックでは、Amazon EC2 で実行されている AWS SDK for Java アプリケーションで IAM ロールを使用する方法について説明します。IAM インスタンスの詳細については、『Amazon EC2 User Guide forLinux Instances』の「Amazon EC2 の IAM ロール」を参照してください。

30

AWS SDK for Java バージョン 2 開発者ガイドデフォルトプロバイダーチェーンと

Amazon EC2 インスタンスプロファイル

デフォルトプロバイダーチェーンと Amazon EC2 インスタンスプロファイルアプリケーションで create メソッドを使用して AWS クライアントを作成した場合、そのクライアントはデフォルトの認証情報プロバイダーチェーンを使用して次の順序で認証情報を検索します。

1. Java のシステムプロパティ: aws.accessKeyId と aws.secretKey。2. システム環境変数: AWS_ACCESS_KEY_ID と AWS_SECRET_ACCESS_KEY。3. デフォルトの認証情報ファイル (このファイルの場所はプラットフォームによって異なります)。4. Amazon ECS 環境変数: AWS_CONTAINER_CREDENTIALS_RELATIVE_URI。5. インスタンスプロファイル認証情報。EC2 インスタンスの IAM ロールに関連付けられたインスタンス

メタデータ内にあります。

デフォルトのプロバイダーチェーンの最終ステップは、Amazon EC2 インスタンスでアプリケーションを実行している場合にのみ行います。ただし、Amazon EC2 インスタンスで使用する場合は、使いやすさとセキュリティに優れています。また、InstanceProfileCredentialsProvider インスタンスを直接クライアントコンストラクタに渡して、デフォルトプロバイダーチェーン全体を経ることなく、インスタンスプロファイル認証情報を取得することもできます。

以下に例を示します。

S3Client s3 = S3Client.builder() .credentialsProvider(InstanceProfileCredentialsProvider.builder().build()) .build();

この方法を使用する場合、SDK は、インスタンスプロファイルの Amazon EC2 インスタンスに関連付けられている IAM ロールに関連付けられたアクセス許可と同じアクセス許可を持つ一時的な AWS 認証情報を取得します。これらの認証情報は一時的なもので、最終的には失効しますが、InstanceProfileCredentialsProvider によって定期的に更新されるため、取得済みの認証情報で引き続き AWS にアクセスできます。

ウォークスルー: Amazon EC2 インスタンスでの IAMロールの使用このチュートリアルでは、IAM ロールを使用して Amazon S3 からオブジェクトを取得し、アクセスを管理する方法を示します。

IAM ロールを作成します。Amazon S3 に読み取り専用アクセスを付与する IAM ロールを作成します。

IAM ロールを作成するには

1. IAM コンソールを開きます。2. ナビゲーションペインで [ロール]、[新しいロールの作成] の順に選択します。3. [ロールタイプの選択] ページの [AWS サービスロール] で、[Amazon EC2] を選択します。4. [ポリシーのアタッチ] ページで、ポリシーリストから [Amazon S3 Read Only Access] を選択し、[次

のステップ] を選択します。5. ロールの名前を入力し、[Next Step] を選択します。この名前は忘れないようにしてください。

この名前は Amazon EC2 インスタンスを起動するときに必要です。

31

AWS SDK for Java バージョン 2 開発者ガイドウォークスルー: Amazon EC2 インスタンスでの IAM ロールの使用

6. [Review] ページで、[Create Role] を選択します。

EC2 インスタンスを起動して IAM ロールを指定するIAM ロールで Amazon EC2 インスタンスを起動するには、Amazon EC2 コンソールを使用します。

コンソールを使用して Amazon EC2 インスタンスを起動するには、『Amazon EC2 User Guide for LinuxInstances』 の「Amazon EC2 Linux インスタンスの開始方法」の指示に従います。

[Review Instance Launch (インスタンス作成の確認)] ページを開いたら、[Edit instance details (インスタンスの詳細の編集)] を選択します。[IAM ロール] で、前に作成した IAM ロールを選択します。指示にしたがって手順を完了します。

Note

そのインスタンスに接続するには、セキュリティグループとキーペアを作成するか、または既存のものを使用する必要があります。

この IAM と Amazon EC2 のセットアップで、EC2 インスタンスにアプリケーションをデプロイすることができます。これにより、Amazon S3 サービスへの読み取りアクセスが付与されます。

32

AWS SDK for Java バージョン 2 開発者ガイドAmazon CloudWatch の例

AWS SDK for Java 2.0 コード例このセクションでは、特定のユースケースに適用される AWS SDK for Java 2.0 の使用例を示します。

これらの例などのソースコードについては、AWS ドキュメントの code examples repository on GitHub を参照してください。

AWS ドキュメントチームに作成を検討してもらう新しいコード例を提案するには、新しいリクエストを作成します。チームは、個々の API 呼び出しのみを対象とするシンプルなコードスニペットよりは、より広範なシナリオやユースケースを対象とするコード例を作成しようとしています。手順については、GitHubの Readme で「Proposing new code examples」セクションを参照してください。

トピック• AWS SDK for Java を使用した CloudWatch の例 (p. 33)• AWS SDK for Java を使用した DynamoDB の例 (p. 42)• AWS SDK for Java を使用した Amazon EC2 の例 (p. 53)• AWS SDK for Java を使用した IAM の例 (p. 66)• AWS SDK for Java を使用した Kinesis の例 (p. 81)• AWS SDK for Java を使用した Lambda の例 (p. 86)• AWS SDK for Java を使用した Amazon S3 の例 (p. 89)• Amazon S3 の署名付き URL の操作 (p. 99)• AWS SDK for Java を使用した Amazon SQS の例 (p. 102)• AWS SDK for Java を使用した Amazon Transcribe の例 (p. 107)• ページ分割された結果を取得する (p. 111)

AWS SDK for Java を使用した CloudWatch の例このセクションでは、AWS SDK for Java 2.0 を使用して CloudWatch をプログラムする例を示します。

Important

この同期クライアントはプレビューリリースのため、本稼働環境には推奨されません。

Amazon CloudWatch は、アマゾン ウェブ サービス (AWS) リソースと、AWS で実行されているアプリケーションをリアルタイムでモニタリングします。リソースとアプリケーションで測定する変数であるメトリクスを収集し、追跡するには、CloudWatch を使用できます。CloudWatch アラームは、定義するルールに従って通知を送信し、また、モニタリングしているリソースに自動的に変更を行います。

CloudWatch の詳細については、Amazon CloudWatch ユーザーガイドを参照してください。

以下の例には、各手法を示すのに必要なコードのみが含まれます。完全なサンプルコードは GitHub で入手できます。そこから、単一のソースファイルをダウンロードするかリポジトリをローカルにクローン作成して、ビルドし実行するためのすべての例を取得できます。

トピック• CloudWatch からメトリクスを取得する (p. 34)• カスタムメトリクスデータを発行する (p. 35)• CloudWatch アラームを使用する (p. 36)• CloudWatch でアラームアクションを使用する (p. 38)• CloudWatch にイベントを送信する (p. 39)

33

AWS SDK for Java バージョン 2 開発者ガイドCloudWatch からメトリクスを取得する

CloudWatch からメトリクスを取得するメトリクスの一覧表示CloudWatch メトリクスを一覧表示するには、ListMetricsRequest を作成して CloudWatchClient のlistMetrics メソッドを呼び出します。ListMetricsRequest を使用して、名前空間、メトリクス名、またはディメンションで返されたメトリクスをフィルタリングできます。

Note

AWS のサービスによって投稿されたメトリクスとディメンションの一覧は、AmazonCloudWatch User Guide の「Amazon CloudWatch メトリクスとディメンションのリファレンス」を参照してください。

インポート

import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;import software.amazon.awssdk.services.cloudwatch.model.ListMetricsRequest;import software.amazon.awssdk.services.cloudwatch.model.ListMetricsResponse;import software.amazon.awssdk.services.cloudwatch.model.Metric;

/** * Lists CloudWatch metrics */

コード

CloudWatchClient cw = CloudWatchClient.builder().build();

boolean done = false;String next_token = null;

while(!done) { ListMetricsResponse response;

if (next_token == null) { ListMetricsRequest request = ListMetricsRequest.builder() .namespace(namespace) .build();

response = cw.listMetrics(request); } else { ListMetricsRequest request = ListMetricsRequest.builder() .namespace(namespace) .nextToken(next_token) .build();

response = cw.listMetrics(request); }

for(Metric metric : response.metrics()) { System.out.printf( "Retrieved metric %s", metric.metricName()); System.out.println(); }

if(response.nextToken() == null) { done = true; }

34

AWS SDK for Java バージョン 2 開発者ガイドカスタムメトリクスデータを発行する

else { next_token = response.nextToken(); }}

このメトリクスは、getMetrics メソッドを呼び出すことによって ListMetricsResponse で返されます。

結果はページ分割される場合があります。結果の次のバッチを取得するには、レスポンスオブジェクトのnextToken を呼び出し、そのトークン値を使用して、新しいリクエストオブジェクトをビルドします。次に、listMetrics メソッドを新しいリクエストで再度呼び出します。

GitHub で完全な例をご覧ください。

詳細情報• Amazon CloudWatch API Reference の「ListMetrics」。

カスタムメトリクスデータを発行する複数の AWS のサービスが「AWS/」で始まる名前空間で独自のメトリクスを発行します。また、(「AWS/」で始まらない限り) 独自の名前空間を使用してカスタムメトリクスデータを発行することもできます。

カスタムメトリクスデータを発行する独自のメトリクスデータを発行するには、CloudWatchClient の putMetricData メソッドをPutMetricDataRequest で呼び出します。PutMetricDataRequest には、データ用に使用するカスタム名前空間と、MetricDatum オブジェクト内のデータポイント自体に関する情報が含まれている必要があります。

Note

「AWS/」で始まる名前空間を指定することはできません。「AWS/」で始まる名前空間は、アマゾン ウェブ サービス製品による利用のために予約されています。

インポート

package com.example.cloudwatch;import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;import software.amazon.awssdk.services.cloudwatch.model.Dimension;import software.amazon.awssdk.services.cloudwatch.model.MetricDatum;import software.amazon.awssdk.services.cloudwatch.model.PutMetricDataRequest;import software.amazon.awssdk.services.cloudwatch.model.PutMetricDataResponse;import software.amazon.awssdk.services.cloudwatch.model.StandardUnit;

コード

Double data_point = Double.parseDouble(args[0]);

CloudWatchClient cw = CloudWatchClient.builder().build();

Dimension dimension = Dimension.builder() .name("UNIQUE_PAGES") .value("URLS").build();

MetricDatum datum = MetricDatum.builder()

35

AWS SDK for Java バージョン 2 開発者ガイドCloudWatch アラームを使用する

.metricName("PAGES_VISITED") .unit(StandardUnit.NONE) .value(data_point) .dimensions(dimension).build();

PutMetricDataRequest request = PutMetricDataRequest.builder() .namespace("SITE/TRAFFIC") .metricData(datum).build();

PutMetricDataResponse response = cw.putMetricData(request);

System.out.printf("Successfully put data point %f", data_point);

GitHub で完全な例をご覧ください。

詳細情報• Amazon CloudWatch User Guide の「Amazon CloudWatch メトリクスの使用」。• Amazon CloudWatch User Guide の「AWS 名前空間」。• Amazon CloudWatch API Reference の「PutMetricData」。

CloudWatch アラームを使用するアラームの作成CloudWatch メトリクスに基づいてアラームを作成するには、CloudWatchClient の putMetricAlarm メソッドをアラーム条件に満たされた PutMetricAlarmRequest で呼び出します。

インポート

import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;import software.amazon.awssdk.services.cloudwatch.model.ComparisonOperator;import software.amazon.awssdk.services.cloudwatch.model.Dimension;import software.amazon.awssdk.services.cloudwatch.model.PutMetricAlarmRequest;import software.amazon.awssdk.services.cloudwatch.model.PutMetricAlarmResponse;import software.amazon.awssdk.services.cloudwatch.model.StandardUnit;import software.amazon.awssdk.services.cloudwatch.model.Statistic;

コード

CloudWatchClient cw = CloudWatchClient.builder().build();

Dimension dimension = Dimension.builder() .name("InstanceId") .value(instanceId).build();

PutMetricAlarmRequest request = PutMetricAlarmRequest.builder() .alarmName(alarmName) .comparisonOperator( ComparisonOperator.GREATER_THAN_THRESHOLD) .evaluationPeriods(1) .metricName("CPUUtilization") .namespace("AWS/EC2") .period(60) .statistic(Statistic.AVERAGE) .threshold(70.0) .actionsEnabled(false)

36

AWS SDK for Java バージョン 2 開発者ガイドCloudWatch アラームを使用する

.alarmDescription( "Alarm when server CPU utilization exceeds 70%") .unit(StandardUnit.SECONDS) .dimensions(dimension) .build();

PutMetricAlarmResponse response = cw.putMetricAlarm(request);

GitHub で完全な例をご覧ください。

アラームの一覧表示作成した CloudWatch アラームを一覧表示するには、CloudWatchClient の describeAlarms メソッドを、結果のオプションを設定するのに使用できる DescribeAlarmsRequest で呼び出します。

インポート

import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;import software.amazon.awssdk.services.cloudwatch.model.DescribeAlarmsRequest;import software.amazon.awssdk.services.cloudwatch.model.DescribeAlarmsResponse;import software.amazon.awssdk.services.cloudwatch.model.MetricAlarm;

コード

CloudWatchClient cw = CloudWatchClient.builder().build();

boolean done = false;String new_token = null;

while(!done) { DescribeAlarmsResponse response; if (new_token == null) { DescribeAlarmsRequest request = DescribeAlarmsRequest.builder().build(); response = cw.describeAlarms(request); } else { DescribeAlarmsRequest request = DescribeAlarmsRequest.builder() .nextToken(new_token) .build(); response = cw.describeAlarms(request); }

for(MetricAlarm alarm : response.metricAlarms()) { System.out.printf("Retrieved alarm %s", alarm.alarmName()); }

if(response.nextToken() == null) { done = true; } else { new_token = response.nextToken(); }}

describeAlarms よって返された DescribeAlarmsResponse の MetricAlarms を呼び出することで、アラームのリストを取得できます。

結果はページ分割される場合があります。結果の次のバッチを取得するには、レスポンスオブジェクトのnextToken を呼び出し、そのトークン値を使用して、新しいリクエストオブジェクトをビルドします。次に、describeAlarms メソッドを新しいリクエストで再度呼び出します。

37

AWS SDK for Java バージョン 2 開発者ガイドCloudWatch でアラームアクションを使用する

Note

また、特定のメトリクスのアラームを取得するには、CloudWatchClient のdescribeAlarmsForMetric メソッドを使用します。使用方法は describeAlarms と同様です。

GitHub で完全な例をご覧ください。

アラームの削除CloudWatch アラームを削除するには、CloudWatchClient の deleteAlarms メソッドを、削除するアラームの名前を 1 つ以上含む DeleteAlarmsRequest で呼び出します。

インポート

import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;import software.amazon.awssdk.services.cloudwatch.model.DeleteAlarmsRequest;import software.amazon.awssdk.services.cloudwatch.model.DeleteAlarmsResponse;

コード

CloudWatchClient cw = CloudWatchClient.builder().build();

DeleteAlarmsRequest request = DeleteAlarmsRequest.builder() .alarmNames(alarm_name).build();

DeleteAlarmsResponse response = cw.deleteAlarms(request);

System.out.printf("Successfully deleted alarm %s", alarm_name);

GitHub で完全な例をご覧ください。

詳細情報• Amazon CloudWatch User Guide の「Amazon CloudWatch アラームの作成」• Amazon CloudWatch API Reference の「PutMetricAlarm」• Amazon CloudWatch API Reference の「DescribeAlarms」• Amazon CloudWatch API Reference の「DeleteAlarms」

CloudWatch でアラームアクションを使用するCloudWatch アラームアクションを使用して、Amazon EC2 インスタンスを自動的に停止、終了、再起動、または復旧するといったアクションを実行するアラームを作成できます。

Note

アラームの作成 (p. 36)時に PutMetricAlarmRequest の alarmActions メソッドを使用することで、アラームアクションをアラームに追加することができます。

アラームアクションの有効化CloudWatch アラームのアラームアクションを有効化するには、アクションを有効にする 1 つ以上のアラームの名前を含む EnableAlarmActionsRequest で CloudWatchClient の enableAlarmActions を呼び出します。

38

AWS SDK for Java バージョン 2 開発者ガイドCloudWatch にイベントを送信する

インポート

import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;import software.amazon.awssdk.services.cloudwatch.model.EnableAlarmActionsRequest;import software.amazon.awssdk.services.cloudwatch.model.EnableAlarmActionsResponse;

コード

CloudWatchClient cw = CloudWatchClient.builder().build();

EnableAlarmActionsRequest request = EnableAlarmActionsRequest.builder() .alarmNames(alarm).build();

EnableAlarmActionsResponse response = cw.enableAlarmActions(request);

GitHub で完全な例をご覧ください。

アラームアクションの無効化CloudWatch アラームのアラームアクションを無効化するには、アクションを無効にする 1 つ以上のアラームの名前を含む DisableAlarmActionsRequest で CloudWatchClient の disableAlarmActions を呼び出します。

インポート

import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;import software.amazon.awssdk.services.cloudwatch.model.DisableAlarmActionsRequest;import software.amazon.awssdk.services.cloudwatch.model.DisableAlarmActionsResponse;

コード

CloudWatchClient cw = CloudWatchClient.builder().build();

DisableAlarmActionsRequest request = DisableAlarmActionsRequest.builder() .alarmNames(alarmName).build();

DisableAlarmActionsResponse response = cw.disableAlarmActions(request);

GitHub で完全な例をご覧ください。

詳細情報• Amazon CloudWatch User Guide の インスタンスを停止、終了、再起動、または復旧するアラームを作

成する• Amazon CloudWatch API Reference の「PutMetricAlarm」• Amazon CloudWatch API Reference の「EnableAlarmActions」• Amazon CloudWatch API Reference の「DisableAlarmActions」

CloudWatch にイベントを送信するCloudWatch Events は、AWS リソースの変更を示すシステムイベントのほぼリアルタイムのストリームを、Amazon EC2 インスタンス、Lambda 関数、Kinesis ストリーム、Amazon ECS タスク、Step

39

AWS SDK for Java バージョン 2 開発者ガイドCloudWatch にイベントを送信する

Functions ステートマシン、Amazon SNS トピック、Amazon SQS キュー、または組み込みターゲットに振り分けます。簡単なルールを使用して、一致したイベントを 1 つ以上のターゲット関数またはストリームに振り分けることができます。

イベントの追加カスタム CloudWatch イベントを追加するには、各イベントに関する詳細情報を提供しているPutEventsRequestEntry オブジェクトを 1 つ以上含む PutEventsRequest オブジェクトを使用してCloudWatchEventsClient の putEvents メソッドを呼び出します。イベントのソースとタイプ、イベントに関連付けられたリソースなど、エントリの複数のパラメータを指定できます。

Note

putEvents への呼び出しごとに最大 10 個のイベントを指定できます。

インポート

import software.amazon.awssdk.services.cloudwatchevents.CloudWatchEventsClient;import software.amazon.awssdk.services.cloudwatchevents.model.PutEventsRequest;import software.amazon.awssdk.services.cloudwatchevents.model.PutEventsRequestEntry;import software.amazon.awssdk.services.cloudwatchevents.model.PutEventsResponse;

コード

CloudWatchEventsClient cwe = CloudWatchEventsClient.builder().build();

final String EVENT_DETAILS = "{ \"key1\": \"value1\", \"key2\": \"value2\" }";

PutEventsRequestEntry request_entry = PutEventsRequestEntry.builder() .detail(EVENT_DETAILS) .detailType("sampleSubmitted") .resources(resource_arn) .source("aws-sdk-java-cloudwatch-example").build();

PutEventsRequest request = PutEventsRequest.builder() .entries(request_entry).build();

PutEventsResponse response = cwe.putEvents(request);

GitHub で完全な例をご覧ください。

ルールの追加ルールを作成または更新するには、ルールの名前を含む PutRuleRequest と、イベントパターン、ルールと関連付ける IAM ロール、およびルールの実行頻度を説明するスケジュール式などを含む任意指定のパラメータを CloudWatchEventsClient の putRule メソッドを使用して呼び出します。

インポート

import software.amazon.awssdk.services.cloudwatchevents.CloudWatchEventsClient;import software.amazon.awssdk.services.cloudwatchevents.model.PutRuleRequest;import software.amazon.awssdk.services.cloudwatchevents.model.PutRuleResponse;import software.amazon.awssdk.services.cloudwatchevents.model.RuleState;

コード

CloudWatchEventsClient cwe =

40

AWS SDK for Java バージョン 2 開発者ガイドCloudWatch にイベントを送信する

CloudWatchEventsClient.builder().build();

PutRuleRequest request = PutRuleRequest.builder() .name(rule_name) .roleArn(role_arn) .scheduleExpression("rate(5 minutes)") .state(RuleState.ENABLED) .build();

PutRuleResponse response = cwe.putRule(request);

GitHub で完全な例をご覧ください。

ターゲットの追加ターゲットは、ルールがトリガーされたときに呼び出されるリソースです。ターゲット例には、AmazonEC2 インスタンス、Lambda 関数、Kinesis ストリーム、Amazon ECS タスク、Step Functions ステートマシン、組み込みターゲットが含まれます。

ルールにターゲットを追加するには、更新するルールを含む PutTargetsRequest とルールに追加するターゲットのリストを使用して CloudWatchEventsClient の putTargets メソッドを呼び出します。

インポート

import software.amazon.awssdk.services.cloudwatchevents.CloudWatchEventsClient;import software.amazon.awssdk.services.cloudwatchevents.model.PutTargetsRequest;import software.amazon.awssdk.services.cloudwatchevents.model.PutTargetsResponse;import software.amazon.awssdk.services.cloudwatchevents.model.Target;

コード

CloudWatchEventsClient cwe = CloudWatchEventsClient.builder().build();

Target target = Target.builder() .arn(function_arn) .id(target_id) .build();

PutTargetsRequest request = PutTargetsRequest.builder() .targets(target) .rule(rule_name) .build();

PutTargetsResponse response = cwe.putTargets(request);

GitHub で完全な例をご覧ください。

詳細情報• Amazon CloudWatch Events User Guide の 「PutEvents を使用したイベントの追加」• Amazon CloudWatch Events User Guide の「ルールのスケジュール式」• Amazon CloudWatch Events User Guide の「CloudWatch イベントのイベントタイプ」• Amazon CloudWatch Events User Guide の「イベントとイベントパターン」• Amazon CloudWatch Events API Reference の「PutEvents」• Amazon CloudWatch Events API Reference の「PutTargets」• Amazon CloudWatch Events API Reference の「PutRule」

41

AWS SDK for Java バージョン 2 開発者ガイドAmazon DynamoDB の例

AWS SDK for Java を使用した DynamoDB の例このセクションでは、AWS SDK for Java 2.0 を使用して DynamoDB をプログラムする例を示します。

Important

この同期クライアントはプレビューリリースのため、本稼働環境には推奨されません。

以下の例には、各手法を示すのに必要なコードのみが含まれます。完全なサンプルコードは GitHub で入手できます。そこから、単一のソースファイルをダウンロードするかリポジトリをローカルにクローン作成して、ビルドし実行するためのすべての例を取得できます。

トピック• DynamoDB のテーブルの操作 (p. 42)• DynamoDB の項目の操作 (p. 48)

DynamoDB のテーブルの操作テーブルは、DynamoDB データベースのすべての項目のコンテナです。DynamoDB のデータの追加または削除を行う前に、テーブルを作成する必要があります。

テーブルごとに、以下を定義する必要があります。

• アカウントおよびリージョンに一意であるテーブル名。• プライマリキー。すべての値は一意でなければならず、テーブル内のどの 2 つの項目も同じプライマリ

キー値を持つことはできません。

プライマリキーは、単一のパーティション (ハッシュ) キーで構成されるシンプルなプライマリキーにするか、パーティションとソート (範囲) キーで構成される複合プライマリキーにすることができます。

各キー値には、ScalarAttributeType クラスによって列挙される データ型が関連付けられています。キー値は、バイナリ (B)、数値 (N)、または文字列 (S) になります。詳細については、Amazon DynamoDBDeveloper Guide の「命名ルールおよびデータ型」を参照してください。

• テーブル用に予約された読み込み/書き込みキャパシティーユニットの数を定義するプロビジョンドスループットの値。

Note

Amazon DynamoDB の料金表は、テーブルに設定したプロビジョニングされたスループット値に基づくため、テーブルに必要と予想される分だけのキャパシティーを予約します。テーブルのプロビジョンドスループットはいつでも変更できるため、必要に応じてキャパシティーを調整できます。

テーブルを作成する新しい DynamoDB テーブルを作成するには、DynamoDbClient の createTable メソッドを使用します。テーブルのプライマリキーを識別するために使用する、テーブル属性とテーブルスキーマを構築する必要があります。また、最初のプロビジョニングされたスループット値およびテーブル名を指定する必要があります。

Note

選択した名前のテーブルがすでに存在している場合は、DynamoDbException がスローされます。

インポート

42

AWS SDK for Java バージョン 2 開発者ガイドDynamoDB のテーブルの操作

import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;import software.amazon.awssdk.services.dynamodb.DynamoDbClient;import software.amazon.awssdk.services.dynamodb.model.AttributeDefinition;import software.amazon.awssdk.services.dynamodb.model.CreateTableRequest;import software.amazon.awssdk.services.dynamodb.model.CreateTableResponse;import software.amazon.awssdk.services.dynamodb.model.KeySchemaElement;import software.amazon.awssdk.services.dynamodb.model.KeyType;import software.amazon.awssdk.services.dynamodb.model.ProvisionedThroughput;import software.amazon.awssdk.services.dynamodb.model.ScalarAttributeType;

シンプルプライマリキーを使用してテーブルを作成するこのコードでは、シンプルプライマリキー (「Name」) を持つテーブルを作成します。

コード

CreateTableRequest request = CreateTableRequest.builder() .attributeDefinitions(AttributeDefinition.builder() .attributeName("Name") .attributeType(ScalarAttributeType.S) .build()) .keySchema(KeySchemaElement.builder() .attributeName("Name") .keyType(KeyType.HASH) .build()) .provisionedThroughput(ProvisionedThroughput.builder() .readCapacityUnits(new Long(10)) .writeCapacityUnits(new Long(10)) .build()) .tableName(table_name) .build();

DynamoDbClient ddb = DynamoDbClient.create();

try { CreateTableResponse response = ddb.createTable(request); System.out.println(response.tableDescription().tableName());} catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1);}

GitHub で完全な例をご覧ください。

複合プライマリキーを使用してテーブルを作成する別の AttributeDefinition および KeySchemaElement を CreateTableRequest に追加します。

インポート

import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;import software.amazon.awssdk.services.dynamodb.model.AttributeDefinition;import software.amazon.awssdk.services.dynamodb.model.CreateTableRequest;import software.amazon.awssdk.services.dynamodb.model.CreateTableResponse;import software.amazon.awssdk.services.dynamodb.model.KeySchemaElement;import software.amazon.awssdk.services.dynamodb.model.KeyType;import software.amazon.awssdk.services.dynamodb.model.ProvisionedThroughput;import software.amazon.awssdk.services.dynamodb.model.ScalarAttributeType;

import software.amazon.awssdk.services.dynamodb.DynamoDbClient;import software.amazon.awssdk.services.dynamodb.model.CreateTableRequest;

43

AWS SDK for Java バージョン 2 開発者ガイドDynamoDB のテーブルの操作

コード

CreateTableRequest request = CreateTableRequest.builder() .attributeDefinitions( AttributeDefinition.builder() .attributeName("Language") .attributeType(ScalarAttributeType.S) .build(), AttributeDefinition.builder() .attributeName("Greeting") .attributeType(ScalarAttributeType.S) .build()) .keySchema( KeySchemaElement.builder() .attributeName("Language") .keyType(KeyType.HASH) .build(), KeySchemaElement.builder() .attributeName("Greeting") .keyType(KeyType.RANGE) .build()) .provisionedThroughput( ProvisionedThroughput.builder() .readCapacityUnits(new Long(10)) .writeCapacityUnits(new Long(10)).build()) .tableName(table_name) .build();

DynamoDbClient ddb = DynamoDbClient.create();

try { CreateTableResponse result = ddb.createTable(request);} catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1);}

GitHub で完全な例をご覧ください。

テーブルの一覧表示特定のリージョンのテーブルを一覧表示するには、DynamoDbClient の listTables メソッドを呼び出します。

Note

指定したテーブルがアカウントやリージョンにない場合は、ResourceNotFoundException がスローされます。

インポート

import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;import software.amazon.awssdk.services.dynamodb.model.ListTablesResponse;import software.amazon.awssdk.services.dynamodb.model.ListTablesRequest;import software.amazon.awssdk.services.dynamodb.DynamoDbClient;

import java.util.List;

コード

44

AWS SDK for Java バージョン 2 開発者ガイドDynamoDB のテーブルの操作

DynamoDbClient ddb = DynamoDbClient.create();

boolean more_tables = true;String last_name = null;

while(more_tables) { try { ListTablesResponse response = null; if (last_name == null) { ListTablesRequest request = ListTablesRequest.builder().build(); response = ddb.listTables(request); } else { ListTablesRequest request = ListTablesRequest.builder() .exclusiveStartTableName(last_name).build(); response = ddb.listTables(request); }

List<String> table_names = response.tableNames();

if (table_names.size() > 0) { for (String cur_name : table_names) { System.out.format("* %s\n", cur_name); } } else { System.out.println("No tables found!"); System.exit(0); }

last_name = response.lastEvaluatedTableName(); if (last_name == null) { more_tables = false; } } catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1); }}

デフォルトでは、1 回の呼び出しで最大 100 個のテーブルが返されます。—評価された最後のテーブルを取得するには、返された ListTablesResponse オブジェクトの lastEvaluatedTableName を使用します。この値を使用して、前回の一覧表示で返された最後の値以降から、一覧表示を開始できます。

GitHub で完全な例をご覧ください。

テーブルの説明 (テーブルに関する情報の取得)DynamoDbClient の describeTable メソッドを呼び出します。

Note

指定したテーブルがアカウントやリージョンにない場合は、ResourceNotFoundException がスローされます。

インポート

import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;import software.amazon.awssdk.services.dynamodb.DynamoDbClient;import software.amazon.awssdk.services.dynamodb.model.AttributeDefinition;import software.amazon.awssdk.services.dynamodb.model.DescribeTableRequest;import software.amazon.awssdk.services.dynamodb.model.ProvisionedThroughputDescription;import software.amazon.awssdk.services.dynamodb.model.TableDescription;import java.util.List;

45

AWS SDK for Java バージョン 2 開発者ガイドDynamoDB のテーブルの操作

コード

DynamoDbClient ddb = DynamoDbClient.create();

DescribeTableRequest request = DescribeTableRequest.builder() .tableName(table_name) .build();

try { TableDescription table_info = ddb.describeTable(request).table();

if (table_info != null) { System.out.format("Table name : %s\n", table_info.tableName()); System.out.format("Table ARN : %s\n", table_info.tableArn()); System.out.format("Status : %s\n", table_info.tableStatus()); System.out.format("Item count : %d\n", table_info.itemCount().longValue()); System.out.format("Size (bytes): %d\n", table_info.tableSizeBytes().longValue());

ProvisionedThroughputDescription throughput_info = table_info.provisionedThroughput(); System.out.println("Throughput"); System.out.format(" Read Capacity : %d\n", throughput_info.readCapacityUnits().longValue()); System.out.format(" Write Capacity: %d\n", throughput_info.writeCapacityUnits().longValue());

List<AttributeDefinition> attributes = table_info.attributeDefinitions(); System.out.println("Attributes"); for (AttributeDefinition a : attributes) { System.out.format(" %s (%s)\n", a.attributeName(), a.attributeType()); } }} catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1);}

GitHub で完全な例をご覧ください。

テーブルの変更 (更新)テーブルのプロビジョンドスループット値は、DynamoDbClient の updateTable メソッドを呼び出すことで随時変更できます。

Note

指定したテーブルがアカウントやリージョンにない場合は、ResourceNotFoundException がスローされます。

インポート

import software.amazon.awssdk.services.dynamodb.model.ProvisionedThroughput;

46

AWS SDK for Java バージョン 2 開発者ガイドDynamoDB のテーブルの操作

import software.amazon.awssdk.services.dynamodb.DynamoDbClient;import software.amazon.awssdk.services.dynamodb.model.QueryRequest;import software.amazon.awssdk.services.dynamodb.model.UpdateTableRequest;

import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;

コード

ProvisionedThroughput table_throughput = ProvisionedThroughput.builder() .readCapacityUnits(read_capacity) .writeCapacityUnits(write_capacity) .build();

DynamoDbClient ddb = DynamoDbClient.create();

UpdateTableRequest request = UpdateTableRequest.builder() .provisionedThroughput(table_throughput) .tableName(table_name) .build();

try { ddb.updateTable(request);} catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1);}

GitHub で完全な例をご覧ください。

テーブルの削除DynamoDbClient の deleteTable メソッドを呼び出し、それにテーブルの名前を渡します。

Note

指定したテーブルがアカウントやリージョンにない場合は、ResourceNotFoundException がスローされます。

インポート

import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;

import software.amazon.awssdk.services.dynamodb.DynamoDbClient;import software.amazon.awssdk.services.dynamodb.model.DeleteTableRequest;

コード

DynamoDbClient ddb = DynamoDbClient.create();

DeleteTableRequest request = DeleteTableRequest.builder() .tableName(table_name) .build();

try { ddb.deleteTable(request);} catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1);

47

AWS SDK for Java バージョン 2 開発者ガイドDynamoDB の項目の操作

}

GitHub で完全な例をご覧ください。

詳細• Amazon DynamoDB Developer Guide の「テーブルの操作のガイドライン」• Amazon DynamoDB Developer Guide の「DynamoDB のテーブルの操作」

DynamoDB の項目の操作DynamoDB で、項目とは、属性のコレクションで、それぞれに名前と値があります。属性値はスカラー型、セット型、ドキュメント型のいずれかです。詳細については、Amazon DynamoDB Developer Guideの「命名ルールおよびデータ型」を参照してください。

テーブルからの項目の取り出し (取得)DynamoDbClient の getItem メソッドを呼び出して、指定する項目のテーブル名とプライマリキー値を持つ GetItemRequest オブジェクトを渡します。これにより、その項目のすべての属性を含むGetItemResponse オブジェクトが返されます。特定の属性を取得するには、GetItemRequest で、1 つ以上のプロジェクション式を指定します。

返された GetItemResponse オブジェクトの item() メソッドを使用して、項目に関連付けられているキー (String) と値 (AttributeValue) のペアの マップを取得できます。

インポート

import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;import software.amazon.awssdk.services.dynamodb.DynamoDbClient;import software.amazon.awssdk.services.dynamodb.model.AttributeValue;import software.amazon.awssdk.services.dynamodb.model.GetItemRequest;import java.util.HashMap;import java.util.Map;import java.util.Set;

コード

HashMap<String,AttributeValue> key_to_get = new HashMap<String,AttributeValue>();

key_to_get.put("Name", AttributeValue.builder() .s(name).build());

GetItemRequest request = null;if (projection_expression != null) { request = GetItemRequest.builder() .key(key_to_get) .tableName(table_name) .projectionExpression(projection_expression) .build();} else { request = GetItemRequest.builder() .key(key_to_get) .tableName(table_name) .build();}

48

AWS SDK for Java バージョン 2 開発者ガイドDynamoDB の項目の操作

DynamoDbClient ddb = DynamoDbClient.create();

try { Map<String,AttributeValue> returned_item = ddb.getItem(request).item(); if (returned_item != null) { Set<String> keys = returned_item.keySet(); for (String key : keys) { System.out.format("%s: %s\n", key, returned_item.get(key).toString()); } } else { System.out.format("No item found with the key %s!\n", name); }} catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1);}

GitHub で完全な例をご覧ください。

非同期クライアントを使用したテーブルからの項目の取り出し(取得)DynamoDbAsyncClient の getItem メソッドを呼び出して、指定する項目のテーブル名とプライマリキー値を持つ GetItemRequest オブジェクトを渡します。

その項目のすべての属性を持つ Collection インスタンスを返すことができます (次の例を参照)。

インポート

import software.amazon.awssdk.services.dynamodb.model.GetItemRequest;import software.amazon.awssdk.services.dynamodb.model.AttributeValue;import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;import java.util.HashMap;import java.util.Map;import java.util.Set;import java.util.stream.Collectors;import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;

コード

//Get both input argumentsString tableName = args[0];String name = args[1];System.out.format("Retrieving item \"%s\" from \"%s\"\n", name, tableName );

HashMap<String, AttributeValue> keyToGet = new HashMap<String, AttributeValue>();

keyToGet.put("Name", AttributeValue.builder().s(name).build());

try {

DynamoDbAsyncClient client = DynamoDbAsyncClient.create();

//Create a GetItemRequest instance GetItemRequest request = GetItemRequest.builder() .key(keyToGet) .tableName(tableName)

49

AWS SDK for Java バージョン 2 開発者ガイドDynamoDB の項目の操作

.build();

//Invoke the DynamoDbAsyncClient object's getItem java.util.Collection<software.amazon.awssdk.services.dynamodb.model.AttributeValue> returnedItem = client.getItem(request).join().item().values();

//Convert Set to Map Map<String, AttributeValue> map = returnedItem.stream().collect(Collectors.toMap(AttributeValue::s, s->s)); Set<String> keys = map.keySet(); for (String key : keys) { System.out.format("%s: %s\n", key, map.get(key).toString()); }

} catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1);}

GitHub で完全な例をご覧ください。

テーブルへの新しい項目の追加項目の属性を表すキーと値のペアのマップを作成します。これらには、テーブルのプライマリキーフィールドの値を含める必要があります。プライマリキーで特定される項目がすでにある場合、フィールドはリクエストによって更新されます。

Note

指定したテーブルがアカウントやリージョンにない場合は、ResourceNotFoundException がスローされます。

インポート

import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;import software.amazon.awssdk.services.dynamodb.DynamoDbClient;import software.amazon.awssdk.services.dynamodb.model.AttributeValue;import software.amazon.awssdk.services.dynamodb.model.PutItemRequest;import software.amazon.awssdk.services.dynamodb.model.ResourceNotFoundException;import java.util.ArrayList;import java.util.HashMap;

コード

HashMap<String,AttributeValue> item_values = new HashMap<String,AttributeValue>();

item_values.put("Name", AttributeValue.builder().s(name).build());

for (String[] field : extra_fields) { item_values.put(field[0], AttributeValue.builder().s(field[1]).build());}

DynamoDbClient ddb = DynamoDbClient.create();PutItemRequest request = PutItemRequest.builder() .tableName(table_name) .item(item_values) .build();

try { ddb.putItem(request);

50

AWS SDK for Java バージョン 2 開発者ガイドDynamoDB の項目の操作

} catch (ResourceNotFoundException e) { System.err.format("Error: The table \"%s\" can't be found.\n", table_name); System.err.println("Be sure that it exists and that you've typed its name correctly!"); System.exit(1);} catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1);}

GitHub で完全な例をご覧ください。

テーブルの既存の項目の更新テーブルにすでに存在する項目の属性を更新するには、DynamoDbClient の updateItem メソッドを呼び出して、テーブル名、プライマリキーの値、更新するフィールドのマップを渡します。

Note

指定したテーブルがアカウントやリージョンにない場合、または渡したプライマリキーで特定される項目がない場合、ResourceNotFoundException がスローされます。

インポート

import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;import software.amazon.awssdk.services.dynamodb.model.AttributeAction;import software.amazon.awssdk.services.dynamodb.model.AttributeValue;import software.amazon.awssdk.services.dynamodb.model.AttributeValueUpdate;import software.amazon.awssdk.services.dynamodb.model.ResourceNotFoundException;import software.amazon.awssdk.services.dynamodb.model.UpdateItemRequest;import software.amazon.awssdk.services.dynamodb.DynamoDbClient;

import java.util.ArrayList;import java.util.HashMap;

コード

System.out.format("Updating \"%s\" in %s\n", name, table_name);if (extra_fields.size() > 0) { System.out.println("Additional fields:"); for (String[] field : extra_fields) { System.out.format(" %s: %s\n", field[0], field[1]); }}

HashMap<String,AttributeValue> item_key = new HashMap<String,AttributeValue>();

item_key.put("Name", AttributeValue.builder().s(name).build());

HashMap<String,AttributeValueUpdate> updated_values = new HashMap<String,AttributeValueUpdate>();

for (String[] field : extra_fields) { updated_values.put(field[0], AttributeValueUpdate.builder() .value(AttributeValue.builder().s(field[1]).build()) .action(AttributeAction.PUT) .build());}

UpdateItemRequest request = UpdateItemRequest.builder() .tableName(table_name)

51

AWS SDK for Java バージョン 2 開発者ガイドDynamoDB の項目の操作

.key(item_key) .attributeUpdates(updated_values) .build();

DynamoDbClient ddb = DynamoDbClient.create();

try { ddb.updateItem(request);} catch (ResourceNotFoundException e) { System.err.println(e.getMessage()); System.exit(1);} catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1);}

GitHub で完全な例をご覧ください。

テーブルの既存の項目の削除テーブルに存在する項目を削除するには、DynamoDbClient の deleteItem メソッドを使用して、テーブル名とプライマリキーの値を渡します。

Note

指定したテーブルがアカウントやリージョンにない場合、または渡したプライマリキーで特定される項目がない場合、ResourceNotFoundException がスローされます。

インポート

import software.amazon.awssdk.services.dynamodb.model.AttributeValue;import software.amazon.awssdk.services.dynamodb.model.DeleteItemRequest;import software.amazon.awssdk.services.dynamodb.model.DeleteItemResponse;import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;import java.util.HashMap;

コード

HashMap<String,AttributeValue> key_to_get = new HashMap<String,AttributeValue>();

key_to_get.put("Name", AttributeValue.builder() .s(name) .build());

DeleteItemRequest deleteReq = DeleteItemRequest.builder() .tableName(table_name) .key(key_to_get) .build();

DynamoDbAsyncClient ddb = DynamoDbAsyncClient.create();

try { ddb.deleteItem(deleteReq);} catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1);}

52

AWS SDK for Java バージョン 2 開発者ガイドAmazon EC2 の例

GitHub で完全な例をご覧ください。

詳細• Amazon DynamoDB Developer Guide の「項目の操作のガイドライン」• Amazon DynamoDB Developer Guide の「DynamoDB の項目の操作」

AWS SDK for Java を使用した Amazon EC2 の例このセクションでは、AWS SDK for Java 2.0 で Amazon EC2 をプログラムする例を示します。

トピック• Amazon EC2 インスタンスの管理 (p. 53)• Amazon EC2 の Elastic IP アドレスの使用 (p. 57)• リージョンとアベイラビリティーゾーンの使用 (p. 59)• Amazon EC2 のキーペアでの作業 (p. 61)• Amazon EC2 でのセキュリティグループの使用 (p. 63)

Amazon EC2 インスタンスの管理インスタンスを作成する新しい Amazon EC2 インスタンスを作成するには、Ec2Client の runInstances メソッドを呼び出して、使用する Amazon マシンイメージ (AMI) およびインスタンスタイプを含む RunInstancesRequest を指定します。

インポート

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.InstanceType;import software.amazon.awssdk.services.ec2.model.RunInstancesRequest;import software.amazon.awssdk.services.ec2.model.RunInstancesResponse;import software.amazon.awssdk.services.ec2.model.Tag;import software.amazon.awssdk.services.ec2.model.CreateTagsRequest;import software.amazon.awssdk.services.ec2.model.Ec2Exception;

コード

Ec2Client ec2 = Ec2Client.create();

RunInstancesRequest run_request = RunInstancesRequest.builder() .imageId(ami_id) .instanceType(InstanceType.T1_MICRO) .maxCount(1) .minCount(1) .build();

RunInstancesResponse response = ec2.runInstances(run_request);

String instance_id = response.instances().get(0).instanceId();

Tag tag = Tag.builder()

53

AWS SDK for Java バージョン 2 開発者ガイドAmazon EC2 インスタンスの管理

.key("Name") .value(name) .build();

CreateTagsRequest tag_request = CreateTagsRequest.builder() .resources(instance_id) .tags(tag) .build();

try { ec2.createTags(tag_request);

System.out.printf( "Successfully started EC2 instance %s based on AMI %s", instance_id, ami_id);}catch (Ec2Exception e) { System.err.println(e.getMessage()); System.exit(1);}

GitHub で完全な例をご覧ください。

インスタンスの作成Amazon EC2 インスタンスを起動するには、Ec2Client の startInstances メソッドを呼び出して、開始するインスタンスの ID を含む StartInstancesRequest を指定します。

インポート

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.StartInstancesRequest;import software.amazon.awssdk.services.ec2.model.StopInstancesRequest;

コード

Ec2Client ec2 = Ec2Client.create();

StartInstancesRequest request = StartInstancesRequest.builder() .instanceIds(instance_id).build();

ec2.startInstances(request);

GitHub で完全な例をご覧ください。

インスタンスの停止Amazon EC2 インスタンスを停止するには、Ec2Client の stopInstances メソッドを呼び出して、停止するインスタンスの ID を含む StopInstancesRequest を指定します。

インポート

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.StartInstancesRequest;import software.amazon.awssdk.services.ec2.model.StopInstancesRequest;

コード

54

AWS SDK for Java バージョン 2 開発者ガイドAmazon EC2 インスタンスの管理

Ec2Client ec2 = Ec2Client.create();

StopInstancesRequest request = StopInstancesRequest.builder() .instanceIds(instance_id).build();

ec2.stopInstances(request);

GitHub で完全な例をご覧ください。

インスタンスの再起動Amazon EC2 インスタンスを再起動するには、Ec2Client の rebootInstances メソッドを呼び出して、再起動するインスタンスの ID を含む RebootInstancesRequest を指定します。

インポート

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.RebootInstancesRequest;import software.amazon.awssdk.services.ec2.model.RebootInstancesResponse;

コード

Ec2Client ec2 = Ec2Client.create();

RebootInstancesRequest request = RebootInstancesRequest.builder() .instanceIds(instance_id).build();

RebootInstancesResponse response = ec2.rebootInstances(request);

GitHub で完全な例をご覧ください。

インスタンスの説明インスタンスを一覧表示するには、DescribeInstancesRequest を作成し、Ec2Client のdescribeInstances メソッドを呼び出します。これにより DescribeInstancesResponse オブジェクトが返されます。このオブジェクトを使用して、お客様のアカウントとリージョンの Amazon EC2 インスタンスを一覧表示することができます。

インスタンスは予約ごとにグループ化されています。それぞれの予約は、インスタンスを起動した startInstances の呼び出しに対応しています。インスタンスを一覧表示するには、まずDescribeInstancesResponse クラスの reservations メソッドを呼び出してから、返された各Reservation オブジェクトの instances を呼び出します。

インポート

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.DescribeInstancesRequest;import software.amazon.awssdk.services.ec2.model.DescribeInstancesResponse;import software.amazon.awssdk.services.ec2.model.Instance;import software.amazon.awssdk.services.ec2.model.Reservation;

コード

55

AWS SDK for Java バージョン 2 開発者ガイドAmazon EC2 インスタンスの管理

String nextToken = null;do { DescribeInstancesRequest request = DescribeInstancesRequest.builder().maxResults(6).nextToken(nextToken).build(); DescribeInstancesResponse response = ec2.describeInstances(request);

for (Reservation reservation : response.reservations()) { for (Instance instance : reservation.instances()) { System.out.printf( "Found reservation with id %s, " + "AMI %s, " + "type %s, " + "state %s " + "and monitoring state %s", instance.instanceId(), instance.imageId(), instance.instanceType(), instance.state().name(), instance.monitoring().state()); System.out.println(""); } } nextToken = response.nextToken();

} while (nextToken != null);

結果はページ分割されます。さらに結果を取得するには、結果オブジェクトの nextToken メソッドから返る値を新しいリクエストオブジェクトの nextToken メソッドに渡した後、次の describeInstancesの呼び出しでその新しいリクエストオブジェクトを使用します。

GitHub で完全な例をご覧ください。

インスタンスの監視CPU やネットワークの使用率、使用可能なメモリ、ディスクの残り容量など、Amazon EC2 インスタンスのさまざまな側面を監視できます。インスタンスの監視の詳細については、Amazon EC2 User Guide forLinux Instances の「Amazon EC2 のモニタリング」を参照してください。

インスタンスの監視を開始するには、監視するインスタンスの ID で MonitorInstancesRequest を作成し、Ec2Client の monitorInstances メソッドに渡します。

インポート

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.MonitorInstancesRequest;import software.amazon.awssdk.services.ec2.model.UnmonitorInstancesRequest;

コード

Ec2Client ec2 = Ec2Client.create();

MonitorInstancesRequest request = MonitorInstancesRequest.builder() .instanceIds(instance_id).build();

ec2.monitorInstances(request);

GitHub で完全な例をご覧ください。

56

AWS SDK for Java バージョン 2 開発者ガイドAmazon EC2 の Elastic IP アドレスの使用

インスタンス監視の停止インスタンスの監視を停止するには、監視を停止するインスタンスの ID で UnmonitorInstancesRequestを作成し、Ec2Client の unmonitorInstances メソッドに渡します。

インポート

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.MonitorInstancesRequest;import software.amazon.awssdk.services.ec2.model.UnmonitorInstancesRequest;

コード

Ec2Client ec2 = Ec2Client.create();

UnmonitorInstancesRequest request = UnmonitorInstancesRequest.builder() .instanceIds(instance_id).build();

ec2.unmonitorInstances(request);

GitHub で完全な例をご覧ください。

詳細情報• Amazon EC2 API Reference の「RunInstances」• Amazon EC2 API Reference の「DescribeInstances」• Amazon EC2 API Reference の「StartInstances」• Amazon EC2 API Reference の「StopInstances」• Amazon EC2 API Reference の「RebootInstances」• Amazon EC2 API Reference の「DescribeInstances」• Amazon EC2 API Reference の「MonitorInstances」• Amazon EC2 API Reference の「UnmonitorInstances」

Amazon EC2 の Elastic IP アドレスの使用Elastic IP アドレスの割り当てElastic IP アドレスを使用するには、まずアカウントに 1 つ割り当ててから、それをインスタンスまたはネットワークインターフェイスに関連付けます。

Elastic IP アドレスを割り当てるには、ネットワークタイプ (Classic EC2 または VPC) が含まれるAllocateAddressRequest オブジェクトを使用して Ec2Client の allocateAddress メソッドを呼び出します。

返された AllocateAddressResponse には割り当て ID が含まれます。この割り当て ID とインスタンス IDを含む AssociateAddressRequest を Ec2Client の associateAddress メソッドに渡すことで、アドレスをインスタンスに関連付けることができます。

インポート

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.AllocateAddressRequest;

57

AWS SDK for Java バージョン 2 開発者ガイドAmazon EC2 の Elastic IP アドレスの使用

import software.amazon.awssdk.services.ec2.model.AllocateAddressResponse;import software.amazon.awssdk.services.ec2.model.AssociateAddressRequest;import software.amazon.awssdk.services.ec2.model.AssociateAddressResponse;import software.amazon.awssdk.services.ec2.model.DomainType;

コード

Ec2Client ec2 = Ec2Client.create();

AllocateAddressRequest allocate_request = AllocateAddressRequest.builder() .domain(DomainType.VPC) .build();

AllocateAddressResponse allocate_response = ec2.allocateAddress(allocate_request);

String allocation_id = allocate_response.allocationId();

AssociateAddressRequest associate_request = AssociateAddressRequest.builder() .instanceId(instance_id) .allocationId(allocation_id) .build();

AssociateAddressResponse associate_response = ec2.associateAddress(associate_request);

GitHub で完全な例をご覧ください。

Elastic IP アドレスの説明アカウントに割り当てられた Elastic IP アドレスを一覧表示するには Ec2Client の describeAddressesメソッドを呼び出します。これにより DescribeAddressesResponse が返されます。このオブジェクトを使用して、アカウントの Elastic IP アドレスを表す Address オブジェクトのリストを取得できます。

インポート

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.Address;import software.amazon.awssdk.services.ec2.model.DescribeAddressesResponse;

コード

Ec2Client ec2 = Ec2Client.create();

DescribeAddressesResponse response = ec2.describeAddresses();

for(Address address : response.addresses()) { System.out.printf( "Found address with public IP %s, " + "domain %s, " + "allocation id %s " + "and NIC id %s", address.publicIp(), address.domain(), address.allocationId(), address.networkInterfaceId());

58

AWS SDK for Java バージョン 2 開発者ガイドリージョンとアベイラビリティーゾーンの使用

}

GitHub で完全な例をご覧ください。

Elastic IP アドレスを解放するElastic IP アドレスを解放するには、Ec2Client の releaseAddress メソッドを呼び出して、解放するElastic IP アドレスのアロケーション ID を含む ReleaseAddressRequest を渡します。

インポート

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.ReleaseAddressRequest;import software.amazon.awssdk.services.ec2.model.ReleaseAddressResponse;

コード

Ec2Client ec2 = Ec2Client.create();

ReleaseAddressRequest request = ReleaseAddressRequest.builder() .allocationId(alloc_id).build();

ReleaseAddressResponse response = ec2.releaseAddress(request);

Elastic IP アドレスを解放すると、その IP アドレスは AWS IP アドレスプールに解放され、後で使用できないことがあります。DNS レコード、およびそのアドレスと通信するすべてのサーバーまたはデバイスを更新してください。

EC2-Classic またはデフォルト VPC を使用している場合、Elastic IP アドレスを解放すると関連付けられているすべてのインスタンスからの関連付けが自動的に解除されます。Elastic IP アドレスを開放せずに関連付けを解除するには、Ec2Client の disassociateAddress メソッドを使用します。

デフォルト以外の VPC を使用している場合は、開放しようとする前に必ず disassociateAddress を使用して Elastic IP アドレスの関連付けを解除する必要があります。そうでない場合は、Amazon EC2 からエラー (InvalidIPAddress.InUse) が返ります。

GitHub で完全な例をご覧ください。

詳細情報• Amazon EC2 User Guide for Linux Instances の「Elastic IP アドレス」• Amazon EC2 API Reference の「AllocateAddress」• Amazon EC2 API Reference の「DescribeAddresses」• Amazon EC2 API Reference の「ReleaseAddress」

リージョンとアベイラビリティーゾーンの使用リージョンの詳細を表示するアカウントに使用可能なリージョンを一覧表示するには、Ec2Client の describeRegions メソッドを呼び出します。これにより DescribeRegionsResponse が返されます。返されたオブジェクトの regions メソッドを呼び出して、各リージョンを表す Region オブジェクトの一覧を取得します。

59

AWS SDK for Java バージョン 2 開発者ガイドリージョンとアベイラビリティーゾーンの使用

インポート

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.DescribeRegionsResponse;import software.amazon.awssdk.services.ec2.model.Region;import software.amazon.awssdk.services.ec2.model.AvailabilityZone;import software.amazon.awssdk.services.ec2.model.DescribeAvailabilityZonesResponse;

コード

DescribeRegionsResponse regions_response = ec2.describeRegions();

for(Region region : regions_response.regions()) { System.out.printf( "Found region %s " + "with endpoint %s", region.regionName(), region.endpoint()); System.out.println();

GitHub で完全な例をご覧ください。

アベイラビリティーゾーンの詳細を表示するアカウントに使用可能な各アベイラビリティーゾーンを一覧表示するには、Ec2Clientの describeAvailabilityZones メソッドを呼び出します。これによりDescribeAvailabilityZonesResponse が返されます。それの availabilityZones メソッドを呼び出して、各アベイラビリティーゾーンを表す AvailabilityZone オブジェクトの一覧を取得します。

インポート

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.DescribeRegionsResponse;import software.amazon.awssdk.services.ec2.model.Region;import software.amazon.awssdk.services.ec2.model.AvailabilityZone;import software.amazon.awssdk.services.ec2.model.DescribeAvailabilityZonesResponse;

コード

Ec2Client を作成します。

Ec2Client ec2 = Ec2Client.create();

次に、describeAvailabilityZones() を呼び出し、結果を取得します。

DescribeAvailabilityZonesResponse zones_response = ec2.describeAvailabilityZones();

for(AvailabilityZone zone : zones_response.availabilityZones()) { System.out.printf( "Found availability zone %s " + "with status %s " + "in region %s", zone.zoneName(), zone.state(), zone.regionName());

60

AWS SDK for Java バージョン 2 開発者ガイドAmazon EC2 のキーペアでの作業

System.out.println();

GitHub で完全な例を参照してください。

アカウントの詳細の表示アカウントの詳細を表示するには、Ec2Client の describeAccountAttributes メソッドを呼び出します。このメソッドは、DescribeAccountAttributesResponse オブジェクトを返します。AccountAttribute オブジェクトのリストを取得するには、このオブジェクトの accountAttributes メソッドを呼び出します。リストを反復処理して、AccountAttribute オブジェクトを取得できます。

アカウントの属性値は、AccountAttribute オブジェクトの attributeValues メソッドを呼び出すことで取得できます。このメソッドは、AccountAttributeValue オブジェクトのリストを返します。この 2 番目のリストを反復処理して、属性の値を表示できます (次のコード例を参照)。

インポート

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.DescribeRegionsResponse;import software.amazon.awssdk.services.ec2.model.Region;import software.amazon.awssdk.services.ec2.model.AvailabilityZone;import software.amazon.awssdk.services.ec2.model.DescribeAvailabilityZonesResponse;

コード

DescribeRegionsResponse regions_response = ec2.describeRegions();

for(Region region : regions_response.regions()) { System.out.printf( "Found region %s " + "with endpoint %s", region.regionName(), region.endpoint()); System.out.println();

GitHub で完全な例をご覧ください。

詳細情報• Amazon EC2 User Guide for Linux Instances の「リージョンとアベイラビリティーゾーン」• Amazon EC2 API Reference の「DescribeRegions」• Amazon EC2 API Reference の「DescribeAvailabilityZones」

Amazon EC2 のキーペアでの作業キーペアを作成するキーペアを作成するには、そのキーの名前を含む CreateKeyPairRequest を使用して Ec2Client のcreateKeyPair メソッドを呼び出します。

インポート

61

AWS SDK for Java バージョン 2 開発者ガイドAmazon EC2 のキーペアでの作業

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.CreateKeyPairRequest;import software.amazon.awssdk.services.ec2.model.CreateKeyPairResponse;

コード

Ec2Client ec2 = Ec2Client.create();

CreateKeyPairRequest request = CreateKeyPairRequest.builder() .keyName(key_name).build();

CreateKeyPairResponse response = ec2.createKeyPair(request);

GitHub で完全な例をご覧ください。

キーペアの詳細を表示するキーペアを一覧表示したりキーペアに関する情報を入手するには、Ec2Client の describeKeyPairs メソッドを呼び出します。これにより DescribeKeyPairsResponse が返されます。KeyPairInfo オブジェクトのリストを返す keyPairs メソッドを呼び出し、このオブジェクトを渡すことで、キーペアのリストにアクセスできます。

インポート

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.DescribeKeyPairsResponse;import software.amazon.awssdk.services.ec2.model.KeyPairInfo;

コード

Ec2Client ec2 = Ec2Client.create();

DescribeKeyPairsResponse response = ec2.describeKeyPairs();

for(KeyPairInfo key_pair : response.keyPairs()) { System.out.printf( "Found key pair with name %s " + "and fingerprint %s", key_pair.keyName(), key_pair.keyFingerprint()); System.out.println("");}

GitHub で完全な例をご覧ください。

キーペアを削除するキーペアを削除するには、Ec2Client の deleteKeyPair メソッドを呼び出し、それに削除するキーペアの名前を含む DeleteKeyPairRequest を渡します。

インポート

import software.amazon.awssdk.services.ec2.Ec2Client;

62

AWS SDK for Java バージョン 2 開発者ガイドAmazon EC2 でのセキュリティグループの使用

import software.amazon.awssdk.services.ec2.model.DeleteKeyPairRequest;import software.amazon.awssdk.services.ec2.model.DeleteKeyPairResponse;

コード

Ec2Client ec2 = Ec2Client.create();

DeleteKeyPairRequest request = DeleteKeyPairRequest.builder() .keyName(key_name) .build();

DeleteKeyPairResponse response = ec2.deleteKeyPair(request);

GitHub で完全な例をご覧ください。

詳細情報• Amazon EC2 User Guide for Linux Instances の「Amazon EC2 のキーペア」• Amazon EC2 API Reference の「CreateKeyPair」• Amazon EC2 API Reference の「DescribeKeyPairs」• Amazon EC2 API Reference の「DeleteKeyPair」

Amazon EC2 でのセキュリティグループの使用セキュリティグループを作成するセキュリティグループを作成するには、そのキーの名前を含む CreateSecurityGroupRequest を使用してEc2Client の createSecurityGroup メソッドを呼び出します。

インポート

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.CreateSecurityGroupRequest;import software.amazon.awssdk.services.ec2.model.CreateSecurityGroupResponse;import software.amazon.awssdk.services.ec2.model.AuthorizeSecurityGroupIngressRequest;import software.amazon.awssdk.services.ec2.model.AuthorizeSecurityGroupIngressResponse;import software.amazon.awssdk.services.ec2.model.IpPermission;import software.amazon.awssdk.services.ec2.model.IpRange;

コード

CreateSecurityGroupRequest create_request = CreateSecurityGroupRequest.builder() .groupName(group_name) .description(group_desc) .vpcId(vpc_id) .build();

CreateSecurityGroupResponse create_response = ec2.createSecurityGroup(create_request);

GitHub で完全な例をご覧ください。

63

AWS SDK for Java バージョン 2 開発者ガイドAmazon EC2 でのセキュリティグループの使用

セキュリティグループを設定するセキュリティグループは、Amazon EC2 インスタンスへのインバウンド (ingress) とアウトバウンド(egress) トラフィックの両方を制御できます。

セキュリティグループに Ingress ルールを追加するには、Ec2Client のauthorizeSecurityGroupIngress メソッドを使用して、セキュリティグループの名前とAuthorizeSecurityGroupIngressRequest オブジェクト内で割り当てるアクセスルール (IpPermission) を指定します。以下の例では、セキュリティグループへの IP のアクセス許可の追加方法を説明します。

インポート

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.CreateSecurityGroupRequest;import software.amazon.awssdk.services.ec2.model.CreateSecurityGroupResponse;import software.amazon.awssdk.services.ec2.model.AuthorizeSecurityGroupIngressRequest;import software.amazon.awssdk.services.ec2.model.AuthorizeSecurityGroupIngressResponse;import software.amazon.awssdk.services.ec2.model.IpPermission;import software.amazon.awssdk.services.ec2.model.IpRange;

コード

まず、Ec2Client を作成します。

Ec2Client ec2 = Ec2Client.create();

次に、Ec2Client の authorizeSecurityGroupIngress メソッドを使用します。

IpRange ip_range = IpRange.builder() .cidrIp("0.0.0.0/0").build();

IpPermission ip_perm = IpPermission.builder() .ipProtocol("tcp") .toPort(80) .fromPort(80) .ipRanges(ip_range) // .ipv4Ranges(ip_range) .build();

IpPermission ip_perm2 = IpPermission.builder() .ipProtocol("tcp") .toPort(22) .fromPort(22) .ipRanges(ip_range) .build();

AuthorizeSecurityGroupIngressRequest auth_request = AuthorizeSecurityGroupIngressRequest.builder() .groupName(group_name) .ipPermissions(ip_perm, ip_perm2) .build();

AuthorizeSecurityGroupIngressResponse auth_response = ec2.authorizeSecurityGroupIngress(auth_request);

セキュリティグループに egress ルールを追加するには、同様のデータを Ec2Client のauthorizeSecurityGroupEgress メソッドに AuthorizeSecurityGroupEgressRequest で指定します。

64

AWS SDK for Java バージョン 2 開発者ガイドAmazon EC2 でのセキュリティグループの使用

GitHub で完全な例をご覧ください。

セキュリティグループについて説明するセキュリティグループについて記述、またはそれらに関する情報を収集するには、Ec2Client のdescribeSecurityGroups メソッドを呼び出します。これにより DescribeSecurityGroupsResponse が返されます。SecurityGroup オブジェクトのリストを返す securityGroups メソッドを呼び出し、このオブジェクトを渡すことで、セキュリティグループのリストにアクセスできます。

インポート

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.DescribeSecurityGroupsRequest;import software.amazon.awssdk.services.ec2.model.DescribeSecurityGroupsResponse;import software.amazon.awssdk.services.ec2.model.SecurityGroup;

コード

Ec2Client ec2 = Ec2Client.create();

DescribeSecurityGroupsRequest request = DescribeSecurityGroupsRequest.builder() .groupIds(group_id).build();

DescribeSecurityGroupsResponse response = ec2.describeSecurityGroups(request);

GitHub で完全な例をご覧ください。

セキュリティグループの削除セキュリティグループを削除するには、Ec2Client の deleteSecurityGroup メソッドを呼び出し、それに削除するセキュリティグループの ID を含む DeleteSecurityGroupRequest を渡します。

インポート

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.DeleteSecurityGroupRequest;import software.amazon.awssdk.services.ec2.model.DeleteSecurityGroupResponse;

コード

Ec2Client ec2 = Ec2Client.create();

DeleteSecurityGroupRequest request = DeleteSecurityGroupRequest.builder() .groupId(group_id) .build();

DeleteSecurityGroupResponse response = ec2.deleteSecurityGroup(request);

GitHub で完全な例をご覧ください。

65

AWS SDK for Java バージョン 2 開発者ガイドAWS Identity and Access Management (IAM) の例

詳細情報• Amazon EC2 User Guide for Linux Instances の「Amazon EC2 セキュリティグループ」• Amazon EC2 User Guide for Linux Instances の「Linux インスタンス用の受信トラフィックの認可」• Amazon EC2 API Reference の「CreateSecurityGroup」• Amazon EC2 API Reference の「DescribeSecurityGroups」• Amazon EC2 API Reference の「DeleteSecurityGroup」• Amazon EC2 API Reference の「AuthorizeSecurityGroupIngress」

AWS SDK for Java を使用した IAM の例このセクションでは、AWS SDK for Java 2.0 を使用して IAM をプログラムする例を示します。

AWS Identity and Access Management (IAM) を利用すると、AWS のサービスおよびリソースに対するお客様のユーザーのアクセスを安全にコントロールすることができます。IAM を使用すると、AWS のユーザーとグループを作成および管理し、アクセス許可を使用して AWS リソースへのアクセスを許可および拒否できます。IAM の詳細なガイドについては、「IAM ユーザーガイド」を参照してください。

以下の例には、各手法を示すのに必要なコードのみが含まれます。完全なサンプルコードは GitHub で入手できます。そこから、単一のソースファイルをダウンロードするかリポジトリをローカルにクローン作成して、ビルドし実行するためのすべての例を取得できます。

トピック• IAM アクセスキーの管理 (p. 66)• IAM ユーザーの管理 (p. 70)• IAM アカウントエイリアスの使用 (p. 72)• IAM ポリシーの使用 (p. 74)• IAM サーバー証明書の使用 (p. 78)

IAM アクセスキーの管理アクセスキーの作成IAM アクセスキーを作成するには、IamClient の createAccessKey メソッドを呼び出し、CreateAccessKeyRequest オブジェクトを渡します。

Note

IAM はグローバルサービスであるため、IamClient が呼び出せるように、リージョンをAWS_GLOBAL を設定する必要があります。

インポート

import software.amazon.awssdk.services.iam.model.CreateAccessKeyRequest;import software.amazon.awssdk.services.iam.model.CreateAccessKeyResponse;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

コード

Region region = Region.AWS_GLOBAL;

66

AWS SDK for Java バージョン 2 開発者ガイドIAM アクセスキーの管理

IamClient iam = IamClient.builder().region(region).build();

CreateAccessKeyRequest request = CreateAccessKeyRequest.builder() .userName(user).build();

CreateAccessKeyResponse response = iam.createAccessKey(request);

System.out.println("Created access key: " + response.accessKey());

GitHub で完全な例をご覧ください。

アクセスキーの一覧表示特定のユーザーのアクセスキーを一覧表示するには、キーの一覧表示の対象となるユーザー名を含むListAccessKeysRequest オブジェクトを作成し、それを IamClient の listAccessKeys メソッドに渡します。

Note

ユーザー名を listAccessKeys に渡さない場合は、リクエストに署名した AWS アカウントに関連付けられているアクセスキーの一覧表示を試行します。

インポート

import software.amazon.awssdk.services.iam.model.AccessKeyMetadata;import software.amazon.awssdk.services.iam.model.ListAccessKeysRequest;import software.amazon.awssdk.services.iam.model.ListAccessKeysResponse;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

コード

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

boolean done = false;String new_marker = null;

while (!done) { ListAccessKeysResponse response;

if(new_marker == null) { ListAccessKeysRequest request = ListAccessKeysRequest.builder() .userName(username).build(); response = iam.listAccessKeys(request); } else { ListAccessKeysRequest request = ListAccessKeysRequest.builder() .userName(username) .marker(new_marker).build(); response = iam.listAccessKeys(request); }

for (AccessKeyMetadata metadata : response.accessKeyMetadata()) { System.out.format("Retrieved access key %s", metadata.accessKeyId()); }

if (!response.isTruncated()) {

67

AWS SDK for Java バージョン 2 開発者ガイドIAM アクセスキーの管理

done = true; } else { new_marker = response.marker(); }}

listAccessKeys の結果はページ分割されます (デフォルトで最大 1 回の呼び出しごとに 100レコード)。返された ListAccessKeysResponse オブジェクトの isTruncated を呼び出して、クエリで返される結果を少なくできるかどうかを確認できます。利用可能な場合は、marker でListAccessKeysResponse を呼び出して、新しいリクエストを作成するときに使用します。この新しいリクエストを listAccessKeys の次の呼び出しで使用します。

GitHub で完全な例をご覧ください。

アクセスキーの最終使用時刻の取得アクセスキーが最後に使用された時刻を取得するには、IamClient の getAccessKeyLastUsed メソッドを呼び出し、そのアクセスキーの ID を含む GetAccessKeyLastUsedRequest オブジェクトを渡します。

返された GetAccessKeyLastUsedResponse オブジェクトを使用して、キーの最終使用時刻を取得できます。

インポート

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;import software.amazon.awssdk.services.iam.model.GetAccessKeyLastUsedRequest;import software.amazon.awssdk.services.iam.model.GetAccessKeyLastUsedResponse;

コード

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

GetAccessKeyLastUsedRequest request = GetAccessKeyLastUsedRequest.builder() .accessKeyId(access_id).build();

GetAccessKeyLastUsedResponse response = iam.getAccessKeyLastUsed(request);

System.out.println("Access key was last used at: " + response.accessKeyLastUsed().lastUsedDate());

GitHub で完全な例をご覧ください。

アクセスキーのアクティブ化や非アクティブ化アクセスキーをアクティブ化または非アクティブ化するには、UpdateAccessKeyRequest オブジェクトを作成し、アクセスキー ID、オプションでユーザー名、また目的のステータスを渡して、次にそのリクエストオブジェクトを IamClient の updateAccessKey メソッドに渡します。

インポート

import software.amazon.awssdk.services.iam.model.StatusType;import software.amazon.awssdk.services.iam.model.UpdateAccessKeyRequest;import software.amazon.awssdk.services.iam.model.UpdateAccessKeyResponse;

import software.amazon.awssdk.regions.Region;

68

AWS SDK for Java バージョン 2 開発者ガイドIAM アクセスキーの管理

import software.amazon.awssdk.services.iam.IamClient;

コード

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

UpdateAccessKeyRequest request = UpdateAccessKeyRequest.builder() .accessKeyId(access_id) .userName(username) .status(statusType) .build();

UpdateAccessKeyResponse response = iam.updateAccessKey(request);

GitHub で完全な例をご覧ください。

アクセスキーの削除アクセスキーを完全に削除するには、IamClient の deleteKey メソッドを呼び出し、それにアクセスキーの ID とユーザー名を含む DeleteAccessKeyRequest を渡します。

Note

削除してしまうと、キーは取得することも使用することもできなくなります。後で再度アクティブ化できるようキーを一時的に非アクティブ化するには、代わりに updateAccessKey (p. 68)メソッドを使用します。

インポート

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;import software.amazon.awssdk.services.iam.model.DeleteAccessKeyRequest;import software.amazon.awssdk.services.iam.model.DeleteAccessKeyResponse;

コード

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

DeleteAccessKeyRequest request = DeleteAccessKeyRequest.builder() .accessKeyId(access_key) .userName(username).build();

DeleteAccessKeyResponse response = iam.deleteAccessKey(request);

GitHub で完全な例をご覧ください。

詳細情報• IAM API Reference の「CreateAccessKey」• IAM API Reference の「ListAccessKeys」• IAM API Reference の「GetAccessKeyLastUsed」• IAM API Reference の「UpdateAccessKey」• IAM API Reference の「DeleteAccessKey」

69

AWS SDK for Java バージョン 2 開発者ガイドIAM ユーザーの管理

IAM ユーザーの管理ユーザーの作成新しい IAM ユーザーを作成するには、ユーザー名を含む CreateUserRequest オブジェクトを IamClient のcreateUser メソッドに渡します。

インポート

import software.amazon.awssdk.services.iam.model.CreateUserRequest;import software.amazon.awssdk.services.iam.model.CreateUserResponse;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

コード

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

CreateUserRequest request = CreateUserRequest.builder() .userName(username).build();

CreateUserResponse response = iam.createUser(request);

System.out.println("Successfully created user: " + response.user().userName());

GitHub で完全な例をご覧ください。

ユーザーの一覧表示アカウントの IAM ユーザーを一覧表示するには、新しい ListUsersRequest を作成して、それを IamClientの listUsers メソッドに渡します。返された ListUsersResponse オブジェクトの users を呼び出すことで、ユーザーのリストを取得できます。

listUsers によって返されたユーザーのリストはページ分割されます。取得できる結果がさらにあることを確認するには、応答オブジェクトの isTruncated メソッドを呼び出します。true が返った場合は、応答オブジェクトの marker() メソッドを呼び出します。マーカー値を使用して、新しいリクエストオブジェクトを作成します。次に、listUsers メソッドを新しいリクエストで再度呼び出します。

インポート

import software.amazon.awssdk.services.iam.model.ListUsersRequest;import software.amazon.awssdk.services.iam.model.ListUsersResponse;import software.amazon.awssdk.services.iam.model.User;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

コード

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

70

AWS SDK for Java バージョン 2 開発者ガイドIAM ユーザーの管理

boolean done = false;String new_marker = null;

while(!done) { ListUsersResponse response;

if (new_marker == null) { ListUsersRequest request = ListUsersRequest.builder().build(); response = iam.listUsers(request); } else { ListUsersRequest request = ListUsersRequest.builder() .marker(new_marker).build(); response = iam.listUsers(request); }

for(User user : response.users()) { System.out.format("Retrieved user %s", user.userName()); }

if(!response.isTruncated()) { done = true; } else { new_marker = response.marker(); }}

GitHub で完全な例をご覧ください。

ユーザーの更新ユーザーを更新するには、IamClient オブジェクトの updateUser メソッドを呼び出し、それが取得するUpdateUserRequest オブジェクトを使用して、ユーザーの名前またはパスを変更します。

インポート

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;import software.amazon.awssdk.services.iam.model.UpdateUserRequest;import software.amazon.awssdk.services.iam.model.UpdateUserResponse;

コード

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

UpdateUserRequest request = UpdateUserRequest.builder() .userName(cur_name) .newUserName(new_name).build();

UpdateUserResponse response = iam.updateUser(request);

GitHub で完全な例をご覧ください。

ユーザーの削除ユーザーを削除するには、UpdateUserRequest オブジェクトに削除するユーザー名を設定して、IamClientの deleteUser リクエストを呼び出します。

71

AWS SDK for Java バージョン 2 開発者ガイドIAM アカウントエイリアスの使用

インポート

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;import software.amazon.awssdk.services.iam.model.DeleteConflictException;import software.amazon.awssdk.services.iam.model.DeleteUserRequest;

コード

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

DeleteUserRequest request = DeleteUserRequest.builder() .userName(username).build();

try { iam.deleteUser(request);} catch (DeleteConflictException e) { System.out.println("Unable to delete user. Verify user is not" + " associated with any resources"); throw e;}

GitHub で完全な例をご覧ください。

詳細情報• IAM User Guide の「IAM ユーザー」• IAM User Guide の「IAM ユーザーの管理」• IAM API Reference の「CreateUser」• IAM API Reference の「ListUsers」• IAM API Reference の「UpdateUser」• IAM API Reference の「DeleteUser」

IAM アカウントエイリアスの使用サインインページの URL に、AWS アカウント ID ではなく会社名または他の分かりやすい識別子を含める場合は、AWS アカウントのエイリアスを作成できます。

Note

AWS ではアカウントごとに 1 つのアカウントのエイリアスのみがサポートされます。

アカウントエイリアスの作成アカウントエイリアスを作成するには、そのエイリアス名が含まれる CreateAccountAliasRequest オブジェクトを使用して IamClient の createAccountAlias メソッドを呼び出します。

インポート

import software.amazon.awssdk.services.iam.model.CreateAccountAliasRequest;import software.amazon.awssdk.services.iam.model.CreateAccountAliasResponse;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

72

AWS SDK for Java バージョン 2 開発者ガイドIAM アカウントエイリアスの使用

コード

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

CreateAccountAliasRequest request = CreateAccountAliasRequest.builder() .accountAlias(alias).build();

CreateAccountAliasResponse response = iam.createAccountAlias(request);

System.out.println("Successfully created account alias: " + alias);

GitHub で完全な例をご覧ください。

アカウントエイリアスを一覧表示するアカウントエイリアスを一覧表示するには、IamClient の listAccountAliases メソッドを呼び出します。

Note

返された ListAccountAliasesResponse では、他の AWS SDK for Java list メソッドと同じisTruncated および marker メソッドがサポートされますが、AWS アカウントで使用できるアカウントエイリアスは 1 つのみです。

インポート

import software.amazon.awssdk.services.iam.model.ListAccountAliasesResponse;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

コード

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

ListAccountAliasesResponse response = iam.listAccountAliases();

for (String alias : response.accountAliases()) { System.out.printf("Retrieved account alias %s", alias);}

GitHub で完全な例を参照してください。

アカウントエイリアスを削除するアカウントエイリアスを削除するには、IamClient の deleteAccountAlias メソッドを呼び出します。アカウントエイリアスを削除する場合は、DeleteAccountAliasRequest オブジェクトを使用してその名前を指定する必要があります。

インポート

import software.amazon.awssdk.services.iam.model.DeleteAccountAliasRequest;import software.amazon.awssdk.services.iam.model.DeleteAccountAliasResponse;

73

AWS SDK for Java バージョン 2 開発者ガイドIAM ポリシーの使用

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

コード

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

DeleteAccountAliasRequest request = DeleteAccountAliasRequest.builder() .accountAlias(alias).build();

DeleteAccountAliasResponse response = iam.deleteAccountAlias(request);

GitHub で完全な例をご覧ください。

詳細情報• IAM User Guide の「AWS アカウント ID とそのエイリアス」• IAM API Reference の「CreateAccountAlias」• IAM API Reference の「ListAccountAliases」• IAM API Reference の「DeleteAccountAlias」

IAM ポリシーの使用ポリシーの作成新しいポリシーを作成するには、CreatePolicyRequest 内のポリシーの名前および JSON 形式のポリシードキュメントを IamClient の createPolicy メソッドに渡します。

インポート

import software.amazon.awssdk.services.iam.model.CreatePolicyRequest;import software.amazon.awssdk.services.iam.model.CreatePolicyResponse;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

コード

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

CreatePolicyRequest request = CreatePolicyRequest.builder() .policyName(policy_name) .policyDocument(POLICY_DOCUMENT).build();

CreatePolicyResponse response = iam.createPolicy(request);

System.out.println("Successfully created policy: " + response.policy().policyName());

IAM ポリシードキュメントは文書による十分な裏づけのある構文を持つ JSON 文字列です。DynamoDBに特定のリクエストをするためのアクセスを提供する例を以下に示します。

74

AWS SDK for Java バージョン 2 開発者ガイドIAM ポリシーの使用

ic static final String POLICY_DOCUMENT ="{" +" \"Version\": \"2012-10-17\"," +" \"Statement\": [" +" {" +" \"Effect\": \"Allow\"," +" \"Action\": \"logs:CreateLogGroup\"," +" \"Resource\": \"%s\"" +" }," +" {" +" \"Effect\": \"Allow\"," +" \"Action\": [" +" \"dynamodb:DeleteItem\"," +" \"dynamodb:GetItem\"," +" \"dynamodb:PutItem\"," +" \"dynamodb:Scan\"," +" \"dynamodb:UpdateItem\"" +" ]," +" \"Resource\": \"RESOURCE_ARN\"" +" }" +" ]" +"}";

GitHub で完全な例をご覧ください。

ポリシーの取得既存のポリシーを取得するには、IamClient の getPolicy メソッドを呼び出して、GetPolicyRequest オブジェクト内のポリシーの ARN を渡します。

インポート

import software.amazon.awssdk.services.iam.model.GetPolicyRequest;import software.amazon.awssdk.services.iam.model.GetPolicyResponse;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

コード

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

GetPolicyRequest request = GetPolicyRequest.builder() .policyArn(policy_arn).build();

GetPolicyResponse response = iam.getPolicy(request);

GitHub で完全な例をご覧ください。

ロールポリシーのアタッチポリシーを IAM ロールにアタッチするには、IamClient の attachRolePolicy メソッドを呼び出し、それに AttachRolePolicyRequest 内のロール名およびポリシー ARN を渡します。

インポート

import software.amazon.awssdk.regions.Region;

75

AWS SDK for Java バージョン 2 開発者ガイドIAM ポリシーの使用

import software.amazon.awssdk.services.iam.IamClient;import software.amazon.awssdk.services.iam.model.AttachRolePolicyRequest;import software.amazon.awssdk.services.iam.model.AttachedPolicy;import software.amazon.awssdk.services.iam.model.ListAttachedRolePoliciesRequest;import software.amazon.awssdk.services.iam.model.ListAttachedRolePoliciesResponse;import java.util.ArrayList;import java.util.List;import java.util.stream.Collectors;

コード

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

AttachRolePolicyRequest attach_request = AttachRolePolicyRequest.builder() .roleName(role_name) .policyArn(POLICY_ARN).build();

iam.attachRolePolicy(attach_request);

GitHub で完全な例をご覧ください。

アタッチ済みロールポリシーの一覧表示ロールのアタッチ済みポリシーを一覧表示するには、IamClient の listAttachedRolePoliciesメソッドを呼び出します。このメソッドは、ポリシーを一覧表示するロール名を含むListAttachedRolePoliciesRequest オブジェクトを受け取ります。

返された ListAttachedRolePoliciesResponse オブジェクトの getAttachedPolicies を呼び出して、アタッチ済みポリシーのリストを取得します。結果は切り捨てられる場合があります。ListAttachedRolePoliciesResponse オブジェクトの isTruncated メソッドが trueを返す場合は、ListAttachedRolePoliciesResponse オブジェクトの marker メソッドを呼び出します。返るマーカーを使用して新しいリクエストを作成します。また、それを使用してlistAttachedRolePolicies を再び呼び出し、結果の次のバッチを取得します。

インポート

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;import software.amazon.awssdk.services.iam.model.AttachRolePolicyRequest;import software.amazon.awssdk.services.iam.model.AttachedPolicy;import software.amazon.awssdk.services.iam.model.ListAttachedRolePoliciesRequest;import software.amazon.awssdk.services.iam.model.ListAttachedRolePoliciesResponse;import java.util.ArrayList;import java.util.List;import java.util.stream.Collectors;

コード

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

List<AttachedPolicy> matching_policies = new ArrayList<>();

boolean done = false;String new_marker = null;

76

AWS SDK for Java バージョン 2 開発者ガイドIAM ポリシーの使用

while(!done) {

ListAttachedRolePoliciesResponse response;

if (new_marker == null) { ListAttachedRolePoliciesRequest request = ListAttachedRolePoliciesRequest.builder() .roleName(role_name).build(); response = iam.listAttachedRolePolicies(request); } else { ListAttachedRolePoliciesRequest request = ListAttachedRolePoliciesRequest.builder() .roleName(role_name) .marker(new_marker).build(); response = iam.listAttachedRolePolicies(request); }

matching_policies.addAll( response.attachedPolicies() .stream() .filter(p -> p.policyName().equals(role_name)) .collect(Collectors.toList()));

if(!response.isTruncated()) { done = true; } else { new_marker = response.marker(); }}

if (matching_policies.size() > 0) { System.out.println(role_name + " policy is already attached to this role."); return;}

GitHub で完全な例をご覧ください。

ロールポリシーのデタッチロールからポリシーをデタッチするには、IamClient の detachRolePolicy メソッドを呼び出し、それに DetachRolePolicyRequest 内のロール名およびポリシー ARN を渡します。

インポート

import software.amazon.awssdk.services.iam.model.DetachRolePolicyRequest;import software.amazon.awssdk.services.iam.model.DetachRolePolicyResponse;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

コード

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

DetachRolePolicyRequest request = DetachRolePolicyRequest.builder()

77

AWS SDK for Java バージョン 2 開発者ガイドIAM サーバー証明書の使用

.roleName(role_name) .policyArn(policy_arn).build();

DetachRolePolicyResponse response = iam.detachRolePolicy(request);

GitHub で完全な例をご覧ください。

詳細情報• IAM User Guide の「IAM ポリシーの概要」。• IAM User Guide の「AWS IAM ポリシーのリファレンス」。• IAM API Reference の「CreatePolicy」• IAM API Reference の「GetPolicy」• IAM API Reference の「AttachRolePolicy」• IAM API Reference の「ListAttachedRolePolicies」• IAM API Reference の「DetachRolePolicy」

IAM サーバー証明書の使用ウェブサイトまたは AWS のアプリケーションへの HTTPS 接続を有効にするには、SSL/TLS サーバー証明書が必要です。AWS Certificate Manager から提供されたサーバー証明書、または外部プロバイダーから入手したサーバー証明書を使用できます。

ACM を使用してサーバー証明書のプロビジョニング、管理、デプロイを行うことをお勧めします。ACMを使用すると、証明書をリクエストし、それを AWS リソースにデプロイして、証明書の更新を ACM で処理できます。ACM で提供される証明書は無料です。ACM の詳細については、ACM ユーザーガイドを参照してください。

サーバー証明書の取得サーバー証明書を取得するには、IamClient の getServerCertificate メソッドを呼び出し、それに証明書の名前を含む GetServerCertificateRequest を渡します。

インポート

import software.amazon.awssdk.services.iam.model.GetServerCertificateRequest;import software.amazon.awssdk.services.iam.model.GetServerCertificateResponse;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

コード

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

GetServerCertificateRequest request = GetServerCertificateRequest.builder() .serverCertificateName(cert_name).build();

GetServerCertificateResponse response = iam.getServerCertificate(request);

GitHub で完全な例をご覧ください。

78

AWS SDK for Java バージョン 2 開発者ガイドIAM サーバー証明書の使用

サーバー証明書の一覧表示サーバー証明書を一覧表示するには、ListServerCertificatesRequest を使用して IamClient のlistServerCertificates メソッドを呼び出します。これにより ListServerCertificatesResponse が返されます。

返された ListServerCertificateResponse オブジェクトの serverCertificateMetadataListメソッドを呼び出して、各証明書についての情報を取得するために使用できる ServerCertificateMetadataオブジェクトの一覧を取得します。

結果は切り捨てられる場合があります。ListServerCertificateResponse オブジェクトのisTruncated メソッドが true を返す場合は、ListServerCertificatesResponse オブジェクトのmarker メソッドを呼び出します。その後、マーカーを使用して新しいリクエストを作成します。この新しいリクエストを使用して、再度 listServerCertificates を呼び出し、結果の次のバッチを取得します。

インポート

import software.amazon.awssdk.services.iam.model.ListServerCertificatesRequest;import software.amazon.awssdk.services.iam.model.ListServerCertificatesResponse;import software.amazon.awssdk.services.iam.model.ServerCertificateMetadata;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

コード

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

boolean done = false;String new_marker = null;

while(!done) { ListServerCertificatesResponse response;

if (new_marker == null) { ListServerCertificatesRequest request = ListServerCertificatesRequest.builder().build(); response = iam.listServerCertificates(request); } else { ListServerCertificatesRequest request = ListServerCertificatesRequest.builder() .marker(new_marker).build(); response = iam.listServerCertificates(request); }

for(ServerCertificateMetadata metadata : response.serverCertificateMetadataList()) { System.out.printf("Retrieved server certificate %s", metadata.serverCertificateName()); }

if(!response.isTruncated()) { done = true; } else { new_marker = response.marker(); }

79

AWS SDK for Java バージョン 2 開発者ガイドIAM サーバー証明書の使用

}

GitHub で完全な例をご覧ください。

サーバー証明書の更新サーバー証明書の名前やパスを更新するには、IamClient の updateServerCertificate メソッドを呼び出します。サーバー証明書の現在の名前および使用する新しい名前か新しいパスのいずれかを使って設定した UpdateServerCertificateRequest オブジェクトが使用されます。

インポート

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;import software.amazon.awssdk.services.iam.model.UpdateServerCertificateRequest;import software.amazon.awssdk.services.iam.model.UpdateServerCertificateResponse;

コード

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

UpdateServerCertificateRequest request = UpdateServerCertificateRequest.builder() .serverCertificateName(cur_name) .newServerCertificateName(new_name) .build();

UpdateServerCertificateResponse response = iam.updateServerCertificate(request);

GitHub で完全な例をご覧ください。

サーバー証明書の削除サーバー証明書を削除するには、証明書の名前を含む DeleteServerCertificateRequest を使用して、IamClient の deleteServerCertificate メソッドを呼び出します。

インポート

import software.amazon.awssdk.services.iam.model.DeleteServerCertificateRequest;import software.amazon.awssdk.services.iam.model.DeleteServerCertificateResponse;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

コード

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

DeleteServerCertificateRequest request = DeleteServerCertificateRequest.builder() .serverCertificateName(cert_name).build();

DeleteServerCertificateResponse response = iam.deleteServerCertificate(request);

80

AWS SDK for Java バージョン 2 開発者ガイドAmazon Kinesis の例

GitHub で完全な例をご覧ください。

詳細情報• IAM User Guide の「サーバー証明書の使用」• IAM API Reference の「GetServerCertificate」• IAM API Reference の「ListServerCertificates」• IAM API Reference の「UpdateServerCertificate」• IAM API Reference の「DeleteServerCertificate」• ACM ユーザーガイド

AWS SDK for Java を使用した Kinesis の例このセクションでは、AWS SDK for Java 2.0 を使用して Amazon Kinesis をプログラムする例を示します。

Kinesis の詳細については、「Amazon Kinesis 開発者ガイド」を参照してください。

以下の例には、各手法を示すのに必要なコードのみが含まれます。完全なサンプルコードは GitHub で入手できます。そこから、単一のソースファイルをダウンロードするかリポジトリをローカルにクローン作成して、ビルドし実行するためのすべての例を取得できます。

トピック• Amazon Kinesis データストリームへのサブスクライブ (p. 81)

Amazon Kinesis データストリームへのサブスクライブ以下の例では、subscribeToShard メソッドを使用し、Amazon Kinesis Data Streams からデータを取得して処理する方法について説明します。Kinesis Data Streams では、強化されたファンアウト機能と低レイテンシーの HTTP/2 データ取得 API が導入されました。これにより、開発者は複数の低レイテンシーで高パフォーマンスのアプリケーションを、同じ Kinesis データストリームでより簡単に実行できます。

の設定まず、非同期 Kinesisクライアントと SubscribeToShardRequest オブジェクトを作成します。これらのオブジェクトは、Kinesis イベントにサブスクライブする次のそれぞれの例で使用されます。

インポート

import java.net.URI;import java.util.concurrent.CompletableFuture;import java.util.concurrent.atomic.AtomicInteger;import java.util.function.Supplier;

import org.reactivestreams.Subscriber;import org.reactivestreams.Subscription;import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;import software.amazon.awssdk.core.async.SdkPublisher;import software.amazon.awssdk.http.Protocol;import software.amazon.awssdk.http.SdkHttpConfigurationOption;import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient;

81

AWS SDK for Java バージョン 2 開発者ガイドAmazon Kinesis データストリームへのサブスクライブ

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.kinesis.KinesisAsyncClient;import software.amazon.awssdk.services.kinesis.model.ShardIteratorType;import software.amazon.awssdk.services.kinesis.model.SubscribeToShardEvent;import software.amazon.awssdk.services.kinesis.model.SubscribeToShardEventStream;import software.amazon.awssdk.services.kinesis.model.SubscribeToShardRequest;import software.amazon.awssdk.services.kinesis.model.SubscribeToShardResponse;import software.amazon.awssdk.services.kinesis.model.SubscribeToShardResponseHandler;import software.amazon.awssdk.utils.AttributeMap;

コード

KinesisAsyncClient client = KinesisAsyncClient.create();

SubscribeToShardRequest request = SubscribeToShardRequest.builder() .consumerARN(CONSUMER_ARN) .shardId("shardId-000000000000") .startingPosition(s -> s.type(ShardIteratorType.LATEST)).build();

ビルダーインターフェイスの使用builder メソッドを使用して、SubscribeToShardResponseHandler の作成をシンプルにできます。

ビルダーを使用して、完全なインターフェイスを実装する代わりにメソッド呼び出しで各ライフサイクルのコールバックを設定できます。

コード

private static CompletableFuture<Void> responseHandlerBuilder(KinesisAsyncClient client, SubscribeToShardRequest request) { SubscribeToShardResponseHandler responseHandler = SubscribeToShardResponseHandler .builder() .onError(t -> System.err.println("Error during stream - " + t.getMessage())) .onComplete(() -> System.out.println("All records stream successfully")) // Must supply some type of subscriber .subscriber(e -> System.out.println("Received event - " + e)) .build(); return client.subscribeToShard(request, responseHandler);}

公開者をさらに制御するには、publisherTransformer メソッドを使用して公開者をカスタマイズできます。

コード

private static CompletableFuture<Void> responseHandlerBuilder_PublisherTransformer(KinesisAsyncClient client, SubscribeToShardRequest request) { SubscribeToShardResponseHandler responseHandler = SubscribeToShardResponseHandler .builder() .onError(t -> System.err.println("Error during stream - " + t.getMessage())) .publisherTransformer(p -> p.filter(e -> e instanceof SubscribeToShardEvent).limit(100)) .subscriber(e -> System.out.println("Received event - " + e)) .build(); return client.subscribeToShard(request, responseHandler);}

GitHub で完全な例をご覧ください。

82

AWS SDK for Java バージョン 2 開発者ガイドAmazon Kinesis データストリームへのサブスクライブ

カスタムレスポンスハンドラの使用サブスクライバーとパブリッシャーの完全なコントロールのためには、SubscribeToShardResponseHandler インターフェイスを実装します。

この例では、onEventStream メソッドを実装します。これにより、公開者へのフルアクセスが許可されます。このデモでは、受信者による表示のために公開者をイベントレコードに変換する方法を示します。

コード

private static CompletableFuture<Void> responseHandlerBuilder_Classic(KinesisAsyncClient client, SubscribeToShardRequest request) { SubscribeToShardResponseHandler responseHandler = new SubscribeToShardResponseHandler() {

@Override public void responseReceived(SubscribeToShardResponse response) { System.out.println("Receieved initial response"); }

@Override public void onEventStream(SdkPublisher<SubscribeToShardEventStream> publisher) { publisher // Filter to only SubscribeToShardEvents .filter(SubscribeToShardEvent.class) // Flat map into a publisher of just records .flatMapIterable(SubscribeToShardEvent::records) // Limit to 1000 total records .limit(1000) // Batch records into lists of 25 .buffer(25) // Print out each record batch .subscribe(batch -> System.out.println("Record Batch - " + batch)); }

@Override public void complete() { System.out.println("All records stream successfully"); }

@Override public void exceptionOccurred(Throwable throwable) { System.err.println("Error during stream - " + throwable.getMessage()); }

}; return client.subscribeToShard(request, responseHandler);}

GitHub で完全な例をご覧ください。

訪問者インターフェイスの使用Visitor オブジェクトを使用して、監視する特定のイベントにサブスクライブできます。

コード

private static CompletableFuture<Void> responseHandlerBuilder_VisitorBuilder(KinesisAsyncClient client, SubscribeToShardRequest request) { SubscribeToShardResponseHandler.Visitor visitor = SubscribeToShardResponseHandler.Visitor

83

AWS SDK for Java バージョン 2 開発者ガイドAmazon Kinesis データストリームへのサブスクライブ

.builder() .onSubscribeToShardEvent(e -> System.out.println("Received subscribe to shard event " + e)) .build(); SubscribeToShardResponseHandler responseHandler = SubscribeToShardResponseHandler .builder() .onError(t -> System.err.println("Error during stream - " + t.getMessage())) .subscriber(visitor) .build(); return client.subscribeToShard(request, responseHandler);}

GitHub で完全な例をご覧ください。

カスタム受信者の使用独自のカスタム受信者を実装して、ストリームにサブスクライブすることもできます。

このコードスニペットでは、サブスクライバーの例を示しています。

コード

private static class MySubscriber implements Subscriber<SubscribeToShardEventStream> {

private Subscription subscription; private AtomicInteger eventCount = new AtomicInteger(0);

@Override public void onSubscribe(Subscription subscription) { this.subscription = subscription; this.subscription.request(1); }

@Override public void onNext(SubscribeToShardEventStream shardSubscriptionEventStream) { System.out.println("Received event " + shardSubscriptionEventStream); if (eventCount.incrementAndGet() >= 100) { // You can cancel the subscription at any time if you wish to stop receiving events. subscription.cancel(); } subscription.request(1); }

@Override public void onError(Throwable throwable) { System.err.println("Error occurred while stream - " + throwable.getMessage()); }

@Override public void onComplete() { System.out.println("Finished streaming all events"); }}

カスタムサブスクライバーを subscribe メソッドに渡して、同様に例をプレビューできます。以下のコードスニペットは、この使用例です。

コード

private static CompletableFuture<Void> responseHandlerBuilder_Subscriber(KinesisAsyncClient client, SubscribeToShardRequest request) {

84

AWS SDK for Java バージョン 2 開発者ガイドAmazon Kinesis データストリームへのサブスクライブ

SubscribeToShardResponseHandler responseHandler = SubscribeToShardResponseHandler .builder() .onError(t -> System.err.println("Error during stream - " + t.getMessage())) .subscriber(MySubscriber::new) .build(); return client.subscribeToShard(request, responseHandler);}

GitHub で完全な例をご覧ください。

サードパーティーライブラリを使用するカスタムの受信者を実装せずに、その他のサードパーティーのライブラリを使用することができます。この例では、RxJava の実装を例に挙げていますが、リアクティブなストリームのインターフェイスを実装するライブラリを使用することもできます。上記ライブラリの詳細については、「Github の RxJava wikiページ」を参照してください。

このライブラリを使用するには、依存関係として追加します。使用する POM スニペットの例を示します(Maven を使用している場合)。

POM エントリ

<target>1.8</target> </configuration> </plugin> </plugins> </build>

インポート

import java.net.URI;import java.util.concurrent.CompletableFuture;

import io.reactivex.Flowable;import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;import software.amazon.awssdk.core.async.SdkPublisher;import software.amazon.awssdk.http.Protocol;import software.amazon.awssdk.http.SdkHttpConfigurationOption;import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient;import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.kinesis.KinesisAsyncClient;import software.amazon.awssdk.services.kinesis.model.ShardIteratorType;import software.amazon.awssdk.services.kinesis.model.StartingPosition;import software.amazon.awssdk.services.kinesis.model.SubscribeToShardEvent;import software.amazon.awssdk.services.kinesis.model.SubscribeToShardRequest;import software.amazon.awssdk.services.kinesis.model.SubscribeToShardResponseHandler;import software.amazon.awssdk.utils.AttributeMap;

この例では、onEventStream ライフサイクルメソッドの RxJava を使用します。これにより、発行者へのフルアクセスが付与され、これを使用して Rx Flowable を作成できます。

コード

SubscribeToShardResponseHandler responseHandler = SubscribeToShardResponseHandler .builder() .onError(t -> System.err.println("Error during stream - " + t.getMessage())) .onEventStream(p -> Flowable.fromPublisher(p) .ofType(SubscribeToShardEvent.class) .flatMapIterable(SubscribeToShardEvent::records)

85

AWS SDK for Java バージョン 2 開発者ガイドAmazon Lambda の例

.limit(1000) .buffer(25) .subscribe(e -> System.out.println("Record batch = " + e))) .build();

publisherTransformer 発行者を指定して、Flowable メソッドを使用することもできます。次の例に示すように、Flowable 発行者を SdkPublisher に適用する必要があります。

コード

SubscribeToShardResponseHandler responseHandler = SubscribeToShardResponseHandler .builder() .onError(t -> System.err.println("Error during stream - " + t.getMessage())) .publisherTransformer(p -> SdkPublisher.adapt(Flowable.fromPublisher(p).limit(100))) .build();

GitHub で完全な例をご覧ください。

詳細情報• Amazon Kinesis API Referenceの SubscribeToShardEvent• Amazon Kinesis API Reference の SubscribeToShard

AWS SDK for Java を使用した Lambda の例このセクションでは、AWS SDK for Java 2.0 を使用して Lambda をプログラムする例を示します。

以下の例には、各手法を示すのに必要なコードのみが含まれます。完全なサンプルコードは GitHub で入手できます。そこから、単一のソースファイルをダウンロードするかリポジトリをローカルにクローン作成して、ビルドし実行するためのすべての例を取得できます。

トピック• Lambda 関数の呼び出し、一覧表示、削除 (p. 86)

Lambda 関数の呼び出し、一覧表示、削除このセクションでは、AWS SDK for Java 2.0 を使用した Lambda サービスクライアントでのプログラミングの例を示します。

トピック• Lambda 関数を呼び出します。 (p. 86)• Lambda 関数を一覧表示する (p. 87)• Lambda 関数を削除する (p. 88)

Lambda 関数を呼び出します。LambdaClient オブジェクトを作成し、その invoke メソッドを呼び出すことによって、Lambda関数を呼び出すことができます。InvokeRequest オブジェクトを作成して、Lambda 関数に渡す関数名やペイロードなどの追加情報を指定します。関数名は、arn:aws:lambda:us-west-2:555556330391:function:HelloFunction と表示されます。AWS コンソールで関数を確認することで、値を取得できます。

86

AWS SDK for Java バージョン 2 開発者ガイドサービスオペレーション

ペイロードデータを関数に渡すには、情報を含む SdkBytes オブジェクトを作成します。たとえば、次のコード例では、Lambda 関数に渡される JSON データに注意してください。

インポート

import software.amazon.awssdk.services.lambda.LambdaClient;import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.lambda.model.InvokeRequest;import software.amazon.awssdk.core.SdkBytes;import software.amazon.awssdk.services.lambda.model.InvokeResponse;import software.amazon.awssdk.services.lambda.model.ServiceException;

コード

次のコード例は、Lambda 関数を呼び出す方法を示しています。

/* Function names appear as arn:aws:lambda:us-west-2:335556330391:function:HelloFunction you can retrieve the value by looking at the function in the AWS Console */ String functionName = args[0];

InvokeResponse res = null ; try { Region region = Region.US_WEST_2; LambdaClient awsLambda = LambdaClient.builder().region(region).build();

//Need a SdkBytes instance for the payload SdkBytes payload = SdkBytes.fromUtf8String("{\n" + " \"Hello \": \"Paris\",\n" + " \"countryCode\": \"FR\"\n" + "}" ) ;

//Setup an InvokeRequest InvokeRequest request = InvokeRequest.builder() .functionName(functionName) .payload(payload) .build();

//Invoke the Lambda function res = awsLambda.invoke(request);

//Get the response String value = res.payload().asUtf8String() ;

//write out the response System.out.println(value);

} catch(ServiceException e) { e.getStackTrace(); }

Github で完全な例をご覧ください。

Lambda 関数を一覧表示するLambdaClient オブジェクトを構築し、その listFunctions メソッドを呼び出します。このメソッドは、ListFunctionsResponse オブジェクトを返します。FunctionConfiguration オブジェクトのリストを返すために、このオブジェクトの functions メソッドを呼び出すことができます。リストを反復処理して、関数に関する情報を取得できます。たとえば、次の Java コード例は、各関数名を取得する方法を示しています。

87

AWS SDK for Java バージョン 2 開発者ガイドサービスオペレーション

インポート

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.lambda.LambdaClient;import software.amazon.awssdk.services.lambda.model.ListFunctionsResponse;import software.amazon.awssdk.services.lambda.model.FunctionConfiguration;import software.amazon.awssdk.services.lambda.model.ServiceException;import java.util.Iterator;import java.util.List;

コード

次の Java コード例は、関数名のリストを取得する方法を示しています。

ListFunctionsResponse functionResult = null ; try { Region region = Region.US_WEST_2; LambdaClient awsLambda = LambdaClient.builder().region(region).build();

//Get a list of all functions functionResult = awsLambda.listFunctions();

List<FunctionConfiguration> list = functionResult.functions();

for (Iterator iter = list.iterator(); iter.hasNext(); ) { FunctionConfiguration config = (FunctionConfiguration)iter.next(); System.out.println("The function name is "+config.functionName()); } } catch(ServiceException e) { e.getStackTrace(); }

Github で完全な例をご覧ください。

Lambda 関数を削除するLambdaClient オブジェクトを構築し、その deleteFunction メソッドを呼び出します。DeleteFunctionRequest オブジェクトを作成し、deleteFunction メソッドに渡します。このオブジェクトには、削除する関数の名前などの情報が含まれています。関数名は、arn:aws:lambda:us-west-2:555556330391:function:HelloFunction と表示されます。AWS コンソールで関数を確認することで、値を取得できます。

インポート

import software.amazon.awssdk.services.lambda.LambdaClient;import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.lambda.model.DeleteFunctionRequest;import software.amazon.awssdk.services.lambda.model.ServiceException;

コード

次の Java コードは、Lambda 関数を削除する方法を示しています。

String functionName = args[0]; try { Region region = Region.US_WEST_2; LambdaClient awsLambda = LambdaClient.builder().region(region).build();

//Setup an DeleteFunctionRequest

88

AWS SDK for Java バージョン 2 開発者ガイドAmazon S3 の例

DeleteFunctionRequest request = DeleteFunctionRequest.builder() .functionName(functionName) .build();

//Invoke the Lambda deleteFunction method awsLambda.deleteFunction(request); System.out.println("Done"); } catch(ServiceException e) { e.getStackTrace(); }

Github で完全な例をご覧ください。

AWS SDK for Java を使用した Amazon S3 の例このセクションでは、AWS SDK for Java 2.0 を使用して Amazon S3 をプログラムする例を示します。

以下の例には、各手法を示すのに必要なコードのみが含まれます。完全なサンプルコードは GitHub で入手できます。そこから、単一のソースファイルをダウンロードするかリポジトリをローカルにクローン作成して、ビルドし実行するためのすべての例を取得できます。

トピック• Amazon S3 バケットの作成、一覧表示、削除 (p. 89)• Amazon S3 オブジェクトに対するオペレーションの実行 (p. 93)

Amazon S3 バケットの作成、一覧表示、削除Amazon S3 の各オブジェクト (ファイル) がバケット内に存在している必要があります。バケットは、オブジェクトの集合 (コンテナ) を表します。各バケットには、一意のキー (名前) が必要です。バケットおよびその設定に関する詳細については、Amazon S3 Developer Guide の「Amazon S3 バケットの使用」を参照してください。

Note

ベストプラクティスAmazon S3 バケットで AbortIncompleteMultipartUpload ライフサイクルルールを有効にすることをお勧めします。このルールは、開始後、指定された日数内に完了しないマルチパートアップロードを中止するよう Amazon S3 に指示できます。設定した時間制限を超えると、Amazon S3 はアップロードを中止して、不完全なアップロードデータを削除します。詳細については、Amazon S3 User Guide の「バージョニングが有効なバケットのライフサイクル設定」を参照してください。

Note

これらのコードスニペットでは、ユーザーが「AWS SDK for Java 2.0 の使用 (p. 13)」の内容を理解し、「開発用の AWS 認証情報とリージョンのセットアップ (p. 5)」の情報を使用してデフォルトの AWS 認証情報を設定していることを前提としています。

トピック• バケットの作成 (p. 90)• バケットを一覧表示する (p. 90)• バケットの削除 (p. 91)

89

AWS SDK for Java バージョン 2 開発者ガイドバケットオペレーション

バケットの作成バケット名を含む CreateBucketRequest を作成します。S3Client の createBucket メソッドに渡します。バケットの一覧表示または削除などのオペレーションを行うには、後の例に示すように、S3Client を使用します。

インポート

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration;import software.amazon.awssdk.services.s3.model.CreateBucketRequest;import software.amazon.awssdk.services.s3.model.DeleteBucketRequest;import software.amazon.awssdk.services.s3.model.ListBucketsRequest;import software.amazon.awssdk.services.s3.model.ListBucketsResponse;

コード

まず、S3Client を作成します。

Region region = Region.US_WEST_2; S3Client s3 = S3Client.builder().region(region).build();

バケットの作成リクエストを作成します。

Region region = Region.US_WEST_2;S3Client s3 = S3Client.builder().region(region).build(); String bucket = "bucket" + System.currentTimeMillis();System.out.println(bucket);

// Create bucketCreateBucketRequest createBucketRequest = CreateBucketRequest .builder() .bucket(bucket) .createBucketConfiguration(CreateBucketConfiguration.builder() .locationConstraint(region.id()) .build()) .build();s3.createBucket(createBucketRequest);

GitHub で完全な例を参照してください。

バケットを一覧表示するListBucketsRequest を作成します。S3Client の listBuckets メソッドを使用して、バケットのリストを取得します。リクエストが成功すると、ListBucketsResponse が返されます。この応答オブジェクトを使用して、バケットのリストを取得します。

インポート

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration;import software.amazon.awssdk.services.s3.model.CreateBucketRequest;import software.amazon.awssdk.services.s3.model.DeleteBucketRequest;import software.amazon.awssdk.services.s3.model.ListBucketsRequest;

90

AWS SDK for Java バージョン 2 開発者ガイドバケットオペレーション

import software.amazon.awssdk.services.s3.model.ListBucketsResponse;

コード

まず、S3Client を作成します。

Region region = Region.US_WEST_2; S3Client s3 = S3Client.builder().region(region).build();

バケットの一覧表示リクエストを作成します。

// List bucketsListBucketsRequest listBucketsRequest = ListBucketsRequest.builder().build();ListBucketsResponse listBucketsResponse = s3.listBuckets(listBucketsRequest);listBucketsResponse.buckets().stream().forEach(x -> System.out.println(x.name()));

GitHub で完全な例を参照してください。

バケットの削除Amazon S3 バケットを削除する前に、バケットが空であることを必ず確認してください。空でない場合は、エラーが返ります。バージョニングされたバケットがある場合は、このバケット内にあるバージョニングされたオブジェクトも削除する必要があります。

トピック• バケット内のオブジェクトを削除する (p. 91)• 空のバケットを削除する (p. 92)

バケット内のオブジェクトを削除するListObjectsV2Request を作成し、S3Client の listObjects メソッドを使用して、バケット内のオブジェクトのリストを取得します。次に、オブジェクトごとに deleteObject メソッドを使用して削除します。

インポート

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration;import software.amazon.awssdk.services.s3.model.CreateBucketRequest;import software.amazon.awssdk.services.s3.model.DeleteBucketRequest;import software.amazon.awssdk.services.s3.model.ListBucketsRequest;import software.amazon.awssdk.services.s3.model.ListBucketsResponse;

コード

まず、S3Client を作成します。

Region region = Region.US_WEST_2; S3Client s3 = S3Client.builder().region(region).build();

ListObjectsV2Request listObjectsV2Request = ListObjectsV2Request.builder().bucket(bucket2).build();ListObjectsV2Response listObjectsV2Response;do {

91

AWS SDK for Java バージョン 2 開発者ガイドバケットオペレーション

listObjectsV2Response = s3.listObjectsV2(listObjectsV2Request); for (S3Object s3Object : listObjectsV2Response.contents()) { s3.deleteObject(DeleteObjectRequest.builder().bucket(bucket2).key(s3Object.key()).build()); }

listObjectsV2Request = ListObjectsV2Request.builder().bucket(bucket2) .continuationToken(listObjectsV2Response.nextContinuationToken()) .build();

} while (listObjectsV2Response.isTruncated());

GitHub で完全な例を参照してください。

空のバケットを削除するバケット名を含む DeleteBucketRequest を作成し、S3Client の deleteBucket メソッドに渡します。

インポート

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration;import software.amazon.awssdk.services.s3.model.CreateBucketRequest;import software.amazon.awssdk.services.s3.model.DeleteBucketRequest;import software.amazon.awssdk.services.s3.model.ListBucketsRequest;import software.amazon.awssdk.services.s3.model.ListBucketsResponse;

コード

まず、S3Client を作成します。

ListObjectsV2Request listObjectsV2Request = ListObjectsV2Request.builder().bucket(bucket2).build();ListObjectsV2Response listObjectsV2Response;do { listObjectsV2Response = s3.listObjectsV2(listObjectsV2Request); for (S3Object s3Object : listObjectsV2Response.contents()) { s3.deleteObject(DeleteObjectRequest.builder().bucket(bucket2).key(s3Object.key()).build()); }

listObjectsV2Request = ListObjectsV2Request.builder().bucket(bucket2) .continuationToken(listObjectsV2Response.nextContinuationToken()) .build();

} while (listObjectsV2Response.isTruncated());

バケット内のすべてのオブジェクトを削除します。

ListObjectsV2Request listObjectsV2Request = ListObjectsV2Request.builder().bucket(bucket2).build();ListObjectsV2Response listObjectsV2Response;do { listObjectsV2Response = s3.listObjectsV2(listObjectsV2Request); for (S3Object s3Object : listObjectsV2Response.contents()) { s3.deleteObject(DeleteObjectRequest.builder().bucket(bucket2).key(s3Object.key()).build()); }

92

AWS SDK for Java バージョン 2 開発者ガイドオブジェクトオペレーション

listObjectsV2Request = ListObjectsV2Request.builder().bucket(bucket2) .continuationToken(listObjectsV2Response.nextContinuationToken()) .build();

} while (listObjectsV2Response.isTruncated());

GitHub で完全な例を参照してください。

Amazon S3 オブジェクトに対するオペレーションの実行Amazon S3 オブジェクトは、ファイルまたはデータの集合を表します。オブジェクトはすべて、バケット (p. 89)に格納する必要があります。

Note

ベストプラクティスAmazon S3 バケットで AbortIncompleteMultipartUpload ライフサイクルルールを有効にすることをお勧めします。このルールは、開始後、指定された日数内に完了しないマルチパートアップロードを中止するよう Amazon S3 に指示できます。設定した時間制限を超えると、Amazon S3 はアップロードを中止して、不完全なアップロードデータを削除します。詳細については、Amazon S3 User Guide の「バージョニングが有効なバケットのライフサイクル設定」を参照してください。Note

これらのコードスニペットでは、ユーザーが「AWS SDK for Java 2.0 の使用 (p. 13)」の内容を理解し、「開発用の AWS 認証情報とリージョンのセットアップ (p. 5)」の情報を使用してデフォルトの AWS 認証情報を設定していることを前提としています。

トピック• オブジェクトのアップロード (p. 93)• 複数のパートに分けてオブジェクトをアップロードする (p. 94)• オブジェクトのダウンロード (p. 95)• オブジェクトの削除 (p. 96)• オブジェクトのコピー (p. 97)• オブジェクトのリスト化 (p. 98)

オブジェクトのアップロードバケット名とキー名を含む PutObjectRequest を作成します。次に、S3Client の putObject メソッドで、このオブジェクトの内容を含む RequestBody と、PutObjectRequest オブジェクトを指定します。バケットが存在している必要があり、存在しない場合はエラーが返ります。

インポート

import java.io.IOException;import java.nio.ByteBuffer;import java.nio.file.Paths;import java.util.Random;import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;

93

AWS SDK for Java バージョン 2 開発者ガイドオブジェクトオペレーション

import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest;import software.amazon.awssdk.services.s3.model.CompletedMultipartUpload;import software.amazon.awssdk.services.s3.model.CompletedPart;import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration;import software.amazon.awssdk.services.s3.model.CreateBucketRequest;import software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest;import software.amazon.awssdk.services.s3.model.CreateMultipartUploadResponse;import software.amazon.awssdk.services.s3.model.DeleteBucketRequest;import software.amazon.awssdk.services.s3.model.DeleteObjectRequest;import software.amazon.awssdk.services.s3.model.GetObjectRequest;import software.amazon.awssdk.services.s3.model.ListObjectsV2Request;import software.amazon.awssdk.services.s3.model.ListObjectsV2Response;import software.amazon.awssdk.services.s3.model.PutObjectRequest;import software.amazon.awssdk.services.s3.model.S3Object;import software.amazon.awssdk.services.s3.model.UploadPartRequest;import software.amazon.awssdk.services.s3.paginators.ListObjectsV2Iterable;import software.amazon.awssdk.core.sync.RequestBody;import software.amazon.awssdk.core.sync.ResponseTransformer;

コード

Region region = Region.US_WEST_2;s3 = S3Client.builder().region(region).build();

String bucket = "bucket" + System.currentTimeMillis();String key = "key";

createBucket(bucket, region);

// Put Objects3.putObject(PutObjectRequest.builder().bucket(bucket).key(key) .build(), RequestBody.fromByteBuffer(getRandomByteBuffer(10_000)));

GitHub で完全な例をご覧ください。

複数のパートに分けてオブジェクトをアップロードするS3Client の createMultipartUpload メソッドを使用してアップロード ID を取得します。次に、uploadPart メソッドを使用して、各パートをアップロードします。最後に、S3Client のcompleteMultipartUpload メソッドを使用して、アップロードされたすべてのパーツをマージし、アップロードオペレーションを終了するよう Amazon S3 に指示します。

インポート

import java.io.IOException;import java.nio.ByteBuffer;import java.nio.file.Paths;import java.util.Random;import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest;import software.amazon.awssdk.services.s3.model.CompletedMultipartUpload;import software.amazon.awssdk.services.s3.model.CompletedPart;import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration;import software.amazon.awssdk.services.s3.model.CreateBucketRequest;import software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest;import software.amazon.awssdk.services.s3.model.CreateMultipartUploadResponse;import software.amazon.awssdk.services.s3.model.DeleteBucketRequest;import software.amazon.awssdk.services.s3.model.DeleteObjectRequest;

94

AWS SDK for Java バージョン 2 開発者ガイドオブジェクトオペレーション

import software.amazon.awssdk.services.s3.model.GetObjectRequest;import software.amazon.awssdk.services.s3.model.ListObjectsV2Request;import software.amazon.awssdk.services.s3.model.ListObjectsV2Response;import software.amazon.awssdk.services.s3.model.PutObjectRequest;import software.amazon.awssdk.services.s3.model.S3Object;import software.amazon.awssdk.services.s3.model.UploadPartRequest;import software.amazon.awssdk.services.s3.paginators.ListObjectsV2Iterable;import software.amazon.awssdk.core.sync.RequestBody;import software.amazon.awssdk.core.sync.ResponseTransformer;

コード

// First create a multipart upload and get upload id CreateMultipartUploadRequest createMultipartUploadRequest = CreateMultipartUploadRequest.builder() .bucket(bucketName).key(key) .build();CreateMultipartUploadResponse response = s3.createMultipartUpload(createMultipartUploadRequest);String uploadId = response.uploadId();System.out.println(uploadId);

// Upload all the different parts of the objectUploadPartRequest uploadPartRequest1 = UploadPartRequest.builder().bucket(bucketName).key(key) .uploadId(uploadId) .partNumber(1).build();String etag1 = s3.uploadPart(uploadPartRequest1, RequestBody.fromByteBuffer(getRandomByteBuffer(5 * MB))).eTag();CompletedPart part1 = CompletedPart.builder().partNumber(1).eTag(etag1).build();

UploadPartRequest uploadPartRequest2 = UploadPartRequest.builder().bucket(bucketName).key(key) .uploadId(uploadId) .partNumber(2).build();String etag2 = s3.uploadPart(uploadPartRequest2, RequestBody.fromByteBuffer(getRandomByteBuffer(3 * MB))).eTag();CompletedPart part2 = CompletedPart.builder().partNumber(2).eTag(etag2).build();

// Finally call completeMultipartUpload operation to tell S3 to merge all uploaded// parts and finish the multipart operation.CompletedMultipartUpload completedMultipartUpload = CompletedMultipartUpload.builder().parts(part1, part2).build();CompleteMultipartUploadRequest completeMultipartUploadRequest = CompleteMultipartUploadRequest.builder().bucket(bucketName).key(key).uploadId(uploadId) .multipartUpload(completedMultipartUpload).build();s3.completeMultipartUpload(completeMultipartUploadRequest);

GitHub で完全な例をご覧ください。

オブジェクトのダウンロードバケット名とキー名を含む GetObjectRequest を作成します。S3Client の getObject メソッドを使用して、GetObjectRequest オブジェクトと ResponseTransformer オブジェクトを渡します。ResponseTransformer によって、応答のコンテンツを指定のファイルまたはストリームに書き込むレスポンスハンドラーが作成されます。

次の例では、オブジェクトのコンテンツを記述するファイル名を指定します。

95

AWS SDK for Java バージョン 2 開発者ガイドオブジェクトオペレーション

インポート

import java.io.IOException;import java.nio.ByteBuffer;import java.nio.file.Paths;import java.util.Random;import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest;import software.amazon.awssdk.services.s3.model.CompletedMultipartUpload;import software.amazon.awssdk.services.s3.model.CompletedPart;import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration;import software.amazon.awssdk.services.s3.model.CreateBucketRequest;import software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest;import software.amazon.awssdk.services.s3.model.CreateMultipartUploadResponse;import software.amazon.awssdk.services.s3.model.DeleteBucketRequest;import software.amazon.awssdk.services.s3.model.DeleteObjectRequest;import software.amazon.awssdk.services.s3.model.GetObjectRequest;import software.amazon.awssdk.services.s3.model.ListObjectsV2Request;import software.amazon.awssdk.services.s3.model.ListObjectsV2Response;import software.amazon.awssdk.services.s3.model.PutObjectRequest;import software.amazon.awssdk.services.s3.model.S3Object;import software.amazon.awssdk.services.s3.model.UploadPartRequest;import software.amazon.awssdk.services.s3.paginators.ListObjectsV2Iterable;import software.amazon.awssdk.core.sync.RequestBody;import software.amazon.awssdk.core.sync.ResponseTransformer;

コード

s3.getObject(GetObjectRequest.builder().bucket(bucket).key(key).build(), ResponseTransformer.toFile(Paths.get("multiPartKey")));

GitHub で完全な例をご覧ください。

オブジェクトの削除バケット名とキー名を含む DeleteObjectRequest を作成します。S3Client の deleteObject メソッドを使用して、削除するバケットの名前とオブジェクトを渡します。指定されたバケットとオブジェクトキーが存在している必要があり、存在しない場合はエラーが返ります。

インポート

import java.io.IOException;import java.nio.ByteBuffer;import java.nio.file.Paths;import java.util.Random;import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest;import software.amazon.awssdk.services.s3.model.CompletedMultipartUpload;import software.amazon.awssdk.services.s3.model.CompletedPart;import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration;import software.amazon.awssdk.services.s3.model.CreateBucketRequest;import software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest;import software.amazon.awssdk.services.s3.model.CreateMultipartUploadResponse;import software.amazon.awssdk.services.s3.model.DeleteBucketRequest;import software.amazon.awssdk.services.s3.model.DeleteObjectRequest;import software.amazon.awssdk.services.s3.model.GetObjectRequest;import software.amazon.awssdk.services.s3.model.ListObjectsV2Request;

96

AWS SDK for Java バージョン 2 開発者ガイドオブジェクトオペレーション

import software.amazon.awssdk.services.s3.model.ListObjectsV2Response;import software.amazon.awssdk.services.s3.model.PutObjectRequest;import software.amazon.awssdk.services.s3.model.S3Object;import software.amazon.awssdk.services.s3.model.UploadPartRequest;import software.amazon.awssdk.services.s3.paginators.ListObjectsV2Iterable;import software.amazon.awssdk.core.sync.RequestBody;import software.amazon.awssdk.core.sync.ResponseTransformer;

コード

DeleteObjectRequest deleteObjectRequest = DeleteObjectRequest.builder().bucket(bucket).key(key).build();s3.deleteObject(deleteObjectRequest);

GitHub で完全な例をご覧ください。

オブジェクトのコピーCopyObjectRequest を作成し、オブジェクトがコピーされるバケット名、URL エンコードされた文字列値 (URLEncoder.encode メソッドを参照)、およびオブジェクトのキー名を指定します。S3Client のcopyObject メソッドを使用して、CopyObjectRequest オブジェクトを渡します。指定されたバケットとオブジェクトキーが存在している必要があり、存在しない場合はエラーが返ります。

インポート

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.CopyObjectRequest;import software.amazon.awssdk.services.s3.model.CopyObjectResponse;import software.amazon.awssdk.services.s3.model.S3Exception;

import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.nio.charset.StandardCharsets;

コード

String object_key = args[0];String from_bucket = args[1];String to_bucket = args[2];

System.out.format("Copying object %s from bucket %s to %s\n", object_key, from_bucket, to_bucket);Region region = Region.US_WEST_2;S3Client s3 = S3Client.builder().region(region).build();String encodedUrl = null;try { encodedUrl = URLEncoder.encode(from_bucket + "/" + object_key, StandardCharsets.UTF_8.toString());} catch (UnsupportedEncodingException e) { System.out.println("URL could not be encoded: " + e.getMessage());}

CopyObjectRequest copyReq = CopyObjectRequest.builder() .copySource(encodedUrl) .bucket(to_bucket) .key(object_key) .build();

97

AWS SDK for Java バージョン 2 開発者ガイドオブジェクトオペレーション

try { CopyObjectResponse copyRes = s3.copyObject(copyReq); System.out.println(copyRes.copyObjectResult().toString());} catch (S3Exception e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1);}System.out.println("Done!");

GitHub で完全な例をご覧ください。

オブジェクトのリスト化ListObjectsRequest を作成し、バケット名を指定します。次に、S3Client の listObjects メソッドを呼び出して、ListObjectsRequest オブジェクトを渡します。このメソッドは、バケット内のすべてのオブジェクトを含む ListObjectsResponse を返します。このオブジェクトの contents メソッドを呼び出して、オブジェクトのリストを取得できます。次のコード例に示すように、このリストを反復処理してオブジェクトを表示できます。

インポート

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.ListObjectsRequest;import software.amazon.awssdk.services.s3.model.ListObjectsResponse;import software.amazon.awssdk.services.s3.model.S3Exception;import software.amazon.awssdk.services.s3.model.S3Object;

import java.util.List;import java.util.ListIterator;

コード

String bucketName = args[0];

try { Region region = Region.US_WEST_2; S3Client s3 = S3Client.builder().region(region).build();

ListObjectsRequest listObjects = ListObjectsRequest .builder() .bucket(bucketName) .build();

ListObjectsResponse res = s3.listObjects(listObjects); List<S3Object> objects = res.contents();

for (ListIterator iterVals = objects.listIterator(); iterVals.hasNext(); ) { S3Object myValue = (S3Object) iterVals.next(); System.out.print("\n The name of the key is " + myValue.key()); System.out.print("\n The object is " + calKb(myValue.size()) + " KBs"); System.out.print("\n The owner is " + myValue.owner()); } } catch (S3Exception e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } }

//convert bytes to kbs private static long calKb(Long val) { return val/1024;

98

AWS SDK for Java バージョン 2 開発者ガイドAmazon S3 の署名付きの例

}

GitHub で完全な例をご覧ください。

Amazon S3 の署名付き URL の操作S3Presigner オブジェクトを使用して Amazon S3SdkRequest に署名し、呼び出し元の側で認証しなくてもそのオブジェクトが実行されるようにすることができます。たとえば、Alice に S3 オブジェクトへのアクセス権限があり、そのオブジェクトへのアクセス権限を一時的に Bob と共有するとします。Alice は、署名付き GetObjectRequest オブジェクトを生成して Bob との共有を保護し、Bob が Alice の認証情報にアクセスすることなくそのオブジェクトをダウンロードできるようにすることができます。

トピック• 署名付き URL の生成とオブジェクトのアップロード (p. 99)• 署名付きオブジェクトの取得 (p. 100)

署名付き URL の生成とオブジェクトのアップロードクライアントオブジェクトを表す S3Presigner オブジェクトを作成します。次に、追加の署名や認証がなくても後で実行できる PresignedPutObjectRequest オブジェクトを作成します。このオブジェクトを作成するときに、バケット名とキー名を指定できます。さらに、signatureDuration メソッドを呼び出して、認証情報を使用せずにバケットにアクセスできる時間を分単位で指定することもできます (次のコード例を参照)。

PresignedPutObjectRequest オブジェクトを使用して、その url メソッドを呼び出すことによって URLを取得できます。

インポート

import java.io.IOException;import java.io.OutputStreamWriter;import java.net.HttpURLConnection;import java.net.URL;import java.time.Duration;

import software.amazon.awssdk.services.lambda.model.ServiceException;import software.amazon.awssdk.services.s3.presigner.model.PresignedPutObjectRequest;import software.amazon.awssdk.services.s3.presigner.S3Presigner;

コード

次の Java コード例では、コンテンツを署名付き S3 バケットにアップロードします。

String bucketName = args[0]; String keyName = args[1];

// Create an S3Presigner using the default AWS Region and credentials S3Presigner presigner = S3Presigner.create();

try { PresignedPutObjectRequest presignedRequest = presigner.presignPutObject(z -> z.signatureDuration(Duration.ofMinutes(10)) .putObjectRequest(por -> por.bucket(bucketName).key(keyName)));

99

AWS SDK for Java バージョン 2 開発者ガイド署名付きオブジェクトの取得

System.out.println("Pre-signed URL to upload a file to: " + presignedRequest.url()); System.out.println("Which HTTP method needs to be used when uploading a file: " + presignedRequest.httpRequest().method());

//Upload content to the bucket by using this URL URL url = presignedRequest.url();

// Create the connection and use it to upload the new object by using the pre-signed URL HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setRequestProperty("Content-Type","text/plain"); connection.setRequestMethod("PUT"); OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream()); out.write("This text uploaded as an object via presigned URL."); out.close();

connection.getResponseCode(); System.out.println("HTTP response code: " + connection.getResponseCode());

// It's recommended that you close the S3Presigner when it is done being used, because some credential // providers (e.g. if your AWS profile is configured to assume an STS role) require system resources // that need to be freed. If you are using one S3Presigner per application (as recommended), this // usually isn't needed presigner.close();

} catch (ServiceException | IOException e) { e.getStackTrace(); }

GitHub で完全な例をご覧ください。

署名付きオブジェクトの取得クライアントオブジェクトを表す S3Presigner オブジェクトを作成します。次に、GetObjectRequestオブジェクトを作成し、バケット名とキー名を指定します。さらに、追加の署名や認証がなくても後で実行できる GetObjectPresignRequest オブジェクトを作成します。このオブジェクトを作成するときに、signatureDuration メソッドを呼び出して、認証情報を使用せずにバケットにアクセスできる時間を分単位で指定できます (次のコード例を参照)。

S3Presigner オブジェクトに属する presignGetObject メソッドを呼び出して、PresignedPutObjectRequest オブジェクトを作成します。このオブジェクトの url メソッドを呼び出して、使用する URL を取得できます。URL を取得したら、次の Java コード例に示すように、標準のHTTP Java ロジックを使用してバケットのコンテンツを読み取ることができます。

インポート

import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.HttpURLConnection;import java.time.Duration;

import software.amazon.awssdk.services.lambda.model.ServiceException;import software.amazon.awssdk.services.s3.model.GetObjectRequest;

100

AWS SDK for Java バージョン 2 開発者ガイド署名付きオブジェクトの取得

import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest;import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest;import software.amazon.awssdk.services.s3.presigner.S3Presigner;import software.amazon.awssdk.utils.IoUtils;

コード

次の Java コード例では、署名付き S3 バケットからコンテンツを読み取ります。

String bucketName = args[0]; String keyName = args[1];

// Create an S3Presigner by using the default AWS Region and credentials S3Presigner presigner = S3Presigner.create();

try {

// Create a GetObjectRequest to be pre-signed GetObjectRequest getObjectRequest = GetObjectRequest.builder() .bucket(bucketName) .key(keyName) .build();

// Create a GetObjectPresignRequest to specify the signature duration GetObjectPresignRequest getObjectPresignRequest = GetObjectPresignRequest.builder() .signatureDuration(Duration.ofMinutes(10)) .getObjectRequest(getObjectRequest) .build();

// Generate the presigned request PresignedGetObjectRequest presignedGetObjectRequest = presigner.presignGetObject(getObjectPresignRequest);

// Log the presigned URL System.out.println("Presigned URL: " + presignedGetObjectRequest.url());

// Create a JDK HttpURLConnection for communicating with S3 HttpURLConnection connection = (HttpURLConnection) presignedGetObjectRequest.url().openConnection();

// Specify any headers that the service needs (not needed when isBrowserExecutable is true) presignedGetObjectRequest.httpRequest().headers().forEach((header, values) -> { values.forEach(value -> { connection.addRequestProperty(header, value); }); });

// Send any request payload that the service needs (not needed when isBrowserExecutable is true) if (presignedGetObjectRequest.signedPayload().isPresent()) { connection.setDoOutput(true); try (InputStream signedPayload = presignedGetObjectRequest.signedPayload().get().asInputStream(); OutputStream httpOutputStream = connection.getOutputStream()) { IoUtils.copy(signedPayload, httpOutputStream); } }

// Download the result of executing the request try (InputStream content = connection.getInputStream()) { System.out.println("Service returned response: "); IoUtils.copy(content, System.out);

101

AWS SDK for Java バージョン 2 開発者ガイドAmazon SQS の例

}

// It's recommended that you close the S3Presigner when it is done being used, because some credential // providers (e.g. if your AWS profile is configured to assume an STS role) require system resources // that need to be freed. If you are using one S3Presigner per application (as recommended), this // usually isn't needed presigner.close();

} catch (ServiceException | IOException e) { e.getStackTrace(); }

GitHub で完全な例をご覧ください。

AWS SDK for Java を使用した Amazon SQS の例このセクションでは、AWS SDK for Java 2.0 を使用して Amazon SQS をプログラムする例を示します。

以下の例には、各手法を示すのに必要なコードのみが含まれます。完全なサンプルコードは GitHub で入手できます。そこから、単一のソースファイルをダウンロードするかリポジトリをローカルにクローン作成して、ビルドし実行するためのすべての例を取得できます。

トピック• Amazon SQS メッセージキューの使用 (p. 102)• Amazon SQS メッセージの送信、受信、削除 (p. 105)

Amazon SQS メッセージキューの使用メッセージキューは、Amazon SQS でメッセージを確実に送信するために使用する論理コンテナです。キューには、標準と先入れ先出し (FIFO) の 2 種類があります。キューおよびキュータイプ間の相違点の詳細については、「Amazon SQS 開発者ガイド」を参照してください。

このトピックでは、AWS SDK for Java を使用して Amazon SQS キューの URL の作成、一覧表示、削除、および取得を行う方法について説明します。

キューの作成SqsClient の createQueue メソッドで、キューのパラメータを定義した CreateQueueRequest オブジェクトを指定します。

インポート

import software.amazon.awssdk.services.sqs.SqsClient;import software.amazon.awssdk.services.sqs.model.ChangeMessageVisibilityRequest;import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;import software.amazon.awssdk.services.sqs.model.DeleteMessageRequest;import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlResponse;import software.amazon.awssdk.services.sqs.model.ListQueuesRequest;import software.amazon.awssdk.services.sqs.model.ListQueuesResponse;import software.amazon.awssdk.services.sqs.model.Message;import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest;

102

AWS SDK for Java バージョン 2 開発者ガイドキューオペレーション

import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequestEntry;import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

コード

CreateQueueRequest createQueueRequest = CreateQueueRequest.builder().queueName(queueName).build();sqsClient.createQueue(createQueueRequest);

GitHub の「完全なサンプル」をご覧ください。

キューを一覧表示するアカウントの Amazon SQS キューを一覧表示するには、SqsClient の listQueues メソッドを呼び出し、ListQueuesRequest オブジェクトを渡します。

パラメータを指定せずに listQueues オーバーロードを使用すると、すべてのキュー (最大 1,000 キュー)が返されます。ListQueuesRequest オブジェクトにキュー名のプレフィックスを指定して、そのプレフィックスに一致するキューの結果を絞り込むことができます。

インポート

import software.amazon.awssdk.services.sqs.SqsClient;import software.amazon.awssdk.services.sqs.model.ChangeMessageVisibilityRequest;import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;import software.amazon.awssdk.services.sqs.model.DeleteMessageRequest;import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlResponse;import software.amazon.awssdk.services.sqs.model.ListQueuesRequest;import software.amazon.awssdk.services.sqs.model.ListQueuesResponse;import software.amazon.awssdk.services.sqs.model.Message;import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequestEntry;import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

コード

String prefix = "que";ListQueuesRequest listQueuesRequest = ListQueuesRequest.builder().queueNamePrefix(prefix).build();ListQueuesResponse listQueuesResponse = sqsClient.listQueues(listQueuesRequest);for (String url : listQueuesResponse.queueUrls()) { System.out.println(url);}

GitHub の「完全なサンプル」をご覧ください。

キューの URL を取得するSqsClient の getQueueUrl メソッドを呼び出し、GetQueueUrlRequest オブジェクトを渡します。

インポート

import software.amazon.awssdk.services.sqs.SqsClient;import software.amazon.awssdk.services.sqs.model.ChangeMessageVisibilityRequest;import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;import software.amazon.awssdk.services.sqs.model.DeleteMessageRequest;

103

AWS SDK for Java バージョン 2 開発者ガイドキューオペレーション

import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlResponse;import software.amazon.awssdk.services.sqs.model.ListQueuesRequest;import software.amazon.awssdk.services.sqs.model.ListQueuesResponse;import software.amazon.awssdk.services.sqs.model.Message;import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequestEntry;import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

コード

GetQueueUrlResponse getQueueUrlResponse = sqsClient.getQueueUrl(GetQueueUrlRequest.builder().queueName(queueName).build());String queueUrl = getQueueUrlResponse.queueUrl();System.out.println(queueUrl);

GitHub の「完全なサンプル」をご覧ください。

キューの削除キューの URL (p. 103) を DeleteMessageRequest オブジェクトに渡します。その後、SqsClient のdeleteQueue メソッドを呼び出します。

インポート

import software.amazon.awssdk.services.sqs.SqsClient;import software.amazon.awssdk.services.sqs.model.ChangeMessageVisibilityRequest;import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;import software.amazon.awssdk.services.sqs.model.DeleteMessageRequest;import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlResponse;import software.amazon.awssdk.services.sqs.model.ListQueuesRequest;import software.amazon.awssdk.services.sqs.model.ListQueuesResponse;import software.amazon.awssdk.services.sqs.model.Message;import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequestEntry;import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

コード

for (Message message : messages) { DeleteMessageRequest deleteMessageRequest = DeleteMessageRequest.builder() .queueUrl(queueUrl) .receiptHandle(message.receiptHandle()) .build(); sqsClient.deleteMessage(deleteMessageRequest);}

GitHub の「完全なサンプル」をご覧ください。

詳細• Amazon SQS Developer Guide の「Amazon SQS キューの操作」• Amazon SQS API Reference の「CreateQueue」• Amazon SQS API Reference の「GetQueueUrl」

104

AWS SDK for Java バージョン 2 開発者ガイドメッセージオペレーション

• Amazon SQS API Reference の「ListQueues」• Amazon SQS API Reference の「DeleteQueues」

Amazon SQS メッセージの送信、受信、削除メッセージは、分散コンポーネントによって送受信できるデータの一部です。メッセージは、常に SQSキュー (p. 102)を使用して提供されます。

メッセージの送信Amazon SQS キューに 1 つのメッセージ追加するには、SqsClient クライアントの sendMessage メソッドを呼び出します。キューの URL (p. 103)、メッセージ本文、およびオプションの遅延値 (秒単位) が含まれる SendMessageRequest オブジェクトを指定します。

インポート

import software.amazon.awssdk.services.sqs.SqsClient;import software.amazon.awssdk.services.sqs.model.ChangeMessageVisibilityRequest;import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;import software.amazon.awssdk.services.sqs.model.DeleteMessageRequest;import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlResponse;import software.amazon.awssdk.services.sqs.model.ListQueuesRequest;import software.amazon.awssdk.services.sqs.model.ListQueuesResponse;import software.amazon.awssdk.services.sqs.model.Message;import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequestEntry;import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

コード

sqsClient.sendMessage(SendMessageRequest.builder() .queueUrl(queueUrl) .messageBody("Hello world!") .delaySeconds(10) .build());

リクエストで複数のメッセージを送信するSqsClient の sendMessageBatch メソッドを使用して 1 つのリクエストで複数のメッセージを送信します。このメソッドは、キューの URL と送信するメッセージのリストを含む SendMessageBatchRequestを受け取ります (各メッセージは SendMessageBatchRequestEntry)。 また、メッセージの遅延値を設定して、特定のメッセージの送信を遅延させることもできます。

インポート

import software.amazon.awssdk.services.sqs.SqsClient;import software.amazon.awssdk.services.sqs.model.ChangeMessageVisibilityRequest;import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;import software.amazon.awssdk.services.sqs.model.DeleteMessageRequest;import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlResponse;import software.amazon.awssdk.services.sqs.model.ListQueuesRequest;import software.amazon.awssdk.services.sqs.model.ListQueuesResponse;import software.amazon.awssdk.services.sqs.model.Message;

105

AWS SDK for Java バージョン 2 開発者ガイドメッセージオペレーション

import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequestEntry;import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

コード

SendMessageBatchRequest sendMessageBatchRequest = SendMessageBatchRequest.builder() .queueUrl(queueUrl) .entries(SendMessageBatchRequestEntry.builder().id("id1").messageBody("Hello from msg 1").build(), SendMessageBatchRequestEntry.builder().id("id2").messageBody("msg 2").delaySeconds(10).build()) .build();sqsClient.sendMessageBatch(sendMessageBatchRequest);

GitHub の「完全なサンプル」をご覧ください。

メッセージを取得するキューに現在含まれているメッセージを取得するには、SqsClient の receiveMessage メソッドを呼び出します。このメソッドは、キュー URL を含む ReceiveMessageRequest を受け取ります。また、返るメッセージの最大数を指定することもできます。メッセージは、Message オブジェクトのリストとして返されます。

インポート

import software.amazon.awssdk.services.sqs.SqsClient;import software.amazon.awssdk.services.sqs.model.ChangeMessageVisibilityRequest;import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;import software.amazon.awssdk.services.sqs.model.DeleteMessageRequest;import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlResponse;import software.amazon.awssdk.services.sqs.model.ListQueuesRequest;import software.amazon.awssdk.services.sqs.model.ListQueuesResponse;import software.amazon.awssdk.services.sqs.model.Message;import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequestEntry;import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

コード

ReceiveMessageRequest receiveMessageRequest = ReceiveMessageRequest.builder() .queueUrl(queueUrl) .maxNumberOfMessages(5) .build();List<Message> messages= sqsClient.receiveMessage(receiveMessageRequest).messages();

受信後にメッセージを削除するメッセージを受信し、その内容を処理した後で、メッセージをキューから削除するには、メッセージの受信ハンドルとキュー URL を SqsClient の deleteMessage メソッドに送信します。

インポート

import software.amazon.awssdk.services.sqs.SqsClient;import software.amazon.awssdk.services.sqs.model.ChangeMessageVisibilityRequest;

106

AWS SDK for Java バージョン 2 開発者ガイドAmazon Transcribe の例

import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;import software.amazon.awssdk.services.sqs.model.DeleteMessageRequest;import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlResponse;import software.amazon.awssdk.services.sqs.model.ListQueuesRequest;import software.amazon.awssdk.services.sqs.model.ListQueuesResponse;import software.amazon.awssdk.services.sqs.model.Message;import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequestEntry;import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

コード

for (Message message : messages) { DeleteMessageRequest deleteMessageRequest = DeleteMessageRequest.builder() .queueUrl(queueUrl) .receiptHandle(message.receiptHandle()) .build(); sqsClient.deleteMessage(deleteMessageRequest);}

GitHub の「完全なサンプル」をご覧ください。

詳細• Amazon SQS Developer Guide の「Amazon SQS キューの操作」• Amazon SQS API Reference の「SendMessage」• Amazon SQS API Reference の「SendMessageBatch」• Amazon SQS API Reference の「ReceiveMessage」• Amazon SQS API Reference の「DeleteMessage」

AWS SDK for Java を使用した Amazon Transcribeの例

このセクションでは、AWS SDK for Java 2.0 を使用して Amazon Transcribe をプログラムする例を示します。

以下の例には、各手法を示すのに必要なコードのみが含まれます。完全なサンプルコードは GitHub で入手できます。そこから、単一のソースファイルをダウンロードするかリポジトリをローカルにクローン作成して、ビルドし実行するためのすべての例を取得できます。

トピック• Amazon Transcribe の使用 (p. 107)

Amazon Transcribe の使用以下の例では、Amazon Transcribe を使用した双方向ストリーミングの仕組みを示しています。双方向ストリーミングとは、サービスに送信されるデータストリームと、サービスからリアルタイムで受信されるデータストリームが、両方あることを意味します。この例では、Amazon Transcribe の文字起こしストリーミングを使用して、音声ストリームを送信し、文字起こしされたテキストストリームをリアルタイムで受信します。

107

AWS SDK for Java バージョン 2 開発者ガイドAmazon Transcribe の使用

この機能の詳細については、Amazon Transcribe Developer Guide の「文字起こしストリーミング」を参照してください。

Amazon Transcribe の使用を開始するには、Amazon Transcribe Developer Guide の「開始方法」を参照してください。

マイクを設定するこのコードは、javax.sound.sampled パッケージを使用して、入力デバイスからの音声をストリーミングします。

コード

import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioSystem;import javax.sound.sampled.DataLine;import javax.sound.sampled.TargetDataLine;

public class Microphone {

public static TargetDataLine get() throws Exception { AudioFormat format = new AudioFormat(16000, 16, 1, true, false); DataLine.Info datalineInfo = new DataLine.Info(TargetDataLine.class, format);

TargetDataLine dataLine = (TargetDataLine) AudioSystem.getLine(datalineInfo); dataLine.open(format);

return dataLine; }}

GitHub で完全な例を参照してください。

パブリッシャーを作成するこのコードは、Amazon Transcribe 音声ストリームから音声データを発行するパブリッシャーを実装します。

コード

import java.io.IOException;import java.io.InputStream;import java.io.UncheckedIOException;import java.nio.ByteBuffer;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.atomic.AtomicLong;import org.reactivestreams.Publisher;import org.reactivestreams.Subscriber;import org.reactivestreams.Subscription;import software.amazon.awssdk.core.SdkBytes;import software.amazon.awssdk.services.transcribestreaming.model.AudioEvent;import software.amazon.awssdk.services.transcribestreaming.model.AudioStream;

public class AudioStreamPublisher implements Publisher<AudioStream> { private final InputStream inputStream;

public AudioStreamPublisher(InputStream inputStream) {

108

AWS SDK for Java バージョン 2 開発者ガイドAmazon Transcribe の使用

this.inputStream = inputStream; }

@Override public void subscribe(Subscriber<? super AudioStream> s) { s.onSubscribe(new SubscriptionImpl(s, inputStream)); }

private class SubscriptionImpl implements Subscription { private static final int CHUNK_SIZE_IN_BYTES = 1024 * 1; private ExecutorService executor = Executors.newFixedThreadPool(1); private AtomicLong demand = new AtomicLong(0);

private final Subscriber<? super AudioStream> subscriber; private final InputStream inputStream;

private SubscriptionImpl(Subscriber<? super AudioStream> s, InputStream inputStream) { this.subscriber = s; this.inputStream = inputStream; }

@Override public void request(long n) { if (n <= 0) { subscriber.onError(new IllegalArgumentException("Demand must be positive")); }

demand.getAndAdd(n);

executor.submit(() -> { try { do { ByteBuffer audioBuffer = getNextEvent(); if (audioBuffer.remaining() > 0) { AudioEvent audioEvent = audioEventFromBuffer(audioBuffer); subscriber.onNext(audioEvent); } else { subscriber.onComplete(); break; } } while (demand.decrementAndGet() > 0); } catch (Exception e) { subscriber.onError(e); } }); }

@Override public void cancel() {

}

private ByteBuffer getNextEvent() { ByteBuffer audioBuffer; byte[] audioBytes = new byte[CHUNK_SIZE_IN_BYTES];

int len = 0; try { len = inputStream.read(audioBytes);

if (len <= 0) { audioBuffer = ByteBuffer.allocate(0); } else { audioBuffer = ByteBuffer.wrap(audioBytes, 0, len);

109

AWS SDK for Java バージョン 2 開発者ガイドAmazon Transcribe の使用

} } catch (IOException e) { throw new UncheckedIOException(e); }

return audioBuffer; }

private AudioEvent audioEventFromBuffer(ByteBuffer bb) { return AudioEvent.builder() .audioChunk(SdkBytes.fromByteBuffer(bb)) .build(); } }}

GitHub で完全な例を参照してください。

クライアントを作成してストリームを開始するmain メソッドで、リクエストオブジェクトを作成し、音声入力ストリームを開始して、音声入力でパブリッシャーをインスタンス化します。

StartStreamTranscriptionResponseHandler を作成して、Amazon Transcribe からのレスポンスを処理する方法を指定する必要もあります。

その後、TranscribeStreamingAsyncClient の startStreamTranscription メソッドを使用して双方向ストリーミングを開始します。

インポート

import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioSystem;import javax.sound.sampled.DataLine;import javax.sound.sampled.TargetDataLine;

import javax.sound.sampled.AudioInputStream;import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;import software.amazon.awssdk.services.transcribestreaming.TranscribeStreamingAsyncClient;import software.amazon.awssdk.services.transcribestreaming.model.LanguageCode;import software.amazon.awssdk.services.transcribestreaming.model.MediaEncoding;import software.amazon.awssdk.services.transcribestreaming.model.StartStreamTranscriptionRequest;import software.amazon.awssdk.services.transcribestreaming.model.StartStreamTranscriptionResponseHandler;import software.amazon.awssdk.services.transcribestreaming.model.TranscriptEvent;

コード

public static void main(String[] args) throws Exception { TranscribeStreamingAsyncClient client = TranscribeStreamingAsyncClient.builder().credentialsProvider(ProfileCredentialsProvider.create()).build();

StartStreamTranscriptionRequest request = StartStreamTranscriptionRequest.builder() .mediaEncoding(MediaEncoding.PCM) .languageCode(LanguageCode.EN_US) .mediaSampleRateHertz(16_000).build();

110

AWS SDK for Java バージョン 2 開発者ガイドページ分割の例

TargetDataLine mic = Microphone.get(); mic.start();

AudioStreamPublisher publisher = new AudioStreamPublisher(new AudioInputStream(mic));

StartStreamTranscriptionResponseHandler response = StartStreamTranscriptionResponseHandler.builder().subscriber(e -> { TranscriptEvent event = (TranscriptEvent) e; event.transcript().results().forEach(r -> r.alternatives().forEach(a -> System.out.println(a.transcript()))); }).build();

client.startStreamTranscription(request, publisher, response).join(); }

GitHub で完全な例を参照してください。

詳細• Amazon Transcribe Developer Guide での の仕組み。• Amazon Transcribe Developer Guide での音声ストリーミングの開始方法• Amazon Transcribe Developer Guide でのガイドラインと制限。

ページ分割された結果を取得する多くの AWS オペレーションでは、応答オブジェクトが単一の応答で返すには大きすぎる場合に、ページ分割後の結果が返ります。AWS SDK for Java 1.0 では、次のページの結果を取得する上で使用する必要があったトークンがレスポンスに含まれていました。AWS SDK for Java 2.0 の新機能として、自動ページ分割メソッドがあります。次のページの結果を取得する複数のサービス呼び出しを自動的に行うことができます。この結果を処理するコードを記述するだけです。さらに、どちらのタイプのメソッドにも、同期バージョンと非同期バージョンがあります。非同期のクライアントの詳細については、「非同期プログラミング (p. 21)」を参照してください。

以下の例では、Amazon S3 および Amazon DynamoDB オペレーションを使用して、ページ分割されたレスポンスからデータを取得するさまざまなメソッドについて説明します。

Note

これらのコードスニペットでは、ユーザーが「AWS SDK for Java 2.0 の使用 (p. 13)」の内容を理解し、「開発用の AWS 認証情報とリージョンのセットアップ (p. 5)」の情報を使用してデフォルトの AWS 認証情報を設定していることを前提としています。

同期ページ分割これらの例では、同期のページ分割メソッドを使用して、Amazon S3 バケットのオブジェクトを一覧表示します。

ページを反復処理するListObjectsV2Request を作成し、バケット名を指定します。オプションで、一度に取得するキーの最大数を指定できます。S3Client の listObjectsV2Paginator メソッドに渡します。このメソッドはListObjectsV2Iterable オブジェクトを返します。このオブジェクトは ListObjectsV2Response クラスのIterable です。

111

AWS SDK for Java バージョン 2 開発者ガイド同期ページ分割

最初の例では、ページネーターオブジェクトを使用して、stream メソッドですべてのレスポンスページを反復処理する方法を示します。レスポンスページに直接ストリーミングし、そのレスポンスストリームを S3Object コンテンツのストリームに変換してから、Amazon S3 オブジェクトのコンテンツを処理できます。

インポート

import java.io.IOException;import java.nio.ByteBuffer;import java.nio.file.Paths;import java.util.Random;import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest;import software.amazon.awssdk.services.s3.model.CompletedMultipartUpload;import software.amazon.awssdk.services.s3.model.CompletedPart;import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration;import software.amazon.awssdk.services.s3.model.CreateBucketRequest;import software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest;import software.amazon.awssdk.services.s3.model.CreateMultipartUploadResponse;import software.amazon.awssdk.services.s3.model.DeleteBucketRequest;import software.amazon.awssdk.services.s3.model.DeleteObjectRequest;import software.amazon.awssdk.services.s3.model.GetObjectRequest;import software.amazon.awssdk.services.s3.model.ListObjectsV2Request;import software.amazon.awssdk.services.s3.model.ListObjectsV2Response;import software.amazon.awssdk.services.s3.model.PutObjectRequest;import software.amazon.awssdk.services.s3.model.S3Object;import software.amazon.awssdk.services.s3.model.UploadPartRequest;import software.amazon.awssdk.services.s3.paginators.ListObjectsV2Iterable;import software.amazon.awssdk.core.sync.RequestBody;import software.amazon.awssdk.core.sync.ResponseTransformer;

コード

// Build the list objects requestListObjectsV2Request listReq = ListObjectsV2Request.builder() .bucket(bucket) .maxKeys(1) .build();

ListObjectsV2Iterable listRes = s3.listObjectsV2Paginator(listReq);// Process response pageslistRes.stream() .flatMap(r -> r.contents().stream()) .forEach(content -> System.out.println(" Key: " + content.key() + " size = " + content.size()));

GitHub で完全な例をご覧ください。

オブジェクトの反復処理次の例では、レスポンスのページではなく、レスポンスで返るオブジェクトを反復処理する方法を示します。

ストリームを使用する

ページ分割された項目コレクションを反復処理するには、応答のコンテンツで stream メソッドを使用します。

112

AWS SDK for Java バージョン 2 開発者ガイド非同期ページ分割

コード

// Helper method to work with paginated collection of items directlylistRes.contents().stream() .forEach(content -> System.out.println(" Key: " + content.key() + " size = " + content.size()));

GitHub で完全な例をご覧ください。

For Loop を使用する

応答のコンテンツを反復処理するには、通常の for ループを使用します。

コード

// Use simple for loop if stream is not necessaryfor (S3Object content : listRes.contents()) { System.out.println(" Key: " + content.key() + " size = " + content.size());}

GitHub で完全な例をご覧ください。

手動のページ分割手動のページ分割が必要なユースケースでは、従来どおり手動のページ分割を使用できます。それ以降のリクエストについては、応答オブジェクトの次のトークンを使用します。while ループの使用例を以下に示します。

コード

// Use manual paginationListObjectsV2Request listObjectsReqManual = ListObjectsV2Request.builder() .bucket(bucket) .maxKeys(1) .build();

boolean done = false;while (!done) { ListObjectsV2Response listObjResponse = s3.listObjectsV2(listObjectsReqManual); for (S3Object content : listObjResponse.contents()) { System.out.println(content.key()); }

if (listObjResponse.nextContinuationToken() == null) { done = true; }

listObjectsReqManual = listObjectsReqManual.toBuilder() .continuationToken(listObjResponse.nextContinuationToken()) .build();}

GitHub で完全な例をご覧ください。

非同期ページ分割この例では、非同期のページ分割メソッドを使用して、DynamoDB のテーブルを一覧表示します。手動のページ分割の例は、非同期プログラミング (p. 21)トピックを参照してください。

113

AWS SDK for Java バージョン 2 開発者ガイド非同期ページ分割

テーブル名のページを反復処理するまず、非同期の DynamoDB クライアントを作成します。次に、listTablesPaginator メソッドを呼び出して、ListTablesPublisher を取得します。これは、リアクティブなストリームの Publisher インターフェイスの実装です。リアクティブなストリームのモデルの詳細については、「リアクティブなストリームの Github リポジトリ」を参照してください。

ListTablesPublisher の subscribe メソッドを呼び出し、サブスクライバーの実装を渡します。この例では、受信者には、公開者から一度に 1 つの項目をリクエストする onNext メソッドがあります。このメソッドは、すべてのページが取得されるまで繰り返し呼び出されます。この onSubscribe メソッドでは、Subscription.request メソッドを呼び出して、公開者に対してデータのリクエストを開始します。公開者からデータの取得を開始するには、このメソッドを呼び出す必要があります。データ取得中にエラーが発生すると、onError メソッドがトリガーされます。最後に、すべてのページがリクエストされると、onComplete メソッドが呼び出されます。

受信者を使用するインポート

import java.util.List;import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;

import org.reactivestreams.Subscriber;import org.reactivestreams.Subscription;

import software.amazon.awssdk.core.async.SdkPublisher;import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;import software.amazon.awssdk.services.dynamodb.model.ListTablesRequest;import software.amazon.awssdk.services.dynamodb.model.ListTablesResponse;import software.amazon.awssdk.services.dynamodb.paginators.ListTablesPublisher;import io.reactivex.Flowable;import reactor.core.publisher.Flux;

コード

まず、非同期クライアントを作成します。

// Creates a default client with credentials and regions loaded from the environmentfinal DynamoDbAsyncClient asyncClient = DynamoDbAsyncClient.create();

ListTablesRequest listTablesRequest = ListTablesRequest.builder().limit(3).build();

次に、Subscriber を使用して結果を取得します。

// Or subscribe method should be called to create a new Subscription.// A Subscription represents a one-to-one life-cycle of a Subscriber subscribing to a Publisher.publisher.subscribe(new Subscriber<ListTablesResponse>() { // Maintain a reference to the subscription object, which is required to request data from the publisher private Subscription subscription;

@Override public void onSubscribe(Subscription s) { subscription = s; // Request method should be called to demand data. Here we request a single page subscription.request(1); }

114

AWS SDK for Java バージョン 2 開発者ガイド非同期ページ分割

@Override public void onNext(ListTablesResponse response) { response.tableNames().forEach(System.out::println); // Once you process the current page, call the request method to signal that you are ready for next page subscription.request(1); }

@Override public void onError(Throwable t) { // Called when an error has occurred while processing the requests }

@Override public void onComplete() { // This indicates all the results are delivered and there are no more pages left }

GitHub で完全な例を参照してください。

For Loop を使用する

新しい受信者を作成する際、シンプルなユースケースで for ループを使用してページの反復処理をすると負荷が過剰に高くなる場合があります。この目的で、応答の公開者オブジェクトには、forEach ヘルパーメソッドが含まれます。

コード

ListTablesPublisher publisher = asyncClient.listTablesPaginator(listTablesRequest);

// Use a for-loop for simple use casesCompletableFuture<Void> future = publisher.subscribe(response -> response.tableNames() .forEach(System.out::println));

GitHub で完全な例を参照してください。

テーブル名を反復処理する次の例では、レスポンスのページではなく、レスポンスで返るオブジェクトを反復処理する方法を示します。同期結果と同様、非同期の結果のクラスには、基となる項目コレクションと対話するメソッドがあります。便利なメソッドの戻り型は、すべてのページに項目をリクエストできる発行者です。

受信者を使用する

コード

まず、非同期クライアントを作成します。

System.out.println("running AutoPagination - iterating on item collection...\n");

// Creates a default client with credentials and regions loaded from the environmentfinal DynamoDbAsyncClient asyncClient = DynamoDbAsyncClient.create();

ListTablesRequest listTablesRequest = ListTablesRequest.builder().limit(3).build();

次に、Subscriber を使用して結果を取得します。

// Use subscriber

115

AWS SDK for Java バージョン 2 開発者ガイド非同期ページ分割

publisher.subscribe(new Subscriber<String>() { private Subscription subscription;

@Override public void onSubscribe(Subscription s) { subscription = s; subscription.request(1); }

@Override public void onNext(String tableName) { System.out.println(tableName); subscription.request(1); }

@Override public void onError(Throwable t) { }

@Override public void onComplete() { }

GitHub で完全な例を参照してください。

For Loop を使用する結果を反復処理するには、便利なメソッド forEach を使用します。

コード

// Use forEachCompletableFuture<Void> future = publisher.subscribe(System.out::println);future.get();

GitHub で完全な例を参照してください。

サードパーティーライブラリを使用するカスタムの受信者を実装せずに、その他のサードパーティーのライブラリを使用することができます。この例では、RxJava の実装を例に挙げていますが、リアクティブなストリームのインターフェイスを実装するライブラリを使用することもできます。上記ライブラリの詳細については、「Github の RxJava wikiページ」を参照してください。

このライブラリを使用するには、依存関係として追加します。使用する POM スニペットの例を示します(Maven を使用している場合)。

POM エントリ

<dependency> <groupId>io.reactivex.rxjava2</groupId> <artifactId>rxjava</artifactId> <version>2.1.9</version> </dependency>

インポート

import java.util.List;import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;

import org.reactivestreams.Subscriber;

116

AWS SDK for Java バージョン 2 開発者ガイド非同期ページ分割

import org.reactivestreams.Subscription;

import software.amazon.awssdk.core.async.SdkPublisher;import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;import software.amazon.awssdk.services.dynamodb.model.ListTablesRequest;import software.amazon.awssdk.services.dynamodb.model.ListTablesResponse;import software.amazon.awssdk.services.dynamodb.paginators.ListTablesPublisher;import io.reactivex.Flowable;import reactor.core.publisher.Flux;

コード

System.out.println("running AutoPagination - using third party subscriber...\n");

DynamoDbAsyncClient asyncClient = DynamoDbAsyncClient.create();ListTablesPublisher publisher = asyncClient.listTablesPaginator(ListTablesRequest.builder() .build());

// The Flowable class has many helper methods that work with any reactive streams compatible publisher implementationList<String> tables = Flowable.fromPublisher(publisher) .flatMapIterable(ListTablesResponse::tableNames) .toList() .blockingGet();System.out.println(tables);

117

AWS SDK for Java バージョン 2 開発者ガイドデータ保護

this AWS product or service のセキュリティ

Amazon Web Services (AWS) では、クラウドのセキュリティが最優先事項です。AWS のお客様は、セキュリティを最も重視する組織の要件を満たすように構築されたデータセンターとネットワークアーキテクチャーから利点を得られます。セキュリティは、AWS とお客様の間の共有責任です。責任共有モデルでは、これをクラウドのセキュリティおよびクラウド内のセキュリティとして説明しています。

クラウドのセキュリティ – AWS は、AWS クラウド内でサービスを実行するインフラストラクチャを保護する責任を担い、使用するサービスを安全に提供します。AWS では当社のセキュリティ責任は最優先事項であり、当社のセキュリティの有効性は、AWS コンプライアンスプログラムの一環として、サードパーティーの監査人によって定期的にテストおよび検証されています。

クラウド内のセキュリティ – お客様の責任は、使用している AWS サービスや、データの機密性、組織の要件、適用される法律や規制などのその他の要因によって決まります。

トピック• this AWS product or service のデータ保護 (p. 118)• this AWS product or service の Identity and Access Management (p. 119)• this AWS product or service のコンプライアンス検証 (p. 119)• this AWS product or service の耐障害性 (p. 120)• this AWS product or service のインフラストラクチャセキュリティ (p. 120)

this AWS product or service のデータ保護This AWS product or service は、データ保護の規制やガイドラインを含む責任共有モデルに準拠しています。Amazon Web Services (AWS) は、AWS のすべてのサービスを実行するグローバルなインフラストラクチャを保護する責任を担います。また、AWS は、カスタマーコンテンツおよび個人データを取り扱うためのセキュリティ構成の統制など、このインフラストラクチャ上でホストされるデータ管理を維持します。データコントローラーまたはデータプロセッサとして機能する AWS のお客様および APN パートナーは、AWS クラウドに保存された個人データに対する責任を担います。

データ保護目的の場合、AWS アカウント認証情報を保護して IAM (AWS Identity and AccessManagement) で個々のユーザーアカウントをセットアップし、そのユーザーに各自の職務を果たすために必要なアクセス許可のみが付与されるようにすることをお勧めします。また、以下の方法でデータを保護することをお勧めします。

• 各アカウントで多要素認証 (MFA) を使用します。• SSL/TLS を使用して AWS リソースと通信します。• AWS CloudTrail で API とユーザーアクティビティログをセットアップします。• AWS 暗号化ソリューションを、AWS サービス内のすべてのデフォルトのセキュリティ管理と一緒に使

用します。• Amazon Macie などの高度なマネージドセキュリティサービスを使用します。これにより、Amazon S3

に保存される個人データの検出と保護が支援されます。

顧客のアカウント番号などの機密の識別情報は、[名前] フィールドなどの自由形式のフィールドに配置しないことを強くお勧めします。これは、コンソール、API、AWS CLI、または AWS で this AWS product

118

AWS SDK for Java バージョン 2 開発者ガイドIdentity and Access Management

or service または他の AWS サービスを使用する場合も同様です。this AWS product or service または他のサービスに入力したデータはすべて、診断ログの内容として取得される可能性があります。外部サーバーへの URL を指定するときは、そのサーバーへのリクエストを検証するための認証情報を URL に含めないでください。

データ保護の詳細については、AWS セキュリティブログのブログ投稿「AWS の責任共有モデルとGDPR」を参照してください。

this AWS product or service の Identity and AccessManagement

AWS Identity and Access Management (IAM) は、管理者が AWS リソースへのアクセスを安全に管理するために役立つ Amazon Web Services (AWS) のサービスです。IAM 管理者は、AWS リソースを使用するために認証 (サインイン) および承認 (アクセス許可を持つ) される者を管理します。IAM は、追加料金なしで使用できる AWS のサービスです。

this AWS product or service を使用して AWS にアクセスするには、AWS アカウントと AWS 認証情報が必要です。AWS アカウントのセキュリティを高めるため、アクセス認証情報を指定する場合は、AWS アカウント認証情報ではなく、IAM ユーザーを使用することをお勧めします。

IAM の使用の詳細については、「IAM」を参照してください。

IAM ユーザーの概要と、それがアカウントのセキュリティに重要である理由については、アマゾン ウェブサービス全般のリファレンスの「AWS セキュリティ認証情報」を参照してください。

This AWS product or service は、サポートする特定の Amazon Web Services (AWS) のサービスを通じて、責任共有モデルに従います。AWS サービスのセキュリティ情報については、AWS のサービスのセキュリティに関するドキュメントページと、コンプライアンスプログラムによる AWS 対象範囲内のサービスを参照してください。

this AWS product or service のコンプライアンス検証

This AWS product or service は、サポートする特定の Amazon Web Services (AWS) のサービスを通じて、責任共有モデルに従います。AWS サービスのセキュリティ情報については、AWS のサービスのセキュリティに関するドキュメントページと、コンプライアンスプログラムによる AWS 対象範囲内のサービスを参照してください。

Amazon Web Services (AWS) サービスのセキュリティおよびコンプライアンスは、複数の AWS コンプライアンスプログラムの一環として、サードパーティーの監査者により評価されます。これには、SOC、PCI、FedRAMP、HIPAA、その他が含まれます。AWS は特定のコンプライアンスプログラムの対象となる AWS のサービスのリストをコンプライアンスプログラムによる AWS 対象範囲内のサービスで提供し、頻繁に更新します。

サードパーティーの監査レポートは、AWS Artifact を使用してダウンロードできます。詳細については、「AWS Artifact のレポートのダウンロード」を参照してください。

AWS コンプライアンスプログラムの詳細については、「AWS コンプライアンスプログラム」を参照してください。

this AWS product or service を使用して AWS のサービスを評価する際のお客様のコンプライアンス責任は、お客様のデータの機密性や組織のコンプライアンス目的、適用可能な法律および規制によって決定さ

119

AWS SDK for Java バージョン 2 開発者ガイド弾力

れます。AWS のサービスの使用が HIPAA、PCI、または FedRAMP などの規格に準拠していることを前提としている場合、AWS は以下を支援するリソースを提供します。

• セキュリティおよびコンプライアンスのクイックスタートガイド – アーキテクチャ上の考慮事項について説明し、セキュリティとコンプライアンスに重点を置いたベースライン環境を AWS にデプロイするための手順を説明するデプロイメントガイド。

• Architecting for HIPAA Security and Compliance ホワイトペーパー – このホワイトペーパーでは、企業が AWS を使用して HIPAA 準拠のアプリケーションを作成する方法について説明します。

• AWS のコンプライアンスのリソース – お客様の業界や場所に適用される可能性があるワークブックとガイドのコレクション。

• AWS Config – 自社プラクティス、業界ガイドライン、および規制に対するリソースの設定の準拠状態を評価するサービス。

• AWS Security Hub – セキュリティ業界の標準およびベストプラクティスへの準拠を確認するのに役立つ、AWS 内のセキュリティ状態の包括的な表示。

this AWS product or service の耐障害性Amazon Web Services (AWS) のグローバルインフラストラクチャは AWS リージョンとアベイラビリティーゾーンを中心として構築されます。

AWS リージョンには、低レイテンシー、高いスループット、そして高度の冗長ネットワークで接続されている複数の物理的に独立・隔離されたアベイラビリティーゾーンがあります。

アベイラビリティーゾーンでは、アベイラビリティーゾーン間で中断することなく自動的にフェイルオーバーするアプリケーションとデータベースを設計および運用することができます。アベイラビリティーゾーンは、従来の単一または複数のデータセンターインフラストラクチャよりも可用性、耐障害性、および拡張性が優れています。

AWS リージョンとアベイラビリティーゾーンの詳細については、「AWS グローバルインフラストラクチャ」を参照してください。

This AWS product or service は、サポートする特定の Amazon Web Services (AWS) のサービスを通じて、責任共有モデルに従います。AWS サービスのセキュリティ情報については、AWS のサービスのセキュリティに関するドキュメントページと、コンプライアンスプログラムによる AWS 対象範囲内のサービスを参照してください。

this AWS product or service のインフラストラクチャセキュリティ

This AWS product or service は、サポートする特定の Amazon Web Services (AWS) のサービスを通じて、責任共有モデルに従います。AWS サービスのセキュリティ情報については、AWS のサービスのセキュリティに関するドキュメントページと、コンプライアンスプログラムによる AWS 対象範囲内のサービスを参照してください。

AWS セキュリティプロセスの詳細については、AWS: セキュリティプロセスの概要ホワイトペーパーを参照してください。

120

AWS SDK for Java バージョン 2 開発者ガイド

ドキュメント履歴このトピックでは、AWS SDK for Java Developer Guide の重要な変更を経時的に説明します。

このドキュメントの構築: 2020 年 1 月 28 日

2018 年 8 月 2 日

Kinesis ストリームの例を追加しました。2018 年 4 月 5 日

自動ページ分割のトピックを追加しました。2017 年 12 月 29 日

IAM、Amazon EC2、Cloudwatch、DynamoDB の例に関するトピックを追加しました。2017 年 8 月 7 日

S3 の getobjects の例を追加しました。2017 年 8 月 4 日

非同期のトピックを追加しました。2017 年 6 月 28 日

新しい SDK バージョン 2.0 をリリースしました。

121