

 AWS SDK for Java 1.x は 2025 年 12 月 31 日にend-of-supportしました。新しい機能、可用性の向上、セキュリティ更新のために、[AWS SDK for Java 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/home.html) に移行することをお勧めします。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS SDK for Java コードの例
<a name="prog-services"></a>

このセクションでは、AWS SDK for Java v1 を使用して AWS のサービスをプログラミングするためのチュートリアルおよび例を示します。

これらの例などのソースコードについては、AWS ドキュメントの [code examples repository on GitHub](https://github.com/awsdocs/aws-doc-sdk-examples) を参照してください。

AWS ドキュメントチームに作成を検討してもらう新しいコード例を提案するには、新しいリクエストを作成します。チームは、個々の API 呼び出しのみを対象とするシンプルなコードスニペットよりは、より広範なシナリオやユースケースを対象とするコード例を作成しようとしています。手順については、GitHub のコード例リポジトリにある「[Contributing guidelines](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/CONTRIBUTING.md)」を参照してください。

## AWS SDK for Java 2.x
<a name="aws-sdk-for-java-2-x"></a>

2018 年、AWS は [AWS SDK for Java 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/home.html) をリリースしました。このガイドには、最新の Java SDK の使用方法と、サンプルコードが記載されています。

**注記**  
[ 開発者が利用できるその他の例と追加のリソースについては、「](welcome.md#additional-resources)その他のドキュメントとリソースAWS SDK for Java」を参照してください。

**Topics**

# AWS SDK for Java を使用した CloudWatch の例
<a name="examples-cloudwatch"></a>

このセクションでは、[AWS SDK for Java](https://aws.amazon.com/sdk-for-java/) を使用して [CloudWatch](https://aws.amazon.com/cloudwatch/) をプログラムする例を示します。

Amazon CloudWatch は、Amazon Web Services (AWS) のリソースおよび AWS で実行しているアプリケーションをリアルタイムでモニタリングします。CloudWatch を使用してメトリクスを収集し、追跡できます。メトリクスとは、リソースやアプリケーションに関して測定できる変数です。CloudWatch アラームは、ユーザーが定義したルールに基づいて、通知を送信したり、モニタリングしているリソースに自動的に変更を加えたりします。

CloudWatch については、「[Amazon CloudWatch User Guide](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/)」を参照してください。

**注記**  
例には各手法を示すのに必要なコードのみが含まれます。[完全なサンプルコードは GitHub で入手できます](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/java)。そこから、単一のソースファイルをダウンロードするかリポジトリをローカルにクローン作成して、ビルドし実行するためのすべての例を取得できます。

**Topics**
+ [CloudWatch からのメトリクスの取得](examples-cloudwatch-get-metrics.md)
+ [カスタムメトリクスデータを発行する](examples-cloudwatch-publish-custom-metrics.md)
+ [CloudWatch アラームの使用](examples-cloudwatch-create-alarms.md)
+ [CloudWatch でのアラームアクションの使用](examples-cloudwatch-use-alarm-actions.md)
+ [CloudWatch にイベントを送信する](examples-cloudwatch-send-events.md)

# CloudWatch からのメトリクスの取得
<a name="examples-cloudwatch-get-metrics"></a>

## メトリクスの一覧表示
<a name="listing-metrics"></a>

CloudWatch メトリクスを一覧表示するには、[ListMetricsRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/cloudwatch/model/ListMetricsRequest.html) を作成して AmazonCloudWatchClient の `listMetrics` メソッドを呼び出します。`ListMetricsRequest` を使用して、名前空間、メトリクス名、またはディメンションで返されたメトリクスをフィルタリングできます。

**注記**  
AWS のサービスによって投稿されるメトリクスとディメンションのリストは、Amazon CloudWatch ユーザーガイドの \$1https---docs-aws-amazon-com-AmazonCloudWatch-latest-monitoring-CW-Support-For-AWS-html\$1[Amazon CloudWatch のメトリクスおよびディメンションのリファレンス] に記載されています。

 **インポート** 

```
import com.amazonaws.services.cloudwatch.AmazonCloudWatch;
import com.amazonaws.services.cloudwatch.AmazonCloudWatchClientBuilder;
import com.amazonaws.services.cloudwatch.model.ListMetricsRequest;
import com.amazonaws.services.cloudwatch.model.ListMetricsResult;
import com.amazonaws.services.cloudwatch.model.Metric;
```

 **コード** 

```
final AmazonCloudWatch cw =
    AmazonCloudWatchClientBuilder.defaultClient();

ListMetricsRequest request = new ListMetricsRequest()
        .withMetricName(name)
        .withNamespace(namespace);

boolean done = false;

while(!done) {
    ListMetricsResult response = cw.listMetrics(request);

    for(Metric metric : response.getMetrics()) {
        System.out.printf(
            "Retrieved metric %s", metric.getMetricName());
    }

    request.setNextToken(response.getNextToken());

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

メトリクスは、`getMetrics` メソッドを呼び出すことによって [ListMetricsResult](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/cloudwatch/model/ListMetricsResult.html) 内で返されます。結果は*ページ分割される*場合があります。結果の次のバッチを取得するには、`setNextToken` オブジェクトの `ListMetricsResult` メソッドの戻り値を使用して元のリクエストオブジェクトで `getNextToken` を呼び出し、変更したリクエストオブジェクトを `listMetrics` の再呼び出しに渡します。

## 詳細情報
<a name="more-information"></a>
+  Amazon CloudWatch API リファレンスの [ListMetrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_ListMetrics.html)

# カスタムメトリクスデータを発行する
<a name="examples-cloudwatch-publish-custom-metrics"></a>

複数の AWS のサービスが「`AWS`」で始まる名前空間で[独自のメトリクス](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/aws-namespaces.html)を発行します。(「`AWS`」で始まらない限り) 独自の名前空間を使用してカスタムメトリクスデータを発行することもできます。

## カスタムメトリクスデータを発行する
<a name="publish-custom-metric-data"></a>

独自のメトリクスデータを発行するには、AmazonCloudWatchClient の `putMetricData` メソッドを [PutMetricDataRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/cloudwatch/model/PutMetricDataRequest.html) で呼び出します。`PutMetricDataRequest` には、データ用に使用するカスタム名前空間と、[MetricDatum](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/cloudwatch/model/MetricDatum.html) オブジェクト内のデータポイント自体に関する情報が含まれている必要があります。

**注記**  
「`AWS`」で始まる名前空間を指定することはできません。「`AWS`」で始まる名前空間は、Amazon Web Services 製品による利用のために予約されています。

 **インポート** 

```
import com.amazonaws.services.cloudwatch.AmazonCloudWatch;
import com.amazonaws.services.cloudwatch.AmazonCloudWatchClientBuilder;
import com.amazonaws.services.cloudwatch.model.Dimension;
import com.amazonaws.services.cloudwatch.model.MetricDatum;
import com.amazonaws.services.cloudwatch.model.PutMetricDataRequest;
import com.amazonaws.services.cloudwatch.model.PutMetricDataResult;
import com.amazonaws.services.cloudwatch.model.StandardUnit;
```

 **コード** 

```
final AmazonCloudWatch cw =
    AmazonCloudWatchClientBuilder.defaultClient();

Dimension dimension = new Dimension()
    .withName("UNIQUE_PAGES")
    .withValue("URLS");

MetricDatum datum = new MetricDatum()
    .withMetricName("PAGES_VISITED")
    .withUnit(StandardUnit.None)
    .withValue(data_point)
    .withDimensions(dimension);

PutMetricDataRequest request = new PutMetricDataRequest()
    .withNamespace("SITE/TRAFFIC")
    .withMetricData(datum);

PutMetricDataResult response = cw.putMetricData(request);
```

## 詳細情報
<a name="more-information"></a>
+  Amazon CloudWatch ユーザーガイドの [Amazon CloudWatch メトリクスの使用](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/working_with_metrics.html)。
+  Amazon CloudWatch ユーザーガイドの [AWS 名前空間](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/aws-namespaces.html)。
+  Amazon CloudWatch API リファレンスの [PutMetricData](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_PutMetricData.html)

# CloudWatch アラームの使用
<a name="examples-cloudwatch-create-alarms"></a>

## アラームの作成
<a name="create-an-alarm"></a>

CloudWatch メトリクスに基づいてアラームを作成するには、AmazonCloudWatchClient の `putMetricAlarm` メソッドをアラーム条件に満たされた [PutMetricAlarmRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/cloudwatch/model/PutMetricAlarmRequest.html) で呼び出します。

 **インポート** 

```
import com.amazonaws.services.cloudwatch.AmazonCloudWatch;
import com.amazonaws.services.cloudwatch.AmazonCloudWatchClientBuilder;
import com.amazonaws.services.cloudwatch.model.ComparisonOperator;
import com.amazonaws.services.cloudwatch.model.Dimension;
import com.amazonaws.services.cloudwatch.model.PutMetricAlarmRequest;
import com.amazonaws.services.cloudwatch.model.PutMetricAlarmResult;
import com.amazonaws.services.cloudwatch.model.StandardUnit;
import com.amazonaws.services.cloudwatch.model.Statistic;
```

 **コード** 

```
final AmazonCloudWatch cw =
    AmazonCloudWatchClientBuilder.defaultClient();

Dimension dimension = new Dimension()
    .withName("InstanceId")
    .withValue(instanceId);

PutMetricAlarmRequest request = new PutMetricAlarmRequest()
    .withAlarmName(alarmName)
    .withComparisonOperator(
        ComparisonOperator.GreaterThanThreshold)
    .withEvaluationPeriods(1)
    .withMetricName("CPUUtilization")
    .withNamespace("{AWS}/EC2")
    .withPeriod(60)
    .withStatistic(Statistic.Average)
    .withThreshold(70.0)
    .withActionsEnabled(false)
    .withAlarmDescription(
        "Alarm when server CPU utilization exceeds 70%")
    .withUnit(StandardUnit.Seconds)
    .withDimensions(dimension);

PutMetricAlarmResult response = cw.putMetricAlarm(request);
```

## アラームの一覧表示
<a name="list-alarms"></a>

作成した CloudWatch アラームを一覧表示するには、AmazonCloudWatchClient の `describeAlarms` メソッドを、結果のオプションを設定するのに使用できる [DescribeAlarmsRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/cloudwatch/model/DescribeAlarmsRequest.html) で呼び出します。

 **インポート** 

```
import com.amazonaws.services.cloudwatch.AmazonCloudWatch;
import com.amazonaws.services.cloudwatch.AmazonCloudWatchClientBuilder;
import com.amazonaws.services.cloudwatch.model.DescribeAlarmsRequest;
import com.amazonaws.services.cloudwatch.model.DescribeAlarmsResult;
import com.amazonaws.services.cloudwatch.model.MetricAlarm;
```

 **コード** 

```
final AmazonCloudWatch cw =
    AmazonCloudWatchClientBuilder.defaultClient();

boolean done = false;
DescribeAlarmsRequest request = new DescribeAlarmsRequest();

while(!done) {

    DescribeAlarmsResult response = cw.describeAlarms(request);

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

    request.setNextToken(response.getNextToken());

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

アラームのリストは `getMetricAlarms` を [ により返される ](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/cloudwatch/model/DescribeAlarmsResult.html)DescribeAlarmsResult`describeAlarms` で呼び出すことで取得できます。

結果は*ページ分割される*場合があります。結果の次のバッチを取得するには、`setNextToken` オブジェクトの `DescribeAlarmsResult` メソッドの戻り値を使用して元のリクエストオブジェクトで `getNextToken` を呼び出し、変更したリクエストオブジェクトを `describeAlarms` の再呼び出しに渡します。

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

## アラームの削除
<a name="delete-alarms"></a>

CloudWatch アラームを削除するには、AmazonCloudWatchClient の `deleteAlarms` メソッドを、削除するアラームの名前を 1 つ以上含む [DeleteAlarmsRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/cloudwatch/model/DeleteAlarmsRequest.html) で呼び出します。

 **インポート** 

```
import com.amazonaws.services.cloudwatch.AmazonCloudWatch;
import com.amazonaws.services.cloudwatch.AmazonCloudWatchClientBuilder;
import com.amazonaws.services.cloudwatch.model.DeleteAlarmsRequest;
import com.amazonaws.services.cloudwatch.model.DeleteAlarmsResult;
```

 **コード** 

```
final AmazonCloudWatch cw =
    AmazonCloudWatchClientBuilder.defaultClient();

DeleteAlarmsRequest request = new DeleteAlarmsRequest()
    .withAlarmNames(alarm_name);

DeleteAlarmsResult response = cw.deleteAlarms(request);
```

## 詳細情報
<a name="more-information"></a>
+  Amazon CloudWatch ユーザーガイドの [Amazon CloudWatch アラームの作成](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)
+  Amazon CloudWatch API リファレンスの [PutMetricAlarm](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_PutMetricAlarm.html)
+  Amazon CloudWatch API リファレンスの [DescribeAlarms](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_DescribeAlarms.html)
+  Amazon CloudWatch API リファレンスの [DeleteAlarms](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_DeleteAlarms.html)

# CloudWatch でのアラームアクションの使用
<a name="examples-cloudwatch-use-alarm-actions"></a>

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

**注記**  
[アラームの作成](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/cloudwatch/model/PutMetricAlarmRequest.html)時に `setAlarmActions`PutMetricAlarmRequest[ の ](examples-cloudwatch-create-alarms.md) メソッドを使用することで、アラームアクションをアラームに追加することができます。

## アラームアクションの有効化
<a name="enable-alarm-actions"></a>

CloudWatch アラームのアラームアクションを有効化するには、アクションを有効にしたい 1 つ以上のアラームの名前を含む [EnableAlarmActionsRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/cloudwatch/model/EnableAlarmActionsRequest.html) で AmazonCloudWatchClient の `enableAlarmActions` を呼び出します。

 **インポート** 

```
import com.amazonaws.services.cloudwatch.AmazonCloudWatch;
import com.amazonaws.services.cloudwatch.AmazonCloudWatchClientBuilder;
import com.amazonaws.services.cloudwatch.model.EnableAlarmActionsRequest;
import com.amazonaws.services.cloudwatch.model.EnableAlarmActionsResult;
```

 **コード** 

```
final AmazonCloudWatch cw =
    AmazonCloudWatchClientBuilder.defaultClient();

EnableAlarmActionsRequest request = new EnableAlarmActionsRequest()
    .withAlarmNames(alarm);

EnableAlarmActionsResult response = cw.enableAlarmActions(request);
```

## アラームアクションの無効化
<a name="disable-alarm-actions"></a>

CloudWatch アラームのアラームアクションを無効化するには、アクションを無効にしたい 1 つ以上のアラームの名前を含む [DisableAlarmActionsRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/cloudwatch/model/DisableAlarmActionsRequest.html) で AmazonCloudWatchClient の `disableAlarmActions` を呼び出します。

 **インポート** 

```
import com.amazonaws.services.cloudwatch.AmazonCloudWatch;
import com.amazonaws.services.cloudwatch.AmazonCloudWatchClientBuilder;
import com.amazonaws.services.cloudwatch.model.DisableAlarmActionsRequest;
import com.amazonaws.services.cloudwatch.model.DisableAlarmActionsResult;
```

 **コード** 

```
final AmazonCloudWatch cw =
    AmazonCloudWatchClientBuilder.defaultClient();

DisableAlarmActionsRequest request = new DisableAlarmActionsRequest()
    .withAlarmNames(alarmName);

DisableAlarmActionsResult response = cw.disableAlarmActions(request);
```

## 詳細情報
<a name="more-information"></a>
+  Amazon CloudWatch ユーザーガイドの[インスタンスを停止、終了、再起動、または復旧するアラームを作成する](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/UsingAlarmActions.html)
+  Amazon CloudWatch API リファレンスの [PutMetricAlarm](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_PutMetricAlarm.html)
+  Amazon CloudWatch API リファレンスの [EnableAlarmActions](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_EnableAlarmActions.html)
+  Amazon CloudWatch API リファレンスの [DisableAlarmActions](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_DisableAlarmActions.html)

# CloudWatch にイベントを送信する
<a name="examples-cloudwatch-send-events"></a>

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

## イベントの追加
<a name="add-events"></a>

カスタム CloudWatch イベントを追加するには、各イベントに関する詳細情報を提供している [PutEventsRequestEntry](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/cloudwatchevents/model/PutEventsRequestEntry.html) オブジェクトを 1 つ以上含む [PutEventsRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/cloudwatchevents/model/PutEventsRequest.html) オブジェクトを使用して AmazonCloudWatchEventsClient の `putEvents` メソッドを呼び出します。イベントのソースとタイプ、イベントに関連付けられたリソースなど、エントリの複数のパラメータを指定できます。

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

 **インポート** 

```
import com.amazonaws.services.cloudwatchevents.AmazonCloudWatchEvents;
import com.amazonaws.services.cloudwatchevents.AmazonCloudWatchEventsClientBuilder;
import com.amazonaws.services.cloudwatchevents.model.PutEventsRequest;
import com.amazonaws.services.cloudwatchevents.model.PutEventsRequestEntry;
import com.amazonaws.services.cloudwatchevents.model.PutEventsResult;
```

 **コード** 

```
final AmazonCloudWatchEvents cwe =
    AmazonCloudWatchEventsClientBuilder.defaultClient();

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

PutEventsRequestEntry request_entry = new PutEventsRequestEntry()
    .withDetail(EVENT_DETAILS)
    .withDetailType("sampleSubmitted")
    .withResources(resource_arn)
    .withSource("aws-sdk-java-cloudwatch-example");

PutEventsRequest request = new PutEventsRequest()
    .withEntries(request_entry);

PutEventsResult response = cwe.putEvents(request);
```

## ルールの追加
<a name="add-rules"></a>

ルールを作成または更新するには、ルールの名前を含む [PutRuleRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/cloudwatchevents/model/PutRuleRequest.html) と、[イベントパターン](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/CloudWatchEventsandEventPatterns.html)、ルールと関連付ける IAM ロール、およびルールの実行頻度を説明する[スケジュール式](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html)などを含む任意指定のパラメータを AmazonCloudWatchEventsClient の `putRule` メソッドを使用して呼び出します。

 **インポート** 

```
import com.amazonaws.services.cloudwatchevents.AmazonCloudWatchEvents;
import com.amazonaws.services.cloudwatchevents.AmazonCloudWatchEventsClientBuilder;
import com.amazonaws.services.cloudwatchevents.model.PutRuleRequest;
import com.amazonaws.services.cloudwatchevents.model.PutRuleResult;
import com.amazonaws.services.cloudwatchevents.model.RuleState;
```

 **コード** 

```
final AmazonCloudWatchEvents cwe =
    AmazonCloudWatchEventsClientBuilder.defaultClient();

PutRuleRequest request = new PutRuleRequest()
    .withName(rule_name)
    .withRoleArn(role_arn)
    .withScheduleExpression("rate(5 minutes)")
    .withState(RuleState.ENABLED);

PutRuleResult response = cwe.putRule(request);
```

## ターゲットの追加
<a name="add-targets"></a>

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

ルールにターゲットを追加するには、更新するルールを含む [PutTargetsRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/cloudwatchevents/model/PutTargetsRequest.html) とルールに追加するターゲットのリストを使用して AmazonCloudWatchEventsClient の `putTargets` メソッドを呼び出します。

 **インポート** 

```
import com.amazonaws.services.cloudwatchevents.AmazonCloudWatchEvents;
import com.amazonaws.services.cloudwatchevents.AmazonCloudWatchEventsClientBuilder;
import com.amazonaws.services.cloudwatchevents.model.PutTargetsRequest;
import com.amazonaws.services.cloudwatchevents.model.PutTargetsResult;
import com.amazonaws.services.cloudwatchevents.model.Target;
```

 **コード** 

```
final AmazonCloudWatchEvents cwe =
    AmazonCloudWatchEventsClientBuilder.defaultClient();

Target target = new Target()
    .withArn(function_arn)
    .withId(target_id);

PutTargetsRequest request = new PutTargetsRequest()
    .withTargets(target)
    .withRule(rule_name);

PutTargetsResult response = cwe.putTargets(request);
```

## 詳細情報
<a name="more-information"></a>
+  Amazon CloudWatch Events ユーザーガイドの [PutEvents を使用したイベントの追加](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/AddEventsPutEvents.html)
+  Amazon CloudWatch Events ユーザーガイドの[ルールのスケジュール式](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html)
+  Amazon CloudWatch Events ユーザーガイドの [CloudWatch イベントのイベントタイプ](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/EventTypes.html)
+  Amazon CloudWatch Events ユーザーガイドの[イベントとイベントパターン](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/CloudWatchEventsandEventPatterns.html)
+  Amazon CloudWatch Events API リファレンスの [PutEvents](https://docs.aws.amazon.com/AmazonCloudWatchEvents/latest/APIReference/API_PutEvents.html)
+  Amazon CloudWatch Events API リファレンスの [PutTargets](https://docs.aws.amazon.com/AmazonCloudWatchEvents/latest/APIReference/API_PutTargets.html)
+  Amazon CloudWatch Events API リファレンスの [PutRule](https://docs.aws.amazon.com/AmazonCloudWatchEvents/latest/APIReference/API_PutRule.html)

# DynamoDB を使用した例AWS SDK for Java
<a name="examples-dynamodb"></a>

このセクションでは、[AWS SDK for Java](https://aws.amazon.com/sdk-for-java/) を使用して [DynamoDB](https://aws.amazon.com/dynamodb/) をプログラムする例を示します。

**注記**  
例には各手法を示すのに必要なコードのみが含まれます。[完全なサンプルコードは GitHub で入手できます](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/java)。そこから、単一のソースファイルをダウンロードするかリポジトリをローカルにクローン作成して、ビルドし実行するためのすべての例を取得できます。

**Topics**
+ [AWS アカウントベースのエンドポイントの使用](#account-based-endpoint-routing)
+ [DynamoDB でのテーブルの操作](examples-dynamodb-tables.md)
+ [DynamoDB での項目の操作](examples-dynamodb-items.md)

## AWS アカウントベースのエンドポイントの使用
<a name="account-based-endpoint-routing"></a>

DynamoDB では、AWS アカウント ID を使用してリクエストのルーティングを効率化することでパフォーマンスを向上させる [AWS アカウントベースのエンドポイント](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.SDKOverview.html#Programming.SDKs.endpoints)が提供されています。

この機能を利用するには、AWS SDK for Java のバージョン 1 のバージョン 1.12.771 以降を使用する必要があります。[Maven 中央リポジトリ](https://central.sonatype.com/artifact/com.amazonaws/aws-java-sdk-bom)で SDK の最新バージョンを検索できます。サポートされているバージョンの SDK がアクティブになると、新しいエンドポイントが自動的に使用されます。

アカウントベースのルーティングをオプトアウトするには、次の 4 つのオプションがあります。
+ `AccountIdEndpointMode` を `DISABLED` に設定して DynamoDB サービスクライアントを構成する。
+ 環境変数を設定する。
+ JVM システムプロパティを設定する。
+ 共有 AWS 設定ファイルを更新する。

次のスニペットは、DynamoDB サービスクライアントを設定してアカウントベースのルーティングを無効にする方法の例です。

```
ClientConfiguration config = new ClientConfiguration()
    .withAccountIdEndpointMode(AccountIdEndpointMode.DISABLED);
AWSCredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();

AmazonDynamoDB dynamodb = AmazonDynamoDBClientBuilder.standard()
    .withClientConfiguration(config)
    .withCredentials(credentialsProvider)
    .withRegion(Regions.US_WEST_2)
    .build();
```

AWS SDK およびツールリファレンスガイドには、後半[ 3 つの設定オプション](https://docs.aws.amazon.com/sdkref/latest/guide/feature-account-endpoints.html)に関する詳細が記載されています。

# DynamoDB でのテーブルの操作
<a name="examples-dynamodb-tables"></a>

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

テーブルごとに、以下を定義する必要があります。
+ アカウントおよびリージョンに一意であるテーブル*名*。
+ *プライマリキー*。すべての値は一意でなければならず、テーブル内のどの 2 つの項目も同じプライマリキー値を持つことはできません。

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

  各キーバリューには、[ScalarAttributeType](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/model/ScalarAttributeType.html) クラスによって列挙される*データ型*が関連付けられています。キー値は、バイナリ (B)、数値 (N)、または文字列 (S) になります。詳細については、Amazon DynamoDB デベロッパーガイドの[命名規則とデータ型](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html)を参照してください。
+  テーブル用に予約された読み込み/書き込みキャパシティーユニットの数を定義する*プロビジョニングされたスループット*の値。
**注記**  
 [Amazon DynamoDB の料金](https://aws.amazon.com/dynamodb/pricing/)は、テーブルに設定したプロビジョニングされたスループット値に基づくため、テーブルに必要と予想される分だけの容量を予約します。

テーブルのプロビジョニングされたスループットはいつでも変更できるため、必要に応じてキャパシティーを調整できます。

## テーブルを作成する
<a name="dynamodb-create-table"></a>

新しい DynamoDB テーブルを作成するには、[DynamoDB クライアント](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/AmazonDynamoDB.html)の `createTable` メソッドを使用します。テーブルのプライマリキーを識別するために使用する、テーブル属性とテーブルスキーマを構築する必要があります。また、最初のプロビジョニングされたスループット値およびテーブル名を指定する必要があります。DynamoDB テーブルの作成時に、キーテーブルの属性のみを定義します。

**注記**  
選択した名前のテーブルが既に存在している場合は、[AmazonServiceException](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/AmazonServiceException.html) がスローされます。

 **インポート**。

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
import com.amazonaws.services.dynamodbv2.model.CreateTableResult;
import com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
import com.amazonaws.services.dynamodbv2.model.KeyType;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
import com.amazonaws.services.dynamodbv2.model.ScalarAttributeType;
```

### シンプルプライマリキーを使用してテーブルを作成する
<a name="dynamodb-create-table-simple"></a>

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

 **Code** 

```
CreateTableRequest request = new CreateTableRequest()
    .withAttributeDefinitions(new AttributeDefinition(
             "Name", ScalarAttributeType.S))
    .withKeySchema(new KeySchemaElement("Name", KeyType.HASH))
    .withProvisionedThroughput(new ProvisionedThroughput(
             new Long(10), new Long(10)))
    .withTableName(table_name);

final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient();

try {
    CreateTableResult result = ddb.createTable(request);
    System.out.println(result.getTableDescription().getTableName());
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/dynamodb/src/main/java/aws/example/dynamodb/CreateTable.java) で完全な例をご覧ください。

### 複合プライマリキーを使用してテーブルを作成する
<a name="dynamodb-create-table-composite"></a>

別の [AttributeDefinition](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/model/AttributeDefinition.html) および [KeySchemaElement](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/model/KeySchemaElement.html) を [CreateTableRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/model/CreateTableRequest.html) に追加します。

 **Code** 

```
CreateTableRequest request = new CreateTableRequest()
    .withAttributeDefinitions(
          new AttributeDefinition("Language", ScalarAttributeType.S),
          new AttributeDefinition("Greeting", ScalarAttributeType.S))
    .withKeySchema(
          new KeySchemaElement("Language", KeyType.HASH),
          new KeySchemaElement("Greeting", KeyType.RANGE))
    .withProvisionedThroughput(
          new ProvisionedThroughput(new Long(10), new Long(10)))
    .withTableName(table_name);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/dynamodb/src/main/java/aws/example/dynamodb/CreateTableCompositeKey.java) で完全な例をご覧ください。

## テーブルの一覧表示
<a name="dynamodb-list-tables"></a>

特定のリージョンのテーブルを一覧表示するには、[DynamoDB クライアント](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/AmazonDynamoDB.html)の `listTables` メソッドを呼び出します。

**注記**  
指定したテーブルがアカウントやリージョンにない場合は、[ResourceNotFoundException](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/model/ResourceNotFoundException.html) がスローされます。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.model.ListTablesRequest;
import com.amazonaws.services.dynamodbv2.model.ListTablesResult;
```

 **コード** 

```
final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient();

ListTablesRequest request;

boolean more_tables = true;
String last_name = null;

while(more_tables) {
    try {
        if (last_name == null) {
        	request = new ListTablesRequest().withLimit(10);
        }
        else {
        	request = new ListTablesRequest()
        			.withLimit(10)
        			.withExclusiveStartTableName(last_name);
        }

        ListTablesResult table_list = ddb.listTables(request);
        List<String> table_names = table_list.getTableNames();

        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 = table_list.getLastEvaluatedTableName();
        if (last_name == null) {
            more_tables = false;
        }
```

デフォルトでは、1 回の呼び出しで最大 100 個のテーブルが返されます。評価された最後のテーブルを取得するには、返された [ListTablesResult](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/model/ListTablesResult.html) オブジェクトに対して `getLastEvaluatedTableName` を使用します。この値を使用して、前回の一覧表示で返された最後の値以降から、一覧表示を開始できます。

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/dynamodb/src/main/java/aws/example/dynamodb/ListTables.java) で完全な例をご覧ください。

## テーブルの説明 (テーブルに関する情報の取得)
<a name="dynamodb-describe-table"></a>

[DynamoDB クライアント](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/AmazonDynamoDB.html)の `describeTable` メソッドを呼び出します。

**注記**  
指定したテーブルがアカウントやリージョンにない場合は、[ResourceNotFoundException](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/model/ResourceNotFoundException.html) がスローされます。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughputDescription;
import com.amazonaws.services.dynamodbv2.model.TableDescription;
```

 **Code** 

```
final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient();

try {
    TableDescription table_info =
       ddb.describeTable(table_name).getTable();

    if (table_info != null) {
        System.out.format("Table name  : %s\n",
              table_info.getTableName());
        System.out.format("Table ARN   : %s\n",
              table_info.getTableArn());
        System.out.format("Status      : %s\n",
              table_info.getTableStatus());
        System.out.format("Item count  : %d\n",
              table_info.getItemCount().longValue());
        System.out.format("Size (bytes): %d\n",
              table_info.getTableSizeBytes().longValue());

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

        List<AttributeDefinition> attributes =
           table_info.getAttributeDefinitions();
        System.out.println("Attributes");
        for (AttributeDefinition a : attributes) {
            System.out.format("  %s (%s)\n",
                  a.getAttributeName(), a.getAttributeType());
        }
    }
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/dynamodb/src/main/java/aws/example/dynamodb/DescribeTable.java) で完全な例をご覧ください。

## テーブルの変更 (更新)
<a name="dynamodb-update-table"></a>

[DynamoDB クライアント](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/AmazonDynamoDB.html)の `updateTable` メソッドを呼び出すことで、テーブルのプロビジョニングされたスループット値を随時変更できます。

**注記**  
指定したテーブルがアカウントやリージョンにない場合は、[ResourceNotFoundException](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/model/ResourceNotFoundException.html) がスローされます。

 **インポート** 

```
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
import com.amazonaws.AmazonServiceException;
```

 **Code** 

```
ProvisionedThroughput table_throughput = new ProvisionedThroughput(
      read_capacity, write_capacity);

final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient();

try {
    ddb.updateTable(table_name, table_throughput);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/dynamodb/src/main/java/aws/example/dynamodb/UpdateTable.java) で完全な例をご覧ください。

## テーブルの削除
<a name="dynamodb-delete-table"></a>

[DynamoDB クライアント](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/AmazonDynamoDB.html)の `deleteTable` メソッドを呼び出し、それにテーブルの名前を渡します。

**注記**  
指定したテーブルがアカウントやリージョンにない場合は、[ResourceNotFoundException](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/model/ResourceNotFoundException.html) がスローされます。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
```

 **Code** 

```
final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient();

try {
    ddb.deleteTable(table_name);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/dynamodb/src/main/java/aws/example/dynamodb/DeleteTable.java) で完全な例をご覧ください。

## 詳細
<a name="more-info"></a>
+  Amazon DynamoDB デベロッパーガイドの[テーブルの操作のガイドライン](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html)
+  Amazon DynamoDB デベロッパーガイドの [DynamoDB のテーブルの操作](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html)

# DynamoDB での項目の操作
<a name="examples-dynamodb-items"></a>

DynamoDB で、項目とは、*属性*のコレクションで、それぞれに*名前*と*値*があります。属性値はスカラー型、セット型、ドキュメント型のいずれかです。詳細については、Amazon DynamoDB デベロッパーガイドの[命名規則とデータ型](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html)を参照してください。

## テーブルからの項目の取り出し (取得)
<a name="dynamodb-get-item"></a>

AmazonDynamoDB の `getItem` メソッドを呼び出して、指定する項目のテーブル名とプライマリキーバリューを持つ [GetItemRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/model/GetItemRequest.html) オブジェクトを渡します。[GetItemResult](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/model/GetItemResult.html) オブジェクトが返されます。

返された `GetItemResult` オブジェクトの `getItem()` メソッドを使用して、項目に関連付けられているキー (String) と値 ([AttributeValue](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/model/AttributeValue.html)) のペアの [Map](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Map.html) を取得できます。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.GetItemRequest;
import java.util.HashMap;
import java.util.Map;
```

 **Code** 

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

key_to_get.put("DATABASE_NAME", new AttributeValue(name));

GetItemRequest request = null;
if (projection_expression != null) {
    request = new GetItemRequest()
        .withKey(key_to_get)
        .withTableName(table_name)
        .withProjectionExpression(projection_expression);
} else {
    request = new GetItemRequest()
        .withKey(key_to_get)
        .withTableName(table_name);
}

final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient();

try {
    Map<String,AttributeValue> returned_item =
       ddb.getItem(request).getItem();
    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 (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/dynamodb/src/main/java/aws/example/dynamodb/GetItem.java) で完全な例をご覧ください。

## テーブルへの新しい項目の追加
<a name="dynamodb-add-item"></a>

項目の属性を表すキーと値のペアの[マップ](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Map.html)を作成します。これらには、テーブルのプライマリキーフィールドの値を含める必要があります。プライマリキーで特定される項目がすでにある場合、フィールドはリクエストによって*更新*されます。

**注記**  
指定したテーブルがアカウントやリージョンにない場合は、[ResourceNotFoundException](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/model/ResourceNotFoundException.html) がスローされます。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.ResourceNotFoundException;
import java.util.ArrayList;
```

 **Code** 

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

item_values.put("Name", new AttributeValue(name));

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

final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient();

try {
    ddb.putItem(table_name, item_values);
} 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 (AmazonServiceException e) {
    System.err.println(e.getMessage());
    System.exit(1);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/dynamodb/src/main/java/aws/example/dynamodb/PutItem.java) で完全な例をご覧ください。

## テーブルの既存の項目の更新
<a name="dynamodb-update-item"></a>

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

**注記**  
指定したテーブルがアカウントやリージョンにない場合、または渡したプライマリキーで特定される項目がない場合、[ResourceNotFoundException](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/model/ResourceNotFoundException.html) がスローされます。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.model.AttributeAction;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.AttributeValueUpdate;
import com.amazonaws.services.dynamodbv2.model.ResourceNotFoundException;
import java.util.ArrayList;
```

 **Code** 

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

item_key.put("Name", new AttributeValue(name));

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

for (String[] field : extra_fields) {
    updated_values.put(field[0], new AttributeValueUpdate(
                new AttributeValue(field[1]), AttributeAction.PUT));
}

final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient();

try {
    ddb.updateItem(table_name, item_key, updated_values);
} catch (ResourceNotFoundException e) {
    System.err.println(e.getMessage());
    System.exit(1);
} catch (AmazonServiceException e) {
    System.err.println(e.getMessage());
    System.exit(1);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/dynamodb/src/main/java/aws/example/dynamodb/UpdateItem.java) で完全な例をご覧ください。

## DynamoDBMapper クラスの使用
<a name="use-the-dynamodbmapper-class"></a>

[AWS SDK for Java](https://aws.amazon.com/sdk-for-java/) には [DynamoDBMapper](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html) クラスが用意されているため、クライアント側のクラスを Amazon DynamoDB テーブルにマッピングできます。[DynamoDBMapper](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html) クラスを使用するには、注釈を使用して、DynamoDB テーブルの項目とコード内のそれに対応するオブジェクトインスタンスの間の関係を定義します (次のコード例を参照)。[DynamoDBMapper](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html) クラスでは、テーブルへのアクセス、さまざまな作成、読み取り、更新、削除 (CRUD) オペレーションの実行、およびクエリを行うことができます。

**注記**  
[DynamoDBMapper](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html) クラスでは、テーブルを作成、更新、または削除することはできません。

 **インポート** 

```
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBRangeKey;
import com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException;
```

 **コード** 

次の Java サンプルコードは、[DynamoDBMapper](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html) クラスを使用して *Music* テーブルにコンテンツを追加する方法を示しています。コンテンツがテーブルに追加されると、*Partition* キーと *Sort* キーを使用して項目がロードされることに注意してください。その後、*Awards* 項目が更新されます。*Music* テーブルの作成については、Amazon DynamoDB デベロッパーガイドの[テーブルの作成](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html)を参照してください。

```
       AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();
       MusicItems items = new MusicItems();

       try{
           // Add new content to the Music table
           items.setArtist(artist);
           items.setSongTitle(songTitle);
           items.setAlbumTitle(albumTitle);
           items.setAwards(Integer.parseInt(awards)); //convert to an int

           // Save the item
           DynamoDBMapper mapper = new DynamoDBMapper(client);
           mapper.save(items);

           // Load an item based on the Partition Key and Sort Key
           // Both values need to be passed to the mapper.load method
           String artistName = artist;
           String songQueryTitle = songTitle;

           // Retrieve the item
           MusicItems itemRetrieved = mapper.load(MusicItems.class, artistName, songQueryTitle);
           System.out.println("Item retrieved:");
           System.out.println(itemRetrieved);

           // Modify the Award value
           itemRetrieved.setAwards(2);
           mapper.save(itemRetrieved);
           System.out.println("Item updated:");
           System.out.println(itemRetrieved);

           System.out.print("Done");
       } catch (AmazonDynamoDBException e) {
           e.getStackTrace();
       }
   }

   @DynamoDBTable(tableName="Music")
   public static class MusicItems {

       //Set up Data Members that correspond to columns in the Music table
       private String artist;
       private String songTitle;
       private String albumTitle;
       private int awards;

       @DynamoDBHashKey(attributeName="Artist")
       public String getArtist() {
           return this.artist;
       }

       public void setArtist(String artist) {
           this.artist = artist;
       }

       @DynamoDBRangeKey(attributeName="SongTitle")
       public String getSongTitle() {
           return this.songTitle;
       }

       public void setSongTitle(String title) {
           this.songTitle = title;
       }

       @DynamoDBAttribute(attributeName="AlbumTitle")
       public String getAlbumTitle() {
           return this.albumTitle;
       }

       public void setAlbumTitle(String title) {
           this.albumTitle = title;
       }

       @DynamoDBAttribute(attributeName="Awards")
       public int getAwards() {
           return this.awards;
       }

       public void setAwards(int awards) {
           this.awards = awards;
       }
   }
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/dynamodb/src/main/java/aws/example/dynamodb/UseDynamoMapping.java) で完全な例をご覧ください。

## 詳細
<a name="more-info"></a>
+  Amazon DynamoDB デベロッパーガイドの[項目の操作のガイドライン](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForItems.html)
+  Amazon DynamoDB デベロッパーガイドの [DynamoDB の項目の操作](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html)

# Amazon EC2 を使用した例AWS SDK for Java
<a name="prog-services-ec2"></a>

このセクションでは、AWS SDK for Java で [Amazon EC2](https://aws.amazon.com/ec2/) をプログラムする例を示します。

**Topics**
+ [チュートリアル: EC2 インスタンスの開始](how-to-ec2.md)
+ [Amazon EC2 での IAM ロールを使用した AWS リソースへのアクセスの許可](java-dg-roles.md)
+ [チュートリアル: Amazon EC2 スポットインスタンス](tutorial-spot-instances-java.md)
+ [チュートリアル: Amazon EC2 スポットリクエストの高度な管理](tutorial-spot-adv-java.md)
+ [Amazon EC2 インスタンスの管理](examples-ec2-instances.md)
+ [Amazon EC2 の Elastic IP アドレスの使用](examples-ec2-elastic-ip.md)
+ [リージョンとアベイラビリティーゾーンを使用する](examples-ec2-regions-zones.md)
+ [Amazon EC2 キーペアでの作業](examples-ec2-key-pairs.md)
+ [Amazon EC2 でセキュリティグループを操作する](examples-ec2-security-groups.md)

# チュートリアル: EC2 インスタンスの開始
<a name="how-to-ec2"></a>

このチュートリアルでは、AWS SDK for Java を使用して EC2 インスタンスを開始する方法を示します。

**Topics**
+ [前提条件](#prerequisitesec2)
+ [Amazon EC2 セキュリティグループを作成する](create-security-group.md)
+ [キーペアの作成](create-key-pair.md)
+ [Amazon EC2 インスタンスを実行する](run-instance.md)

## 前提条件
<a name="prerequisitesec2"></a>

開始する前に、AWS アカウント を作成したこと、および AWS 認証情報を設定したことを確認します。詳細については、「[はじめに](getting-started.md)」を参照してください。

# Amazon EC2 セキュリティグループを作成する
<a name="create-security-group"></a>

## EC2-Classic は廃止されます
<a name="retiringEC2Classic"></a>

**警告**  
2022 年 8 月 15 日に、EC2-Classic の提供を終了しｈます。EC2-Classic は、VPC への移行をお勧めします。詳細については、ブログ記事[EC2-Classic-Classic Networking is Retiring – Here's How to Prepare](https://aws.amazon.com/blogs/aws/ec2-classic-is-retiring-heres-how-to-prepare/)を参照してください。

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

EC2-Classic または EC2-VPC で使用するセキュリティグループを作成します。EC2-Classic と EC2-VPC の詳細については、Amazon EC2 Linux インスタンス用ユーザーガイドの[サポートされるプラットフォーム](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-supported-platforms.html)を参照してください。

Amazon EC2 コンソールを使用したセキュリティグループの作成の詳細については、「Linux インスタンス用 Amazon EC2 ユーザーガイド」の「[Amazon EC2 セキュリティグループ](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html)」を参照してください。

1. [CreateSecurityGroupRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/CreateSecurityGroupRequest.html) インスタンスを作成し、初期化します。[ withGroupName](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/CreateSecurityGroupRequest.html#withGroupName-java.lang.String-) メソッドを使用してセキュリティグループの名前を設定し、[ withDescription](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/CreateSecurityGroupRequest.html#withDescription-java.lang.String-) メソッドを使用してセキュリティグループの説明を設定します。次に例を示します。

   ```
   CreateSecurityGroupRequest csgr = new CreateSecurityGroupRequest();
   csgr.withGroupName("JavaSecurityGroup").withDescription("My security group");
   ```

   セキュリティグループ名は、Amazon EC2 クライアントを初期化する AWS リージョン内で一意である必要があります。セキュリティグループの名前と説明には、US-ASCII 文字を使用する必要があります。

1. リクエストオブジェクトをパラメータとして [createSecurityGroup](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/AmazonEC2.html#createSecurityGroup-com.amazonaws.services.ec2.model.CreateSecurityGroupRequest-) メソッドに渡します。このメソッドは [ CreateSecurityGroupResult ](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/CreateSecurityGroupResult.html) オブジェクトを返します。次に例を示します。

   ```
   CreateSecurityGroupResult createSecurityGroupResult =
       amazonEC2Client.createSecurityGroup(csgr);
   ```

   既存のセキュリティグループと同じ名前でセキュリティグループを作成しようとすると、`createSecurityGroup` によって例外がスローされます。

デフォルトでは、新しいセキュリティグループは Amazon EC2 インスタンスへのインバウンドトラフィックを許可しません。インバウンドトラフィックを許可するには、セキュリティグループの進入を明示的に承認する必要があります。個々の IP アドレス、IP アドレスの範囲、特定のプロトコル、および TCP/UDP ポートに対して進入を承認することができます。

1. [IpPermission ](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/IpPermission.html) インスタンスを作成し、初期化します。[withIpv4Ranges](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/IpPermission.html#withIpv4Ranges-java.util.Collection-) メソッドを使用して、進入の承認対象となる IP アドレスの範囲を設定し、[withIpProtocol](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/IpPermission.html#withIpProtocol-java.lang.String-) メソッドを使用して、IP プロトコルを設定します。[withFromPort](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/IpPermission.html#withFromPort-java.lang.Integer-) メソッドと [withToPort](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/IpPermission.html#withToPort-java.lang.Integer-) メソッドを使用して、進入の承認対象となるポートの範囲を指定します。次に例を示します。

   ```
   IpPermission ipPermission =
       new IpPermission();
   
   IpRange ipRange1 = new IpRange().withCidrIp("111.111.111.111/32");
   IpRange ipRange2 = new IpRange().withCidrIp("150.150.150.150/32");
   
   ipPermission.withIpv4Ranges(Arrays.asList(new IpRange[] {ipRange1, ipRange2}))
               .withIpProtocol("tcp")
               .withFromPort(22)
               .withToPort(22);
   ```

   進入が許可されるには、`IpPermission` オブジェクトで指定したすべての条件を満たしている必要があります。

   CIDR 表記を使用して IP アドレスを指定します。プロトコルを TCP/UDP として指定した場合は、送信元ポートと送信先ポートを指定する必要があります。ポートを承認できるのは、TCP または UDP を指定した場合のみです。

1. [ AuthorizeSecurityGroupIngressRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/AuthorizeSecurityGroupEgressRequest.html) インスタンスを作成し、初期化します。`withGroupName` メソッドを使用して、セキュリティグループの名前を指定し、前に初期化した `IpPermission` オブジェクトを [withIpPermissions](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/AuthorizeSecurityGroupEgressRequest.html#withIpPermissions-com.amazonaws.services.ec2.model.IpPermission…​-) メソッドに渡します。次に例を示します。

   ```
   AuthorizeSecurityGroupIngressRequest authorizeSecurityGroupIngressRequest =
       new AuthorizeSecurityGroupIngressRequest();
   
   authorizeSecurityGroupIngressRequest.withGroupName("JavaSecurityGroup")
                                       .withIpPermissions(ipPermission);
   ```

1. リクエストオブジェクトを [authorizeSecurityGroupIngress](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/AmazonEC2Client.html#authorizeSecurityGroupIngress-com.amazonaws.services.ec2.model.AuthorizeSecurityGroupIngressRequest-) メソッドに渡します。次に例を示します。

   ```
   amazonEC2Client.authorizeSecurityGroupIngress(authorizeSecurityGroupIngressRequest);
   ```

   進入がすでに承認されている IP アドレスを使用して `authorizeSecurityGroupIngress` を呼び出すと、メソッドによって例外がスローされます。`IpPermission` を呼び出す前に、新しい `AuthorizeSecurityGroupIngress` オブジェクトを作成し、初期化して、異なる IP、ポート、プロトコルに対して進入を承認します。

[authorizeSecurityGroupIngress](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/AmazonEC2Client.html#authorizeSecurityGroupIngress-com.amazonaws.services.ec2.model.AuthorizeSecurityGroupIngressRequest-) メソッドまたは [authorizeSecurityGroupEgress](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/AmazonEC2Client.html#authorizeSecurityGroupEgress-com.amazonaws.services.ec2.model.AuthorizeSecurityGroupEgressRequest-) メソッドを呼び出すと、セキュリティグループにルールが追加されます。

# キーペアの作成
<a name="create-key-pair"></a>

EC2 インスタンスを起動するときはキーペアを指定し、インスタンスに接続するときはキーペアのプライベートキーを指定する必要があります。キーペアを作成することも、他のインスタンスの起動時に使用した既存のキーペアを使用することもできます。詳細については、「Linux インスタンス用 Amazon EC2 ユーザーガイド」の「[Amazon EC2 Key Pairs](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)」を参照してください。

1. [CreateKeyPairRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/CreateKeyPairRequest.html) インスタンスを作成し、初期化します。[withKeyName](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/CreateKeyPairRequest.html#withKeyName-java.lang.String-) メソッドを使用して、キーペアの名前を設定します。次に例を示します。

   ```
   CreateKeyPairRequest createKeyPairRequest = new CreateKeyPairRequest();
   
   createKeyPairRequest.withKeyName(keyName);
   ```
**重要**  
キーペア名は一意である必要があります。既存のキーペアと同じキー名でキーペアを作成しようとすると、例外が発生します。

1. [createKeyPair](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/AmazonEC2.html#createKeyPair-com.amazonaws.services.ec2.model.CreateKeyPairRequest--) メソッドにリクエストオブジェクトを渡します。このメソッドは、[ CreateKeyPairResult](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/CreateKeyPairResult.html) インスタンスを返します。次に例を示します。

   ```
   CreateKeyPairResult createKeyPairResult =
     amazonEC2Client.createKeyPair(createKeyPairRequest);
   ```

1. 結果のオブジェクトの [getKeyPair](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/CreateKeyPairResult.html#getKeyPair--) メソッドを呼び出して、[KeyPair](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/KeyPair.html) オブジェクトを取得します。`KeyPair` オブジェクトの [getKeyMaterial](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/KeyPair.html#getKeyMaterial--) メソッドを呼び出して、暗号化されていない PEM エンコード形式のプライベートキーを取得します。次に例を示します。

   ```
   KeyPair keyPair = new KeyPair();
   
   keyPair = createKeyPairResult.getKeyPair();
   
   String privateKey = keyPair.getKeyMaterial();
   ```

# Amazon EC2 インスタンスを実行する
<a name="run-instance"></a>

同じ Amazon Machine Image (AMI) から全く同じに設定された 1 つ以上の EC2 インスタンスを起動するには、以下の手順を使用します。EC2 インスタンスを作成した後は、ステータスを確認できます。EC2 インスタンスが実行した後は、それに接続できます。

1. [RunInstancesRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/RunInstancesRequest.html) インスタンスを作成し、初期化します。指定した AMI、キーペア、およびセキュリティグループが、クライアントオブジェクトを作成したときに指定したリージョンに存在することを確認します。

   ```
   RunInstancesRequest runInstancesRequest =
      new RunInstancesRequest();
   
   runInstancesRequest.withImageId("ami-a9d09ed1")
                      .withInstanceType(InstanceType.T1Micro)
                      .withMinCount(1)
                      .withMaxCount(1)
                      .withKeyName("my-key-pair")
                      .withSecurityGroups("my-security-group");
   ```  
 [withImageId](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/RunInstancesRequest.html#withImageId-java.lang.String-)   
   + AMI の ID。Amazon から提供されるパブリック AMI を見つける方法や独自の AMI を作成する方法については、「[Amazon マシンイメージ (AMI)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html)」を参照してください。  
 [withInstanceType](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/RunInstancesRequest.html#withInstanceType-java.lang.String-)   
   + 指定した AMI と互換性のあるインスタンスタイプ。詳細については、Amazon EC2 Linux インスタンス用ユーザーガイドの[インスタンスタイプ](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)を参照してください。  
 [withMinCount](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/RunInstancesRequest.html#withMinCount-java.lang.Integer-)   
   + 起動する EC2 インスタンスの最小数。ターゲットアベイラビリティーゾーンで Amazon EC2 が起動できるインスタンスより多い場合、Amazon EC2 はインスタンスを起動しません。  
 [withMaxCount](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/RunInstancesRequest.html#withMaxCount-java.lang.Integer-)   
   + 起動する EC2 インスタンスの最大数。ターゲットアベイラビリティーゾーンで Amazon EC2 が起動できるインスタンスより多い場合、Amazon EC2 は `MinCount` より多くて可能な最大数のインスタンスを起動します。1 から、インスタンスタイプに対して許可されているインスタンスの最大数の間で起動できます。詳細については、Amazon EC2 の一般的なよくある質問の Amazon EC2 でいくつインスタンスを実行できますか? を参照してください。  
 [withKeyName](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/RunInstancesRequest.html#withKeyName-java.lang.String-)   
   + EC2 キーペアの名前。キーペアを指定せずにインスタンスを起動すると、接続できません。詳細については、「[キーペアの作成](create-key-pair.md)」を参照してください。  
 [withSecurityGroups](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/RunInstancesRequest.html#withSecurityGroups-java.util.Collection-)   
   + 1 つまたは複数のセキュリティグループ。詳細については、[Amazon EC2 セキュリティグループの作成](create-security-group.md)を参照してください。

1. リクエストオブジェクトを [runInstances](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/AmazonEC2Client.html#runInstances-com.amazonaws.services.ec2.model.RunInstancesRequest-) メソッドに渡してインスタンスを起動します。このメソッドは、[RunInstancesResult](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/RunInstancesResult.html) オブジェクトを返します。次に例を示します。

   ```
   RunInstancesResult result = amazonEC2Client.runInstances(
                                 runInstancesRequest);
   ```

インスタンスの実行後は、キーペアを使用してインスタンスにリモート接続することができます。詳細については、Amazon EC2 Linux インスタンス用ユーザーガイドの [Linux インスタンスへの接続](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstances.html)を参照してください。

# Amazon EC2 での IAM ロールを使用した AWS リソースへのアクセスの許可
<a name="java-dg-roles"></a>

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

このトピックでは、Amazon EC2 で実行されている Java SDK アプリケーションで IAM ロールを使用する方法について説明します。IAM インスタンスの詳細については、「Linux インスタンス用 Amazon EC2 ユーザーガイドの [IAM Roles for Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)」を参照してください。

## デフォルトプロバイダチェーンと EC2 インスタンスプロファイル
<a name="default-provider-chain"></a>

アプリケーションでデフォルトのコンストラクタを使用して AWS クライアントを作成する場合、そのクライアントは*デフォルトの認証情報プロバイダチェーン*を使用して次の順序で認証情報を検索します。

1. Java のシステムプロパティ: `aws.accessKeyId` と `aws.secretKey`。

1. システム環境変数: `AWS_ACCESS_KEY_ID` と `AWS_SECRET_ACCESS_KEY`。

1. デフォルトの認証情報ファイル (このファイルの場所はプラットフォームによって異なります)。

1. `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` 環境変数が設定されていて、セキュリティマネージャーが変数にアクセスするアクセス権限を持っている場合、Amazon EC2 コンテナサービスを介して配信される認証情報。

1. *インスタンスプロファイル認証情報*。EC2 インスタンスの IAM ロールに関連付けられたインスタンスメタデータ内にあります。

1. 環境またはコンテナからのウェブアイデンティティトークンの認証情報。

デフォルトのプロバイダチェーンの*インスタンスプロファイル認証情報*ステップは、アプリケーションを Amazon EC2 インスタンスで実行する場合にのみ使用できます。Amazon EC2 インスタンスを使用する場合にもっとも使い方が簡単でセキュリティに優れた方法です。また、[InstanceProfileCredentialsProvider](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/auth/InstanceProfileCredentialsProvider.html) インスタンスを直接クライアントコンストラクタに渡して、デフォルトプロバイダーチェーン全体を経ることなく、インスタンスプロファイル認証情報を取得することもできます。

例:

```
AmazonS3 s3 = AmazonS3ClientBuilder.standard()
              .withCredentials(new InstanceProfileCredentialsProvider(false))
              .build();
```

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

**重要**  
認証情報の自動更新は、デフォルトのプロバイダーチェーンの一部として独自の `InstanceProfileCredentialsProvider` を作成するデフォルトのクライアントコンストラクターを使用する場合、または `InstanceProfileCredentialsProvider` インスタンスをクライアントコンストラクターに直接渡す場合に*のみ*行われます。その他の手段でインスタンスプロファイル認証情報を取得または渡す場合は、お客様自身で期限切れ認証情報を確認し更新する必要があります。

クライアントコンストラクタが認証情報プロバイダチェーンを使用して証明書を見つけられない場合、[AmazonClientException](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/AmazonClientException.html) がスローされます。

## ウォークスルー: EC2 インスタンスでの IAM ロールの使用
<a name="roles-walkthrough"></a>

以下のウォークスルーでは、アクセス権を管理するために IAM ロールを使用して Amazon S3 からオブジェクトを取得する方法を示します。

### IAM ロールを作成します。
<a name="java-dg-create-the-role"></a>

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

1. [[IAM コンソール]](https://console.aws.amazon.com/iam/home) を開きます。

1. ナビゲーションペインで [**Roles**]、[**Create New Role**] の順に選択します。

1. ロールの名前を入力し、**[Next Step]** (次のステップ) を選択します。この名前は Amazon EC2 インスタンスを起動するときに必要になるため、覚えておいてください。

1. **[ロールタイプの選択]** ページの **[AWS のサービス ロール]** で、**[Amazon EC2]** を選択します。

1. [**許可を設定**] ページの **[ポリシーテンプレートの選択]** で、**[Amazon S3 読み取り専用アクセス]** を選択して、**[次のステップ]** を選択します。

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

### EC2 インスタンスを起動して IAM ロールを指定する
<a name="java-dg-launch-ec2-instance-with-instance-profile"></a>

Amazon EC2 コンソールまたは AWS SDK for Java を使用して、IAM ロールで Amazon EC2 インスタンスを起動できます。
+ コンソールを使用して Amazon EC2 インスタンスを起動するには、Amazon EC2 Linux インスタンス用ユーザーガイドの [Amazon EC2 Linux インスタンスの開始方法](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html)の指示に従います。

  [**Review Instance Launch (インスタンス作成の確認)**] ページを開いたら、[**Edit instance details (インスタンスの詳細の編集)**] を選択します。[**IAM role**] (IAM ロール) で、前に作成した IAM ロールを選択します。指示にしたがって手順を完了します。
**注記**  
そのインスタンスに接続するには、セキュリティグループとキーペアを作成するか、または既存のものを使用する必要があります。
+ AWS SDK for Java を使用して IAM ロールを使用する Amazon EC2 インスタンスを起動するには、[Amazon EC2 インスタンスの実行](run-instance.md)を参照してください。

### アプリケーションを作成する
<a name="java-dg-remove-the-credentials"></a>

EC2 インスタンスで実行するサンプルアプリケーションを作成してみましょう。まず、チュートリアルファイルを保存するために使用できるディレクトリを作成します (例: `GetS3ObjectApp`)。

次に、新しく作成したディレクトリに AWS SDK for Java ライブラリをコピーします。AWS SDK for Java を `~/Downloads` ディレクトリにダウンロードした場合は、次のコマンドを使用してそれらのライブラリをコピーできます。

```
cp -r ~/Downloads/aws-java-sdk-{1.7.5}/lib .
cp -r ~/Downloads/aws-java-sdk-{1.7.5}/third-party .
```

新規ファイルを開き、`GetS3Object.java` と名付け、次のコードを追加します。

```
import java.io.*;

import com.amazonaws.auth.*;
import com.amazonaws.services.s3.*;
import com.amazonaws.services.s3.model.*;
import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;

public class GetS3Object {
  private static final String bucketName = "text-content";
  private static final String key = "text-object.txt";

  public static void main(String[] args) throws IOException
  {
    AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();

    try {
      System.out.println("Downloading an object");
      S3Object s3object = s3Client.getObject(
          new GetObjectRequest(bucketName, key));
      displayTextInputStream(s3object.getObjectContent());
    }
    catch(AmazonServiceException ase) {
      System.err.println("Exception was thrown by the service");
    }
    catch(AmazonClientException ace) {
      System.err.println("Exception was thrown by the client");
    }
  }

  private static void displayTextInputStream(InputStream input) throws IOException
  {
    // Read one text line at a time and display.
    BufferedReader reader = new BufferedReader(new InputStreamReader(input));
    while(true)
    {
      String line = reader.readLine();
      if(line == null) break;
      System.out.println( "    " + line );
    }
    System.out.println();
  }
}
```

新規ファイルを開き、`build.xml` と名付け、次の行を追加します。

```
<project name="Get {S3} Object" default="run" basedir=".">
  <path id="aws.java.sdk.classpath">
    <fileset dir="./lib" includes="**/*.jar"/>
    <fileset dir="./third-party" includes="**/*.jar"/>
    <pathelement location="lib"/>
    <pathelement location="."/>
  </path>

  <target name="build">
  <javac debug="true"
    includeantruntime="false"
    srcdir="."
    destdir="."
    classpathref="aws.java.sdk.classpath"/>
  </target>

  <target name="run" depends="build">
    <java classname="GetS3Object" classpathref="aws.java.sdk.classpath" fork="true"/>
  </target>
</project>
```

変更を加えたプログラムを構築し、実行します。プログラムには認証情報は保存されていません。このため、AWS 認証情報が既に指定されていない場合、コードによって `AmazonServiceException` がスローされます。例:

```
$ ant
Buildfile: /path/to/my/GetS3ObjectApp/build.xml

build:
  [javac] Compiling 1 source file to /path/to/my/GetS3ObjectApp

run:
   [java] Downloading an object
   [java] AmazonServiceException

BUILD SUCCESSFUL
```

### EC2 インスタンスへのコンパイルしたプログラムの転送
<a name="java-dg-transfer-compiled-program-to-ec2-instance"></a>

Secure Copy (Amazon EC2**``) を使用して、** ライブラリとともに AWS SDK for Java インスタンスにプログラムを転送します。一連のコマンドは、次のようになります。

```
scp -p -i {my-key-pair}.pem GetS3Object.class ec2-user@{public_dns}:GetS3Object.class
scp -p -i {my-key-pair}.pem build.xml ec2-user@{public_dns}:build.xml
scp -r -p -i {my-key-pair}.pem lib ec2-user@{public_dns}:lib
scp -r -p -i {my-key-pair}.pem third-party ec2-user@{public_dns}:third-party
```

**注記**  
使用した Linux ディストリビューションに応じて、*ユーザー名*は「ec2-user」、「root」、「ubuntu」のいずれかになります。インスタンスのパブリック DNS 名を取得するには、[EC2 コンソール](https://console.aws.amazon.com/ec2/home)を開き、[**Description**] (説明) タブで [**Public DNS**] (パブリック DNS) 値を探します (例: `ec2-198-51-100-1.compute-1.amazonaws.com`)。

上記のコマンドでは:
+  `GetS3Object.class` はコンパイルされたプログラム、
+  `build.xml` はプログラムを構築して実行するために使用する ant ファイル、
+ `lib` ディレクトリと `third-party` ディレクトリは、AWS SDK for Java の対応するライブラリフォルダです。
+ `-r` スイッチは、`scp` が `library` ディストリビューションの `third-party` ディレクトリと AWS SDK for Java ディレクトリのすべてのコンテンツについて、再帰的なコピーを実行することを示しています。
+ `-p` スイッチは、ソースファイルがコピー先にコピーされるときに、`scp` ではソースファイルのアクセス許可が維持されることを示しています。
**注記**  
この `-p` スイッチは、Linux、macOS、または Unix でのみ機能します。Windows からファイルをコピーする場合、必要に応じて次のコマンドを使用し、インスタンスでのファイルへのアクセス許可を修正します。

```
chmod -R u+rwx GetS3Object.class build.xml lib third-party
```

### EC2 インスタンスでサンプルプログラムを実行する
<a name="java-dg-run-the-program"></a>

プログラムを実行するには、Amazon EC2 インスタンスに接続します。詳細については、Amazon EC2 Linux インスタンス用ユーザーガイドの [Linux インスタンスへの接続](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstances.html)を参照してください。

**` ant ` がインスタンスで使用できない場合は、次のコマンドを使用してインストールします。**

```
sudo yum install ant
```

次に、`ant` を使用して次のようにプログラムを実行します。

```
ant run
```

プログラムでは、Amazon S3 オブジェクトのコンテンツがコマンドウィンドウに表示されます。

# チュートリアル: Amazon EC2 スポットインスタンス
<a name="tutorial-spot-instances-java"></a>

## 概要
<a name="tutor-spot-java-overview"></a>

スポットインスタンスとは、Amazon Elastic Compute Cloud (Amazon EC2) の未使用キャパシティに対してお客様から価格を提示していただき、入札価格がその時点の*スポット料金*を上回っている限り、お客様がそのインスタンスを取得し、実行できるというシステムです。Amazon EC2 のスポット料金は、需要と供給に基づいて定期的に変動しますが、お客様の入札価格がその価格以上ならば、空いているスポットインスタンスにアクセスできます。オンデマンドインスタンスやリザーブドインスタンスと同様に、スポットインスタンスは計算キャパシティを増やしたいときの選択肢の 1 つとなります。

スポットインスタンスを利用すると、Amazon EC2 によるバッチ処理、科学研究、画像処理、動画エンコーディング、データと Web のクローリング、財務分析、テストなどのコストの大幅削減を期待できます。加えて、スポットインスタンスは、大量の追加計算キャパシティが必要であるけれどもその緊急性が低いという場合にも適しています。

スポットインスタンスを使用するには、スポットインスタンスリクエストを提出し、このときにインスタンス時間当たりいくらまで支払えるかを指定します。これが入札価格です。入札価格がその時点のスポット価格を超えている場合は、リクエストが受理されてインスタンスを実行できるようになります。このインスタンスの実行は、お客様がインスタンスを終了した時点と、スポット価格が入札価格を上回った時点のいずれか早い方までとなります。

次のことに注意することが重要です。
+ 時間当たりの支払い金額が入札価格を下回ることもよくあります。Amazon EC2 のスポット料金は、提出されるリクエストや空きインスタンスの変動に応じて、定期的に変更されます。お客様それぞれの入札価格の方が上かどうかにかかわらず、どのお客様もその期間の同一のスポット料金をお支払いいただきます。したがって、お客様が支払う金額は入札価格を下回ることもありますが、入札価格を超えることはありません。
+ スポットインスタンスを実行しているときに、お客様の入札価格がその時点のスポット料金以上ではなくなった場合は、そのインスタンスは終了となります。つまり、この変動性の高いキャパシティを活用できる、柔軟性の高いワークロードとアプリケーションに限ってスポットインスタンスを利用することをお勧めします。

スポットインスタンスは稼働中、他の Amazon EC2 インスタンスとまったく同じように動作します。そして他の Amazon EC2 インスタンスと同様に、スポットインスタンスは必要がなくなった場合に終了することができます。お客様がインスタンスを終了した場合は、使用時間の端数分についても料金をいただきます (オンデマンドやリザーブドのインスタンスと同様です)。ただし、スポット価格がお客様の入札価格を超えたためにインスタンスが Amazon EC2 によって終了させられた場合は、使用時間の端数分の料金は発生しません。

このチュートリアルでは、AWS SDK for Java を使用して以下を行う方法について説明します。
+ スポットリクエストを提出する
+ スポットリクエストが受理されたかどうかを判断する
+ スポットリクエストをキャンセルする
+ 関連するインスタンスを終了させる

## 前提条件
<a name="tutor-spot-java-prereq"></a>

このチュートリアルを使用するには、AWS SDK for Java がインストールされており、基本インストール前提条件を満たしている必要があります。詳細については、「[Set up the AWS SDK for Java](setup-install.md)」を参照してください。

## ステップ 1: 認証情報のセットアップ
<a name="tutor-spot-java-credentials"></a>

このサンプルコードの使用を開始するには、AWS 認証情報を設定する必要があります。その方法については、[開発用の AWS 認証情報とリージョンのセットアップ](setup-credentials.md)を参照してください。

**注記**  
IAM ユーザーの認証情報を使用してこれらの値を指定することをお勧めします。詳細については、[AWS にサインアップし、IAM ユーザーを作成する](signup-create-iam-user.md)を参照してください。

これで設定が完了したので、例に示すコードを使用できるようになります。

## ステップ 2: セキュリティグループのセットアップ
<a name="tutor-spot-java-sg"></a>

*セキュリティグループ*とは、ファイアウォールとしての役割を果たすものであり、インスタンスのグループに対してどのトラフィックの送受信を許可するかを制御します。デフォルトでは、インスタンスの起動時にセキュリティグループは何も設定されていません。つまり、着信 IP トラフィックは、どの TCP ポートであってもすべて拒否されます。したがって、ここでは、スポットリクエストを提出する前に、必要なネットワークトラフィックを許可するセキュリティグループをセットアップすることにします。このチュートリアルの目的に合わせて、ここでは新しいセキュリティグループを「GettingStarted」という名前で作成します。このグループでは、自分のアプリケーションを実行する IP アドレスからの Secure Shell (SSH) トラフィックを許可します。新しいセキュリティグループをセットアップするには、次に示すコードサンプルをインクルードするか実行する必要があります。このコードは、セキュリティグループをプログラムからセットアップするためのものです。

`AmazonEC2` クライアントオブジェクトを作成した後で、`CreateSecurityGroupRequest` オブジェクトを作成し、「GettingStarted」という名前と、セキュリティグループの説明を指定します。その後で、`ec2.createSecurityGroup` API を呼び出してグループを作成します。

このグループにアクセスできるようにするために、`ipPermission` オブジェクトを作成します。IP アドレス範囲は、ローカルコンピュータのサブネット (CIDR 表現) で設定します。IP アドレスの「/10」というサフィックスが、指定した IP アドレスのサブネットを示します。また、`ipPermission` オブジェクトを設定して TCP プロトコルとポート 22 (SSH) を指定します。最後のステップは、`ec2.authorizeSecurityGroupIngress` を呼び出すことです。このときに、作成したセキュリティグループの名前と `ipPermission` オブジェクトを指定します。

```
// Create the AmazonEC2 client so we can call various APIs.
AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

// Create a new security group.
try {
    CreateSecurityGroupRequest securityGroupRequest = new CreateSecurityGroupRequest("GettingStartedGroup", "Getting Started Security Group");
    ec2.createSecurityGroup(securityGroupRequest);
} catch (AmazonServiceException ase) {
    // Likely this means that the group is already created, so ignore.
    System.out.println(ase.getMessage());
}

String ipAddr = "0.0.0.0/0";

// Get the IP of the current host, so that we can limit the Security
// Group by default to the ip range associated with your subnet.
try {
    InetAddress addr = InetAddress.getLocalHost();

    // Get IP Address
    ipAddr = addr.getHostAddress()+"/10";
} catch (UnknownHostException e) {
}

// Create a range that you would like to populate.
ArrayList<String> ipRanges = new ArrayList<String>();
ipRanges.add(ipAddr);

// Open up port 22 for TCP traffic to the associated IP
// from above (e.g. ssh traffic).
ArrayList<IpPermission> ipPermissions = new ArrayList<IpPermission> ();
IpPermission ipPermission = new IpPermission();
ipPermission.setIpProtocol("tcp");
ipPermission.setFromPort(new Integer(22));
ipPermission.setToPort(new Integer(22));
ipPermission.setIpRanges(ipRanges);
ipPermissions.add(ipPermission);

try {
    // Authorize the ports to the used.
    AuthorizeSecurityGroupIngressRequest ingressRequest =
        new AuthorizeSecurityGroupIngressRequest("GettingStartedGroup",ipPermissions);
    ec2.authorizeSecurityGroupIngress(ingressRequest);
} catch (AmazonServiceException ase) {
    // Ignore because this likely means the zone has
    // already been authorized.
    System.out.println(ase.getMessage());
}
```

このアプリケーションを実行して新しいセキュリティグループを作成する必要があるのは 1 回のみです。

また、AWS Toolkit for Eclipse を使用してセキュリティグループを作成することもできます。詳細については、「[Managing Security Groups from AWS Cost Explorer](https://docs.aws.amazon.com/toolkit-for-eclipse/v1/user-guide/tke-sg.html)」を参照してください。

## ステップ 3: スポットリクエストを提出する
<a name="tutor-spot-java-submit"></a>

スポットリクエストを提出するには、最初に、使用するインスタンスタイプ、Amazon マシンイメージ (AMI)、最高入札価格を決定する必要があります。前のステップで設定したセキュリティグループも指定する必要があります。これは、必要に応じてインスタンスにログインできるようにするためです。

選択できるインスタンスタイプにはさまざまなものがあります。すべての一覧については、Amazon EC2 インスタンスタイプのページを参照してください。このチュートリアルでは、最も低価格のインスタンスタイプである t1.micro を使用します。次に、使用する AMI のタイプを決定します。ここでは、ami-a9d09ed1 を使用します。これは、このチュートリアルの執筆時点で最新の Amazon Linux AMI です。最新の AMI は時間の経過と共に変化する可能性がありますが、次のステップを実行することで最新バージョンの AMI であることを常に判断できます。

1. [Amazon EC2 コンソール](https://console.aws.amazon.com/ec2/home)を開きます。

1. [**Launch Instance (インスタンスの起動)**] ボタンを選択します。

1. 最初のウィンドウには、利用可能な AMI が表示されます。各 AMI のタイトルの横には、AMI の ID が表示されます。`DescribeImages` API を使用することもできますが、このコマンドの利用方法は、このチュートリアルでは取り上げません。

スポットインスタンス入札のアプローチは多数あります。さまざまなアプローチの概要については、[スポットインスタンスの入札](https://www.youtube.com/watch?v=WD9N73F3Fao&feature=player_embedded)の動画をご覧ください。ただし、ここでは初めての方のために、3 つの一般的な戦略について説明します。その 3 つとは、「コストがオンデマンド価格より低くなるように入札する」、「計算処理の結果の価値に基づいて入札する」、「できるだけ早くコンピューティング性能を獲得できるように入札する」です。
+  * コストをオンデマンドよりも低くする* 実行完了までに何時間も、あるいは何日間もかかるバッチ処理ジョブがあるとします。ただし、いつ開始していつ完了するかについては、特に決められていないものとします。このジョブを完了するためのコストを、オンデマンドインスタンスを使用する場合よりも低くできるかどうかを考えます。インスタンスタイプのスポット価格の履歴を、AWS マネジメントコンソール または Amazon EC2 API を使用して調べます。詳細については、「[スポット価格の履歴の表示](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-spot-instances-history.html)」を参照してください。使用したいインスタンスタイプの、特定のアベイラビリティーゾーンでの価格履歴を分析した後は、入札のアプローチとして次の 2 つも考えられます。
  + スポット料金の範囲の上限（ただしオンデマンド価格よりは下）で入札します。このようにすれば、この 1 回限りのスポットリクエストが受理される可能性が高くなり、ジョブが完了するまで連続して実行できるからです。
  + または、スポットインスタンスに対して支払う金額をオンデマンドインスタンス料金の % で指定し、1 つの永続リクエストで次々とインスタンスを起動することを計画できます。指定された料金を超えた場合、スポットインスタンスは終了します。(この作業を自動化する方法については、このチュートリアルで後ほど説明します。)
+  *結果の価値以上は支払わない* データ処理ジョブを実行するとします。このジョブの結果の価値は判明しており、計算コストに換算してどれくらいになるかもわかっています。使用するインスタンスタイプのスポット料金履歴の分析が完了した後で、入札価格を選択します。コンピューティング時間のコストがこのジョブの結果の価値を上回ることがないように、価格を決定します。永続リクエストを作成し、スポット料金が入札価格以下となったときに断続的に実行するよう設定します。
+  *計算キャパシティをすぐに獲得する* 追加のキャパシティが突然、短期間だけ必要になることがあり、オンデマンドインスタンスではそのキャパシティを獲得できないとします。使用するインスタンスタイプのスポット料金履歴の分析が完了した後で、履歴の価格の最大値を超える価格で入札します。このようにすれば、リクエストがすぐに受理される可能性が高まり、完了するまで連続して計算できるようになります。

入札価格を選択すると、スポットインスタンスをリクエストできる状態になります。ここでは、このチュートリアルの目的に合わせて、オンデマンド価格 (0.03 USD) で入札します。これは、受理される可能性を最大にするためです。利用できるインスタンスのタイプと、インスタンスのオンデマンド料金を調べるには、Amazon EC2 の料金のページを参照してください。スポットインスタンスの実行中は、インスタンスが実行された期間で有効なスポット料金を支払い続けます。スポットインスタンス料金は Amazon EC2 で設定され、長期の需要と供給応じて、スポットインスタンス容量に合わせて緩やかに調整されます。また、スポットインスタンスに対して支払う金額をオンデマンドインスタンス料金の % で指定することもできます。スポットインスタンスをリクエストするには、先ほど選択したパラメータを使用してリクエストを構築するだけです。初めに、`RequestSpotInstanceRequest` オブジェクトを作成します。このリクエストオブジェクトには、起動したいインスタンスの数と入札価格が必要です。さらに、リクエストの `LaunchSpecification` を設定する必要があります。この内容は、インスタンスタイプ、AMI ID、および使用するセキュリティグループです。リクエストの内容が入力されたら、`requestSpotInstances` オブジェクトの `AmazonEC2Client` メソッドを呼び出します。次の例で、スポットインスタンスをリクエストする方法を示します。

```
// Create the AmazonEC2 client so we can call various APIs.
AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

// Initializes a Spot Instance Request
RequestSpotInstancesRequest requestRequest = new RequestSpotInstancesRequest();

// Request 1 x t1.micro instance with a bid price of $0.03.
requestRequest.setSpotPrice("0.03");
requestRequest.setInstanceCount(Integer.valueOf(1));

// Setup the specifications of the launch. This includes the
// instance type (e.g. t1.micro) and the latest Amazon Linux
// AMI id available. Note, you should always use the latest
// Amazon Linux AMI id or another of your choosing.
LaunchSpecification launchSpecification = new LaunchSpecification();
launchSpecification.setImageId("ami-a9d09ed1");
launchSpecification.setInstanceType(InstanceType.T1Micro);

// Add the security group to the request.
ArrayList<String> securityGroups = new ArrayList<String>();
securityGroups.add("GettingStartedGroup");
launchSpecification.setSecurityGroups(securityGroups);

// Add the launch specifications to the request.
requestRequest.setLaunchSpecification(launchSpecification);

// Call the RequestSpotInstance API.
RequestSpotInstancesResult requestResult = ec2.requestSpotInstances(requestRequest);
```

このコードを実行すると、新しいスポットインスタンスリクエストが発行されます。他にも、スポットリクエストの設定に使用できるオプションがあります。詳細については、[チュートリアル: Amazon EC2 スポットリクエストの高度な管理](tutorial-spot-adv-java.md)または AWS SDK for Java API リファレンスの [RequestSpotInstances](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/RequestSpotInstancesRequest.html) クラスにアクセスしてください。

**注記**  
スポットインスタンスが実際に起動されるとお客様への課金が発生するので、料金を抑えるために、リクエストを作成した場合はキャンセルし、インスタンスを起動した場合は終了してください。

## ステップ 4: スポットリクエストの状態を特定する
<a name="tutor-spot-java-request-state"></a>

次に、最後のステップに進む前にスポットリクエストの状態が「アクティブ」になるのを待つようにするコードを作成する必要があります。スポットリクエストの状態を特定するには、[describeSpotInstanceRequests](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/AmazonEC2Client.html#describeSpotInstanceRequests) メソッドをポーリングすることによって、モニタリング対象のスポットリクエスト ID の状態を調べます。

ステップ 2 で作成したリクエスト ID は、`requestSpotInstances` リクエストへのレスポンスに埋め込まれています。次に示すコード例では、リクエスト ID を `requestSpotInstances` レスポンスから取り出して `ArrayList` への入力に使用する方法を示します。

```
// Call the RequestSpotInstance API.
RequestSpotInstancesResult requestResult = ec2.requestSpotInstances(requestRequest);
List<SpotInstanceRequest> requestResponses = requestResult.getSpotInstanceRequests();

// Setup an arraylist to collect all of the request ids we want to
// watch hit the running state.
ArrayList<String> spotInstanceRequestIds = new ArrayList<String>();

// Add all of the request ids to the hashset, so we can determine when they hit the
// active state.
for (SpotInstanceRequest requestResponse : requestResponses) {
    System.out.println("Created Spot Request: "+requestResponse.getSpotInstanceRequestId());
    spotInstanceRequestIds.add(requestResponse.getSpotInstanceRequestId());
}
```

リクエスト ID をモニタリングするには、`describeSpotInstanceRequests` メソッドを呼び出してリクエストの状態を特定します。その後で、リクエストが「オープン」状態でなくなるまでループを繰り返します。状態が、例えば「アクティブ」ではなく、「オープン」以外かどうかをモニタリングするのは、リクエストが直接「クローズ済み」に遷移することもあるからです (リクエストの引数に問題がある場合)。次に示すコード例では、このことを実現する具体的な方法を示します。

```
// Create a variable that will track whether there are any
// requests still in the open state.
boolean anyOpen;

do {
    // Create the describeRequest object with all of the request ids
    // to monitor (e.g. that we started).
    DescribeSpotInstanceRequestsRequest describeRequest = new DescribeSpotInstanceRequestsRequest();
    describeRequest.setSpotInstanceRequestIds(spotInstanceRequestIds);

    // Initialize the anyOpen variable to false - which assumes there
    // are no requests open unless we find one that is still open.
    anyOpen=false;

    try {
        // Retrieve all of the requests we want to monitor.
        DescribeSpotInstanceRequestsResult describeResult = ec2.describeSpotInstanceRequests(describeRequest);
        List<SpotInstanceRequest> describeResponses = describeResult.getSpotInstanceRequests();

        // Look through each request and determine if they are all in
        // the active state.
        for (SpotInstanceRequest describeResponse : describeResponses) {
            // If the state is open, it hasn't changed since we attempted
            // to request it. There is the potential for it to transition
            // almost immediately to closed or cancelled so we compare
            // against open instead of active.
        if (describeResponse.getState().equals("open")) {
            anyOpen = true;
            break;
        }
    }
} catch (AmazonServiceException e) {
      // If we have an exception, ensure we don't break out of
      // the loop. This prevents the scenario where there was
      // blip on the wire.
      anyOpen = true;
    }

    try {
        // Sleep for 60 seconds.
        Thread.sleep(60*1000);
    } catch (Exception e) {
        // Do nothing because it woke up early.
    }
} while (anyOpen);
```

このコードを実行すると、スポットインスタンスリクエストは完了するか、エラーありで失敗し、そのエラーが画面に出力されます。どちらの場合も、次のステップに進んで、アクティブなリクエストがある場合はクリーンアップし、実行中のインスタンスがある場合は終了させてください。

## ステップ 5: スポットリクエストとインスタンスをクリーンアップする
<a name="tutor-spot-java-cleaning-up"></a>

最後に、リクエストとインスタンスをクリーンアップする必要があります。未完了リクエストのキャンセルと、インスタンスの削除の*両方*を行うことが重要です。リクエストをキャンセルするだけではインスタンスは終了しないので、引き続きお客様への課金が発生することになります。インスタンスを削除すると、スポットリクエストがキャンセルされることもありますが、場合によっては (持続的入札を使用した場合など)、インスタンスを終了しただけでは、リクエストが再度受理されるのを停止できないことがあります。したがって、アクティブな入札のキャンセルと実行中インスタンスの削除の両方を行うことをお勧めします。

次のコードでは、リクエストをキャンセルする方法を示します。

```
try {
    // Cancel requests.
    CancelSpotInstanceRequestsRequest cancelRequest =
       new CancelSpotInstanceRequestsRequest(spotInstanceRequestIds);
    ec2.cancelSpotInstanceRequests(cancelRequest);
} catch (AmazonServiceException e) {
    // Write out any exceptions that may have occurred.
    System.out.println("Error cancelling instances");
    System.out.println("Caught Exception: " + e.getMessage());
    System.out.println("Reponse Status Code: " + e.getStatusCode());
    System.out.println("Error Code: " + e.getErrorCode());
    System.out.println("Request ID: " + e.getRequestId());
}
```

稼働中のインスタンスを終了させるには、そのインスタンスを起動したリクエストに関連付けられているインスタンス ID が必要です。次のコード例は、前に示したインスタンスをモニタリングするためのコードに `ArrayList` を追加したものです。この中に、`describeInstance` レスポンスに関連付けられているインスタンス ID を格納します。

```
// Create a variable that will track whether there are any requests
// still in the open state.
boolean anyOpen;
// Initialize variables.
ArrayList<String> instanceIds = new ArrayList<String>();

do {
   // Create the describeRequest with all of the request ids to
   // monitor (e.g. that we started).
   DescribeSpotInstanceRequestsRequest describeRequest = new DescribeSpotInstanceRequestsRequest();
   describeRequest.setSpotInstanceRequestIds(spotInstanceRequestIds);

   // Initialize the anyOpen variable to false, which assumes there
   // are no requests open unless we find one that is still open.
   anyOpen = false;

   try {
         // Retrieve all of the requests we want to monitor.
         DescribeSpotInstanceRequestsResult describeResult =
            ec2.describeSpotInstanceRequests(describeRequest);

         List<SpotInstanceRequest> describeResponses =
            describeResult.getSpotInstanceRequests();

         // Look through each request and determine if they are all
         // in the active state.
         for (SpotInstanceRequest describeResponse : describeResponses) {
           // If the state is open, it hasn't changed since we
           // attempted to request it. There is the potential for
           // it to transition almost immediately to closed or
           // cancelled so we compare against open instead of active.
           if (describeResponse.getState().equals("open")) {
              anyOpen = true; break;
           }
           // Add the instance id to the list we will
           // eventually terminate.
           instanceIds.add(describeResponse.getInstanceId());
         }
   } catch (AmazonServiceException e) {
      // If we have an exception, ensure we don't break out
      // of the loop. This prevents the scenario where there
      // was blip on the wire.
      anyOpen = true;
   }

    try {
        // Sleep for 60 seconds.
        Thread.sleep(60*1000);
    } catch (Exception e) {
        // Do nothing because it woke up early.
    }
} while (anyOpen);
```

この `ArrayList` に格納されているインスタンス ID を使用して、稼働中のインスタンスを終了させます。コードは次のとおりです。

```
try {
    // Terminate instances.
    TerminateInstancesRequest terminateRequest = new TerminateInstancesRequest(instanceIds);
    ec2.terminateInstances(terminateRequest);
} catch (AmazonServiceException e) {
    // Write out any exceptions that may have occurred.
    System.out.println("Error terminating instances");
    System.out.println("Caught Exception: " + e.getMessage());
    System.out.println("Reponse Status Code: " + e.getStatusCode());
    System.out.println("Error Code: " + e.getErrorCode());
    System.out.println("Request ID: " + e.getRequestId());
}
```

## ステップの集約
<a name="tutor-spot-java-bring-together"></a>

これまでに説明したステップは、よりオブジェクト指向的なアプローチをとって 1 つに集約することができます。このステップとは、EC2 クライアントの初期化、スポットリクエストの提出、スポットリクエストがオープン状態でなくなったかどうかの特定、および未完了のスポットリクエストや関連するインスタンスのクリーンアップです。これらのすべてを実行する、`Requests` というクラスを作成します。

さらに、`GettingStartedApp` というクラスも作成します。ここにメインメソッドがあり、ここで高レベルの関数呼び出しを実行します。具体的には、既に説明した `Requests` オブジェクトを初期化します。スポットインスタンスリクエストを提出します。その後は、スポットリクエストが「アクティブ」状態になるまで待ちます。最後に、リクエストとインスタンスをクリーンアップします。

この例の完全なソースコードは、[GitHub](https://github.com/aws/aws-sdk-java/tree/master/src/samples/AmazonEC2SpotInstances-GettingStarted) で確認またはダウンロードできます。

お疲れ様でした。これで、AWS SDK for Java を使用したスポットインスタンスソフトウェア開発の入門チュートリアルは終了です。

## 次のステップ
<a name="tutor-spot-java-next"></a>

[チュートリアル: Amazon EC2 スポットリクエストの高度な管理](tutorial-spot-adv-java.md)に進みます。

# チュートリアル: Amazon EC2 スポットリクエストの高度な管理
<a name="tutorial-spot-adv-java"></a>

 Amazon EC2 スポットインスタンスとは、Amazon EC2 の未使用キャパシティに対してお客様から価格を提示していただき、入札値段がその時点の*スポット料金*を上回っている限り、お客様がインスタンスを実行できるというシステムです。Amazon EC2 のスポット料金は、需要と供給に応じて定期的に変動します。スポットインスタンスの詳細については、Amazon EC2 Linux インスタンス用ユーザーガイドの[スポットインスタンス](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-spot-instances.html)を参照してください。

## 前提条件
<a name="tutor-spot-adv-java-prereq"></a>

このチュートリアルを使用するには、AWS SDK for Java がインストールされており、基本インストール前提条件を満たしている必要があります。詳細については、「[Set up the AWS SDK for Java](setup-install.md)」を参照してください。

## 認証情報のセットアップ
<a name="tutor-spot-adv-java-credentials"></a>

このサンプルコードの使用を開始するには、AWS 認証情報を設定する必要があります。その方法については、[開発用の AWS 認証情報とリージョンのセットアップ](setup-credentials.md)を参照してください。

**注記**  
IAM ユーザーの認証情報を使用してこれらの値を指定することをお勧めします。詳細については、[AWS にサインアップし、IAM ユーザーを作成する](signup-create-iam-user.md)を参照してください。

これで設定が完了したので、例に示すコードを使用できるようになります。

## セキュリティグループのセットアップ
<a name="tutor-spot-adv-java-sg"></a>

セキュリティグループとは、ファイアウォールとしての役割を果たすものであり、インスタンスのグループに対してどのトラフィックの送受信を許可するかを制御します。デフォルトでは、インスタンスの起動時にセキュリティグループは何も設定されていません。つまり、着信 IP トラフィックは、どの TCP ポートであってもすべて拒否されます。したがって、ここでは、スポットリクエストを提出する前に、必要なネットワークトラフィックを許可するセキュリティグループをセットアップすることにします。このチュートリアルの目的に合わせて、ここでは新しいセキュリティグループを「GettingStarted」という名前で作成します。このグループでは、自分のアプリケーションを実行する IP アドレスからの Secure Shell (SSH) トラフィックを許可します。新しいセキュリティグループをセットアップするには、次に示すコードサンプルをインクルードするか実行する必要があります。このコードは、セキュリティグループをプログラムからセットアップするためのものです。

`AmazonEC2` クライアントオブジェクトを作成した後で、`CreateSecurityGroupRequest` オブジェクトを作成し、「GettingStarted」という名前と、セキュリティグループの説明を指定します。その後で、`ec2.createSecurityGroup` API を呼び出してグループを作成します。

このグループにアクセスできるようにするために、`ipPermission` オブジェクトを作成します。IP アドレス範囲は、ローカルコンピュータのサブネット (CIDR 表現) で設定します。IP アドレスの「/10」というサフィックスが、指定した IP アドレスのサブネットを示します。また、`ipPermission` オブジェクトを設定して TCP プロトコルとポート 22 (SSH) を指定します。最後のステップは、`ec2 .authorizeSecurityGroupIngress` を呼び出すことです。このときに、作成したセキュリティグループの名前と `ipPermission` オブジェクトを指定します。

(次に示すコードは、最初のチュートリアルで使用したのと同じものです)

```
// Create the AmazonEC2Client object so we can call various APIs.
AmazonEC2 ec2 = AmazonEC2ClientBuilder.standard()
                    .withCredentials(credentials)
                    .build();

// Create a new security group.
try {
    CreateSecurityGroupRequest securityGroupRequest =
        new CreateSecurityGroupRequest("GettingStartedGroup",
        "Getting Started Security Group");
    ec2.createSecurityGroup(securityGroupRequest);
} catch (AmazonServiceException ase) {
    // Likely this means that the group is already created, so ignore.
    System.out.println(ase.getMessage());
}

String ipAddr = "0.0.0.0/0";

// Get the IP of the current host, so that we can limit the Security Group
// by default to the ip range associated with your subnet.
try {
    // Get IP Address
    InetAddress addr = InetAddress.getLocalHost();
    ipAddr = addr.getHostAddress()+"/10";
}
catch (UnknownHostException e) {
    // Fail here...
}

// Create a range that you would like to populate.
ArrayList<String> ipRanges = new ArrayList<String>();
ipRanges.add(ipAddr);

// Open up port 22 for TCP traffic to the associated IP from
// above (e.g. ssh traffic).
ArrayList<IpPermission> ipPermissions = new ArrayList<IpPermission> ();
IpPermission ipPermission = new IpPermission();
ipPermission.setIpProtocol("tcp");
ipPermission.setFromPort(new Integer(22));
ipPermission.setToPort(new Integer(22));
ipPermission.setIpRanges(ipRanges);
ipPermissions.add(ipPermission);

try {
    // Authorize the ports to the used.
    AuthorizeSecurityGroupIngressRequest ingressRequest =
        new AuthorizeSecurityGroupIngressRequest(
            "GettingStartedGroup",ipPermissions);
    ec2.authorizeSecurityGroupIngress(ingressRequest);
}
catch (AmazonServiceException ase) {
    // Ignore because this likely means the zone has already
    // been authorized.
    System.out.println(ase.getMessage());
}
```

このコードサンプル全体を見るには、`advanced.CreateSecurityGroupApp.java` コードサンプルを参照してください。このアプリケーションを実行して新しいセキュリティグループを作成する必要があるのは 1 回のみです。

**注記**  
また、AWS Toolkit for Eclipse を使用してセキュリティグループを作成することもできます。詳細については、「AWS Toolkit for Eclipse ユーザーガイド」の「[Managing Security Groups from AWS Cost Explorer](https://docs.aws.amazon.com/toolkit-for-eclipse/v1/user-guide/tke-sg.html)」を参照してください。

## スポットインスタンスリクエスト作成の詳細なオプション
<a name="tutor-spot-adv-req-opts"></a>

[チュートリアル: Amazon EC2 スポットインスタンス](tutorial-spot-instances-java.md)で説明したように、リクエストを作成してインスタンスタイプ、Amazon Machine Image (AMI)、および最高入札価格を指定する必要があります。

初めに、`RequestSpotInstanceRequest` オブジェクトを作成します。このリクエストオブジェクトには、必要なインスタンスの数と入札価格が必要です。さらに、リクエストの `LaunchSpecification` も設定する必要があります。この内容は、インスタンスタイプ、AMI ID、および使用するセキュリティグループです。リクエストの内容が入力されたら、`requestSpotInstances` オブジェクトの `AmazonEC2Client` メソッドを呼び出します。スポットインスタンスをリクエストする方法の例を次に示します。

(次に示すコードは、最初のチュートリアルで使用したのと同じものです)

```
// Create the AmazonEC2 client so we can call various APIs.
AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

// Initializes a Spot Instance Request
RequestSpotInstancesRequest requestRequest = new RequestSpotInstancesRequest();

// Request 1 x t1.micro instance with a bid price of $0.03.
requestRequest.setSpotPrice("0.03");
requestRequest.setInstanceCount(Integer.valueOf(1));

// Set up the specifications of the launch. This includes the
// instance type (e.g. t1.micro) and the latest Amazon Linux
// AMI id available. Note, you should always use the latest
// Amazon Linux AMI id or another of your choosing.
LaunchSpecification launchSpecification = new LaunchSpecification();
launchSpecification.setImageId("ami-a9d09ed1");
launchSpecification.setInstanceType(InstanceType.T1Micro);

// Add the security group to the request.
ArrayList<String> securityGroups = new ArrayList<String>();
securityGroups.add("GettingStartedGroup");
launchSpecification.setSecurityGroups(securityGroups);

// Add the launch specification.
requestRequest.setLaunchSpecification(launchSpecification);

// Call the RequestSpotInstance API.
RequestSpotInstancesResult requestResult =
    ec2.requestSpotInstances(requestRequest);
```

## 永続リクエストと 1 回限りのリクエスト
<a name="tutor-spot-adv-persist-v-one"></a>

スポットリクエストを作成するときは、複数の任意パラメータを指定できます。最初のパラメータは、そのリクエストが 1 回限りか持続的なものかを指定するためのものです。デフォルトでは、リクエストは 1 回限りとなります。1 回限りのリクエストが受理されるのは 1 回だけであり、リクエストしたインスタンスが終了すると、そのリクエストはクローズ済みとなります。永続リクエストは、同じリクエストで実行されているスポットインスタンスがない限り、常に受理の対象となります。リクエストのタイプを指定するには、スポットリクエストの Type を設定します。このことを行うコードを次に示します。

```
// Retrieves the credentials from an AWSCredentials.properties file.
AWSCredentials credentials = null;
try {
    credentials = new PropertiesCredentials(
        GettingStartedApp.class.getResourceAsStream("AwsCredentials.properties"));
}
catch (IOException e1) {
    System.out.println(
        "Credentials were not properly entered into AwsCredentials.properties.");
    System.out.println(e1.getMessage());
    System.exit(-1);
}

// Create the AmazonEC2 client so we can call various APIs.
AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

// Initializes a Spot Instance Request
RequestSpotInstancesRequest requestRequest =
    new RequestSpotInstancesRequest();

// Request 1 x t1.micro instance with a bid price of $0.03.
requestRequest.setSpotPrice("0.03");
requestRequest.setInstanceCount(Integer.valueOf(1));

// Set the type of the bid to persistent.
requestRequest.setType("persistent");

// Set up the specifications of the launch. This includes the
// instance type (e.g. t1.micro) and the latest Amazon Linux
// AMI id available. Note, you should always use the latest
// Amazon Linux AMI id or another of your choosing.
LaunchSpecification launchSpecification = new LaunchSpecification();
launchSpecification.setImageId("ami-a9d09ed1");
launchSpecification.setInstanceType(InstanceType.T1Micro);

// Add the security group to the request.
ArrayList<String> securityGroups = new ArrayList<String>();
securityGroups.add("GettingStartedGroup");
launchSpecification.setSecurityGroups(securityGroups);

// Add the launch specification.
requestRequest.setLaunchSpecification(launchSpecification);

// Call the RequestSpotInstance API.
RequestSpotInstancesResult requestResult =
    ec2.requestSpotInstances(requestRequest);
```

## リクエストの期間の制限
<a name="tutor-spot-adv-validity-period"></a>

また、リクエストの有効期間もオプションで指定できます。その期間の開始時点と終了時点の両方を指定できます。デフォルトでは、スポットリクエストが受理の対象とみなされるのは、作成された時点から、そのリクエストが受理されるか作成者によってキャンセルされるまでの間となります。ただし、必要であれば、作成時に有効期間を指定できます。この期間を指定する方法の例を次のコードに示します。

```
// Create the AmazonEC2 client so we can call various APIs.
AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

// Initializes a Spot Instance Request
RequestSpotInstancesRequest requestRequest = new RequestSpotInstancesRequest();

// Request 1 x t1.micro instance with a bid price of $0.03.
requestRequest.setSpotPrice("0.03");
requestRequest.setInstanceCount(Integer.valueOf(1));

// Set the valid start time to be two minutes from now.
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MINUTE, 2);
requestRequest.setValidFrom(cal.getTime());

// Set the valid end time to be two minutes and two hours from now.
cal.add(Calendar.HOUR, 2);
requestRequest.setValidUntil(cal.getTime());

// Set up the specifications of the launch. This includes
// the instance type (e.g. t1.micro)

// and the latest Amazon Linux AMI id available.
// Note, you should always use the latest Amazon
// Linux AMI id or another of your choosing.
LaunchSpecification launchSpecification = new LaunchSpecification();
launchSpecification.setImageId("ami-a9d09ed1");
launchSpecification.setInstanceType("t1.micro");

// Add the security group to the request.
ArrayList<String> securityGroups = new ArrayList<String>();
securityGroups.add("GettingStartedGroup");
launchSpecification.setSecurityGroups(securityGroups);

// Add the launch specification.
requestRequest.setLaunchSpecification(launchSpecification);

// Call the RequestSpotInstance API.
RequestSpotInstancesResult requestResult = ec2.requestSpotInstances(requestRequest);
```

## Amazon EC2 スポットインスタンスリクエストのグループ化
<a name="tutor-spot-adv-grouping"></a>

スポットインスタンスリクエストには、いくつか異なる方法でグループ化するオプションがあります。ここでは、起動グループ、アベイラビリティーゾーングループ、およびプレイスメントグループの利点について説明します。

リクエストしたスポットインスタンスがすべて同時に起動され、同時に終了するようにしたい場合は、起動グループを利用します。起動グループとは、1 つにまとめる入札のグループに付けられるラベルです。同じ起動グループ内のインスタンスはすべて、同時に起動されて同時に終了します。なお、起動グループ内のインスタンスが受理済みの場合に、その同じ起動グループで起動される新しいインスタンスも受理されるという保証はありません。起動グループを設定する方法の例を次のコードサンプルで示します。

```
// Create the AmazonEC2 client so we can call various APIs.
AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

// Initializes a Spot Instance Request
RequestSpotInstancesRequest requestRequest = new RequestSpotInstancesRequest();

// Request 5 x t1.micro instance with a bid price of $0.03.
requestRequest.setSpotPrice("0.03");
requestRequest.setInstanceCount(Integer.valueOf(5));

// Set the launch group.
requestRequest.setLaunchGroup("ADVANCED-DEMO-LAUNCH-GROUP");

// Set up the specifications of the launch. This includes
// the instance type (e.g. t1.micro) and the latest Amazon Linux
// AMI id available. Note, you should always use the latest
// Amazon Linux AMI id or another of your choosing.
LaunchSpecification launchSpecification = new LaunchSpecification();
launchSpecification.setImageId("ami-a9d09ed1");
launchSpecification.setInstanceType(InstanceType.T1Micro);

// Add the security group to the request.
ArrayList<String> securityGroups = new ArrayList<String>();
securityGroups.add("GettingStartedGroup");
launchSpecification.setSecurityGroups(securityGroups);

// Add the launch specification.
requestRequest.setLaunchSpecification(launchSpecification);

// Call the RequestSpotInstance API.
RequestSpotInstancesResult requestResult =
    ec2.requestSpotInstances(requestRequest);
```

1 つのリクエスト内のすべてのインスタンスが同じアベイラビリティーゾーン内で起動されるようにする必要があるが、どのアベイラビリティーゾーンでもかまわない場合は、アベイラビリティーゾーングループを利用します。アベイラビリティーゾーングループとは、同じアベイラビリティーゾーンにまとめるインスタンスのグループに付けられるラベルです。同じアベイラビリティーゾーングループに属し、同時に受理されたインスタンスはすべて、同じアベイラビリティーゾーンで起動されます。アベイラビリティーゾーングループを設定する方法の例を次に示します。

```
// Create the AmazonEC2 client so we can call various APIs.
AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

// Initializes a Spot Instance Request
RequestSpotInstancesRequest requestRequest = new RequestSpotInstancesRequest();

// Request 5 x t1.micro instance with a bid price of $0.03.
requestRequest.setSpotPrice("0.03");
requestRequest.setInstanceCount(Integer.valueOf(5));

// Set the availability zone group.
requestRequest.setAvailabilityZoneGroup("ADVANCED-DEMO-AZ-GROUP");

// Set up the specifications of the launch.  This includes the instance
// type (e.g.  t1.micro) and the latest Amazon Linux AMI id available.
// Note, you should always use the latest Amazon Linux AMI id or another
// of your choosing.
LaunchSpecification launchSpecification = new LaunchSpecification();
launchSpecification.setImageId("ami-a9d09ed1");
launchSpecification.setInstanceType(InstanceType.T1Micro);

// Add the security group to the request.
ArrayList<String> securityGroups = new ArrayList<String>();
securityGroups.add("GettingStartedGroup");
launchSpecification.setSecurityGroups(securityGroups);

// Add the launch specification.
requestRequest.setLaunchSpecification(launchSpecification);

// Call the RequestSpotInstance API.
RequestSpotInstancesResult requestResult =
    ec2.requestSpotInstances(requestRequest);
```

リクエストするスポットインスタンスをどのアベイラビリティーゾーンで起動したいかを指定できます。次のコードサンプルでは、アベイラビリティーゾーンの設定方法を示します。

```
// Create the AmazonEC2 client so we can call various APIs.
AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

// Initializes a Spot Instance Request
RequestSpotInstancesRequest requestRequest = new RequestSpotInstancesRequest();

// Request 1 x t1.micro instance with a bid price of $0.03.
requestRequest.setSpotPrice("0.03");
requestRequest.setInstanceCount(Integer.valueOf(1));

// Set up the specifications of the launch. This includes the instance
// type (e.g. t1.micro) and the latest Amazon Linux AMI id available.
// Note, you should always use the latest Amazon Linux AMI id or another
// of your choosing.
LaunchSpecification launchSpecification = new LaunchSpecification();
launchSpecification.setImageId("ami-a9d09ed1");
launchSpecification.setInstanceType(InstanceType.T1Micro);

// Add the security group to the request.
ArrayList<String> securityGroups = new ArrayList<String>();
securityGroups.add("GettingStartedGroup");
launchSpecification.setSecurityGroups(securityGroups);

// Set up the availability zone to use. Note we could retrieve the
// availability zones using the ec2.describeAvailabilityZones() API. For
// this demo we will just use us-east-1a.
SpotPlacement placement = new SpotPlacement("us-east-1b");
launchSpecification.setPlacement(placement);

// Add the launch specification.
requestRequest.setLaunchSpecification(launchSpecification);

// Call the RequestSpotInstance API.
RequestSpotInstancesResult requestResult =
    ec2.requestSpotInstances(requestRequest);
```

最後の*プレイスメントグループ*は、ハイパフォーマンスコンピューティング (HPC) スポットインスタンス (クラスターコンピュートインスタンスやクラスター GPU インスタンスなど) を使用する場合に指定できます。プレイスメントグループを利用すると、低レイテンシー、高帯域幅でインスタンス間を接続できます。プレイスメントグループを設定する方法の例を次に示します。

```
// Create the AmazonEC2 client so we can call various APIs.
AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

// Initializes a Spot Instance Request
RequestSpotInstancesRequest requestRequest = new RequestSpotInstancesRequest();

// Request 1 x t1.micro instance with a bid price of $0.03.
requestRequest.setSpotPrice("0.03");
requestRequest.setInstanceCount(Integer.valueOf(1));

// Set up the specifications of the launch. This includes the instance
// type (e.g. t1.micro) and the latest Amazon Linux AMI id available.
// Note, you should always use the latest Amazon Linux AMI id or another
// of your choosing.

LaunchSpecification launchSpecification = new LaunchSpecification();
launchSpecification.setImageId("ami-a9d09ed1");
launchSpecification.setInstanceType(InstanceType.T1Micro);

// Add the security group to the request.
ArrayList<String> securityGroups = new ArrayList<String>();
securityGroups.add("GettingStartedGroup");
launchSpecification.setSecurityGroups(securityGroups);

// Set up the placement group to use with whatever name you desire.
// For this demo we will just use "ADVANCED-DEMO-PLACEMENT-GROUP".
SpotPlacement placement = new SpotPlacement();
placement.setGroupName("ADVANCED-DEMO-PLACEMENT-GROUP");
launchSpecification.setPlacement(placement);

// Add the launch specification.
requestRequest.setLaunchSpecification(launchSpecification);

// Call the RequestSpotInstance API.
RequestSpotInstancesResult requestResult =
    ec2.requestSpotInstances(requestRequest);
```

このセクションで示したパラメータはいずれも、省略可能です。また、これらのパラメータのほとんど (入札が 1 回限りであるか永続的であるかを除く) により、入札が履行される可能性を低減できることを理解することも重要です。したがって、これらのオプションは、そのオプションが必要な場合に限って使用することが重要です。これまでに示したコード例すべてを 1 つにまとめたものが `com.amazonaws.codesamples.advanced.InlineGettingStartedCodeSampleApp.java` クラスの中にあります。

## 中断または終了の後もルートパーティションを永続化する方法
<a name="tutor-spot-adv-persist-root"></a>

スポットインスタンスの中断を管理する最も簡単な方法は、データのチェックポイントを作成して Amazon Elastic Block Store (Amazon Amazon EBS) ボリュームに保存するという処理を定期的に行うことです。チェックポイントを定期的に作成しておくと、中断が発生したときでも、データが失われるのは最後のチェックポイント以降に作成された分だけになります（その間に他の非べき等アクションが実行されていないことを前提とします）。このプロセスを容易にするには、スポットリクエストを設定するときに、中断時や終了時にルートパーティションを削除しないことを指定します。このシナリオを実現する方法を示す新しいコードが、次の例に挿入されています。

追加されたコードの中では、`BlockDeviceMapping` オブジェクトを作成し、対応する Amazon Elastic Block Store (Amazon EBS) を Amazon EBS オブジェクトに設定しています (このオブジェクトは、スポットインスタンスが終了しても削除しない (`not`) よう設定済みです)。その後で、この `BlockDeviceMapping` をマッピングの ArrayList に追加し、起動指定の中でこのマッピングを指定します。

```
// Retrieves the credentials from an AWSCredentials.properties file.
AWSCredentials credentials = null;
try {
    credentials = new PropertiesCredentials(
        GettingStartedApp.class.getResourceAsStream("AwsCredentials.properties"));
}
catch (IOException e1) {
    System.out.println(
        "Credentials were not properly entered into AwsCredentials.properties.");
    System.out.println(e1.getMessage());
    System.exit(-1);
}

// Create the AmazonEC2 client so we can call various APIs.
AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

// Initializes a Spot Instance Request
RequestSpotInstancesRequest requestRequest = new RequestSpotInstancesRequest();

// Request 1 x t1.micro instance with a bid price of $0.03.
requestRequest.setSpotPrice("0.03");
requestRequest.setInstanceCount(Integer.valueOf(1));

// Set up the specifications of the launch. This includes the instance
// type (e.g. t1.micro) and the latest Amazon Linux AMI id available.
// Note, you should always use the latest Amazon Linux AMI id or another
// of your choosing.
LaunchSpecification launchSpecification = new LaunchSpecification();
launchSpecification.setImageId("ami-a9d09ed1");
launchSpecification.setInstanceType(InstanceType.T1Micro);

// Add the security group to the request.
ArrayList<String> securityGroups = new ArrayList<String>();
securityGroups.add("GettingStartedGroup");
launchSpecification.setSecurityGroups(securityGroups);

// Create the block device mapping to describe the root partition.
BlockDeviceMapping blockDeviceMapping = new BlockDeviceMapping();
blockDeviceMapping.setDeviceName("/dev/sda1");

// Set the delete on termination flag to false.
EbsBlockDevice ebs = new EbsBlockDevice();
ebs.setDeleteOnTermination(Boolean.FALSE);
blockDeviceMapping.setEbs(ebs);

// Add the block device mapping to the block list.
ArrayList<BlockDeviceMapping> blockList = new ArrayList<BlockDeviceMapping>();
blockList.add(blockDeviceMapping);

// Set the block device mapping configuration in the launch specifications.
launchSpecification.setBlockDeviceMappings(blockList);

// Add the launch specification.
requestRequest.setLaunchSpecification(launchSpecification);

// Call the RequestSpotInstance API.
RequestSpotInstancesResult requestResult =
    ec2.requestSpotInstances(requestRequest);
```

このボリュームがインスタンスの起動時に再度接続されるようにしたい場合は、ブロックデバイスマッピング設定を使用することもできます。別の方法としては、ルート以外のパーティションを接続する場合に、どの Amazon Amazon EBS ボリュームをスポットインスタンス再開後にインスタンスに接続するかを指定できます。このようにするには、スナップショット ID を `EbsBlockDevice` オブジェクトで指定し、代替デバイス名を `BlockDeviceMapping` オブジェクトで指定します。ブロックデバイスマッピングを利用すると、インスタンスのブートストラップが容易になります。

ルートパーティションを使用して重要なデータのチェックポイントを作成しておくと、インスタンスの中断の可能性を管理するうえで大いに役立ちます。中断の可能性を管理するその他の方法については、[中断の管理についての動画](https://www.youtube.com/watch?feature=player_embedded&v=wcPNnUo60pc)をご覧ください。

## スポットリクエストとインスタンスにタグを付加する方法
<a name="tutor-spot-adv-tags"></a>

Amazon EC2 リソースにタグを追加すると、クラウドインフラストラクチャの管理を簡略化できます。タグとは、メタデータの形を取るものであり、わかりやすい名前を付けるのに使用できます。また、検索がしやすくなり、複数ユーザー間での共同作業にも役立ちます。タグは、プロセスのスクリプトや各部分の自動化にも使用できます。Amazon EC2 リソースのタグ付けの詳細については、Amazon EC2 Linux インスタンス用ユーザーガイドの[タグの使用](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html)を参照してください。

### リクエストのタグ付け
<a name="tagging-requests"></a>

使用するスポットリクエストにタグを追加するには、リソースをリクエストした*後で*タグを付ける必要があります。`requestSpotInstances()` からの戻り値によって、タグ付けのためのスポットリクエスト ID を取得する際に使用できる [RequestSpotInstancesResult](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/RequestSpotInstancesResult.html) オブジェクトが提供されます。

```
// Call the RequestSpotInstance API.
RequestSpotInstancesResult requestResult = ec2.requestSpotInstances(requestRequest);
List<SpotInstanceRequest> requestResponses = requestResult.getSpotInstanceRequests();

// A list of request IDs to tag
ArrayList<String> spotInstanceRequestIds = new ArrayList<String>();

// Add the request ids to the hashset, so we can determine when they hit the
// active state.
for (SpotInstanceRequest requestResponse : requestResponses) {
    System.out.println("Created Spot Request: "+requestResponse.getSpotInstanceRequestId());
    spotInstanceRequestIds.add(requestResponse.getSpotInstanceRequestId());
}
```

ID を取得したら、[CreateTagsRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/CreateTagsRequest.html) に ID を追加し、Amazon EC2 クライアントの `createTags()` メソッドを呼び出してリクエストにタグを追加できます。

```
// The list of tags to create
ArrayList<Tag> requestTags = new ArrayList<Tag>();
requestTags.add(new Tag("keyname1","value1"));

// Create the tag request
CreateTagsRequest createTagsRequest_requests = new CreateTagsRequest();
createTagsRequest_requests.setResources(spotInstanceRequestIds);
createTagsRequest_requests.setTags(requestTags);

// Tag the spot request
try {
    ec2.createTags(createTagsRequest_requests);
}
catch (AmazonServiceException e) {
    System.out.println("Error terminating instances");
    System.out.println("Caught Exception: " + e.getMessage());
    System.out.println("Reponse Status Code: " + e.getStatusCode());
    System.out.println("Error Code: " + e.getErrorCode());
    System.out.println("Request ID: " + e.getRequestId());
}
```

### インスタンスにタグを付ける
<a name="tagging-instances"></a>

同様に、スポットリクエスト自体に対し、インスタンスの作成後 1 つのインスタンスのみにタグを追加でき、またそのタグはスポットリクエストに一致する場合のみ追加されます (*オープン*状態ではなくなります)。

Amazon EC2 クライアントの `describeSpotInstanceRequests()`メソッドを [DescribeSpotInstanceRequestsRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/DescribeSpotInstanceRequestsRequest.html) オブジェクトとともに呼び出し、リクエストのステータスを確認できます。返される [DescribeSpotInstanceRequestsResult](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/DescribeSpotInstanceRequestsResult.html) オブジェクトには、スポットリクエストのステータスをクエリし、*open* 状態でなくなったときにインスタンス ID を取得するために使用できる [SpotInstanceRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/SpotInstanceRequest.html) オブジェクトのリストが含まれています。

スポットリクエストがオープン状態でなくなると、`SpotInstanceRequest` メソッドを呼び出すことで、そのインスタンス ID を `getInstanceId()` オブジェクトから取得できます。

```
boolean anyOpen; // tracks whether any requests are still open

// a list of instances to tag.
ArrayList<String> instanceIds = new ArrayList<String>();

do {
    DescribeSpotInstanceRequestsRequest describeRequest =
        new DescribeSpotInstanceRequestsRequest();
    describeRequest.setSpotInstanceRequestIds(spotInstanceRequestIds);

    anyOpen=false; // assume no requests are still open

    try {
        // Get the requests to monitor
        DescribeSpotInstanceRequestsResult describeResult =
            ec2.describeSpotInstanceRequests(describeRequest);

        List<SpotInstanceRequest> describeResponses =
            describeResult.getSpotInstanceRequests();

        // are any requests open?
        for (SpotInstanceRequest describeResponse : describeResponses) {
                if (describeResponse.getState().equals("open")) {
                    anyOpen = true;
                    break;
                }
                // get the corresponding instance ID of the spot request
                instanceIds.add(describeResponse.getInstanceId());
        }
    }
    catch (AmazonServiceException e) {
        // Don't break the loop due to an exception (it may be a temporary issue)
        anyOpen = true;
    }

    try {
        Thread.sleep(60*1000); // sleep 60s.
    }
    catch (Exception e) {
        // Do nothing if the thread woke up early.
    }
} while (anyOpen);
```

ここで、返されるインスタンスにタグを追加できます。

```
// Create a list of tags to create
ArrayList<Tag> instanceTags = new ArrayList<Tag>();
instanceTags.add(new Tag("keyname1","value1"));

// Create the tag request
CreateTagsRequest createTagsRequest_instances = new CreateTagsRequest();
createTagsRequest_instances.setResources(instanceIds);
createTagsRequest_instances.setTags(instanceTags);

// Tag the instance
try {
    ec2.createTags(createTagsRequest_instances);
}
catch (AmazonServiceException e) {
    // Write out any exceptions that may have occurred.
    System.out.println("Error terminating instances");
    System.out.println("Caught Exception: " + e.getMessage());
    System.out.println("Reponse Status Code: " + e.getStatusCode());
    System.out.println("Error Code: " + e.getErrorCode());
    System.out.println("Request ID: " + e.getRequestId());
}
```

## スポットリクエストのキャンセルとインスタンスの削除
<a name="canceling-spot-requests-and-terminating-instances"></a>

### スポットリクエストのキャンセル
<a name="canceling-a-spot-request"></a>

スポットインスタンスリクエストをキャンセルするには、Amazon EC2 クライアントの `cancelSpotInstanceRequests` を [CancelSpotInstanceRequestsRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/CancelSpotInstanceRequestsRequest.html) オブジェクトとともに呼び出します。

```
try {
    CancelSpotInstanceRequestsRequest cancelRequest = new CancelSpotInstanceRequestsRequest(spotInstanceRequestIds);
    ec2.cancelSpotInstanceRequests(cancelRequest);
} catch (AmazonServiceException e) {
    System.out.println("Error cancelling instances");
    System.out.println("Caught Exception: " + e.getMessage());
    System.out.println("Reponse Status Code: " + e.getStatusCode());
    System.out.println("Error Code: " + e.getErrorCode());
    System.out.println("Request ID: " + e.getRequestId());
}
```

### スポットインスタンスの削除
<a name="terminating-spot-instances"></a>

Amazon EC2 クライアントの `terminateInstances()` メソッドに ID を渡すことで、実行中のすべてのスポットインスタンスを終了できます。

```
try {
    TerminateInstancesRequest terminateRequest = new TerminateInstancesRequest(instanceIds);
    ec2.terminateInstances(terminateRequest);
} catch (AmazonServiceException e) {
    System.out.println("Error terminating instances");
    System.out.println("Caught Exception: " + e.getMessage());
    System.out.println("Reponse Status Code: " + e.getStatusCode());
    System.out.println("Error Code: " + e.getErrorCode());
    System.out.println("Request ID: " + e.getRequestId());
}
```

## ステップの集約
<a name="tutor-spot-adv-bring-together"></a>

これまでに説明したステップは、よりオブジェクト指向的なアプローチをとって 1 つのクラスに集約し、利便性を高めることができます。`Requests` という名前のクラスをインスタンス化すると、これらのアクションを実行できます。さらに、`GettingStartedApp` というクラスも作成します。ここにメインメソッドがあり、ここで高レベルの関数呼び出しを実行します。

この例の完全なソースコードは、[GitHub](https://github.com/aws/aws-sdk-java/tree/master/src/samples/AmazonEC2SpotInstances-Advanced) で確認またはダウンロードできます。

お疲れ様でした。これで、AWS SDK for Java を使用してスポットインスタンスソフトウェアを開発するための、高度なリクエスト機能のチュートリアルは終了です。

# Amazon EC2 インスタンスの管理
<a name="examples-ec2-instances"></a>

## インスタンスを作成する
<a name="creating-an-instance"></a>

新しい Amazon EC2 インスタンスを作成するには、AmazonEC2Client の `runInstances` メソッドを呼び出して、使用する [Amazon マシンイメージ (AMI)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html)、および[インスタンスタイプ](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)を含む [RunInstancesRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/RunInstancesRequest.html) を指定します。

 **インポート** 

```
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.InstanceType;
import com.amazonaws.services.ec2.model.RunInstancesRequest;
import com.amazonaws.services.ec2.model.RunInstancesResult;
import com.amazonaws.services.ec2.model.Tag;
```

 **コード** 

```
RunInstancesRequest run_request = new RunInstancesRequest()
    .withImageId(ami_id)
    .withInstanceType(InstanceType.T1Micro)
    .withMaxCount(1)
    .withMinCount(1);

RunInstancesResult run_response = ec2.runInstances(run_request);

String reservation_id = run_response.getReservation().getInstances().get(0).getInstanceId();
```

[完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/ec2/src/main/java/aws/example/ec2/CreateInstance.java)をご覧ください。

## インスタンスの起動
<a name="starting-an-instance"></a>

Amazon EC2 インスタンスを起動するには、AmazonEC2Client の `startInstances` メソッドを呼び出して、開始するインスタンスの ID を含む [StartInstancesRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/StartInstancesRequest.html) 指定します。

 **インポート** 

```
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.StartInstancesRequest;
```

 **コード** 

```
final AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

StartInstancesRequest request = new StartInstancesRequest()
    .withInstanceIds(instance_id);

ec2.startInstances(request);
```

[完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/ec2/src/main/java/aws/example/ec2/StartStopInstance.java)をご覧ください。

## インスタンスの停止
<a name="stopping-an-instance"></a>

Amazon EC2 インスタンスを停止するには、AmazonEC2Client の `stopInstances` メソッドを呼び出して、停止するインスタンスの ID を含む [StopInstancesRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/StopInstancesRequest.html) 指定します。

 **インポート** 

```
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.StopInstancesRequest;
```

 **コード** 

```
final AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

StopInstancesRequest request = new StopInstancesRequest()
    .withInstanceIds(instance_id);

ec2.stopInstances(request);
```

[完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/ec2/src/main/java/aws/example/ec2/StartStopInstance.java)をご覧ください。

## インスタンスの再起動
<a name="rebooting-an-instance"></a>

Amazon EC2 インスタンスを再起動するには、AmazonEC2Client の `rebootInstances`メソッドを呼び出して、再起動するインスタンスの ID を含む [RebootInstancesRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/RebootInstancesRequest.html) を指定します。

 **インポート** 

```
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.RebootInstancesRequest;
import com.amazonaws.services.ec2.model.RebootInstancesResult;
```

 **コード** 

```
final AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

RebootInstancesRequest request = new RebootInstancesRequest()
    .withInstanceIds(instance_id);

RebootInstancesResult response = ec2.rebootInstances(request);
```

[完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/ec2/src/main/java/aws/example/ec2/RebootInstance.java)をご覧ください。

## インスタンスの説明
<a name="describing-instances"></a>

インスタンスをリスト表示するには、[DescribeInstancesRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/DescribeInstancesRequest.html) を作成し、AmazonEC2Client の `describeInstances` メソッドを呼び出します。お客様のアカウントとリージョンの [ インスタンスをリスト表示するのに使用できる ](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/DescribeInstancesResult.html)DescribeInstancesResultAmazon EC2 オブジェクトが返されます。

インスタンスは*予約*ごとにグループ化されています。それぞれの予約は、インスタンスを起動した `startInstances` の呼び出しに対応しています。インスタンスをリスト表示するには、まず `DescribeInstancesResult` クラスの `getReservations' method, and then call `getInstances`[予約](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/Reservation.html)オブジェクトごとにメソッド名 getInstances を呼び出します。

 **インポート** 

```
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.DescribeInstancesRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesResult;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.Reservation;
```

 **コード** 

```
final AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();
boolean done = false;

DescribeInstancesRequest request = new DescribeInstancesRequest();
while(!done) {
    DescribeInstancesResult response = ec2.describeInstances(request);

    for(Reservation reservation : response.getReservations()) {
        for(Instance instance : reservation.getInstances()) {
            System.out.printf(
                "Found instance with id %s, " +
                "AMI %s, " +
                "type %s, " +
                "state %s " +
                "and monitoring state %s",
                instance.getInstanceId(),
                instance.getImageId(),
                instance.getInstanceType(),
                instance.getState().getName(),
                instance.getMonitoring().getState());
        }
    }

    request.setNextToken(response.getNextToken());

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

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

[完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/ec2/src/main/java/aws/example/ec2/DescribeInstances.java)をご覧ください。

## インスタンスの監視
<a name="monitoring-an-instance"></a>

CPU やネットワークの使用率、使用可能なメモリ、ディスクの残り容量など、Amazon EC2 インスタンスのさまざまな側面を監視できます。インスタンスのモニタリングの詳細については、「Linux インスタンス用 Amazon EC2 ユーザーガイド」の「[Monitoring Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring_ec2.html)」を参照してください。

インスタンスのモニタリングを開始するには、モニタリングするインスタンスの ID で [MonitorInstancesRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/MonitorInstancesRequest.html) を作成し、AmazonEC2Client の `monitorInstances` メソッドに渡します。

 **インポート** 

```
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.MonitorInstancesRequest;
```

 **コード** 

```
final AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

MonitorInstancesRequest request = new MonitorInstancesRequest()
        .withInstanceIds(instance_id);

ec2.monitorInstances(request);
```

[完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/ec2/src/main/java/aws/example/ec2/MonitorInstance.java)をご覧ください。

## インスタンス監視の停止
<a name="stopping-instance-monitoring"></a>

インスタンスのモニタリングを停止するには、モニタリングを停止するインスタンスの ID で [UnmonitorInstancesRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/UnmonitorInstancesRequest.html) を作成し、AmazonEC2Client の `unmonitorInstances` メソッドに渡します。

 **インポート** 

```
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.UnmonitorInstancesRequest;
```

 **コード** 

```
final AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

UnmonitorInstancesRequest request = new UnmonitorInstancesRequest()
    .withInstanceIds(instance_id);

ec2.unmonitorInstances(request);
```

[完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/ec2/src/main/java/aws/example/ec2/MonitorInstance.java)をご覧ください。

## 詳細情報
<a name="more-information"></a>
+  Amazon EC2 API リファレンスの [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html)
+  Amazon EC2 API リファレンスの [DescribeInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html)
+  Amazon EC2 API リファレンスの [StartInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StartInstances.html)
+  Amazon EC2 API リファレンスの [StopInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StopInstances.html)
+  Amazon EC2 API リファレンスの [RebootInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RebootInstances.html)
+  Amazon EC2 API リファレンスの [MonitorInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_MonitorInstances.html)
+  Amazon EC2 API リファレンスの [UnmonitorInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_UnmonitorInstances.html)

# Amazon EC2 の Elastic IP アドレスの使用
<a name="examples-ec2-elastic-ip"></a>

## EC2-Classic は廃止されます
<a name="retiringEC2Classic"></a>

**警告**  
2022 年 8 月 15 日に、EC2-Classic の提供を終了しｈます。EC2-Classic は、VPC への移行をお勧めします。詳細については、ブログ記事[EC2-Classic-Classic Networking is Retiring – Here's How to Prepare](https://aws.amazon.com/blogs/aws/ec2-classic-is-retiring-heres-how-to-prepare/)を参照してください。

## Elastic IP アドレスの割り当て
<a name="allocating-an-elastic-ip-address"></a>

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

Elastic IP アドレスを割り当てるには、ネットワークタイプ (Classic EC2 または VPC) が含まれる [AllocateAddressRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/AllocateAddressRequest.html) オブジェクトを使用して AmazonEC2Client の `allocateAddress` メソッドを呼び出します。

返される [AllocateAddressResult](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/AllocateAddressResult.html) には、[AssociateAddressRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/AssociateAddressRequest.html) のアロケーション ID とインスタンス ID を AmazonEC2Client の `associateAddress` メソッドに渡すことで、アドレスをインスタンスに関連付けるために使用できるアロケーション ID が含まれます。

 **インポート** 

```
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.AllocateAddressRequest;
import com.amazonaws.services.ec2.model.AllocateAddressResult;
import com.amazonaws.services.ec2.model.AssociateAddressRequest;
import com.amazonaws.services.ec2.model.AssociateAddressResult;
import com.amazonaws.services.ec2.model.DomainType;
```

 **コード** 

```
final AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

AllocateAddressRequest allocate_request = new AllocateAddressRequest()
    .withDomain(DomainType.Vpc);

AllocateAddressResult allocate_response =
    ec2.allocateAddress(allocate_request);

String allocation_id = allocate_response.getAllocationId();

AssociateAddressRequest associate_request =
    new AssociateAddressRequest()
        .withInstanceId(instance_id)
        .withAllocationId(allocation_id);

AssociateAddressResult associate_response =
    ec2.associateAddress(associate_request);
```

[完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/ec2/src/main/java/aws/example/ec2/AllocateAddress.java)をご覧ください。

## Elastic IP アドレスの説明
<a name="describing-elastic-ip-addresses"></a>

アカウントに割り当てられた Elastic IP アドレスを一覧表示するには AmazonEC2Client の `describeAddresses` メソッドを呼び出します。返される [DescribeAddressesResult](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/DescribeAddressesResult.html) を使用して、アカウントの Elastic IP アドレスを表す [Address](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/Address.html) オブジェクトのリストを取得できます。

 **インポート** 

```
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.Address;
import com.amazonaws.services.ec2.model.DescribeAddressesResult;
```

 **コード** 

```
final AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

DescribeAddressesResult response = ec2.describeAddresses();

for(Address address : response.getAddresses()) {
    System.out.printf(
            "Found address with public IP %s, " +
            "domain %s, " +
            "allocation id %s " +
            "and NIC id %s",
            address.getPublicIp(),
            address.getDomain(),
            address.getAllocationId(),
            address.getNetworkInterfaceId());
}
```

[完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/ec2/src/main/java/aws/example/ec2/DescribeAddresses.java)をご覧ください。

## Elastic IP アドレスを解放する
<a name="releasing-an-elastic-ip-address"></a>

Elastic IP アドレスを解放するには、AmazonEC2Client の `releaseAddress` メソッドを呼び出して、解放する Elastic IP アドレスのアロケーション ID を含む [ReleaseAddressRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/ReleaseAddressRequest.html) を渡します。

 **インポート** 

```
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.ReleaseAddressRequest;
import com.amazonaws.services.ec2.model.ReleaseAddressResult;
```

 **コード** 

```
final AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

ReleaseAddressRequest request = new ReleaseAddressRequest()
    .withAllocationId(alloc_id);

ReleaseAddressResult response = ec2.releaseAddress(request);
```

Elastic IP アドレスを解放すると、その IP アドレスは AWS IP アドレスプールに解放され、後で使用できないことがあります。DNS レコード、およびそのアドレスと通信するすべてのサーバーまたはデバイスを更新してください。既に解放済みの Elastic IP アドレスを解放しようとした場合に、そのアドレスが既に別の AWS アカウント に割り当てられていると *AuthFailure* エラーが発生します。

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

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

[完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/ec2/src/main/java/aws/example/ec2/ReleaseAddress.java)をご覧ください。

## 詳細情報
<a name="more-information"></a>
+  Amazon EC2 Linux インスタンス用ユーザーガイドの [Elastic IP アドレス](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)
+  Amazon EC2 API リファレンスの [AllocateAddress](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AllocateAddress.html)
+  Amazon EC2 API リファレンスの [DescribeAddresses](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeAddresses.html)
+  Amazon EC2 API リファレンスの [ReleaseAddress](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ReleaseAddress.html)

# リージョンとアベイラビリティーゾーンを使用する
<a name="examples-ec2-regions-zones"></a>

## リージョンの詳細を表示する
<a name="describe-regions"></a>

アカウントに使用可能なリージョンを一覧表示するには、AmazonEC2Client の `describeRegions` メソッドを呼び出します。[DescribeRegionsResult](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/DescribeRegionsResult.html) が返されます。返されたオブジェクトの `getRegions` メソッドを呼び出して、各リージョンを表す [Region](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/Region.html) オブジェクトの一覧を取得します。

 **インポート** 

```
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.DescribeRegionsResult;
import com.amazonaws.services.ec2.model.Region;
import com.amazonaws.services.ec2.model.AvailabilityZone;
import com.amazonaws.services.ec2.model.DescribeAvailabilityZonesResult;
```

 **コード** 

```
DescribeRegionsResult regions_response = ec2.describeRegions();

for(Region region : regions_response.getRegions()) {
    System.out.printf(
        "Found region %s " +
        "with endpoint %s",
        region.getRegionName(),
        region.getEndpoint());
}
```

[完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/ec2/src/main/java/aws/example/ec2/DescribeRegionsAndZones.java)をご覧ください。

## アベイラビリティーゾーンの詳細を表示する
<a name="describe-availability-zones"></a>

アカウントに使用可能な各アベイラビリティーゾーンを一覧表示するには、AmazonEC2Client の `describeAvailabilityZones` メソッドを呼び出します。[DescribeAvailabilityZonesResult](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/DescribeAvailabilityZonesResult.html) が返されます。それの `getAvailabilityZones` メソッドを呼び出して、各アベイラビリティーゾーンを表す [AvailabilityZone](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/AvailabilityZone.html) オブジェクトの一覧を取得します。

 **インポート** 

```
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.DescribeRegionsResult;
import com.amazonaws.services.ec2.model.Region;
import com.amazonaws.services.ec2.model.AvailabilityZone;
import com.amazonaws.services.ec2.model.DescribeAvailabilityZonesResult;
```

 **コード** 

```
DescribeAvailabilityZonesResult zones_response =
    ec2.describeAvailabilityZones();

for(AvailabilityZone zone : zones_response.getAvailabilityZones()) {
    System.out.printf(
        "Found availability zone %s " +
        "with status %s " +
        "in region %s",
        zone.getZoneName(),
        zone.getState(),
        zone.getRegionName());
}
```

[完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/ec2/src/main/java/aws/example/ec2/DescribeRegionsAndZones.java)をご覧ください。

## アカウントの説明
<a name="describe-accounts"></a>

アカウントの詳細を表示するには、AmazonEC2Client の `describeAccountAttributes` メソッドを呼び出します。このメソッドは、[DescribeAccountAttributesResult](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/DescribeAccountAttributesResult.html) オブジェクトを返します。このオブジェクト `getAccountAttributes` メソッドを呼び出して、[AccountAttribute](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/AccountAttribute.html) オブジェクトのリストを取得します。リストを反復処理して、[AccountAttribute](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/AccountAttribute.html) オブジェクトを取得できます。

アカウントの属性値は、[AccountAttribute](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/AccountAttribute.html) オブジェクトの `getAttributeValues` メソッドを呼び出すことで取得できます。このメソッドは、[AccountAttributeValue](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/AccountAttributeValue.html) オブジェクトのリストを返します。この 2 番目のリストを反復処理して、属性の値を表示できます (次のコード例を参照)。

 **インポート** 

```
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.AccountAttributeValue;
import com.amazonaws.services.ec2.model.DescribeAccountAttributesResult;
import com.amazonaws.services.ec2.model.AccountAttribute;
import java.util.List;
import java.util.ListIterator;
```

 **Code** 

```
AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

try{
    DescribeAccountAttributesResult accountResults = ec2.describeAccountAttributes();
    List<AccountAttribute> accountList = accountResults.getAccountAttributes();

    for (ListIterator iter = accountList.listIterator(); iter.hasNext(); ) {

        AccountAttribute attribute = (AccountAttribute) iter.next();
        System.out.print("\n The name of the attribute is "+attribute.getAttributeName());
        List<AccountAttributeValue> values = attribute.getAttributeValues();

         //iterate through the attribute values
        for (ListIterator iterVals = values.listIterator(); iterVals.hasNext(); ) {
            AccountAttributeValue myValue = (AccountAttributeValue) iterVals.next();
            System.out.print("\n The value of the attribute is "+myValue.getAttributeValue());
        }
    }
    System.out.print("Done");
}
catch (Exception e)
{
    e.getStackTrace();
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/ec2/src/main/java/aws/example/ec2/DescribeAccount.java) で完全な例をご覧ください。

## 詳細情報
<a name="more-information"></a>
+  Amazon EC2 Linux インスタンス用ユーザーガイドの[リージョンとアベイラビリティーゾーン](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html)
+  Amazon EC2 API リファレンスの [DescribeRegions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeRegions.html)
+  Amazon EC2 API リファレンスの [DescribeAvailabilityZones](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeAvailabilityZones.html)

# Amazon EC2 キーペアでの作業
<a name="examples-ec2-key-pairs"></a>

## キーペアを作成する
<a name="creating-a-key-pair"></a>

キーペアを作成するには、そのキーの名前を含む [CreateKeyPairRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/CreateKeyPairRequest.html) を使用して AmazonEC2Client の `createKeyPair` メソッドを呼び出します。

 **インポート** 

```
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.CreateKeyPairRequest;
import com.amazonaws.services.ec2.model.CreateKeyPairResult;
```

 **コード** 

```
final AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

CreateKeyPairRequest request = new CreateKeyPairRequest()
    .withKeyName(key_name);

CreateKeyPairResult response = ec2.createKeyPair(request);
```

[完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/ec2/src/main/java/aws/example/ec2/CreateKeyPair.java)をご覧ください。

## キーペアの詳細を表示する
<a name="describing-key-pairs"></a>

キーペアを一覧表示したりキーペアに関する情報を入手するには、AmazonEC2Client の `describeKeyPairs` メソッドを呼び出します。[ メソッドを呼び出すことでキーペアの一覧にアクセスするのに使用できる ](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/DescribeKeyPairsResult.html)DescribeKeyPairsResult`getKeyPairs` が返され、それにより [KeyPairInfo](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/KeyPairInfo.html) オブジェクトの一覧が返されます。

 **インポート** 

```
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.DescribeKeyPairsResult;
import com.amazonaws.services.ec2.model.KeyPairInfo;
```

 **コード** 

```
final AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

DescribeKeyPairsResult response = ec2.describeKeyPairs();

for(KeyPairInfo key_pair : response.getKeyPairs()) {
    System.out.printf(
        "Found key pair with name %s " +
        "and fingerprint %s",
        key_pair.getKeyName(),
        key_pair.getKeyFingerprint());
}
```

[完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/ec2/src/main/java/aws/example/ec2/DescribeKeyPairs.java)をご覧ください。

## キーペアを削除する
<a name="deleting-a-key-pair"></a>

キーペアを削除するには、AmazonEC2Client の `deleteKeyPair` メソッドを呼び出し、それに削除するキーペアの名前を含む [DeleteKeyPairRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/DeleteKeyPairRequest.html) を渡します。

 **インポート** 

```
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.DeleteKeyPairRequest;
import com.amazonaws.services.ec2.model.DeleteKeyPairResult;
```

 **コード** 

```
final AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

DeleteKeyPairRequest request = new DeleteKeyPairRequest()
    .withKeyName(key_name);

DeleteKeyPairResult response = ec2.deleteKeyPair(request);
```

[完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/ec2/src/main/java/aws/example/ec2/DeleteKeyPair.java)をご覧ください。

## 詳細情報
<a name="more-information"></a>
+  「Linux インスタンス用 Amazon EC2 ユーザーガイド」の [Amazon EC2 キーペア](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)
+  Amazon EC2 API リファレンスの [CreateKeyPair](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateKeyPair.html)
+  Amazon EC2 API リファレンスの [DescribeKeyPairs](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeKeyPairs.html)
+  Amazon EC2 API リファレンスの [DeleteKeyPair](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteKeyPair.html)

# Amazon EC2 でセキュリティグループを操作する
<a name="examples-ec2-security-groups"></a>

## セキュリティグループを作成する
<a name="creating-a-security-group"></a>

セキュリティグループを作成するには、そのキーの名前を含む [CreateSecurityGroupRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/CreateSecurityGroupRequest.html) を使用して AmazonEC2Client の `createSecurityGroup` メソッドを呼び出します。

 **インポート** 

```
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.CreateSecurityGroupRequest;
import com.amazonaws.services.ec2.model.CreateSecurityGroupResult;
```

 **コード** 

```
final AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

CreateSecurityGroupRequest create_request = new
    CreateSecurityGroupRequest()
        .withGroupName(group_name)
        .withDescription(group_desc)
        .withVpcId(vpc_id);

CreateSecurityGroupResult create_response =
    ec2.createSecurityGroup(create_request);
```

[完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/ec2/src/main/java/aws/example/ec2/CreateSecurityGroup.java)をご覧ください。

## セキュリティグループを設定する
<a name="configuring-a-security-group"></a>

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

セキュリティグループに Ingress ルールを追加するには、AmazonEC2Client の `authorizeSecurityGroupIngress` メソッドを使用して、セキュリティグループの名前と [AuthorizeSecurityGroupIngressRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/IpPermission.html) オブジェクト内で割り当てるアクセスルール ([IpPermission](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/AuthorizeSecurityGroupIngressRequest.html)) を指定します。以下の例では、セキュリティグループへの IP のアクセス許可の追加方法を説明します。

 **インポート** 

```
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.CreateSecurityGroupRequest;
import com.amazonaws.services.ec2.model.CreateSecurityGroupResult;
```

 **コード** 

```
IpRange ip_range = new IpRange()
    .withCidrIp("0.0.0.0/0");

IpPermission ip_perm = new IpPermission()
    .withIpProtocol("tcp")
    .withToPort(80)
    .withFromPort(80)
    .withIpv4Ranges(ip_range);

IpPermission ip_perm2 = new IpPermission()
    .withIpProtocol("tcp")
    .withToPort(22)
    .withFromPort(22)
    .withIpv4Ranges(ip_range);

AuthorizeSecurityGroupIngressRequest auth_request = new
    AuthorizeSecurityGroupIngressRequest()
        .withGroupName(group_name)
        .withIpPermissions(ip_perm, ip_perm2);

AuthorizeSecurityGroupIngressResult auth_response =
    ec2.authorizeSecurityGroupIngress(auth_request);
```

セキュリティグループに egress ルールを追加するには、同様のデータを AmazonEC2Client の `authorizeSecurityGroupEgress` メソッドに [AuthorizeSecurityGroupEgressRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/AuthorizeSecurityGroupEgressRequest.html) で指定します。

[完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/ec2/src/main/java/aws/example/ec2/CreateSecurityGroup.java)をご覧ください。

## セキュリティグループについて説明する
<a name="describing-security-groups"></a>

セキュリティグループについて記述、またはそれらに関する情報を収集するには、AmazonEC2Client の `describeSecurityGroups` メソッドを呼び出します。`getSecurityGroups`メソッドを呼び出すことでセキュリティグループの一覧にアクセスするのに使用できる [DescribeSecurityGroupsResult](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/DescribeSecurityGroupsResult.html) が返され、それにより [SecurityGroup](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/ec2/model/SecurityGroup.html) オブジェクトの一覧が返されます。

 **インポート** 

```
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.DescribeSecurityGroupsRequest;
import com.amazonaws.services.ec2.model.DescribeSecurityGroupsResult;
```

 **コード** 

```
final String USAGE =
    "To run this example, supply a group id\n" +
    "Ex: DescribeSecurityGroups <group-id>\n";

if (args.length != 1) {
    System.out.println(USAGE);
    System.exit(1);
}

String group_id = args[0];
```

[完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/ec2/src/main/java/aws/example/ec2/DescribeSecurityGroups.java)をご覧ください。

## セキュリティグループの削除
<a name="deleting-a-security-group"></a>

セキュリティグループを削除するには、AmazonEC2Client の `deleteSecurityGroup` メソッドを呼び出し、それに削除するセキュリティグループの ID を含む [DeleteSecurityGroupRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/ec2/model/DeleteSecurityGroupRequest.html) を渡します。

 **インポート** 

```
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.DeleteSecurityGroupRequest;
import com.amazonaws.services.ec2.model.DeleteSecurityGroupResult;
```

 **コード** 

```
final AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

DeleteSecurityGroupRequest request = new DeleteSecurityGroupRequest()
    .withGroupId(group_id);

DeleteSecurityGroupResult response = ec2.deleteSecurityGroup(request);
```

[完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/ec2/src/main/java/aws/example/ec2/DeleteSecurityGroup.java)をご覧ください。

## 詳細情報
<a name="more-information"></a>
+  「Linux インスタンス用 Amazon EC2 ユーザーガイド」の [Amazon EC2 セキュリティグループ](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)
+  Amazon EC2 Linux インスタンス用ユーザーガイドでの [Linux インスタンスのインバウンドトラフィックの承認](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/authorizing-access-to-an-instance.html)
+  Amazon EC2 API リファレンスの [CreateSecurityGroup](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateSecurityGroup.html)
+  Amazon EC2 API リファレンスの [DescribeSecurityGroups](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSecurityGroups.html)
+  Amazon EC2 API リファレンスの [DeleteSecurityGroup](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteSecurityGroup.html)
+  Amazon EC2 API リファレンスの [AuthorizeSecurityGroupIngress](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AuthorizeSecurityGroupIngress.html)

# AWS SDK for Java を使用した IAM の例
<a name="examples-iam"></a>

このセクションでは、[AWS SDK for Java](https://aws.amazon.com/sdk-for-java/) を使用して [IAM](https://aws.amazon.com/iam/) をプログラムする例を示します。

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

**注記**  
例には各手法を示すのに必要なコードのみが含まれます。[完全なサンプルコードは GitHub で入手できます](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/java)。そこから、単一のソースファイルをダウンロードするかリポジトリをローカルにクローン作成して、ビルドし実行するためのすべての例を取得できます。

**Topics**
+ [IAM アクセスキーの管理](examples-iam-access-keys.md)
+ [IAM ユーザーの管理](examples-iam-users.md)
+ [IAM アカウントエイリアスの使用](examples-iam-account-aliases.md)
+ [IAM ポリシーの使用](examples-iam-policies.md)
+ [IAM サーバー証明書の使用](examples-iam-server-certificates.md)

# IAM アクセスキーの管理
<a name="examples-iam-access-keys"></a>

## アクセスキーの作成
<a name="creating-an-access-key"></a>

IAM アクセスキーを作成するには、AmazonIdentityManagementClient`createAccessKey` メソッドを [CreateAccessKeyRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/CreateAccessKeyRequest.html) オブジェクトを使用して呼び出します。

 `CreateAccessKeyRequest` には 2 つのコンストラクタ、すなわち、ユーザー名を取るものとパラメータのないものとがあります。パラメータを取らないバージョンを使用する場合、`withUserName` メソッドに渡す前に `createAccessKey` setter メソッドを使用してユーザー名を設定する必要があります。

 **インポート** 

```
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.CreateAccessKeyRequest;
import com.amazonaws.services.identitymanagement.model.CreateAccessKeyResult;
```

 **Code** 

```
final AmazonIdentityManagement iam =
    AmazonIdentityManagementClientBuilder.defaultClient();

CreateAccessKeyRequest request = new CreateAccessKeyRequest()
    .withUserName(user);

CreateAccessKeyResult response = iam.createAccessKey(request);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/iam/src/main/java/aws/example/iam/CreateAccessKey.java) で完全な例をご覧ください。

## アクセスキーの一覧表示
<a name="listing-access-keys"></a>

特定のユーザーのアクセスキーを一覧表示するには、キーの一覧表示の対象となるユーザー名を含む [ListAccessKeysRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/ListAccessKeysRequest.html) オブジェクトを作成し、それを AmazonIdentityManagementClient の `listAccessKeys` メソッドに渡します。

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

 **インポート** 

```
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.AccessKeyMetadata;
import com.amazonaws.services.identitymanagement.model.ListAccessKeysRequest;
import com.amazonaws.services.identitymanagement.model.ListAccessKeysResult;
```

 **コード** 

```
final AmazonIdentityManagement iam =
    AmazonIdentityManagementClientBuilder.defaultClient();

boolean done = false;
ListAccessKeysRequest request = new ListAccessKeysRequest()
        .withUserName(username);

while (!done) {

    ListAccessKeysResult response = iam.listAccessKeys(request);

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

    request.setMarker(response.getMarker());

    if (!response.getIsTruncated()) {
        done = true;
    }
}
```

`listAccessKeys` の結果はページ分割されます (デフォルトで最大 1 回の呼び出しごとに 100 レコード)。返された [ListAccessKeysResult](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/ListAccessKeysResult.html) オブジェクトで `getIsTruncated` を呼び出し、より少ない結果を返されたクエリが利用可能かどうか確認することができます。利用可能な場合は、`setMarker` で `ListAccessKeysRequest` を呼び出し、それを `listAccessKeys` の次の呼び出しに返します。

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/iam/src/main/java/aws/example/iam/ListAccessKeys.java) で完全な例をご覧ください。

## アクセスキーの最終使用時刻の取得
<a name="retrieving-an-access-key-s-last-used-time"></a>

アクセスキーが最後に使用された時刻を取得するには、そのアクセスキーの ID で AmazonIdentityManagementClient の `getAccessKeyLastUsed` メソッドを呼び出します。アクセスキーの ID は [GetAccessKeyLastUsedRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/GetAccessKeyLastUsedRequest.html) オブジェクトを使用して、またはアクセスキー ID を直接取るオーバーロードへ直接渡すことができます。

その後返された [GetAccessKeyLastUsedResult](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/GetAccessKeyLastUsedResult.html) オブジェクトを使用して、キーの最終使用時刻を取得できます。

 **インポート** 

```
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.GetAccessKeyLastUsedRequest;
import com.amazonaws.services.identitymanagement.model.GetAccessKeyLastUsedResult;
```

 **Code** 

```
final AmazonIdentityManagement iam =
    AmazonIdentityManagementClientBuilder.defaultClient();

GetAccessKeyLastUsedRequest request = new GetAccessKeyLastUsedRequest()
    .withAccessKeyId(access_id);

GetAccessKeyLastUsedResult response = iam.getAccessKeyLastUsed(request);

System.out.println("Access key was last used at: " +
        response.getAccessKeyLastUsed().getLastUsedDate());
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/iam/src/main/java/aws/example/iam/AccessKeyLastUsed.java) で完全な例をご覧ください。

## アクセスキーのアクティブ化や非アクティブ化
<a name="iam-access-keys-update"></a>

アクセスキーをアクティブ化または非アクティブ化するには、[UpdateAccessKeyRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/UpdateAccessKeyRequest.html) オブジェクトを作成し、アクセスキー ID、オプションでユーザー名、また目的の[ステータス](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/StatusType.html)を渡して、次にそのリクエストオブジェクトを AmazonIdentityManagementClient の `updateAccessKey` メソッドに渡します。

 **インポート** 

```
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.UpdateAccessKeyRequest;
import com.amazonaws.services.identitymanagement.model.UpdateAccessKeyResult;
```

 **Code** 

```
final AmazonIdentityManagement iam =
    AmazonIdentityManagementClientBuilder.defaultClient();

UpdateAccessKeyRequest request = new UpdateAccessKeyRequest()
    .withAccessKeyId(access_id)
    .withUserName(username)
    .withStatus(status);

UpdateAccessKeyResult response = iam.updateAccessKey(request);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/iam/src/main/java/aws/example/iam/UpdateAccessKey.java) で完全な例をご覧ください。

## アクセスキーの削除
<a name="deleting-an-access-key"></a>

アクセスキーを完全に削除するには、AmazonIdentityManagementClient の `deleteKey` メソッドを呼び出し、それにアクセスキーの ID とユーザーネームを含む [DeleteAccessKeyRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/DeleteAccessKeyRequest.html) を渡します。

**注記**  
削除してしまうと、キーは取得することも使用することもできなくなります。後で再度アクティブ化できるようキーを一時的に非アクティブ化するには、代わりに [updateAccessKey](#iam-access-keys-update) メソッドを使用します。

 **インポート** 

```
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.DeleteAccessKeyRequest;
import com.amazonaws.services.identitymanagement.model.DeleteAccessKeyResult;
```

 **Code** 

```
final AmazonIdentityManagement iam =
    AmazonIdentityManagementClientBuilder.defaultClient();

DeleteAccessKeyRequest request = new DeleteAccessKeyRequest()
    .withAccessKeyId(access_key)
    .withUserName(username);

DeleteAccessKeyResult response = iam.deleteAccessKey(request);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/iam/src/main/java/aws/example/iam/DeleteAccessKey.java) で完全な例をご覧ください。

## 詳細情報
<a name="more-information"></a>
+  IAM API リファレンスの [CreateAccessKey](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateAccessKey.html)
+  IAM API リファレンスの [ListAccessKeys](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAccessKeys.html)
+  IAM API リファレンスの [GetAccessKeyLastUsed](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccessKeyLastUsed.html)
+  IAM API リファレンスの [UpdateAccessKey](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateAccessKey.html)
+  IAM API リファレンスの [DeleteAccessKey](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteAccessKey.html)

# IAM ユーザーの管理
<a name="examples-iam-users"></a>

## ユーザーの作成
<a name="creating-a-user"></a>

新しい IAM ユーザーを作成するには、直接、またはユーザー名を含む [CreateUserRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/CreateUserRequest.html) オブジェクトを使用して、AmazonIdentityManagementClient の `createUser` メソッドにユーザー名を渡します。

 **インポート** 

```
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.CreateUserRequest;
import com.amazonaws.services.identitymanagement.model.CreateUserResult;
```

 **Code** 

```
final AmazonIdentityManagement iam =
    AmazonIdentityManagementClientBuilder.defaultClient();

CreateUserRequest request = new CreateUserRequest()
    .withUserName(username);

CreateUserResult response = iam.createUser(request);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/iam/src/main/java/aws/example/iam/CreateUser.java) で完全な例をご覧ください。

## ユーザーの一覧表示
<a name="listing-users"></a>

アカウントの IAM ユーザーを一覧表示するには、新しい [ListUsersRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/ListUsersRequest.html) を作成して、それを AmazonIdentityManagementClient の `listUsers` メソッドに渡します。返された [ListUsersResult](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/identitymanagement/model/ListUsersResult.html) オブジェクトで `getUsers` を呼び出すことでユーザーのリストを取得できます。

`listUsers` によって返されたユーザーのリストはページ分割されます。取得できる結果がさらにあることを確認するには、応答オブジェクトの `getIsTruncated` メソッドを呼び出します。`true` が返ってきた場合、リクエストオブジェクトの `setMarker()` メソッドを呼び出し、それに応答オブジェクトの `getMarker()` メソッドの戻り値を渡します。

 **インポート** 

```
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.ListUsersRequest;
import com.amazonaws.services.identitymanagement.model.ListUsersResult;
import com.amazonaws.services.identitymanagement.model.User;
```

 **Code** 

```
final AmazonIdentityManagement iam =
    AmazonIdentityManagementClientBuilder.defaultClient();

boolean done = false;
ListUsersRequest request = new ListUsersRequest();

while(!done) {
    ListUsersResult response = iam.listUsers(request);

    for(User user : response.getUsers()) {
        System.out.format("Retrieved user %s", user.getUserName());
    }

    request.setMarker(response.getMarker());

    if(!response.getIsTruncated()) {
        done = true;
    }
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/iam/src/main/java/aws/example/iam/ListUsers.java) で完全な例をご覧ください。

## ユーザーの更新
<a name="updating-a-user"></a>

ユーザーを更新するには、AmazonIdentityManagementClient オブジェクトの `updateUser` メソッドを呼び出し、それが取得する [UpdateUserRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/UpdateUserRequest.html) オブジェクトを使用して、ユーザーの*名前*または*パス*を変更します。

 **インポート** 

```
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.UpdateUserRequest;
import com.amazonaws.services.identitymanagement.model.UpdateUserResult;
```

 **Code** 

```
final AmazonIdentityManagement iam =
    AmazonIdentityManagementClientBuilder.defaultClient();

UpdateUserRequest request = new UpdateUserRequest()
    .withUserName(cur_name)
    .withNewUserName(new_name);

UpdateUserResult response = iam.updateUser(request);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/iam/src/main/java/aws/example/iam/UpdateUser.java) で完全な例をご覧ください。

## ユーザーの削除
<a name="deleting-a-user"></a>

ユーザーを削除するには、[UpdateUserRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/UpdateUserRequest.html) オブジェクトに削除するユーザー名を設定して、AmazonIdentityManagementClient の `deleteUser` リクエストを呼び出します。

 **インポート** 

```
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.DeleteConflictException;
import com.amazonaws.services.identitymanagement.model.DeleteUserRequest;
```

 **Code** 

```
final AmazonIdentityManagement iam =
    AmazonIdentityManagementClientBuilder.defaultClient();

DeleteUserRequest request = new DeleteUserRequest()
    .withUserName(username);

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](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/iam/src/main/java/aws/example/iam/DeleteUser.java) で完全な例をご覧ください。

## 詳細情報
<a name="more-information"></a>
+  IAM ユーザーガイドの [IAM ユーザー](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)
+  IAM ユーザーガイドの [IAM ユーザーの管理](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_manage.html)
+  IAM API リファレンスの [CreateUser](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateUser.html)
+  IAM API リファレンスの [ListUsers](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListUsers.html)
+  IAM API リファレンスの [UpdateUser](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateUser.html)
+  IAM API リファレンスの [DeleteUser](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteUser.html)

# IAM アカウントエイリアスの使用
<a name="examples-iam-account-aliases"></a>

サインインページの URL に、AWS アカウント ID ではなく企業の名前または他のわかりやすい識別子を含めるには、AWS アカウント のエイリアスを作成します。

**注記**  
 AWS ではアカウントごとに 1 つのアカウントのエイリアスのみがサポートされます。

## アカウントエイリアスの作成
<a name="creating-an-account-alias"></a>

アカウントエイリアスを作成するには、そのエイリアス名が含まれる [CreateAccountAliasRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/CreateAccountAliasRequest.html) オブジェクトを使用して AmazonIdentityManagementClient の `createAccountAlias` メソッドを呼び出します。

 **インポート** 

```
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.CreateAccountAliasRequest;
import com.amazonaws.services.identitymanagement.model.CreateAccountAliasResult;
```

 **Code** 

```
final AmazonIdentityManagement iam =
    AmazonIdentityManagementClientBuilder.defaultClient();

CreateAccountAliasRequest request = new CreateAccountAliasRequest()
    .withAccountAlias(alias);

CreateAccountAliasResult response = iam.createAccountAlias(request);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/iam/src/main/java/aws/example/iam/CreateAccountAlias.java) で完全な例をご覧ください。

## アカウントエイリアスを一覧表示する
<a name="listing-account-aliases"></a>

アカウントエイリアスを一覧表示するには、AmazonIdentityManagementClient の `listAccountAliases` メソッドを呼び出します。

**注記**  
返される [ListAccountAliasesResult](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/identitymanagement/model/ListAccountAliasesResult.html) は、他の AWS SDK for Java *list* メソッドと同じ `getIsTruncated` および `getMarker` メソッドがサポートされますが、AWS アカウント で使用できるアカウントエイリアスは *1 つ*のみです。

 **インポート** 

```
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.ListAccountAliasesResult;
```

 ** コード** 

```
final AmazonIdentityManagement iam =
    AmazonIdentityManagementClientBuilder.defaultClient();

ListAccountAliasesResult response = iam.listAccountAliases();

for (String alias : response.getAccountAliases()) {
    System.out.printf("Retrieved account alias %s", alias);
}
```

GitHub で[完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/iam/src/main/java/aws/example/iam/ListAccountAliases.java)をご覧ください。

## アカウントエイリアスを削除する
<a name="deleting-an-account-alias"></a>

アカウントエイリアスを削除するには、AmazonIdentityManagementClient の `deleteAccountAlias` メソッドを呼び出します。アカウントエイリアスを削除する場合は、[DeleteAccountAliasRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/DeleteAccountAliasRequest.html) オブジェクトを使用してその名前を指定する必要があります。

 **インポート** 

```
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.DeleteAccountAliasRequest;
import com.amazonaws.services.identitymanagement.model.DeleteAccountAliasResult;
```

 **Code** 

```
final AmazonIdentityManagement iam =
    AmazonIdentityManagementClientBuilder.defaultClient();

DeleteAccountAliasRequest request = new DeleteAccountAliasRequest()
    .withAccountAlias(alias);

DeleteAccountAliasResult response = iam.deleteAccountAlias(request);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/iam/src/main/java/aws/example/iam/DeleteAccountAlias.java) で完全な例をご覧ください。

## 詳細情報
<a name="more-information"></a>
+  IAM ユーザーガイドの [AWS アカウント ID とそのエイリアス](https://docs.aws.amazon.com/IAM/latest/UserGuide/console_account-alias.html)
+  IAM API リファレンスの [CreateAccountAlias](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateAccountAlias.html)
+  IAM API リファレンスの [ListAccountAliases](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAccountAliases.html)
+  IAM API リファレンスの [DeleteAccountAlias](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteAccountAlias.html)

# IAM ポリシーの使用
<a name="examples-iam-policies"></a>

## ポリシーの作成
<a name="creating-a-policy"></a>

新しいポリシーを作成するには、[CreatePolicyRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/CreatePolicyRequest.html) 内のポリシーの名前および JSON 形式のポリシードキュメントを AmazonIdentityManagementClient の `createPolicy` メソッドに渡します。

 **インポート** 

```
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.CreatePolicyRequest;
import com.amazonaws.services.identitymanagement.model.CreatePolicyResult;
```

 **コード** 

```
final AmazonIdentityManagement iam =
    AmazonIdentityManagementClientBuilder.defaultClient();

CreatePolicyRequest request = new CreatePolicyRequest()
    .withPolicyName(policy_name)
    .withPolicyDocument(POLICY_DOCUMENT);

CreatePolicyResult response = iam.createPolicy(request);
```

IAM ポリシードキュメントは[文書による十分な裏づけのある構文](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_grammar.html)を持つ JSON 文字列です。DynamoDB に特定のリクエストをするためのアクセスを提供する例を以下に示します。

```
public 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](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/iam/src/main/java/aws/example/iam/CreatePolicy.java) で完全な例をご覧ください。

## ポリシーの取得
<a name="getting-a-policy"></a>

既存のポリシーを取得するには、AmazonIdentityManagementClient の `getPolicy` メソッドを呼び出して、[GetPolicyRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/GetPolicyRequest.html) オブジェクト内のポリシーの ARN を渡します。

 **インポート** 

```
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.GetPolicyRequest;
import com.amazonaws.services.identitymanagement.model.GetPolicyResult;
```

 **Code** 

```
final AmazonIdentityManagement iam =
    AmazonIdentityManagementClientBuilder.defaultClient();

GetPolicyRequest request = new GetPolicyRequest()
    .withPolicyArn(policy_arn);

GetPolicyResult response = iam.getPolicy(request);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/iam/src/main/java/aws/example/iam/GetPolicy.java) で完全な例をご覧ください。

## ロールポリシーのアタッチ
<a name="attaching-a-role-policy"></a>

ポリシーを IAMhttp://docs.aws.amazon.com/IAM/latest/UserGuide/id\$1roles.html[ロール] にアタッチするには、AmazonIdentityManagementClient の `attachRolePolicy` メソッドを呼び出し、[AttachRolePolicyRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/AttachRolePolicyRequest.html) でロール名とポリシー ARN を指定します。

 **インポート** 

```
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.AttachRolePolicyRequest;
import com.amazonaws.services.identitymanagement.model.AttachedPolicy;
```

 **Code** 

```
final AmazonIdentityManagement iam =
    AmazonIdentityManagementClientBuilder.defaultClient();

AttachRolePolicyRequest attach_request =
    new AttachRolePolicyRequest()
        .withRoleName(role_name)
        .withPolicyArn(POLICY_ARN);

iam.attachRolePolicy(attach_request);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/iam/src/main/java/aws/example/iam/AttachRolePolicy.java) で完全な例をご覧ください。

## アタッチ済みロールポリシーの一覧表示
<a name="listing-attached-role-policies"></a>

ロールのアタッチ済みポリシーを一覧表示するには、AmazonIdentityManagementClient の `listAttachedRolePolicies` メソッドを呼び出します。このメソッドは、ポリシーを一覧表示するロール名を含む [ListAttachedRolePoliciesRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/ListAttachedRolePoliciesRequest.html) オブジェクトを受け取ります。

返された [ListAttachedRolePoliciesResult](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/ListAttachedRolePoliciesResult.html) オブジェクトで `getAttachedPolicies` を呼び出してアタッチ済みポリシーのリストを取得します。結果は切り捨てられる場合があります。`ListAttachedRolePoliciesResult` オブジェクトの `getIsTruncated` メソッドが `true` を返す場合は、`ListAttachedRolePoliciesRequest` オブジェクトの `setMarker` メソッドを呼び出し、それを使用して `listAttachedRolePolicies` を再び呼び出し、結果の次のバッチを取得します。

 **インポート** 

```
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.ListAttachedRolePoliciesRequest;
import com.amazonaws.services.identitymanagement.model.ListAttachedRolePoliciesResult;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
```

 **Code** 

```
final AmazonIdentityManagement iam =
    AmazonIdentityManagementClientBuilder.defaultClient();

ListAttachedRolePoliciesRequest request =
    new ListAttachedRolePoliciesRequest()
        .withRoleName(role_name);

List<AttachedPolicy> matching_policies = new ArrayList<>();

boolean done = false;

while(!done) {
    ListAttachedRolePoliciesResult response =
        iam.listAttachedRolePolicies(request);

    matching_policies.addAll(
            response.getAttachedPolicies()
                    .stream()
                    .filter(p -> p.getPolicyName().equals(role_name))
                    .collect(Collectors.toList()));

    if(!response.getIsTruncated()) {
        done = true;
    }
    request.setMarker(response.getMarker());
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/iam/src/main/java/aws/example/iam/AttachRolePolicy.java) で完全な例をご覧ください。

## ロールポリシーのデタッチ
<a name="detaching-a-role-policy"></a>

ロールからポリシーをデタッチするには、AmazonIdentityManagementClient の `detachRolePolicy` メソッドを呼び出し、それに [DetachRolePolicyRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/DetachRolePolicyRequest.html) 内のロール名およびポリシー ARN を渡します。

 **インポート** 

```
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.DetachRolePolicyRequest;
import com.amazonaws.services.identitymanagement.model.DetachRolePolicyResult;
```

 **Code** 

```
final AmazonIdentityManagement iam =
    AmazonIdentityManagementClientBuilder.defaultClient();

DetachRolePolicyRequest request = new DetachRolePolicyRequest()
    .withRoleName(role_name)
    .withPolicyArn(policy_arn);

DetachRolePolicyResult response = iam.detachRolePolicy(request);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/iam/src/main/java/aws/example/iam/DetachRolePolicy.java) で完全な例をご覧ください。

## 詳細情報
<a name="more-information"></a>
+  IAM ユーザーガイドの [IAM ポリシーの概要](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)。
+  IAM ユーザーガイドの [AWS IAM ポリシーのリファレンス](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html)。
+  IAM API リファレンスの [CreatePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicy.html)
+  IAM API リファレンスの [GetPolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetPolicy.html)
+  IAM API リファレンスの [AttachRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachRolePolicy.html)
+  IAM API リファレンスの [ListAttachedRolePolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedRolePolicies.html)
+  IAM API リファレンスの [DetachRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DetachRolePolicy.html)

# IAM サーバー証明書の使用
<a name="examples-iam-server-certificates"></a>

AWS でウェブサイトまたはアプリケーションへの HTTPS 接続を有効にするには、SSL/TLS *サーバー証明書*が必要です。AWS Certificate Manager から提供されたサーバー証明書、または外部プロバイダーから入手したサーバー証明書を使用できます。

ACM を使用してサーバー証明書のプロビジョニング、管理、デプロイを行うことをお勧めします。ACM を使用すると、証明書をリクエストし、それを AWS リソースにデプロイして、証明書の更新を ACM で処理できます。ACM で提供される証明書は無料です。ACM の詳細については、[ACM ユーザーガイド](https://docs.aws.amazon.com/acm/latest/userguide/)を参照してください。

## サーバー証明書の取得
<a name="getting-a-server-certificate"></a>

サーバー証明書を取得するには、AmazonIdentityManagementClient の `getServerCertificate` メソッドを呼び出し、それに証明書の名前を含む [GetServerCertificateRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/GetServerCertificateRequest.html) を渡します。

 **インポート** 

```
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.GetServerCertificateRequest;
import com.amazonaws.services.identitymanagement.model.GetServerCertificateResult;
```

 **Code** 

```
final AmazonIdentityManagement iam =
    AmazonIdentityManagementClientBuilder.defaultClient();

GetServerCertificateRequest request = new GetServerCertificateRequest()
            .withServerCertificateName(cert_name);

GetServerCertificateResult response = iam.getServerCertificate(request);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/iam/src/main/java/aws/example/iam/GetServerCertificate.java) で完全な例をご覧ください。

## サーバー証明書の一覧表示
<a name="listing-server-certificates"></a>

サーバー証明書を一覧表示するには、AmazonIdentityManagementClient の `listServerCertificates` メソッドを呼び出し、[ListServerCertificatesRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/ListServerCertificatesRequest.html) を渡します。[ListServerCertificatesResult](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/ListServerCertificatesResult.html) が返されます。

返された `ListServerCertificateResult` オブジェクトの `getServerCertificateMetadataList` メソッドを呼び出して、各証明書についての情報を取得するために使用できる [ServerCertificateMetadata](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/ServerCertificateMetadata.html) オブジェクトの一覧を取得します。

結果は切り捨てられる場合があります。`ListServerCertificateResult` オブジェクトの `getIsTruncated` メソッドが `true` を返す場合は、`ListServerCertificatesRequest` オブジェクトの `setMarker` メソッドを呼び出し、それを使用して `listServerCertificates` を再び呼び出し、結果の次のバッチを取得します。

 **インポート** 

```
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.ListServerCertificatesRequest;
import com.amazonaws.services.identitymanagement.model.ListServerCertificatesResult;
import com.amazonaws.services.identitymanagement.model.ServerCertificateMetadata;
```

 **Code** 

```
final AmazonIdentityManagement iam =
    AmazonIdentityManagementClientBuilder.defaultClient();

boolean done = false;
ListServerCertificatesRequest request =
        new ListServerCertificatesRequest();

while(!done) {

    ListServerCertificatesResult response =
        iam.listServerCertificates(request);

    for(ServerCertificateMetadata metadata :
            response.getServerCertificateMetadataList()) {
        System.out.printf("Retrieved server certificate %s",
                metadata.getServerCertificateName());
    }

    request.setMarker(response.getMarker());

    if(!response.getIsTruncated()) {
        done = true;
    }
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/iam/src/main/java/aws/example/iam/ListServerCertificates.java) で完全な例をご覧ください。

## サーバー証明書の更新
<a name="updating-a-server-certificate"></a>

サーバー証明書の名前やパスを更新するには、AmazonIdentityManagementClient の `updateServerCertificate` メソッドを呼び出します。サーバー証明書の現在の名前および使用する新しい名前か新しいパスのいずれかを使って設定した [UpdateServerCertificateRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/UpdateServerCertificateRequest.html) オブジェクトが使用されます。

 **インポート** 

```
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.UpdateServerCertificateRequest;
import com.amazonaws.services.identitymanagement.model.UpdateServerCertificateResult;
```

 **Code** 

```
final AmazonIdentityManagement iam =
    AmazonIdentityManagementClientBuilder.defaultClient();

UpdateServerCertificateRequest request =
    new UpdateServerCertificateRequest()
        .withServerCertificateName(cur_name)
        .withNewServerCertificateName(new_name);

UpdateServerCertificateResult response =
    iam.updateServerCertificate(request);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/iam/src/main/java/aws/example/iam/UpdateServerCertificate.java) で完全な例をご覧ください。

## サーバー証明書の削除
<a name="deleting-a-server-certificate"></a>

サーバー証明書を削除するには、証明書の名前を含む [DeleteServerCertificateRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/identitymanagement/model/DeleteServerCertificateRequest.html) を使用して、AmazonIdentityManagementClient の `deleteServerCertificate` メソッドを呼び出します。

 **インポート** 

```
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.DeleteServerCertificateRequest;
import com.amazonaws.services.identitymanagement.model.DeleteServerCertificateResult;
```

 **Code** 

```
final AmazonIdentityManagement iam =
    AmazonIdentityManagementClientBuilder.defaultClient();

DeleteServerCertificateRequest request =
    new DeleteServerCertificateRequest()
        .withServerCertificateName(cert_name);

DeleteServerCertificateResult response =
    iam.deleteServerCertificate(request);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/iam/src/main/java/aws/example/iam/DeleteServerCertificate.java) で完全な例をご覧ください。

## 詳細情報
<a name="more-information"></a>
+  IAM ユーザーガイドの[サーバー証明書の使用](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_server-certs.html)
+  IAM API リファレンスの [GetServerCertificate](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetServerCertificate.html)
+  IAM API リファレンスの [ListServerCertificates](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListServerCertificates.html)
+  IAM API リファレンスの [UpdateServerCertificate](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateServerCertificate.html)
+  IAM API リファレンスの [DeleteServerCertificate](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteServerCertificate.html)
+  [ACM ユーザーガイド](https://docs.aws.amazon.com/acm/latest/userguide/) 

# Lambda を使用した例AWS SDK for Java
<a name="lambda-examples"></a>

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

**注記**  
例には各手法を示すのに必要なコードのみが含まれます。[完全なサンプルコードは GitHub で入手できます](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/java)。そこから、単一のソースファイルをダウンロードするかリポジトリをローカルにクローン作成して、ビルドし実行するためのすべての例を取得できます。

**Topics**
+ [サービスオペレーション](examples-lambda.md)

# Lambda 関数の呼び出し、一覧表示、および削除
<a name="examples-lambda"></a>

このセクションでは、AWS SDK for Java を使用した Lambda のサービスのクライアントでのプログラミングの例を示します。Lambda 関数の作成方法については、[AWS Lambda 関数の作成方法](https://docs.aws.amazon.com/toolkit-for-eclipse/v1/user-guide/lambda-tutorial.html)を参照してください。

**Topics**
+ [関数を呼び出す](#invoke-function)
+ [関数の一覧表示](#list-function)
+ [関数を削除する](#delete-function)

## 関数を呼び出す
<a name="invoke-function"></a>

[AWSLambda](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/lambda/AWSLambda.html) オブジェクトを作成し、その `invoke` メソッドを呼び出すことによって、Lambda 関数を呼び出すことができます。[InvokeRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/lambda/model/InvokeRequest.html) オブジェクトを作成して、Lambda 関数に渡す関数名やペイロードなどの追加情報を指定します。関数名は、*arn:aws:lambda:us-east-1:555556330391:function:HelloFunction* と表示されます。AWS マネジメントコンソール で関数を確認することで、値を取得できます。

ペイロードデータを関数に渡すには、次のコード例に示すように、[InvokeRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/lambda/model/InvokeRequest.html) オブジェクトの `withPayload` メソッドを呼び出し、JSON 形式の文字列を指定します。

 **インポート** 

```
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.lambda.AWSLambda;
import com.amazonaws.services.lambda.AWSLambdaClientBuilder;
import com.amazonaws.services.lambda.model.InvokeRequest;
import com.amazonaws.services.lambda.model.InvokeResult;
import com.amazonaws.services.lambda.model.ServiceException;

import java.nio.charset.StandardCharsets;
```

 **コード** 

次のコード例は、Lambda 関数を呼び出す方法を示しています。

```
        String functionName = args[0];

        InvokeRequest invokeRequest = new InvokeRequest()
                .withFunctionName(functionName)
                .withPayload("{\n" +
                        " \"Hello \": \"Paris\",\n" +
                        " \"countryCode\": \"FR\"\n" +
                        "}");
        InvokeResult invokeResult = null;

        try {
            AWSLambda awsLambda = AWSLambdaClientBuilder.standard()
                    .withCredentials(new ProfileCredentialsProvider())
                    .withRegion(Regions.US_WEST_2).build();

            invokeResult = awsLambda.invoke(invokeRequest);

            String ans = new String(invokeResult.getPayload().array(), StandardCharsets.UTF_8);

            //write out the return value
            System.out.println(ans);

        } catch (ServiceException e) {
            System.out.println(e);
        }

        System.out.println(invokeResult.getStatusCode());
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/lambda/src/main/java/com/example/lambda/LambdaInvokeFunction.java) で完全な例をご覧ください。

## 関数の一覧表示
<a name="list-function"></a>

[AWSLambda](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/lambda/AWSLambda.html) オブジェクトを構築し、その `listFunctions` メソッドを呼び出します。このメソッドは、[ListFunctionsResult](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/lambda/model/ListFunctionsResult.html) オブジェクトを返します。このオブジェクトの `getFunctions` メソッドを呼び出して、[FunctionConfiguration](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/lambda/model/FunctionConfiguration.html) オブジェクトのリストを返すことができます。リストを反復処理して、関数に関する情報を取得できます。たとえば、次の Java コード例は、各関数名を取得する方法を示しています。

 **インポート** 

```
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.lambda.AWSLambda;
import com.amazonaws.services.lambda.AWSLambdaClientBuilder;
import com.amazonaws.services.lambda.model.FunctionConfiguration;
import com.amazonaws.services.lambda.model.ListFunctionsResult;
import com.amazonaws.services.lambda.model.ServiceException;
import java.util.Iterator;
import java.util.List;
```

 **コード** 

次の Java コード例は、Lambda 関数名のリストを取得する方法を示しています。

```
        ListFunctionsResult functionResult = null;

        try {
            AWSLambda awsLambda = AWSLambdaClientBuilder.standard()
                    .withCredentials(new ProfileCredentialsProvider())
                    .withRegion(Regions.US_WEST_2).build();

            functionResult = awsLambda.listFunctions();

            List<FunctionConfiguration> list = functionResult.getFunctions();

            for (Iterator iter = list.iterator(); iter.hasNext(); ) {
                FunctionConfiguration config = (FunctionConfiguration)iter.next();

                System.out.println("The function name is "+config.getFunctionName());
            }

        } catch (ServiceException e) {
            System.out.println(e);
        }
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/lambda/src/main/java/com/example/lambda/ListFunctions.java) で完全な例をご覧ください。

## 関数を削除する
<a name="delete-function"></a>

[AWSLambda](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/lambda/AWSLambda.html) オブジェクトを構築し、その `deleteFunction` メソッドを呼び出します。[DeleteFunctionRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/lambda/model/DeleteFunctionRequest.html) オブジェクトを作成し、`deleteFunction` メソッドに渡します。このオブジェクトには、削除する関数の名前などの情報が含まれています。関数名は、*arn:aws:lambda:us-east-1:555556330391:function:HelloFunction* と表示されます。AWS マネジメントコンソール で関数を確認することで、値を取得できます。

 **インポート** 

```
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.lambda.AWSLambda;
import com.amazonaws.services.lambda.AWSLambdaClientBuilder;
import com.amazonaws.services.lambda.model.ServiceException;
import com.amazonaws.services.lambda.model.DeleteFunctionRequest;
```

 **コード** 

次の Java コードは、Lambda 関数を削除する方法を示しています。

```
        String functionName = args[0];
        try {
            AWSLambda awsLambda = AWSLambdaClientBuilder.standard()
                    .withCredentials(new ProfileCredentialsProvider())
                    .withRegion(Regions.US_WEST_2).build();

            DeleteFunctionRequest delFunc = new DeleteFunctionRequest();
            delFunc.withFunctionName(functionName);

            //Delete the function
            awsLambda.deleteFunction(delFunc);
            System.out.println("The function is deleted");

        } catch (ServiceException e) {
            System.out.println(e);
        }
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/lambda/src/main/java/com/example/lambda/DeleteFunction.java) で完全な例をご覧ください。

# Amazon Pinpoint を使用した例AWS SDK for Java
<a name="examples-pinpoint"></a>

このセクションでは、[AWS SDK for Java](https://aws.amazon.com/sdk-for-java/) を使用して [Amazon Pinpoint](https://aws.amazon.com/pinpoint/) をプログラムする例を示します。

**注記**  
例には各手法を示すのに必要なコードのみが含まれます。[完全なサンプルコードは GitHub で入手できます](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/java)。そこから、単一のソースファイルをダウンロードするかリポジトリをローカルにクローン作成して、ビルドし実行するためのすべての例を取得できます。

**Topics**
+ [Amazon Pinpoint のアプリの作成および削除](examples-pinpoint-create-app.md)
+ [Amazon Pinpoint でのエンドポイントの作成](examples-pinpoint-create-endpoint.md)
+ [Amazon Pinpoint でのセグメントの作成](examples-pinpoint-create-segment.md)
+ [Amazon Pinpoint でのキャンペーンの作成](examples-pinpoint-create-campaign.md)
+ [Amazon Pinpoint のチャネルの更新](examples-pinpoint-update-channel.md)

# Amazon Pinpoint のアプリの作成および削除
<a name="examples-pinpoint-create-app"></a>

アプリとは、個別のアプリケーションのオーディエンスを定義する Amazon Pinpoint のプロジェクトです。このオーディエンスにカスタマイズされたメッセージを使用して働きかけます。このページの例では、新しいアプリの作成方法や既存のアプリの削除方法を説明します。

## アプリの作成
<a name="create-an-app"></a>

アプリ名を [CreateAppRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/pinpoint/model/CreateAppRequest.html) オブジェクトに指定し、そのオブジェクトを AmazonPinpointClient の `createApp` メソッドに渡して、Amazon Pinpoint に新しいアプリケーションを作成します。

 **インポート** 

```
import com.amazonaws.services.pinpoint.AmazonPinpoint;
import com.amazonaws.services.pinpoint.AmazonPinpointClientBuilder;
import com.amazonaws.services.pinpoint.model.CreateAppRequest;
import com.amazonaws.services.pinpoint.model.CreateAppResult;
import com.amazonaws.services.pinpoint.model.CreateApplicationRequest;
```

 **Code** 

```
CreateApplicationRequest appRequest = new CreateApplicationRequest()
		.withName(appName);

CreateAppRequest request = new CreateAppRequest();
request.withCreateApplicationRequest(appRequest);
CreateAppResult result = pinpoint.createApp(request);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/pinpoint/src/main/java/com/example/pinpoint/CreateApp.java) で完全な例をご覧ください。

## アプリの削除
<a name="delete-an-app"></a>

アプリケーションを削除するには、削除するアプリケーション名を設定した [DeleteAppRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/pinpoint/model/DeleteAppRequest.html) オブジェクトを指定して AmazonPinpointClient の `deleteApp` リクエストを呼び出します。

 **インポート** 

```
import com.amazonaws.services.pinpoint.AmazonPinpoint;
import com.amazonaws.services.pinpoint.AmazonPinpointClientBuilder;
```

 **Code** 

```
DeleteAppRequest deleteRequest = new DeleteAppRequest()
		.withApplicationId(appID);

pinpoint.deleteApp(deleteRequest);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/pinpoint/src/main/java/com/example/pinpoint/DeleteApp.java) で完全な例をご覧ください。

## 詳細情報
<a name="more-information"></a>
+  Amazon Pinpoint API リファレンスの[アプリケーション](https://docs.aws.amazon.com/pinpoint/latest/apireference/rest-api-apps.html)
+  Amazon Pinpoint API リファレンスの[アプリケーション](https://docs.aws.amazon.com/pinpoint/latest/apireference/rest-api-app.html)

# Amazon Pinpoint でのエンドポイントの作成
<a name="examples-pinpoint-create-endpoint"></a>

エンドポイントでユーザーデバイスを一意に識別し、Amazon Pinpoint でプッシュ通知を送信することができます。アプリで Amazon Pinpoint サポートが有効になっている場合、アプリは、新しいユーザーがアプリを開いたときに Amazon Pinpoint で自動的にエンドポイントを登録します。次の例では、プログラムで新しいエンドポイントを追加する方法について説明します。

## エンドポイントの作成
<a name="create-an-endpoint"></a>

Amazon Pinpoint で新しいエンドポイントを作成するには、[EndpointRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/pinpoint/model/EndpointRequest.html) オブジェクトにエンドポイントデータを指定します。

 **インポート** 

```
import com.amazonaws.services.pinpoint.AmazonPinpoint;
import com.amazonaws.services.pinpoint.AmazonPinpointClientBuilder;
import com.amazonaws.services.pinpoint.model.UpdateEndpointRequest;
import com.amazonaws.services.pinpoint.model.UpdateEndpointResult;
import com.amazonaws.services.pinpoint.model.EndpointDemographic;
import com.amazonaws.services.pinpoint.model.EndpointLocation;
import com.amazonaws.services.pinpoint.model.EndpointRequest;
import com.amazonaws.services.pinpoint.model.EndpointResponse;
import com.amazonaws.services.pinpoint.model.EndpointUser;
import com.amazonaws.services.pinpoint.model.GetEndpointRequest;
import com.amazonaws.services.pinpoint.model.GetEndpointResult;
```

 **コード** 

```
HashMap<String, List<String>> customAttributes = new HashMap<>();
List<String> favoriteTeams = new ArrayList<>();
favoriteTeams.add("Lakers");
favoriteTeams.add("Warriors");
customAttributes.put("team", favoriteTeams);


EndpointDemographic demographic = new EndpointDemographic()
        .withAppVersion("1.0")
        .withMake("apple")
        .withModel("iPhone")
        .withModelVersion("7")
        .withPlatform("ios")
        .withPlatformVersion("10.1.1")
        .withTimezone("America/Los_Angeles");

EndpointLocation location = new EndpointLocation()
        .withCity("Los Angeles")
        .withCountry("US")
        .withLatitude(34.0)
        .withLongitude(-118.2)
        .withPostalCode("90068")
        .withRegion("CA");

Map<String,Double> metrics = new HashMap<>();
metrics.put("health", 100.00);
metrics.put("luck", 75.00);

EndpointUser user = new EndpointUser()
        .withUserId(UUID.randomUUID().toString());

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"); // Quoted "Z" to indicate UTC, no timezone offset
String nowAsISO = df.format(new Date());

EndpointRequest endpointRequest = new EndpointRequest()
        .withAddress(UUID.randomUUID().toString())
        .withAttributes(customAttributes)
        .withChannelType("APNS")
        .withDemographic(demographic)
        .withEffectiveDate(nowAsISO)
        .withLocation(location)
        .withMetrics(metrics)
        .withOptOut("NONE")
        .withRequestId(UUID.randomUUID().toString())
        .withUser(user);
```

次に、その EndpointRequest オブジェクトを使用して [UpdateEndpointRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/pinpoint/model/UpdateEndpointRequest.html) オブジェクトを作成します。最後に、UpdateEndpointRequest オブジェクトを AmazonPinpointClient の `updateEndpoint` メソッドに渡します。

 **Code** 

```
UpdateEndpointRequest updateEndpointRequest = new UpdateEndpointRequest()
        .withApplicationId(appId)
        .withEndpointId(endpointId)
        .withEndpointRequest(endpointRequest);

UpdateEndpointResult updateEndpointResponse = client.updateEndpoint(updateEndpointRequest);
System.out.println("Update Endpoint Response: " + updateEndpointResponse.getMessageBody());
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/pinpoint/src/main/java/com/example/pinpoint/CreateEndpoint.java) で完全な例をご覧ください。

## 詳細情報
<a name="more-information"></a>
+  Amazon Pinpoint デベロッパーガイドの[エンドポイントの追加](https://docs.aws.amazon.com/pinpoint/latest/developerguide/endpoints.html)
+  Amazon Pinpoint API リファレンスの[エンドポイント](https://docs.aws.amazon.com/pinpoint/latest/apireference/rest-api-endpoint.html)

# Amazon Pinpoint でのセグメントの作成
<a name="examples-pinpoint-create-segment"></a>

ユーザーセグメントは、ユーザーが最近いつ頃アプリを開いたか、またはどのデバイスを使用しているか、などの共有特性に基づくユーザーのサブセットを表します。次の例では、ユーザーのセグメントを定義する方法を示しています。

## セグメントの作成
<a name="create-a-segment"></a>

Amazon PinpointSegmentDimensions[ オブジェクトでセグメントのディメンションを定義することで、](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/pinpoint/model/SegmentDimensions.html) に新しいセグメントを作成します。

 **インポート** 

```
import com.amazonaws.services.pinpoint.AmazonPinpoint;
import com.amazonaws.services.pinpoint.AmazonPinpointClientBuilder;
import com.amazonaws.services.pinpoint.model.CreateSegmentRequest;
import com.amazonaws.services.pinpoint.model.CreateSegmentResult;
import com.amazonaws.services.pinpoint.model.AttributeDimension;
import com.amazonaws.services.pinpoint.model.AttributeType;
import com.amazonaws.services.pinpoint.model.RecencyDimension;
import com.amazonaws.services.pinpoint.model.SegmentBehaviors;
import com.amazonaws.services.pinpoint.model.SegmentDemographics;
import com.amazonaws.services.pinpoint.model.SegmentDimensions;
import com.amazonaws.services.pinpoint.model.SegmentLocation;
import com.amazonaws.services.pinpoint.model.SegmentResponse;
import com.amazonaws.services.pinpoint.model.WriteSegmentRequest;
```

 **コード** 

```
Pinpoint pinpoint = AmazonPinpointClientBuilder.standard().withRegion(Regions.US_EAST_1).build();
Map<String, AttributeDimension> segmentAttributes = new HashMap<>();
segmentAttributes.put("Team", new AttributeDimension().withAttributeType(AttributeType.INCLUSIVE).withValues("Lakers"));

SegmentBehaviors segmentBehaviors = new SegmentBehaviors();
SegmentDemographics segmentDemographics = new SegmentDemographics();
SegmentLocation segmentLocation = new SegmentLocation();

RecencyDimension recencyDimension = new RecencyDimension();
recencyDimension.withDuration("DAY_30").withRecencyType("ACTIVE");
segmentBehaviors.setRecency(recencyDimension);

SegmentDimensions dimensions = new SegmentDimensions()
        .withAttributes(segmentAttributes)
        .withBehavior(segmentBehaviors)
        .withDemographic(segmentDemographics)
        .withLocation(segmentLocation);
```

次に [SegmentDimensions](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/pinpoint/model/SegmentDimensions.html) オブジェクトを [WriteSegmentRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/pinpoint/model/WriteSegmentRequest.html) に設定します。これは [CreateSegmentRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/pinpoint/model/CreateSegmentRequest.html) オブジェクトの作成に使用されます。その後、CreateSegmentRequest オブジェクトを AmazonPinpointClient の `createSegment` メソッドに渡します。

 **Code** 

```
WriteSegmentRequest writeSegmentRequest = new WriteSegmentRequest()
        .withName("MySegment").withDimensions(dimensions);

CreateSegmentRequest createSegmentRequest = new CreateSegmentRequest()
        .withApplicationId(appId).withWriteSegmentRequest(writeSegmentRequest);

CreateSegmentResult createSegmentResult = client.createSegment(createSegmentRequest);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/pinpoint/src/main/java/com/example/pinpoint/CreateSegment.java) で完全な例をご覧ください。

## 詳細情報
<a name="more-information"></a>
+  Amazon Pinpoint ユーザーガイドの [Amazon Pinpoint セグメント](https://docs.aws.amazon.com/pinpoint/latest/userguide/segments.html)
+  Amazon Pinpoint デベロッパーガイドの[セグメントの作成](https://docs.aws.amazon.com/pinpoint/latest/developerguide/segments.html)
+  Amazon Pinpoint API リファレンスの[セグメント](https://docs.aws.amazon.com/pinpoint/latest/apireference/rest-api-segments.html)
+  Amazon Pinpoint API リファレンスの[セグメント](https://docs.aws.amazon.com/pinpoint/latest/apireference/rest-api-segment.html)

# Amazon Pinpoint でのキャンペーンの作成
<a name="examples-pinpoint-create-campaign"></a>

キャンペーンを使用して、ユーザーとアプリケーション間の関与を向上させることができます。キャンペーンを作成すると、ユーザーのセグメントに合わせてカスタマイズされたメッセージまたは特別なプロモーションを使用してユーザーに連絡できます。この例では、指定されたセグメントにカスタマイズされたプッシュ通知を送信する標準的なキャンペーンを新しく作成する方法を説明します。

## キャンペーンの作成
<a name="create-a-campaign"></a>

新しいキャンペーンを作成する前に、[スケジュール](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/pinpoint/model/Schedule.html)と[メッセージ](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/pinpoint/model/Message.html)を定義し、[WriteCampaignRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/pinpoint/model/WriteCampaignRequest.html) オブジェクトでこれらの値を設定する必要があります。

 **インポート** 

```
import com.amazonaws.services.pinpoint.AmazonPinpoint;
import com.amazonaws.services.pinpoint.AmazonPinpointClientBuilder;
import com.amazonaws.services.pinpoint.model.CreateCampaignRequest;
import com.amazonaws.services.pinpoint.model.CreateCampaignResult;
import com.amazonaws.services.pinpoint.model.Action;
import com.amazonaws.services.pinpoint.model.CampaignResponse;
import com.amazonaws.services.pinpoint.model.Message;
import com.amazonaws.services.pinpoint.model.MessageConfiguration;
import com.amazonaws.services.pinpoint.model.Schedule;
import com.amazonaws.services.pinpoint.model.WriteCampaignRequest;
```

 **コード** 

```
Schedule schedule = new Schedule()
        .withStartTime("IMMEDIATE");

Message defaultMessage = new Message()
        .withAction(Action.OPEN_APP)
        .withBody("My message body.")
        .withTitle("My message title.");

MessageConfiguration messageConfiguration = new MessageConfiguration()
        .withDefaultMessage(defaultMessage);

WriteCampaignRequest request = new WriteCampaignRequest()
        .withDescription("My description.")
        .withSchedule(schedule)
        .withSegmentId(segmentId)
        .withName("MyCampaign")
        .withMessageConfiguration(messageConfiguration);
```

次に、Amazon PinpointCreateCampaignRequest[ オブジェクトに ](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/pinpoint/model/WriteCampaignRequest.html)WriteCampaignRequest[ をキャンペーン設定とともに指定し、](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/pinpoint/model/CreateCampaignRequest.html) で新規キャンペーンを作成します。最後に、CreateCampaignRequest オブジェクトを AmazonPinpointClient の `createCampaign` メソッドに渡します。

 **Code** 

```
CreateCampaignRequest createCampaignRequest = new CreateCampaignRequest()
        .withApplicationId(appId).withWriteCampaignRequest(request);

CreateCampaignResult result = client.createCampaign(createCampaignRequest);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/pinpoint/src/main/java/com/example/pinpoint/CreateApp.java) で完全な例をご覧ください。

## 詳細情報
<a name="more-information"></a>
+  Amazon Pinpoint ユーザーガイドの [Amazon Pinpoint キャンペーン](https://docs.aws.amazon.com/pinpoint/latest/userguide/campaigns.html)
+  Amazon Pinpoint デベロッパーガイドの[キャンペーンの作成](https://docs.aws.amazon.com/pinpoint/latest/developerguide/campaigns.html)
+  Amazon Pinpoint API リファレンスの[キャンペーン](https://docs.aws.amazon.com/pinpoint/latest/apireference/rest-api-campaigns.html)
+  Amazon Pinpoint API リファレンスの[キャンペーン](https://docs.aws.amazon.com/pinpoint/latest/apireference/rest-api-campaign.html)
+  Amazon Pinpoint API リファレンスの[キャンペーンアクティビティ](https://docs.aws.amazon.com/pinpoint/latest/apireference/rest-api-campaign-activities.html)
+  Amazon Pinpoint API リファレンスの[キャンペーンバージョン](https://docs.aws.amazon.com/pinpoint/latest/apireference/rest-api-campaign-versions.html)
+  Amazon Pinpoint API リファレンスの[キャンペーンバージョン](https://docs.aws.amazon.com/pinpoint/latest/apireference/rest-api-campaign-version.html)

# Amazon Pinpoint のチャネルの更新
<a name="examples-pinpoint-update-channel"></a>

チャネルはメッセージを配信するプラットフォームのタイプを定義します。この例は、APN チャネルを使用してメッセージを送信する方法を示しています。

## チャネルの更新
<a name="update-a-channel"></a>

アプリ ID と更新するチャネルタイプのリクエストオブジェクトを指定して、Amazon Pinpoint のチャネルを有効にします。この例では、[APNSChannelRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/pinpoint/model/APNSChannelRequest.html) オブジェクトを要求する APN チャネルが更新されます。これらを [UpdateApnsChannelRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/pinpoint/model/UpdateApnsChannelRequest.html) に設定し、そのオブジェクトを AmazonPinpointClient の `updateApnsChannel` メソッドに渡します。

 **インポート** 

```
import com.amazonaws.services.pinpoint.AmazonPinpoint;
import com.amazonaws.services.pinpoint.AmazonPinpointClientBuilder;
import com.amazonaws.services.pinpoint.model.APNSChannelRequest;
import com.amazonaws.services.pinpoint.model.APNSChannelResponse;
import com.amazonaws.services.pinpoint.model.GetApnsChannelRequest;
import com.amazonaws.services.pinpoint.model.GetApnsChannelResult;
import com.amazonaws.services.pinpoint.model.UpdateApnsChannelRequest;
import com.amazonaws.services.pinpoint.model.UpdateApnsChannelResult;
```

 **Code** 

```
APNSChannelRequest request = new APNSChannelRequest()
		.withEnabled(enabled);

UpdateApnsChannelRequest updateRequest = new UpdateApnsChannelRequest()
		.withAPNSChannelRequest(request)
		.withApplicationId(appId);
UpdateApnsChannelResult result = client.updateApnsChannel(updateRequest);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/pinpoint/src/main/java/com/example/pinpoint/UpdateChannel.java) で完全な例をご覧ください。

## 詳細情報
<a name="more-information"></a>
+  Amazon Pinpoint ユーザーガイドの [Amazon Pinpoint チャネル](https://docs.aws.amazon.com/pinpoint/latest/userguide/channels.html)
+  Amazon Pinpoint API リファレンスの [ADM チャネル](https://docs.aws.amazon.com/pinpoint/latest/apireference/rest-api-adm-channel.html)
+  Amazon Pinpoint API リファレンスの [APN チャネル](https://docs.aws.amazon.com/pinpoint/latest/apireference/rest-api-apns-channel.html)
+  Amazon Pinpoint API リファレンスの [APN サンドボックスチャネル](https://docs.aws.amazon.com/pinpoint/latest/apireference/rest-api-apns-sandbox-channel.html)
+  Amazon Pinpoint API リファレンスの [APN VoIP チャネル](https://docs.aws.amazon.com/pinpoint/latest/apireference/rest-api-apns-voip-channel.html)
+  Amazon Pinpoint API リファレンスの [APNs VoIP サンドボックスチャネル](https://docs.aws.amazon.com/pinpoint/latest/apireference/rest-api-apns-voip-sandbox-channel.html)
+  Amazon Pinpoint API リファレンスの [Baidu チャネル](https://docs.aws.amazon.com/pinpoint/latest/apireference/rest-api-baidu-channel.html)
+  Amazon Pinpoint API リファレンスの [E メールチャネル](https://docs.aws.amazon.com/pinpoint/latest/apireference/rest-api-email-channel.html)
+  Amazon Pinpoint API リファレンスの [GCM チャネル](https://docs.aws.amazon.com/pinpoint/latest/apireference/rest-api-gcm-channel.html)
+  Amazon Pinpoint API リファレンスの [SMS チャネル](https://docs.aws.amazon.com/pinpoint/latest/apireference/rest-api-sms-channel.html)

# Amazon S3 を使用した例AWS SDK for Java
<a name="examples-s3"></a>

このセクションでは、[AWS SDK for Java](https://aws.amazon.com/sdk-for-java/) を使用して [Amazon S3](https://aws.amazon.com/s3/) をプログラムする例を示します。

**注記**  
例には各手法を示すのに必要なコードのみが含まれます。[完全なサンプルコードは GitHub で入手できます](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/java)。そこから、単一のソースファイルをダウンロードするかリポジトリをローカルにクローン作成して、ビルドし実行するためのすべての例を取得できます。

**Topics**
+ [Amazon S3 バケットの作成、一覧表示、削除](examples-s3-buckets.md)
+ [Amazon S3 オブジェクトに対する操作の実行](examples-s3-objects.md)
+ [バケットおよびオブジェクトの Amazon S3 アクセス許可の管理](examples-s3-access-permissions.md)
+ [バケットポリシーを使用した Amazon S3 バケットへのアクセス管理](examples-s3-bucket-policies.md)
+ [Amazon S3 操作の TransferManager の使用](examples-s3-transfermanager.md)
+ [ウェブサイトとしての Amazon S3 バケットの設定](examples-s3-website-configuration.md)
+ [Amazon S3 クライアント側の暗号化を使用する](examples-crypto.md)

# Amazon S3 バケットの作成、一覧表示、削除
<a name="examples-s3-buckets"></a>

Amazon S3 の各オブジェクト (ファイル) は、オブジェクトのコレクション (コンテナ) を表す*バケット*内に存在している必要があります。各バケットは*キー* (名前) で識別され、それは一意である必要があります。バケットおよびその設定についての詳細は、Amazon Simple Storage Service ユーザーガイドの [Amazon S3 バケットの使用](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html)を参照してください。

**注記**  
ベストプラクティス  
[ バケットで ](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlifecycle.html)AbortIncompleteMultipartUploadAmazon S3 ライフサイクルルールを有効にすることをお勧めします。  
このルールは、開始後、指定された日数内に完了しないマルチパートアップロードを中止するよう Amazon S3 に指示できます。設定した時間制限を超えると、Amazon S3 はアップロードを中止して、不完全なアップロードデータを削除します。  
詳細については、Amazon S3 ユーザーガイドの[バージョニングを使用したバケットのライフサイクル設定](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-configuration-bucket-with-versioning.html)を参照してください。

**注記**  
これらのコード例では、ユーザーが [AWS SDK for Java の使用](basics.md)の内容を理解し、[開発用の AWS 認証情報とリージョンのセットアップ](setup-credentials.md)の情報を使用してデフォルトの AWS 認証情報を設定していることを前提としています。

## バケットの作成
<a name="create-bucket"></a>

AmazonS3 クライアントの `createBucket` メソッドを使用します。新しい[バケットが](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/Bucket.html)返されます。`createBucket` メソッドでは、バケットが既に存在する場合、例外が発生します。

**注記**  
同じ名前のバケットを作成する前にバケットが既に存在するかどうかを確認するには、`doesBucketExist` メソッドを呼び出してください。バケットが存在する場合は `true` を返し、それ以外の場合は `false` を返します。

 **インポート** 

```
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.AmazonS3Exception;
import com.amazonaws.services.s3.model.Bucket;

import java.util.List;
```

 **Code** 

```
if (s3.doesBucketExistV2(bucket_name)) {
    System.out.format("Bucket %s already exists.\n", bucket_name);
    b = getBucket(bucket_name);
} else {
    try {
        b = s3.createBucket(bucket_name);
    } catch (AmazonS3Exception e) {
        System.err.println(e.getErrorMessage());
    }
}
return b;
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/CreateBucket.java) で完全な例をご覧ください。

## バケットの一覧表示
<a name="list-buckets"></a>

AmazonS3 クライアントの `listBucket` メソッドを使用します。成功すると、[バケット](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/Bucket.html)のリストが返されます。

 **インポート** 

```
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.Bucket;

import java.util.List;
```

 **Code** 

```
List<Bucket> buckets = s3.listBuckets();
System.out.println("Your {S3} buckets are:");
for (Bucket b : buckets) {
    System.out.println("* " + b.getName());
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/ListBuckets.java) で完全な例をご覧ください。

## バケットの削除
<a name="delete-bucket"></a>

Amazon S3 バケットを削除する前に、バケットが空であることを必ず確認してください。空になっていないとエラーが発生します。[バージョニングされたバケット](https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html)がある場合は、このバケットに関連付けられているすべてのバージョニングされたオブジェクトも削除する必要があります。

**注記**  
[完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/DeleteBucket.java)には、これらの各ステップが順に含まれており、Amazon S3 バケットとそのコンテンツを削除するための完全なソリューションを提供しています。

**Topics**
+ [バケットを削除する前にバージョニングされていないバケットからオブジェクトを削除する](#remove-objects-from-an-unversioned-bucket-before-deleting-it)
+ [バケットを削除する前にバージョニングされているバケットからオブジェクトを削除する](#remove-objects-from-a-versioned-bucket-before-deleting-it)
+ [空のバケットを削除する](#delete-an-empty-bucket)

### バケットを削除する前にバージョニングされていないバケットからオブジェクトを削除する
<a name="remove-objects-from-an-unversioned-bucket-before-deleting-it"></a>

AmazonS3 クライアントの `listObjects` メソッドを使用してオブジェクトのリストおよび `deleteObject` を取得し、それぞれを削除します。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

import java.util.Iterator;
```

 **Code** 

```
System.out.println(" - removing objects from bucket");
ObjectListing object_listing = s3.listObjects(bucket_name);
while (true) {
    for (Iterator<?> iterator =
         object_listing.getObjectSummaries().iterator();
         iterator.hasNext(); ) {
        S3ObjectSummary summary = (S3ObjectSummary) iterator.next();
        s3.deleteObject(bucket_name, summary.getKey());
    }

    // more object_listing to retrieve?
    if (object_listing.isTruncated()) {
        object_listing = s3.listNextBatchOfObjects(object_listing);
    } else {
        break;
    }
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/DeleteBucket.java) で完全な例をご覧ください。

### バケットを削除する前にバージョニングされているバケットからオブジェクトを削除する
<a name="remove-objects-from-a-versioned-bucket-before-deleting-it"></a>

[バージョニングされたバケット](https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html)を使用している場合は、バケットを削除する前に、バケットに保存されているすべてのバージョンのオブジェクトも削除する必要があります。

バケット内のオブジェクトを削除する際に使用したのと同じような方法で、バージョニングされたオブジェクトを削除します。まず、AmazonS3 クライアントの `listVersions` メソッドを使用してすべてのバージョニングされたオブジェクトを一覧表示し、次に `deleteVersion` を使用して各オブジェクトを削除します。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

import java.util.Iterator;
```

 **Code** 

```
System.out.println(" - removing versions from bucket");
VersionListing version_listing = s3.listVersions(
        new ListVersionsRequest().withBucketName(bucket_name));
while (true) {
    for (Iterator<?> iterator =
         version_listing.getVersionSummaries().iterator();
         iterator.hasNext(); ) {
        S3VersionSummary vs = (S3VersionSummary) iterator.next();
        s3.deleteVersion(
                bucket_name, vs.getKey(), vs.getVersionId());
    }

    if (version_listing.isTruncated()) {
        version_listing = s3.listNextBatchOfVersions(
                version_listing);
    } else {
        break;
    }
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/DeleteBucket.java) で完全な例をご覧ください。

### 空のバケットを削除する
<a name="delete-an-empty-bucket"></a>

バケットからオブジェクト (すべてのバージョニングされたオブジェクトを含む) を削除したら、AmazonS3 クライアントの `deleteBucket` メソッドを使用してバケット自体を削除できます。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

import java.util.Iterator;
```

 **Code** 

```
System.out.println(" OK, bucket ready to delete!");
s3.deleteBucket(bucket_name);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/DeleteBucket.java) で完全な例をご覧ください。

# Amazon S3 オブジェクトに対する操作の実行
<a name="examples-s3-objects"></a>

Amazon S3 オブジェクトは、*ファイル*またはデータの集合を表します。すべてのオブジェクトが[バケット](examples-s3-buckets.md)内にある必要があります。

**注記**  
これらのコード例では、ユーザーが [AWS SDK for Java の使用](basics.md)の内容を理解し、[開発用の AWS 認証情報とリージョンのセットアップ](setup-credentials.md)の情報を使用してデフォルトの AWS 認証情報を設定していることを前提としています。

**Topics**
+ [オブジェクトのアップロード](#upload-object)
+ [オブジェクトのリスト化](#list-objects)
+ [オブジェクトのダウンロード](#download-object)
+ [オブジェクトのコピー、移動、または名前の変更](#copy-object)
+ [オブジェクトの削除](#delete-object)
+ [複数オブジェクトの一括削除](#delete-objects)

## オブジェクトのアップロード
<a name="upload-object"></a>

AmazonS3 クライアントの `putObject` メソッドを使用して、バケット名、キー名、アップロードするファイルを指定します。*バケットが存在している必要があり、存在しない場合はエラーが発生します*。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
```

 **コード** 

```
System.out.format("Uploading %s to S3 bucket %s...\n", file_path, bucket_name);
final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
try {
    s3.putObject(bucket_name, key_name, new File(file_path));
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/PutObject.java) で完全な例をご覧ください。

## オブジェクトのリスト化
<a name="list-objects"></a>

バケット内のオブジェクトのリストを取得するには、AmazonS3 クライアントの `listObjects` メソッドを使用して、バケット名を指定します。

`listObjects` メソッドは、バケットのオブジェクトに関する情報を提供する [ObjectListing](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/ObjectListing.html) オブジェクトを返します。オブジェクト名 (キー) を一覧表示するには、`getObjectSummaries` メソッドを使用して、それぞれがバケット内の単一のオブジェクトを表す [S3ObjectSummary](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/S3ObjectSummary.html) オブジェクトのリストを取得し、 メソッドを呼び出してオブジェクト名を取得します。それから、`getKey` メソッドを呼び出してオブジェクト名を取得します。

 **インポート** 

```
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ListObjectsV2Result;
import com.amazonaws.services.s3.model.S3ObjectSummary;
```

 **コード** 

```
System.out.format("Objects in S3 bucket %s:\n", bucket_name);
final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
ListObjectsV2Result result = s3.listObjectsV2(bucket_name);
List<S3ObjectSummary> objects = result.getObjectSummaries();
for (S3ObjectSummary os : objects) {
    System.out.println("* " + os.getKey());
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/ListObjects.java) で完全な例をご覧ください。

## オブジェクトのダウンロード
<a name="download-object"></a>

AmazonS3 クライアントの `getObject` メソッドを使用して、ダウンロードするバケットの名前とオブジェクトを渡します。成功すると、このメソッドによって [S3Object](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/S3Object.html) が返されます。*指定されたバケットとオブジェクトキーが存在している必要があり、存在しない場合エラーが発生します*。

オブジェクトのコンテンツは、`getObjectContent` の `S3Object` を呼び出して取得できます。これにより、標準の Java `InputStream` オブジェクトとして動作する [S3ObjectInputStream](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/S3ObjectInputStream.html) が返されます。

次の例では、S3 からオブジェクトをダウンロードし、そのコンテンツをファイルに保存します (オブジェクトキーと同じ名前を使用)。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectInputStream;

import java.io.File;
```

 **コード** 

```
System.out.format("Downloading %s from S3 bucket %s...\n", key_name, bucket_name);
final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
try {
    S3Object o = s3.getObject(bucket_name, key_name);
    S3ObjectInputStream s3is = o.getObjectContent();
    FileOutputStream fos = new FileOutputStream(new File(key_name));
    byte[] read_buf = new byte[1024];
    int read_len = 0;
    while ((read_len = s3is.read(read_buf)) > 0) {
        fos.write(read_buf, 0, read_len);
    }
    s3is.close();
    fos.close();
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
} catch (FileNotFoundException e) {
    System.err.println(e.getMessage());
    System.exit(1);
} catch (IOException e) {
    System.err.println(e.getMessage());
    System.exit(1);
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/GetObject.java) で完全な例をご覧ください。

## オブジェクトのコピー、移動、または名前の変更
<a name="copy-object"></a>

AmazonS3 クライアントの `copyObject` メソッドを使用して、1 つのバケットから別のバケットへオブジェクトをコピーできます。コピー元のバケットの名前、コピーするオブジェクト、およびコピー先バケットの名前が継承されます。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
```

 **コード** 

```
try {
    s3.copyObject(from_bucket, object_key, to_bucket, object_key);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
System.out.println("Done!");
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/CopyObject.java) で完全な例をご覧ください。

**注記**  
`copyObject` を [deleteObject](#delete-object) とともに使用して、最初にオブジェクトを新しい名前でコピーし (コピー元とコピー先の両方に同じバケットの使用が可能)、元の場所からそのオブジェクトを削除することで、オブジェクトの**移動**または**名前変更**ができます。

## オブジェクトの削除
<a name="delete-object"></a>

AmazonS3 クライアントの `deleteObject` メソッドを使用して、削除するバケットの名前とオブジェクトを渡します。*指定されたバケットとオブジェクトキーが存在している必要があり、存在しない場合エラーが発生します*。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
```

 **コード** 

```
final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
try {
    s3.deleteObject(bucket_name, object_key);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/DeleteObject.java) で完全な例をご覧ください。

## 複数オブジェクトの一括削除
<a name="delete-objects"></a>

AmazonS3 クライアントの `deleteObjects` メソッドを使用すると、link:sdk-for-java/v1/reference/com/amazonaws/services/s3/model/DeleteObjectsRequest.html`` メソッドに名前を渡すことで、同じバケットから複数のオブジェクトを削除できます。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
```

 **コード** 

```
final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
try {
    DeleteObjectsRequest dor = new DeleteObjectsRequest(bucket_name)
            .withKeys(object_keys);
    s3.deleteObjects(dor);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/DeleteObjects.java) で完全な例をご覧ください。

# バケットおよびオブジェクトの Amazon S3 アクセス許可の管理
<a name="examples-s3-access-permissions"></a>

Amazon S3 バケットとオブジェクトのアクセスコントロールリスト (ACL) を使用して、Amazon S3 リソースをきめ細かく制御することができます。

**注記**  
これらのコード例では、ユーザーが [AWS SDK for Java の使用](basics.md)の内容を理解し、[開発用の AWS 認証情報とリージョンのセットアップ](setup-credentials.md)の情報を使用してデフォルトの AWS 認証情報を設定していることを前提としています。

## バケットのアクセスコントロールリストの取得
<a name="get-the-access-control-list-for-a-bucket"></a>

バケットの現在の ACL を取得するには、AmazonS3 の `getBucketAcl` メソッドを呼び出して、それにクエリを実行する*バケット名*を渡します。このメソッドは、[AccessControlList](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/AccessControlList.html) オブジェクトを返します。リスト内の各アクセス権を取得するには、その `getGrantsAsList` メソッドを呼び出します。これにより、[Grant](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/Grant.html) オブジェクトの標準 Java リストが返されます。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.AccessControlList;
import com.amazonaws.services.s3.model.Grant;
```

 **Code** 

```
final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
try {
    AccessControlList acl = s3.getBucketAcl(bucket_name);
    List<Grant> grants = acl.getGrantsAsList();
    for (Grant grant : grants) {
        System.out.format("  %s: %s\n", grant.getGrantee().getIdentifier(),
                grant.getPermission().toString());
    }
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/GetAcl.java) で完全な例をご覧ください。

## バケットのアクセスコントロールリストの設定
<a name="set-the-access-control-list-for-a-bucket"></a>

バケットの ACL に許可の追加や変更をするには、AmazonS3 の `setBucketAcl` メソッドを呼び出します。設定する被付与者やアクセスレベルのリストを含む [AccessControlList](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/AccessControlList.html) オブジェクトが使用されます。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.AccessControlList;
import com.amazonaws.services.s3.model.EmailAddressGrantee;
```

 **コード** 

```
final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
try {
    // get the current ACL
    AccessControlList acl = s3.getBucketAcl(bucket_name);
    // set access for the grantee
    EmailAddressGrantee grantee = new EmailAddressGrantee(email);
    Permission permission = Permission.valueOf(access);
    acl.grantPermission(grantee, permission);
    s3.setBucketAcl(bucket_name, acl);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
```

**注記**  
[Grantee](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/Grantee.html) クラスを使用して直接被付与者の一意の識別子を提供するか、ここで行ったように、[EmailAddressGrantee](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/EmailAddressGrantee.html) クラスを使用して被付与者を E メールで設定することができます。

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/SetAcl.java) で完全な例をご覧ください。

## オブジェクトのアクセスコントロールリストの取得
<a name="get-the-access-control-list-for-an-object"></a>

オブジェクトの現在の ACL を取得するには、AmazonS3 の `getObjectAcl` メソッドを呼び出して、それにクエリを実行する*バケット名*および*オブジェクト名*を渡します。`getBucketAcl` と同様に、このメソッドは各[権限](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/AccessControlList.html)を調べるのに使用できる [AccessControlList](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/Grant.html) オブジェクトを返します。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.AccessControlList;
import com.amazonaws.services.s3.model.Grant;
```

 **Code** 

```
try {
    AccessControlList acl = s3.getObjectAcl(bucket_name, object_key);
    List<Grant> grants = acl.getGrantsAsList();
    for (Grant grant : grants) {
        System.out.format("  %s: %s\n", grant.getGrantee().getIdentifier(),
                grant.getPermission().toString());
    }
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/GetAcl.java) で完全な例をご覧ください。

## オブジェクトのアクセスコントロールリストの設定
<a name="set-the-access-control-list-for-an-object"></a>

オブジェクトの ACL に許可の追加や変更をするには、AmazonS3 の `setObjectAcl` メソッドを呼び出します。設定する被付与者やアクセスレベルのリストを含む [AccessControlList](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/AccessControlList.html) オブジェクトが使用されます。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.AccessControlList;
import com.amazonaws.services.s3.model.EmailAddressGrantee;
```

 **コード** 

```
    try {
        // get the current ACL
        AccessControlList acl = s3.getObjectAcl(bucket_name, object_key);
        // set access for the grantee
        EmailAddressGrantee grantee = new EmailAddressGrantee(email);
        Permission permission = Permission.valueOf(access);
        acl.grantPermission(grantee, permission);
        s3.setObjectAcl(bucket_name, object_key, acl);
    } catch (AmazonServiceException e) {
        System.err.println(e.getErrorMessage());
        System.exit(1);
    }
}
```

**注記**  
[Grantee](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/Grantee.html) クラスを使用して直接被付与者の一意の識別子を提供するか、ここで行ったように、[EmailAddressGrantee](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/EmailAddressGrantee.html) クラスを使用して被付与者を E メールで設定することができます。

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/SetAcl.java) で完全な例をご覧ください。

## 詳細情報
<a name="more-information"></a>
+  Amazon S3 API リファレンスの [GET Bucket acl](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETacl.html)
+  Amazon S3 API リファレンスの [PUT Bucket acl](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTacl.html)
+  Amazon S3 API リファレンスの [GET Object acl](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGETacl.html)
+  Amazon S3 API リファレンスの [PUT Object acl](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUTacl.html)

# バケットポリシーを使用した Amazon S3 バケットへのアクセス管理
<a name="examples-s3-bucket-policies"></a>

*バケットポリシー*を設定、取得、または削除して、Amazon S3 バケットへのアクセスを管理できます。

## バケットポリシーの設定
<a name="set-s3-bucket-policy"></a>

特定の S3 バケットにバケットポリシーを設定するには。
+ AmazonS3 クライアントの `setBucketPolicy` を呼び出し、[SetBucketPolicyRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/SetBucketPolicyRequest.html) を渡します。
+ バケット名とポリシーテキスト (JSON 形式) を受け取る `setBucketPolicy` オーバーロードを使用して、直接ポリシーを設定します。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.policy.Policy;
import com.amazonaws.auth.policy.Principal;
```

 **コード** 

```
    s3.setBucketPolicy(bucket_name, policy_text);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
```

### Policy クラスを使用してポリシーを生成または検証する
<a name="use-s3-bucket-policy-class"></a>

バケットポリシーを `setBucketPolicy` に渡す場合、以下のことができます。
+ ポリシーを JSON 形式のテキスト文字列として直接指定できます。
+ [Policy](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/auth/policy/Policy.html) クラスを使用してポリシーを構築できます。

`Policy` クラスを使用することで、テキスト文字列を正しくフォーマットすることについて心配する必要はありません。`Policy` クラスから JSON ポリシーテキストを取得するには、その `toJson` メソッドを使用します。

 **インポート** 

```
import com.amazonaws.auth.policy.Resource;
import com.amazonaws.auth.policy.Statement;
import com.amazonaws.auth.policy.actions.S3Actions;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
```

 **コード** 

```
        new Statement(Statement.Effect.Allow)
                .withPrincipals(Principal.AllUsers)
                .withActions(S3Actions.GetObject)
                .withResources(new Resource(
                        "{region-arn}s3:::" + bucket_name + "/*")));
return bucket_policy.toJson();
```

`Policy` クラスは、渡された JSON 文字列を使用してポリシーの構築を試行できる `fromJson` メソッドも提供します。このメソッドは、確実にテキストが有効なポリシー構造へと変換できることを検証し、ポリシーテキストが無効な場合には `IllegalArgumentException` エラーとなります。

```
Policy bucket_policy = null;
try {
    bucket_policy = Policy.fromJson(file_text.toString());
} catch (IllegalArgumentException e) {
    System.out.format("Invalid policy text in file: \"%s\"",
            policy_file);
    System.out.println(e.getMessage());
}
```

この方法を使用して、ファイルやその他の手段から読み取るポリシーを事前に検証できます。

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/SetBucketPolicy.java) で完全な例をご覧ください。

## バケットポリシーの取得
<a name="get-s3-bucket-policy"></a>

Amazon S3 バケットのポリシーを取得するには、AmazonS3 クライアントの `getBucketPolicy` メソッドを呼び出し、それにポリシーの取得元であるバケットの名前を渡します。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
```

 **コード** 

```
  try {
      BucketPolicy bucket_policy = s3.getBucketPolicy(bucket_name);
      policy_text = bucket_policy.getPolicyText();
  } catch (AmazonServiceException e) {
      System.err.println(e.getErrorMessage());
      System.exit(1);
  }
```

その名前のバケットが存在しない場合、バケットへのアクセス権がない場合、またはバケットポリシーがない場合は、`AmazonServiceException` がスローされます。

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/GetBucketPolicy.java) で完全な例をご覧ください。

## バケットポリシーの削除
<a name="delete-s3-bucket-policy"></a>

バケットポリシーを削除するには、AmazonS3 クライアントの `deleteBucketPolicy` を呼び出して、それにバケット名を渡します。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
```

 **コード** 

```
  try {
      s3.deleteBucketPolicy(bucket_name);
  } catch (AmazonServiceException e) {
      System.err.println(e.getErrorMessage());
      System.exit(1);
  }
```

このメソッドは、バケットにまだポリシーがない場合でも成功します。指定した名前のバケットが存在していないか、バケットへのアクセス権がない場合は、`AmazonServiceException` がスローされます。

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/DeleteBucketPolicy.java) で完全な例をご覧ください。

## 詳細
<a name="more-info"></a>
+  Amazon Simple Storage Service ユーザーガイドの[アクセスポリシー言語の概要](https://docs.aws.amazon.com/AmazonS3/latest/dev/access-policy-language-overview.html)
+  Amazon Simple Storage Service ユーザーガイドの[バケットポリシーの例](https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html)

# Amazon S3 操作の TransferManager の使用
<a name="examples-s3-transfermanager"></a>

AWS SDK for Java TransferManager クラスを使用して、ローカル環境から Amazon S3へファイルを確実に転送し、S3 の複数の場所間でオブジェクトをコピーします。`TransferManager` は、転送の進行状況を取得し、アップロードとダウンロードの一時停止/再開を行うことができます。

**注記**  
ベストプラクティス  
[ バケットで ](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlifecycle.html)AbortIncompleteMultipartUploadAmazon S3 ライフサイクルルールを有効にすることをお勧めします。  
このルールは、開始後、指定された日数内に完了しないマルチパートアップロードを中止するよう Amazon S3 に指示できます。設定した時間制限を超えると、Amazon S3 はアップロードを中止して、不完全なアップロードデータを削除します。  
詳細については、Amazon S3 ユーザーガイドの[バージョニングを使用したバケットのライフサイクル設定](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-configuration-bucket-with-versioning.html)を参照してください。

**注記**  
これらのコード例では、ユーザーが [AWS SDK for Java の使用](basics.md)の内容を理解し、[開発用の AWS 認証情報とリージョンのセットアップ](setup-credentials.md)の情報を使用してデフォルトの AWS 認証情報を設定していることを前提としています。

## ファイルとディレクトリのアップロード
<a name="transfermanager-uploading"></a>

TransferManager は、[以前に作成した](examples-s3-buckets.md#create-bucket) Amazon S3 バケットのいずれに対してもファイル、ファイルリスト、ディレクトリをアップロードできます。

**Topics**
+ [1 つのファイルのアップロード](#transfermanager-upload-file)
+ [ファイルのリストのアップロード](#transfermanager-upload-file-list)
+ [ディレクトリのアップロード](#transfermanager-upload-directory)

### 1 つのファイルのアップロード
<a name="transfermanager-upload-file"></a>

TransferManager の `upload` メソッドを呼び出し、Amazon S3 バケット名、キー (オブジェクト) 名、アップロードするファイルを表す標準 Java [ファイル](https://docs.oracle.com/javase/8/docs/api/index.html?java/io/File.html)オブジェクトを指定します。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.s3.transfer.MultipleFileUpload;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.TransferManagerBuilder;
import com.amazonaws.services.s3.transfer.Upload;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
```

 **コード** 

```
File f = new File(file_path);
TransferManager xfer_mgr = TransferManagerBuilder.standard().build();
try {
    Upload xfer = xfer_mgr.upload(bucket_name, key_name, f);
    // loop with Transfer.isDone()
    XferMgrProgress.showTransferProgress(xfer);
    //  or block with Transfer.waitForCompletion()
    XferMgrProgress.waitForCompletion(xfer);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
xfer_mgr.shutdownNow();
```

`upload` メソッドは、*即座に*返され、転送の状態を確認する、または、転送が完了するまで待機するための `Upload` オブジェクトが提供されます。

`waitForCompletion` を使用して、転送が正常に完了した後に TransferManager の `shutdownNow` メソッドを呼び出すことの詳細については、[転送の完了の待機](#transfermanager-wait-for-completion)を参照してください。転送の完了を待ちながら、転送の状態や進行状況に関する更新情報をポーリングまたはリスンできます。詳細については、「[転送の状態と進行状況の取得](#transfermanager-get-status-and-progress)」を参照してください。

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/XferMgrUpload.java) で完全な例をご覧ください。

### ファイルのリストのアップロード
<a name="transfermanager-upload-file-list"></a>

複数のファイルを一括してアップロードするには、TransferManager`uploadFileList` メソッドを呼び出して、以下を指定します。
+ Amazon S3 バケット名
+ 作成したオブジェクトの名前の前に付加される*キープレフィックス* (オブジェクトを置くバケット内のパス)
+ ファイルパスの作成元の相対ディレクトリを表す[ファイル](https://docs.oracle.com/javase/8/docs/api/index.html?java/io/File.html)オブジェクト
+ [リスト](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/List.html)オブジェクト (アップロードする一連の[ファイル](https://docs.oracle.com/javase/8/docs/api/index.html?java/io/File.html)オブジェクトを含む)

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.s3.transfer.MultipleFileUpload;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.TransferManagerBuilder;
import com.amazonaws.services.s3.transfer.Upload;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
```

 **コード** 

```
ArrayList<File> files = new ArrayList<File>();
for (String path : file_paths) {
    files.add(new File(path));
}

TransferManager xfer_mgr = TransferManagerBuilder.standard().build();
try {
    MultipleFileUpload xfer = xfer_mgr.uploadFileList(bucket_name,
            key_prefix, new File("."), files);
    // loop with Transfer.isDone()
    XferMgrProgress.showTransferProgress(xfer);
    // or block with Transfer.waitForCompletion()
    XferMgrProgress.waitForCompletion(xfer);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
xfer_mgr.shutdownNow();
```

`waitForCompletion` を使用して、転送が正常に完了した後に TransferManager の `shutdownNow` メソッドを呼び出すことの詳細については、[転送の完了の待機](#transfermanager-wait-for-completion)を参照してください。転送の完了を待ちながら、転送の状態や進行状況に関する更新情報をポーリングまたはリスンできます。詳細については、「[転送の状態と進行状況の取得](#transfermanager-get-status-and-progress)」を参照してください。

`uploadFileList` から返される [MultipleFileUpload](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/MultipleFileUpload.html) オブジェクトを使用して、転送の状態や進行状況をクエリできます。詳細については、「[転送の現在の進行状況のポーリング](#transfermanager-get-progress-polling)」と「[ProgressListener による転送の進行状況の取得](#transfermanager-progress-listener)」を参照してください。

`MultipleFileUpload` の `getSubTransfers` メソッドを使用して、転送中の各ファイルについて個別の `Upload` オブジェクトを取得することもできます。詳細については、「[サブ転送の進行状況の取得](#transfermanager-get-subtransfer-progress)」を参照してください。

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/XferMgrUpload.java) で完全な例をご覧ください。

### ディレクトリのアップロード
<a name="transfermanager-upload-directory"></a>

TransferManager の `uploadDirectory` メソッドを使用して、ファイルのディレクトリ全体をアップロードし、オプションとしてファイルをサブディレクトリに再帰的にコピーできます。このメソッドに、Amazon S3 バケット名、S3 キープレフィックス、コピーするローカルディレクトリを表す [File](https://docs.oracle.com/javase/8/docs/api/index.html?java/io/File.html) オブジェクト、およびサブディレクトリに再帰的にコピーするかどうか (`boolean`true* または *false*) を示す * 値を渡します。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.s3.transfer.MultipleFileUpload;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.TransferManagerBuilder;
import com.amazonaws.services.s3.transfer.Upload;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
```

 **コード** 

```
TransferManager xfer_mgr = TransferManagerBuilder.standard().build();
try {
    MultipleFileUpload xfer = xfer_mgr.uploadDirectory(bucket_name,
            key_prefix, new File(dir_path), recursive);
    // loop with Transfer.isDone()
    XferMgrProgress.showTransferProgress(xfer);
    // or block with Transfer.waitForCompletion()
    XferMgrProgress.waitForCompletion(xfer);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
xfer_mgr.shutdownNow();
```

`waitForCompletion` を使用して、転送が正常に完了した後に TransferManager の `shutdownNow` メソッドを呼び出すことの詳細については、[転送の完了の待機](#transfermanager-wait-for-completion)を参照してください。転送の完了を待ちながら、転送の状態や進行状況に関する更新情報をポーリングまたはリスンできます。詳細については、「[転送の状態と進行状況の取得](#transfermanager-get-status-and-progress)」を参照してください。

`uploadFileList` から返される [MultipleFileUpload](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/MultipleFileUpload.html) オブジェクトを使用して、転送の状態や進行状況をクエリできます。詳細については、「[転送の現在の進行状況のポーリング](#transfermanager-get-progress-polling)」と「[ProgressListener による転送の進行状況の取得](#transfermanager-progress-listener)」を参照してください。

`MultipleFileUpload` の `getSubTransfers` メソッドを使用して、転送中の各ファイルについて個別の `Upload` オブジェクトを取得することもできます。詳細については、「[サブ転送の進行状況の取得](#transfermanager-get-subtransfer-progress)」を参照してください。

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/XferMgrUpload.java) で完全な例をご覧ください。

## ファイルまたはディレクトリのダウンロード
<a name="transfermanager-downloading"></a>

TransferManager クラスを使用して、1 つのファイル (Amazon S3 オブジェクト) またはディレクトリ (Amazon S3 バケット名とオブジェクトプレフィックス) を Amazon S3 からダウンロードできます。

**Topics**
+ [1 つのファイルのダウンロード](#transfermanager-download-file)
+ [ディレクトリのダウンロード](#tranfermanager-download-directory)

### 1 つのファイルのダウンロード
<a name="transfermanager-download-file"></a>

TransferManager の `download` メソッドを使用して、ダウンロードするオブジェクトが含まれている Amazon S3 バケット名、キー (オブジェクト) 名、およびローカルシステムで作成するファイルを表す[ファイル](https://docs.oracle.com/javase/8/docs/api/index.html?java/io/File.html)オブジェクトを渡します。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.s3.transfer.Download;
import com.amazonaws.services.s3.transfer.MultipleFileDownload;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.TransferManagerBuilder;

import java.io.File;
```

 **コード** 

```
File f = new File(file_path);
TransferManager xfer_mgr = TransferManagerBuilder.standard().build();
try {
    Download xfer = xfer_mgr.download(bucket_name, key_name, f);
    // loop with Transfer.isDone()
    XferMgrProgress.showTransferProgress(xfer);
    // or block with Transfer.waitForCompletion()
    XferMgrProgress.waitForCompletion(xfer);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
xfer_mgr.shutdownNow();
```

`waitForCompletion` を使用して、転送が正常に完了した後に TransferManager の `shutdownNow` メソッドを呼び出すことの詳細については、[転送の完了の待機](#transfermanager-wait-for-completion)を参照してください。転送の完了を待ちながら、転送の状態や進行状況に関する更新情報をポーリングまたはリスンできます。詳細については、「[転送の状態と進行状況の取得](#transfermanager-get-status-and-progress)」を参照してください。

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/XferMgrDownload.java) で完全な例をご覧ください。

### ディレクトリのダウンロード
<a name="tranfermanager-download-directory"></a>

同じキープレフィックス (ファイルシステムのディレクトリに相当) を共有するファイルのセットを Amazon S3 からダウンロードするには、TransferManager`downloadDirectory` メソッドを呼び出します。このメソッドに、ダウンロードするオブジェクトが含まれている Amazon S3 バケットの名前、すべてのオブジェクトに共有されているオブジェクトプレフィックス、およびローカルシステムにファイルをダウンロードする先のディレクトリを表す [ファイル](https://docs.oracle.com/javase/8/docs/api/index.html?java/io/File.html) オブジェクトを渡します。指定したディレクトリがまだない場合は、自動的に作成されます。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.s3.transfer.Download;
import com.amazonaws.services.s3.transfer.MultipleFileDownload;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.TransferManagerBuilder;

import java.io.File;
```

 **コード** 

```
TransferManager xfer_mgr = TransferManagerBuilder.standard().build();

try {
    MultipleFileDownload xfer = xfer_mgr.downloadDirectory(
            bucket_name, key_prefix, new File(dir_path));
    // loop with Transfer.isDone()
    XferMgrProgress.showTransferProgress(xfer);
    // or block with Transfer.waitForCompletion()
    XferMgrProgress.waitForCompletion(xfer);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
xfer_mgr.shutdownNow();
```

`waitForCompletion` を使用して、転送が正常に完了した後に TransferManager の `shutdownNow` メソッドを呼び出すことの詳細については、[転送の完了の待機](#transfermanager-wait-for-completion)を参照してください。転送の完了を待ちながら、転送の状態や進行状況に関する更新情報をポーリングまたはリスンできます。詳細については、「[転送の状態と進行状況の取得](#transfermanager-get-status-and-progress)」を参照してください。

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/XferMgrDownload.java) で完全な例をご覧ください。

## オブジェクトのコピー
<a name="transfermanager-copy-object"></a>

S3 バケット間でオブジェクトをコピーするには、TransferManager`copy` メソッドを使用します。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.s3.transfer.Copy;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.TransferManagerBuilder;
```

 **Code** 

```
System.out.println("Copying s3 object: " + from_key);
System.out.println("      from bucket: " + from_bucket);
System.out.println("     to s3 object: " + to_key);
System.out.println("        in bucket: " + to_bucket);

TransferManager xfer_mgr = TransferManagerBuilder.standard().build();
try {
    Copy xfer = xfer_mgr.copy(from_bucket, from_key, to_bucket, to_key);
    // loop with Transfer.isDone()
    XferMgrProgress.showTransferProgress(xfer);
    // or block with Transfer.waitForCompletion()
    XferMgrProgress.waitForCompletion(xfer);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
xfer_mgr.shutdownNow();
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/XferMgrCopy.java) で完全な例をご覧ください。

## 転送が完了するまで待つ
<a name="transfermanager-wait-for-completion"></a>

転送が完了するまでアプリケーション (またはスレッド) がブロックできる場合、[Transfer](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/Transfer.html) インターフェイスの `waitForCompletion` メソッドを使用して転送が完了するまでブロックします。ブロックしないと、例外が発生します。

```
try {
    xfer.waitForCompletion();
} catch (AmazonServiceException e) {
    System.err.println("Amazon service error: " + e.getMessage());
    System.exit(1);
} catch (AmazonClientException e) {
    System.err.println("Amazon client error: " + e.getMessage());
    System.exit(1);
} catch (InterruptedException e) {
    System.err.println("Transfer interrupted: " + e.getMessage());
    System.exit(1);
}
```

* を呼び出す*前に`waitForCompletion`イベントをポーリングする場合、別個のスレッドにポーリング機構を実装する場合、または [ProgressListener](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/event/ProgressListener.html) を使用して非同期的に進行状況の更新を受け取る場合は、転送の進行状況が取得されます。

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/XferMgrProgress.java) で完全な例をご覧ください。

## 転送の状態および進行状況の取得
<a name="transfermanager-get-status-and-progress"></a>

TransferManager`upload*`、`download*`、`copy` メソッドから返される各クラスは、1 つのファイルまたは複数のファイルの操作であるかどうかに応じて、以下のクラスのいずれかのインスタンスを返します。


**​**  

| Class | 返すクラス | 
| --- | --- | 
|   [Copy] (コピー](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/Copy.html)   |   `copy`   | 
|   [をダウンロードします](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/Download.html)。  |   `download`   | 
|   [MultipleFileDownload](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/MultipleFileDownload.html)   |   `downloadDirectory`   | 
|   [アップロード](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/Upload.html)   |   `upload`   | 
|   [MultipleFileUpload](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/MultipleFileUpload.html)   |   `uploadFileList`, `uploadDirectory`   | 

これらすべてのクラスは、[Transfer](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/Transfer.html) インターフェイスを実装します。`Transfer` は、転送の進行状況の取得や転送の一時停止/再開、および、転送の現在や最終ステータスを取得するのに役立つメソッドを提供します。

**Topics**
+ [転送の現在の進行状況のポーリング](#transfermanager-get-progress-polling)
+ [ProgressListener による転送の進行状況の取得](#transfermanager-progress-listener)
+ [サブ転送の進行状況の取得](#transfermanager-get-subtransfer-progress)

### 転送の現在の進行状況のポーリング
<a name="transfermanager-get-progress-polling"></a>

このループでは、転送の進行状況を出力し、実行時は現在の進行状況を確認し、完了時は最終の状態を出力します。

 **インポート** 

```
import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.event.ProgressEvent;
import com.amazonaws.event.ProgressListener;
import com.amazonaws.services.s3.transfer.*;
import com.amazonaws.services.s3.transfer.Transfer.TransferState;

import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
```

 **Code** 

```
// print the transfer's human-readable description
System.out.println(xfer.getDescription());
// print an empty progress bar...
printProgressBar(0.0);
// update the progress bar while the xfer is ongoing.
do {
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        return;
    }
    // Note: so_far and total aren't used, they're just for
    // documentation purposes.
    TransferProgress progress = xfer.getProgress();
    long so_far = progress.getBytesTransferred();
    long total = progress.getTotalBytesToTransfer();
    double pct = progress.getPercentTransferred();
    eraseProgressBar();
    printProgressBar(pct);
} while (xfer.isDone() == false);
// print the final state of the transfer.
TransferState xfer_state = xfer.getState();
System.out.println(": " + xfer_state);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/XferMgrProgress.java) で完全な例をご覧ください。

### ProgressListener による転送の進行状況の取得
<a name="transfermanager-progress-listener"></a>

[Transfer](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/Transfer.html) インターフェイスの `addProgressListener` メソッドを使用して、[ProgressListener](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/event/ProgressListener.html) を任意の転送にアタッチできます。

[ProgressListener](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/event/ProgressListener.html) は、メソッドとして `progressChanged` だけを必要とし、このメソッドに [ProgressEvent](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/event/ProgressEvent.html) オブジェクトを渡します。このオブジェクトでは、その `getBytes` メソッドを呼び出してオペレーションの総バイト数を取得できます。また、`getBytesTransferred` を呼び出してそれまでに転送されたバイト数を取得できます。

 **インポート** 

```
import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.event.ProgressEvent;
import com.amazonaws.event.ProgressListener;
import com.amazonaws.services.s3.transfer.*;
import com.amazonaws.services.s3.transfer.Transfer.TransferState;

import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
```

 **Code** 

```
File f = new File(file_path);
TransferManager xfer_mgr = TransferManagerBuilder.standard().build();
try {
    Upload u = xfer_mgr.upload(bucket_name, key_name, f);
    // print an empty progress bar...
    printProgressBar(0.0);
    u.addProgressListener(new ProgressListener() {
        public void progressChanged(ProgressEvent e) {
            double pct = e.getBytesTransferred() * 100.0 / e.getBytes();
            eraseProgressBar();
            printProgressBar(pct);
        }
    });
    // block with Transfer.waitForCompletion()
    XferMgrProgress.waitForCompletion(u);
    // print the final state of the transfer.
    TransferState xfer_state = u.getState();
    System.out.println(": " + xfer_state);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
xfer_mgr.shutdownNow();
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/XferMgrProgress.java) で完全な例をご覧ください。

### サブ転送の進行状況の取得
<a name="transfermanager-get-subtransfer-progress"></a>

[MultipleFileUpload](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/MultipleFileUpload.html) クラスは、その `getSubTransfers` メソッドを呼び出してサブ転送に関する情報を返すことができます。[アップロード](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/Upload.html)オブジェクトの変更不能な[コレクション](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Collection.html)を返して、サブ転送ごとの転送の状態と進行状況を提供します。

 **インポート** 

```
import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.event.ProgressEvent;
import com.amazonaws.event.ProgressListener;
import com.amazonaws.services.s3.transfer.*;
import com.amazonaws.services.s3.transfer.Transfer.TransferState;

import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
```

 **Code** 

```
Collection<? extends Upload> sub_xfers = new ArrayList<Upload>();
sub_xfers = multi_upload.getSubTransfers();

do {
    System.out.println("\nSubtransfer progress:\n");
    for (Upload u : sub_xfers) {
        System.out.println("  " + u.getDescription());
        if (u.isDone()) {
            TransferState xfer_state = u.getState();
            System.out.println("  " + xfer_state);
        } else {
            TransferProgress progress = u.getProgress();
            double pct = progress.getPercentTransferred();
            printProgressBar(pct);
            System.out.println();
        }
    }

    // wait a bit before the next update.
    try {
        Thread.sleep(200);
    } catch (InterruptedException e) {
        return;
    }
} while (multi_upload.isDone() == false);
// print the final state of the transfer.
TransferState xfer_state = multi_upload.getState();
System.out.println("\nMultipleFileUpload " + xfer_state);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/XferMgrProgress.java) で完全な例をご覧ください。

## 詳細
<a name="transfermanager-see-also"></a>
+  Amazon Simple Storage Service ユーザーガイドの[オブジェクトキー](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html)

# ウェブサイトとしての Amazon S3 バケットの設定
<a name="examples-s3-website-configuration"></a>

Amazon S3 バケットを、ウェブサイトのように機能させるよう設定できます。これを行うには、ウェブサイト設定をセットする必要があります。

**注記**  
これらのコード例では、ユーザーが [AWS SDK for Java の使用](basics.md)の内容を理解し、[開発用の AWS 認証情報とリージョンのセットアップ](setup-credentials.md)の情報を使用してデフォルトの AWS 認証情報を設定していることを前提としています。

## バケットのウェブサイト設定をセットする
<a name="set-a-bucket-s-website-configuration"></a>

Amazon S3 バケットのウェブサイト設定をセットするには、AmazonS3 の `setWebsiteConfiguration` メソッドを設定するバケット名で呼び出し、バケットのウェブサイト設定が含まれる [BucketWebsiteConfiguration](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/BucketWebsiteConfiguration.html) オブジェクトを呼び出します。

インデックスドキュメントの設定は*必要です*が、他のすべてのパラメータはオプションです。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.BucketWebsiteConfiguration;
```

 **コード** 

```
    String bucket_name, String index_doc, String error_doc) {
BucketWebsiteConfiguration website_config = null;

if (index_doc == null) {
    website_config = new BucketWebsiteConfiguration();
} else if (error_doc == null) {
    website_config = new BucketWebsiteConfiguration(index_doc);
} else {
    website_config = new BucketWebsiteConfiguration(index_doc, error_doc);
}

final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
try {
    s3.setBucketWebsiteConfiguration(bucket_name, website_config);
} catch (AmazonServiceException e) {
    System.out.format(
            "Failed to set website configuration for bucket '%s'!\n",
            bucket_name);
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
```

**注記**  
ウェブサイト設定をセットしても、バケットのアクセス権限は変更されません。ウェブ上でファイルが表示されるようにするには、バケットのファイルにパブリック読み取りアクセスを許可する*バケットポリシー*も設定する必要があります。詳細については、[バケットポリシーを使用した Amazon S3 バケットへのアクセス管理](examples-s3-bucket-policies.md)を参照してください。

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/SetWebsiteConfiguration.java) で完全な例をご覧ください。

## バケットのウェブサイト設定を取得する
<a name="get-a-bucket-s-website-configuration"></a>

Amazon S3 バケットのウェブサイト設定を取得するには、AmazonS3 の `getWebsiteConfiguration` メソッドを、設定を取得するバケットの名前で呼び出します。

この設定は [BucketWebsiteConfiguration](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/BucketWebsiteConfiguration.html) オブジェクトとして返されます。バケットのウェブサイト設定がない場合は、`null` が返されます。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.BucketWebsiteConfiguration;
```

 **Code** 

```
final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
try {
    BucketWebsiteConfiguration config =
            s3.getBucketWebsiteConfiguration(bucket_name);
    if (config == null) {
        System.out.println("No website configuration found!");
    } else {
        System.out.format("Index document: %s\n",
                config.getIndexDocumentSuffix());
        System.out.format("Error document: %s\n",
                config.getErrorDocument());
    }
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.out.println("Failed to get website configuration!");
    System.exit(1);
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/GetWebsiteConfiguration.java) で完全な例をご覧ください。

## バケットのウェブサイト設定を削除する
<a name="delete-a-bucket-s-website-configuration"></a>

Amazon S3 バケットのウェブサイト設定を削除するには、AmazonS3 の `deleteWebsiteConfiguration` メソッドを、設定を削除するバケットの名前で呼び出します。

 **インポート** 

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
```

 **Code** 

```
final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
try {
    s3.deleteBucketWebsiteConfiguration(bucket_name);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.out.println("Failed to delete website configuration!");
    System.exit(1);
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/DeleteWebsiteConfiguration.java) で完全な例をご覧ください。

## 詳細情報
<a name="more-information"></a>
+  Amazon S3 API リファレンスの [PUT Bucket ウェブサイト](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTwebsite.html)
+  Amazon S3 API リファレンスの [GET Bucket ウェブサイト](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETwebsite.html)
+  Amazon S3 API リファレンスの [DELETE Bucket ウェブサイト](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketDELETEwebsite.html)

# Amazon S3 クライアント側の暗号化を使用する
<a name="examples-crypto"></a>

Amazon S3 暗号化クライアントを使用したデータの暗号化は、Amazon S3 に保存された機密情報に保護レイヤーを追加するための 1 つの方法です。このセクションの例では、アプリケーションの Amazon S3 暗号化クライアントを作成および設定する方法を示しています。

暗号化を初めて使用する場合は、AWS KMS デベロッパーガイドの[暗号化の基礎](https://docs.aws.amazon.com/kms/latest/developerguide/crypto-intro.html)で暗号化の用語やアルゴリズムの基本的な概要を参照してください。AWS SDK 全体の暗号化のサポートの詳細については、「Amazon Web Services 全般のリファレンス」の「[AWS SDK Support for Amazon S3 Client-Side Encryption](https://docs.aws.amazon.com/general/latest/gr/aws_sdk_cryptography.html)」を参照してください。

**注記**  
これらのコード例では、ユーザーが [AWS SDK for Java の使用](basics.md)の内容を理解し、[開発用の AWS 認証情報とリージョンのセットアップ](setup-credentials.md)の情報を使用してデフォルトの AWS 認証情報を設定していることを前提としています。

AWS SDK for Java のバージョン 1.11.836 以前を使用している場合は、アプリケーションをそれ以降のバージョンに移行する方法について、「[Amazon S3 Encryption Client Migration](s3-encryption-migration.md)」を参照してください。移行できない場合は、GitHub で[この完全な例](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/S3Encrypt.java)を参照してください。

それ以外の場合であって、AWS SDK for Java のバージョン 1.11.837 以降を使用しているときは、以下にリストされているトピックの例を調べて、Amazon S3 クライアント側の暗号化を使用してください。

**Topics**
+ [Amazon S3クライアントマスターキーを使用した クライアント側の暗号化](examples-crypto-masterkey.md)
+ [AWS KMS マネージドキーを使用した Amazon S3 クライアント側の暗号化](examples-crypto-kms.md)

# Amazon S3クライアントマスターキーを使用した クライアント側の暗号化
<a name="examples-crypto-masterkey"></a>

次の例では、[AmazonS3EncryptionClientV2Builder](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/AmazonS3EncryptionClientV2Builder.html) クラスを使用して、クライアント側の暗号化が有効になった Amazon S3 クライアントを作成します。有効にすると、このクライアントを使用して Amazon S3 にアップロードするすべてのオブジェクトが暗号化されます。このクライアントを使用して Amazon S3 から取得したオブジェクトは、自動的に復号化されます。

**注記**  
次の例では、カスタマー管理のクライアントマスターキーを使用した Amazon S3 クライアント側の暗号化の使用方法を説明します。AWS KMS マネージドの暗号化キーを使用する方法については、「[Amazon S3 client-side encryption with AWS KMS managed keys](examples-crypto-kms.md)」を参照してください。

クライアント側の Amazon S3 暗号化を有効にする際に、厳格な認証済みまたは認証済みの 2 つの暗号化モードから選択できます。以下のセクションで、各タイプを有効にする方法を説明します。各モードで使用されるアルゴリズムについては、[CryptoMode](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/CryptoMode.html) の定義を参照してください。

## 必須のインポート
<a name="required-imports"></a>

これらの例では、次のクラスをインポートします。

 **インポート**。

```
import com.amazonaws.ClientConfiguration;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3EncryptionClientV2Builder;
import com.amazonaws.services.s3.AmazonS3EncryptionV2;
import com.amazonaws.services.s3.model.CryptoConfigurationV2;
import com.amazonaws.services.s3.model.CryptoMode;
import com.amazonaws.services.s3.model.EncryptionMaterials;
import com.amazonaws.services.s3.model.StaticEncryptionMaterialsProvider;
```

## 厳格な認証済み暗号化
<a name="strict-authenticated-encryption"></a>

厳密に認証された暗号化は、`CryptoMode` が指定されていない場合のデフォルトのモードです。

このモードを明示的に有効にするには、`StrictAuthenticatedEncryption` 値を `withCryptoConfiguration` メソッドに指定します。

**注記**  
クライアント側で認証済み暗号化を使用するには、最新の [Bouncy Castle jar](https://www.bouncycastle.org/download/bouncy-castle-java/) ファイルをアプリケーションのクラスパスに含める必要があります。

 **コード** 

```
AmazonS3EncryptionV2 s3Encryption = AmazonS3EncryptionClientV2Builder.standard()
         .withRegion(Regions.US_WEST_2)
         .withCryptoConfiguration(new CryptoConfigurationV2().withCryptoMode((CryptoMode.StrictAuthenticatedEncryption)))
         .withEncryptionMaterialsProvider(new StaticEncryptionMaterialsProvider(new EncryptionMaterials(secretKey)))
         .build();

s3Encryption.putObject(bucket_name, ENCRYPTED_KEY2, "This is the 2nd content to encrypt");
```

## 認証済み暗号化モード
<a name="authenticated-encryption-mode"></a>

`AuthenticatedEncryption` モードを使用すると、暗号化中に適用されるキーのラップアルゴリズムが強化されます。このモードで復号化するときは、アルゴリズムによって復号化されたオブジェクトの整合性が検証され、チェックが失敗した場合は例外がスローされます。認証済み暗号化の動作の詳細については、「[Amazon S3 Client-Side Authenticated Encryption](https://aws.amazon.com/blogs/developer/amazon-s3-client-side-authenticated-encryption)」というブログ記事を参照してください。

**注記**  
クライアント側で認証済み暗号化を使用するには、最新の [Bouncy Castle jar](https://www.bouncycastle.org/download/bouncy-castle-java/) ファイルをアプリケーションのクラスパスに含める必要があります。

このモードを有効にするには、`AuthenticatedEncryption` 値を `withCryptoConfiguration` メソッドに指定します。

 **コード** 

```
AmazonS3EncryptionV2 s3EncryptionClientV2 = AmazonS3EncryptionClientV2Builder.standard()
         .withRegion(Regions.DEFAULT_REGION)
         .withClientConfiguration(new ClientConfiguration())
         .withCryptoConfiguration(new CryptoConfigurationV2().withCryptoMode(CryptoMode.AuthenticatedEncryption))
         .withEncryptionMaterialsProvider(new StaticEncryptionMaterialsProvider(new EncryptionMaterials(secretKey)))
         .build();

s3EncryptionClientV2.putObject(bucket_name, ENCRYPTED_KEY1, "This is the 1st content to encrypt");
```

# AWS KMS マネージドキーを使用した Amazon S3 クライアント側の暗号化
<a name="examples-crypto-kms"></a>

次の例では、[AmazonS3EncryptionClientV2Builder](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/AmazonS3EncryptionClientV2Builder.html) クラスを使用して、クライアント側の暗号化が有効になった Amazon S3 クライアントを作成します。この設定を行うと、このクライアントを使用して Amazon S3 にアップロードするすべてのオブジェクトが暗号化されます。このクライアントを使用して Amazon S3 から取得したオブジェクトは、自動的に復号化されます。

**注記**  
次の例では、AWS KMS マネージドキーを使用した Amazon S3 クライアント側の暗号化の使用方法を説明します。独自の暗号化キーを使用する方法については、「[Amazon S3 client-side encryption with client master keys](examples-crypto-masterkey.md)」を参照してください。

クライアント側の Amazon S3 暗号化を有効にする際に、厳格な認証済みまたは認証済みの 2 つの暗号化モードから選択できます。以下のセクションで、各タイプを有効にする方法を説明します。各モードで使用されるアルゴリズムについては、[CryptoMode](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/CryptoMode.html) の定義を参照してください。

## 必須のインポート
<a name="required-imports"></a>

これらの例では、次のクラスをインポートします。

 **インポート**。

```
import com.amazonaws.ClientConfiguration;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.kms.AWSKMS;
import com.amazonaws.services.kms.AWSKMSClientBuilder;
import com.amazonaws.services.kms.model.GenerateDataKeyRequest;
import com.amazonaws.services.kms.model.GenerateDataKeyResult;
import com.amazonaws.services.s3.AmazonS3EncryptionClientV2Builder;
import com.amazonaws.services.s3.AmazonS3EncryptionV2;
import com.amazonaws.services.s3.model.CryptoConfigurationV2;
import com.amazonaws.services.s3.model.CryptoMode;
import com.amazonaws.services.s3.model.EncryptionMaterials;
import com.amazonaws.services.s3.model.KMSEncryptionMaterialsProvider;
```

## 厳格な認証済み暗号化
<a name="strict-authenticated-encryption-kms"></a>

厳密に認証された暗号化は、`CryptoMode` が指定されていない場合のデフォルトのモードです。

このモードを明示的に有効にするには、`StrictAuthenticatedEncryption` 値を `withCryptoConfiguration` メソッドに指定します。

**注記**  
クライアント側で認証済み暗号化を使用するには、最新の [Bouncy Castle jar](https://www.bouncycastle.org/download/bouncy-castle-java/) ファイルをアプリケーションのクラスパスに含める必要があります。

 **コード** 

```
AmazonS3EncryptionV2 s3Encryption = AmazonS3EncryptionClientV2Builder.standard()
         .withRegion(Regions.US_WEST_2)
         .withCryptoConfiguration(new CryptoConfigurationV2().withCryptoMode((CryptoMode.StrictAuthenticatedEncryption)))
         .withEncryptionMaterialsProvider(new KMSEncryptionMaterialsProvider(keyId))
         .build();

s3Encryption.putObject(bucket_name, ENCRYPTED_KEY3, "This is the 3rd content to encrypt with a key created in the {console}");
System.out.println(s3Encryption.getObjectAsString(bucket_name, ENCRYPTED_KEY3));
```

`putObject` 暗号化クライアントで Amazon S3 メソッドを呼び出して、オブジェクトをアップロードします。

 **コード** 

```
s3Encryption.putObject(bucket_name, ENCRYPTED_KEY3, "This is the 3rd content to encrypt with a key created in the {console}");
```

同じクライアントを使用してオブジェクトを取得できます。この例では、`getObjectAsString` メソッドを使用して保存された文字列を取得しています。

 **コード** 

```
System.out.println(s3Encryption.getObjectAsString(bucket_name, ENCRYPTED_KEY3));
```

## 認証済み暗号化モード
<a name="authenticated-encryption-kms"></a>

`AuthenticatedEncryption` モードを使用すると、暗号化中に適用されるキーのラップアルゴリズムが強化されます。このモードで復号化するときは、アルゴリズムによって復号化されたオブジェクトの整合性が検証され、チェックが失敗した場合は例外がスローされます。認証済み暗号化の動作の詳細については、「[Amazon S3 Client-Side Authenticated Encryption](https://aws.amazon.com/blogs/developer/amazon-s3-client-side-authenticated-encryption)」というブログ記事を参照してください。

**注記**  
クライアント側で認証済み暗号化を使用するには、最新の [Bouncy Castle jar](https://www.bouncycastle.org/download/bouncy-castle-java/) ファイルをアプリケーションのクラスパスに含める必要があります。

このモードを有効にするには、`AuthenticatedEncryption` 値を `withCryptoConfiguration` メソッドに指定します。

 **コード** 

```
AmazonS3EncryptionV2 s3Encryption = AmazonS3EncryptionClientV2Builder.standard()
         .withRegion(Regions.US_WEST_2)
         .withCryptoConfiguration(new CryptoConfigurationV2().withCryptoMode((CryptoMode.AuthenticatedEncryption)))
         .withEncryptionMaterialsProvider(new KMSEncryptionMaterialsProvider(keyId))
         .build();
```

## AWS KMS クライアントの設定
<a name="configure-kms"></a>

Amazon S3 暗号化クライアントは、明示的に指定されていない限り、デフォルトで AWS KMS クライアントを作成します。

この自動作成された AWS KMS クライアントのリージョンを設定するには、`awsKmsRegion` を設定します。

 **コード** 

```
Region kmsRegion = Region.getRegion(Regions.AP_NORTHEAST_1);

AmazonS3EncryptionV2 s3Encryption = AmazonS3EncryptionClientV2Builder.standard()
        .withRegion(Regions.US_WEST_2)
        .withCryptoConfiguration(new CryptoConfigurationV2().withAwsKmsRegion(kmsRegion))
        .withEncryptionMaterialsProvider(new KMSEncryptionMaterialsProvider(keyId))
        .build();
```

または、独自の AWS KMS クライアントを使用して暗号化クライアントを初期化することもできます。

 **コード** 

```
AWSKMS kmsClient = AWSKMSClientBuilder.standard()
        .withRegion(Regions.US_WEST_2);
        .build();

AmazonS3EncryptionV2 s3Encryption = AmazonS3EncryptionClientV2Builder.standard()
        .withRegion(Regions.US_WEST_2)
        .withKmsClient(kmsClient)
        .withCryptoConfiguration(new CryptoConfigurationV2().withCryptoMode((CryptoMode.AuthenticatedEncryption)))
        .withEncryptionMaterialsProvider(new KMSEncryptionMaterialsProvider(keyId))
        .build();
```

# Amazon SQS を使用した例AWS SDK for Java
<a name="examples-sqs"></a>

このセクションでは、[AWS SDK for Java](https://aws.amazon.com/sdk-for-java/) を使用して [Amazon SQS](https://aws.amazon.com/sqs/) をプログラムする例を示します。

**注記**  
例には各手法を示すのに必要なコードのみが含まれます。[完全なサンプルコードは GitHub で入手できます](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/java)。そこから、単一のソースファイルをダウンロードするかリポジトリをローカルにクローン作成して、ビルドし実行するためのすべての例を取得できます。

**Topics**
+ [Amazon SQS メッセージキューの使用](examples-sqs-message-queues.md)
+ [Amazon SQS メッセージの送信、受信、削除](examples-sqs-messages.md)
+ [Amazon SQS メッセージキューのロングポーリングの有効化](examples-sqs-long-polling.md)
+ [Amazon SQS で可視性タイムアウトを設定する](examples-sqs-visibility-timeout.md)
+ [Amazon SQS でのデッドレターキューの使用](examples-sqs-dead-letter-queues.md)

# Amazon SQS メッセージキューの使用
<a name="examples-sqs-message-queues"></a>

*メッセージキュー*は、Amazon SQS でメッセージを確実に送信するために使用する論理コンテナです。キューには、*標準*と*先入れ先出し* (FIFO) の 2 種類があります。キューおよびキュータイプ間の相違点の詳細については、「[Amazon SQS デベロッパーガイド](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/)」を参照してください。

このトピックでは、Amazon SQS を使用して AWS SDK for Java キューの URL の作成、一覧表示、削除、および取得を行う方法について説明します。

## キューの作成
<a name="sqs-create-queue"></a>

AmazonSQS クライアントの `createQueue` メソッドを使用し、キューのパラメータを記述する [CreateQueueRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/sqs/model/CreateQueueRequest.html) オブジェクトを渡します。

 **インポート** 

```
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
import com.amazonaws.services.sqs.model.AmazonSQSException;
import com.amazonaws.services.sqs.model.CreateQueueRequest;
```

 **コード** 

```
AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();
CreateQueueRequest create_request = new CreateQueueRequest(QUEUE_NAME)
        .addAttributesEntry("DelaySeconds", "60")
        .addAttributesEntry("MessageRetentionPeriod", "86400");

try {
    sqs.createQueue(create_request);
} catch (AmazonSQSException e) {
    if (!e.getErrorCode().equals("QueueAlreadyExists")) {
        throw e;
    }
}
```

キュー名だけを必要とする簡略化された形式の `createQueue` を使用して、標準キューを作成できます。

```
sqs.createQueue("MyQueue" + new Date().getTime());
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/sqs/src/main/java/aws/example/sqs/UsingQueues.java) で完全な例をご覧ください。

## キューの一覧表示
<a name="sqs-list-queues"></a>

アカウントの Amazon SQS キューを一覧表示するには、AmazonSQS クライアントの `listQueues` メソッドを呼び出します。

 **インポート** 

```
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
import com.amazonaws.services.sqs.model.ListQueuesResult;
```

 **コード** 

```
AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();
ListQueuesResult lq_result = sqs.listQueues();
System.out.println("Your SQS Queue URLs:");
for (String url : lq_result.getQueueUrls()) {
    System.out.println(url);
}
```

パラメータなしで `listQueues` オーバーロードを使用すると、*すべてのキュー*が返されます。返された結果は、`ListQueuesRequest` オブジェクトに渡すことでフィルタできます。

 **インポート** 

```
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
import com.amazonaws.services.sqs.model.ListQueuesRequest;
```

 **Code** 

```
AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();
String name_prefix = "Queue";
lq_result = sqs.listQueues(new ListQueuesRequest(name_prefix));
System.out.println("Queue URLs with prefix: " + name_prefix);
for (String url : lq_result.getQueueUrls()) {
    System.out.println(url);
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/sqs/src/main/java/aws/example/sqs/UsingQueues.java) で完全な例をご覧ください。

## キューの URL の取得
<a name="sqs-get-queue-url"></a>

AmazonSQS クライアントの `getQueueUrl` メソッドを呼び出します。

 **インポート** 

```
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
```

 **Code** 

```
AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();
String queue_url = sqs.getQueueUrl(QUEUE_NAME).getQueueUrl();
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/sqs/src/main/java/aws/example/sqs/UsingQueues.java) で完全な例をご覧ください。

## キューの削除
<a name="sqs-delete-queue"></a>

キューの [URL](#sqs-get-queue-url) を AmazonSQS クライアントの `deleteQueue` メソッドに渡します。

 **インポート** 

```
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
```

 **Code** 

```
AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();
sqs.deleteQueue(queue_url);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/sqs/src/main/java/aws/example/sqs/UsingQueues.java) で完全な例をご覧ください。

## 詳細
<a name="more-info"></a>
+  Amazon SQS デベロッパーガイドの [Amazon SQS キューの仕組み](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-how-it-works.html)
+  Amazon SQS API リファレンスの [CreateQueue](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_CreateQueue.html)
+  Amazon SQS API リファレンスの [GetQueueUrl](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_GetQueueUrl.html)
+  Amazon SQS API リファレンスの [ListQueues](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ListQueues.html)
+  Amazon SQS API リファレンスの [DeleteQueues](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_DeleteQueues.html)

# Amazon SQS メッセージの送信、受信、削除
<a name="examples-sqs-messages"></a>

このトピックでは、Amazon SQS メッセージを送信、受信、削除する方法について説明します。メッセージは、常に [SQS キュー](examples-sqs-message-queues.md)を使用して提供されます。

## メッセージの送信
<a name="sqs-message-send"></a>

Amazon SQS キューに 1 つのメッセージ追加するには、AmazonSQS クライアントの `sendMessage` メソッドを呼び出します。キューの [URL](examples-sqs-message-queues.md#sqs-get-queue-url)、メッセージ本文、およびオプションの遅延値 (秒単位) が含まれる [SendMessageRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/sqs/model/SendMessageRequest.html) オブジェクトを指定します。

 **インポート** 

```
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
import com.amazonaws.services.sqs.model.SendMessageRequest;
```

 **Code** 

```
SendMessageRequest send_msg_request = new SendMessageRequest()
        .withQueueUrl(queueUrl)
        .withMessageBody("hello world")
        .withDelaySeconds(5);
sqs.sendMessage(send_msg_request);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/sqs/src/main/java/aws/example/sqs/SendReceiveMessages.java) で完全な例をご覧ください。

### 一度に複数のメッセージを送信する
<a name="sqs-messages-send-multiple"></a>

複数のメッセージを 1 回のリクエストで送信できます。複数のメッセージを送信するには、AmazonSQS クライアントの `sendMessageBatch` メソッドを呼び出して、キュー URL と送信するメッセージのリスト (各メッセージが [SendMessageBatchRequestEntry](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/sqs/model/SendMessageBatchRequestEntry.html)) を含む [SendMessageBatchRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/sqs/model/SendMessageBatchRequest.html) を渡します。メッセージごとにオプションの遅延値を設定することもできます。

 **インポート** 

```
import com.amazonaws.services.sqs.model.SendMessageBatchRequest;
import com.amazonaws.services.sqs.model.SendMessageBatchRequestEntry;
```

 **Code** 

```
SendMessageBatchRequest send_batch_request = new SendMessageBatchRequest()
        .withQueueUrl(queueUrl)
        .withEntries(
                new SendMessageBatchRequestEntry(
                        "msg_1", "Hello from message 1"),
                new SendMessageBatchRequestEntry(
                        "msg_2", "Hello from message 2")
                        .withDelaySeconds(10));
sqs.sendMessageBatch(send_batch_request);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/sqs/src/main/java/aws/example/sqs/SendReceiveMessages.java) で完全な例をご覧ください。

## メッセージを受信する
<a name="sqs-messages-receive"></a>

キューに現在含まれているメッセージを取得するには、AmazonSQS クライアントの `receiveMessage` メソッドを呼び出して、キューの URL を渡します。メッセージは、[Message](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/sqs/model/Message.html) オブジェクトのリストとして返されます。

 **インポート** 

```
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
import com.amazonaws.services.sqs.model.AmazonSQSException;
import com.amazonaws.services.sqs.model.SendMessageBatchRequest;
```

 **コード** 

```
List<Message> messages = sqs.receiveMessage(queueUrl).getMessages();
```

## 受信後にメッセージを削除する
<a name="sqs-messages-delete"></a>

メッセージを受信し、その内容を処理した後で、メッセージをキューから削除するには、メッセージの受信ハンドルとキュー URL を AmazonSQS クライアントの `deleteMessage` メソッドに送信します。

 **Code** 

```
for (Message m : messages) {
    sqs.deleteMessage(queueUrl, m.getReceiptHandle());
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/sqs/src/main/java/aws/example/sqs/SendReceiveMessages.java) で完全な例をご覧ください。

## 詳細
<a name="more-info"></a>
+  Amazon SQS デベロッパーガイドの [Amazon SQS キューの仕組み](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-how-it-works.html)
+  Amazon SQS API リファレンスの [SendMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)
+  Amazon SQS API リファレンスの [SendMessageBatch](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessageBatch.html)
+  Amazon SQS API リファレンスの [ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html)
+  Amazon SQS API リファレンスの [DeleteMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_DeleteMessage.html)

# Amazon SQS メッセージキューのロングポーリングの有効化
<a name="examples-sqs-long-polling"></a>

 Amazon SQS はデフォルトで*ショートポーリング*を使用して、サーバーのサブセットだけに対して (重み付けされたランダムディストリビューションに基づいて) クエリを実行し、レスポンスに含めることができるメッセージがあるかどうかを調べます。

ロングポーリングは、Amazon SQS キューに送信された ReceiveMessage リクエストに応答して返信するメッセージがない場合に、偽の空のレスポンスを排除して空のレスポンスの数を減らすことで、Amazon SQS の使用コストを削減します。

**注記**  
*1～20 秒*でロングポーリング頻度を設定できます。

## キューの作成時にロングポーリングを有効化する
<a name="sqs-long-polling-create-queue"></a>

Amazon SQS キューを作成するときにロングポーリングを有効にするには、AmazonSQS クラスの `createQueue` メソッドを呼び出す前に [CreateQueueRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/sqs/model/CreateQueueRequest.html) オブジェクトの `ReceiveMessageWaitTimeSeconds` 属性を設定します。

 **インポート** 

```
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
import com.amazonaws.services.sqs.model.AmazonSQSException;
import com.amazonaws.services.sqs.model.CreateQueueRequest;
```

 **Code** 

```
final AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();

// Enable long polling when creating a queue
CreateQueueRequest create_request = new CreateQueueRequest()
        .withQueueName(queue_name)
        .addAttributesEntry("ReceiveMessageWaitTimeSeconds", "20");

try {
    sqs.createQueue(create_request);
} catch (AmazonSQSException e) {
    if (!e.getErrorCode().equals("QueueAlreadyExists")) {
        throw e;
    }
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/sqs/src/main/java/aws/example/sqs/LongPolling.java) で完全な例をご覧ください。

## 既存のキューでロングポーリングを有効にする
<a name="sqs-long-polling-existing-queue"></a>

キューを作成するときにロングポーリングを有効にすることに加えて、AmazonSQS クラスの `setQueueAttributes` メソッドを呼び出す前に、[SetQueueAttributesRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/sqs/model/SetQueueAttributesRequest.html) で `ReceiveMessageWaitTimeSeconds` を設定することで既存のキューでも有効にできます。

 **インポート** 

```
import com.amazonaws.services.sqs.model.SetQueueAttributesRequest;
```

 **Code** 

```
SetQueueAttributesRequest set_attrs_request = new SetQueueAttributesRequest()
        .withQueueUrl(queue_url)
        .addAttributesEntry("ReceiveMessageWaitTimeSeconds", "20");
sqs.setQueueAttributes(set_attrs_request);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/sqs/src/main/java/aws/example/sqs/LongPolling.java) で完全な例をご覧ください。

## メッセージ受信時のロングポーリングを有効にする
<a name="sqs-long-polling-receive-message"></a>

メッセージを受信した時にロングポーリングを有効にするには、AmazonSQS クラスの `receiveMessage` メソッドに提供する [ReceiveMessageRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/sqs/model/ReceiveMessageRequest.html) の待機時間を秒単位で設定します。

**注記**  
次のポーリングイベントの待機中に `receiveMessage` リクエストがタイムアウトしないように、AWS クライアントのリクエストのタイムアウトがロングポーリングの最大値 (20 秒) より長いことを確認します。

 **インポート** 

```
import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
```

 **Code** 

```
ReceiveMessageRequest receive_request = new ReceiveMessageRequest()
        .withQueueUrl(queue_url)
        .withWaitTimeSeconds(20);
sqs.receiveMessage(receive_request);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/sqs/src/main/java/aws/example/sqs/LongPolling.java) で完全な例をご覧ください。

## 詳細
<a name="more-info"></a>
+  Amazon SQS デベロッパーガイドの [Amazon SQS ロングポーリング](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-long-polling.html)
+  Amazon SQS API リファレンスの [CreateQueue](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_CreateQueue.html)
+  Amazon SQS API リファレンスの [ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html)
+  Amazon SQS API リファレンスの [SetQueueAttributes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html)

# Amazon SQS で可視性タイムアウトを設定する
<a name="examples-sqs-visibility-timeout"></a>

Amazon SQS でメッセージを受信すると、受信確認のために、削除されるまでキューに残ります。削除されなかった受信メッセージは、指定された*可視性タイムアウト*の後に以降のリクエストで使用でき、メッセージが処理および削除される前に複数回受信することを防ぎます。

**注記**  
[標準キュー](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/standard-queues.html)を使用している場合、可視性タイムアウトはメッセージを 2 回受信しない保証にはなりません。標準キューを使用している場合は、同じメッセージが複数回配信されるケースをコードが処理できることを確認してください。

## 単一のメッセージのメッセージ可視性タイムアウトを設定する
<a name="sqs-visibility-timeout-receipt"></a>

メッセージを受信したとき、渡したい [ChangeMessageVisibilityRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/sqs/model/ChangeMessageVisibilityRequest.html) の受信ハンドルを AmazonSQS クラスの `changeMessageVisibility` メソッドに渡すことで、可視性タイムアウトを変更することができます。

 **インポート** 

```
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
```

 **Code** 

```
AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();

// Get the receipt handle for the first message in the queue.
String receipt = sqs.receiveMessage(queue_url)
                    .getMessages()
                    .get(0)
                    .getReceiptHandle();

sqs.changeMessageVisibility(queue_url, receipt, timeout);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/sqs/src/main/java/aws/example/sqs/VisibilityTimeout.java) で完全な例をご覧ください。

## 複数のメッセージのメッセージ可視性タイムアウトを同時に設定する
<a name="setting-the-message-visibility-timeout-for-multiple-messages-at-once"></a>

複数のメッセージのメッセージ可視性タイムアウトを設定するには、それぞれに一意の ID 文字列と受信ハンドルを含む [ChangeMessageVisibilityBatchRequestEntry](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/sqs/model/ChangeMessageVisibilityBatchRequestEntry.html) オブジェクトのリストを作成します。次に、リストを Amazon SQS クライアントクラスの `changeMessageVisibilityBatch` メソッドに渡します。

 **インポート** 

```
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
import com.amazonaws.services.sqs.model.ChangeMessageVisibilityBatchRequestEntry;
import java.util.ArrayList;
import java.util.List;
```

 **Code** 

```
AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();

List<ChangeMessageVisibilityBatchRequestEntry> entries =
    new ArrayList<ChangeMessageVisibilityBatchRequestEntry>();

entries.add(new ChangeMessageVisibilityBatchRequestEntry(
            "unique_id_msg1",
            sqs.receiveMessage(queue_url)
               .getMessages()
               .get(0)
               .getReceiptHandle())
        .withVisibilityTimeout(timeout));

entries.add(new ChangeMessageVisibilityBatchRequestEntry(
            "unique_id_msg2",
            sqs.receiveMessage(queue_url)
               .getMessages()
               .get(0)
               .getReceiptHandle())
        .withVisibilityTimeout(timeout + 200));

sqs.changeMessageVisibilityBatch(queue_url, entries);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/sqs/src/main/java/aws/example/sqs/VisibilityTimeout.java) で完全な例をご覧ください。

## 詳細
<a name="more-info"></a>
+  Amazon SQS デベロッパーガイドの[可視性タイムアウト](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html)
+  Amazon SQS API リファレンスの [SetQueueAttributes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html)
+  Amazon SQS API リファレンスの [GetQueueAttributes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_GetQueueAttributes.html)
+  Amazon SQS API リファレンスの [ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html)
+  Amazon SQS API リファレンスの [ChangeMessageVisibility](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ChangeMessageVisibility.html)
+  Amazon SQS API リファレンスの [ChangeMessageVisibilityBatch](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ChangeMessageVisibilityBatch.html)

# Amazon SQS でのデッドレターキューの使用
<a name="examples-sqs-dead-letter-queues"></a>

 Amazon SQS では、*デッドレターキュー*がサポートされます。デッドレターキューは、正常に処理できないメッセージの送信先として他の (送信元) キューが使用できるキューです。これらのメッセージは、処理が成功しなかった理由を判断するためにデッドレターキューに分離できます。

## デッドレターキューの作成
<a name="sqs-dead-letter-queue-create-dl-queue"></a>

デッドレターキューは、通常のキューと同じ方法で作成されますが、次の制限があります。
+ デッドレターキューは、ソースキューと同じタイプのキュー (FIFO または標準) である必要があります。
+ デッドレターキューは、ソースキューと同じ AWS アカウント およびリージョンを使用して作成する必要があります。

ここで 2 つの同一の Amazon SQS キューを作成し、そのうちの 1 つがデッドレターキューとして機能します。

 **インポート** 

```
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
import com.amazonaws.services.sqs.model.AmazonSQSException;
```

 **Code** 

```
final AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();

// Create source queue
try {
    sqs.createQueue(src_queue_name);
} catch (AmazonSQSException e) {
    if (!e.getErrorCode().equals("QueueAlreadyExists")) {
        throw e;
    }
}

// Create dead-letter queue
try {
    sqs.createQueue(dl_queue_name);
} catch (AmazonSQSException e) {
    if (!e.getErrorCode().equals("QueueAlreadyExists")) {
        throw e;
    }
}
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/sqs/src/main/java/aws/example/sqs/DeadLetterQueues.java) で完全な例をご覧ください。

## ソースキューに対するデッドレターキューの指定
<a name="sqs-dead-letter-queue-set-redrive-policy"></a>

デッドレターキューを指定するには、まず*再処理ポリシー*を作成し、次にキューの属性でそのポリシーを設定します。再処理ポリシーは JSON で指定され、デッドレターキューの ARN、およびメッセージがデッドレターキューに送信される前に受信できて処理できない最大回数を指定します。

ソースキューに再処理ポリシーを設定するには、JSON 再処理ポリシーで `RedrivePolicy` 属性を設定した [SetQueueAttributesRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/sqs/model/SetQueueAttributesRequest.html) オブジェクトを使用して、AmazonSQS クラスの `setQueueAttributes` メソッドを呼び出します。

 **インポート** 

```
import com.amazonaws.services.sqs.model.GetQueueAttributesRequest;
import com.amazonaws.services.sqs.model.GetQueueAttributesResult;
import com.amazonaws.services.sqs.model.SetQueueAttributesRequest;
```

 **Code** 

```
String dl_queue_url = sqs.getQueueUrl(dl_queue_name)
                         .getQueueUrl();

GetQueueAttributesResult queue_attrs = sqs.getQueueAttributes(
        new GetQueueAttributesRequest(dl_queue_url)
            .withAttributeNames("QueueArn"));

String dl_queue_arn = queue_attrs.getAttributes().get("QueueArn");

// Set dead letter queue with redrive policy on source queue.
String src_queue_url = sqs.getQueueUrl(src_queue_name)
                          .getQueueUrl();

SetQueueAttributesRequest request = new SetQueueAttributesRequest()
        .withQueueUrl(src_queue_url)
        .addAttributesEntry("RedrivePolicy",
                "{\"maxReceiveCount\":\"5\", \"deadLetterTargetArn\":\""
                + dl_queue_arn + "\"}");

sqs.setQueueAttributes(request);
```

[GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/sqs/src/main/java/aws/example/sqs/DeadLetterQueues.java) で完全な例をご覧ください。

## 詳細
<a name="more-info"></a>
+  Amazon SQS デベロッパーガイドでの [Amazon SQSデッドレターキューの使用](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html)
+  Amazon SQS API リファレンスの [SetQueueAttributes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html)

# Amazon SWF を使用した例AWS SDK for Java
<a name="prog-services-swf"></a>

 [Amazon SWF](https://aws.amazon.com/swf/) は、アクティビティ、子ワークフロー、または [Lambda](https://aws.amazon.com/lambda/) タスクで構成される並列またはシーケンシャルステップを持つことができる分散ワークフローをデベロッパーが構築およびスケールできるようにする、ワークフロー管理サービスです。

AWS SDK for Java を使用して Amazon SWF を操作する方法は 2 つあります。SWF *クライアント*オブジェクトを使用する方法と、AWS Flow Framework for Java を使用する方法です。AWS Flow Framework for Java は注釈を多用し、AspectJ や Spring Framework などの追加のライブラリに依存するため、初期設定がより難しくなります。ただし、大量または複雑なプロジェクトでは、AWS Flow Framework for Java を使用すると時間を節約できます。詳細については、「[AWS Flow Framework for Java デベロッパーガイド](https://docs.aws.amazon.com/amazonswf/latest/awsflowguide/)」を参照してください。

このセクションでは、Amazon SWF クライアントを直接使用することにより、AWS SDK for Java をプログラミングする例を示します。

**Topics**
+ [SWF の基本](swf-basics.md)
+ [シンプルな Amazon SWF アプリケーションの構築](swf-hello.md)
+ [Lambda タスク](swf-lambda-task.md)
+ [アクティビティおよびワークフローワーカーの適切なシャットダウン](swf-graceful-shutdown.md)
+ [ドメインの登録](prog-services-swf-register-domain.md)
+ [ドメインの一覧表示](prog-services-swf-list-domains.md)

# SWF の基本
<a name="swf-basics"></a>

以下は、Amazon SWF を使用して AWS SDK for Java を操作する一般的なパターンです。主に参照用です。より詳細な入門チュートリアルについては、[シンプルな Amazon SWF アプリケーションの構築](swf-hello.md)を参照してください。

## 依存関係
<a name="dependencies"></a>

基本的な Amazon SWF アプリケーションでは、次の依存関係が必要です (AWS SDK for Java に含まれています)。
+ aws-java-sdk-1.12.\$1.jar
+ commons-logging-1.2.\$1.jar
+ httpclient-4.3.\$1.jar
+ httpcore-4.3.\$1.jar
+ jackson-annotations-2.12.\$1.jar
+ jackson-core-2.12.\$1.jar
+ jackson-databind-2.12.\$1.jar
+ joda-time-2.8.\$1.jar

**注記**  
これらのパッケージのバージョン番号はお手持ちの SDK のバージョンによって異なりますが、SDK で提供するバージョンは互換性についてテスト済みで、使用するバージョンです。

 AWS Flow Framework for Java アプリケーションでは、追加のセットアップ*および*追加の依存関係が必要です。フレームワークの使用の詳細については、「[AWS Flow Framework for Java デベロッパーガイド](https://docs.aws.amazon.com/amazonswf/latest/awsflowguide/)」を参照してください。

## インポート
<a name="imports"></a>

一般的に、コード開発には次のインポートを使用できます。

```
import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClientBuilder;
import com.amazonaws.services.simpleworkflow.model.*;
```

ただし、必要なクラスのみをインポートすることをお勧めします。`com.amazonaws.services.simpleworkflow.model` ワークスペースで、特定のクラスを指定することになる可能性があります。

```
import com.amazonaws.services.simpleworkflow.model.PollForActivityTaskRequest;
import com.amazonaws.services.simpleworkflow.model.RespondActivityTaskCompletedRequest;
import com.amazonaws.services.simpleworkflow.model.RespondActivityTaskFailedRequest;
import com.amazonaws.services.simpleworkflow.model.TaskList;
```

AWS Flow Framework for Java を使用している場合は、`com.amazonaws.services.simpleworkflow.flow` ワークスペースからクラスをインポートします。例:

```
import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow;
import com.amazonaws.services.simpleworkflow.flow.ActivityWorker;
```

**注記**  
AWS Flow Framework for Java には、AWS SDK for Java の基本的な要件に加えて追加の要件があります。詳細については、「[AWS Flow Framework for Java デベロッパーガイド](https://docs.aws.amazon.com/amazonswf/latest/awsflowguide/)」を参照してください。

## SWF クライアントクラスの使用
<a name="using-the-swf-client-class"></a>

Amazon SWF の基本的なインターフェイスは、[AmazonSimpleWorkflowClient](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/AmazonSimpleWorkflowClient.html) または [AmazonSimpleWorkflowAsyncClient](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/AmazonSimpleWorkflowAsyncClient.html) クラスを通じて提供されます。これらの主な違いは、`\*AsyncClient` クラスは同時 (非同期) プログラミング用に [Future](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/concurrent/Future.html) オブジェクトを返すことです。

```
AmazonSimpleWorkflowClient swf = AmazonSimpleWorkflowClientBuilder.defaultClient();
```

# シンプルな Amazon SWF アプリケーションの構築
<a name="swf-hello"></a>

このトピックでは、AWS SDK for Java を使用した [Amazon SWF](https://aws.amazon.com/swf/) アプリケーションのプログラミングについて、重要な概念を示しながら説明します。

## 例について
<a name="about-the-example"></a>

例のプロジェクトでは、AWS クラウドを通じて渡されるワークフローデータを受け入れる 1 つのアクティビティでワークフローを作成し (HelloWorld では、いつものように、あいさつする相手の名前になります)、応答であいさつを出力します。

これは表面的には非常に単純に見えますが、Amazon SWF アプリケーションは連携して動作する数多くの部分で構成されます。
+ ワークフロー実行データの論理コンテナとして使用される**ドメイン**。
+ ワークフローのアクティビティと子ワークフローの実行の論理的順序を定義するコードコンポーネントを表す 1 つ以上の**ワークフロー**。
+ 決定タスクをポーリングし、それに応じてアクティビティまたは子ワークフローをスケジュールする**ワークフローワーカー** (*ディサイダーとも呼ばれる*)。
+ それぞれがワークフローのワークの単位を表す、1 つ以上の**アクティビティ**。
+ アクティビティタスクをポーリングし、それに応じてアクティビティメソッドを実行する**アクティビティワーカー**。
+ ワークフローとアクティビティワーカーにリクエストを発行するために使用される ** によって管理されるキューである、1 つ以上の**タスクリストAmazon SWF。ワークフローワーカーを想定したタスクリスト内のタスクは、*決定タスク*と呼ばれます。アクティビティワーカーを想定したものは、*アクティビティタスク*と呼ばれます。
+ ワークフローの実行を開始する**ワークフロースターター**。

バックグラウンドでは、Amazon SWF がこれらのコンポーネントの操作を調整して、AWS クラウドからのフローの連携、それらの間のデータの受け渡し、タイムアウトとハートビート通知の処理、およびワークフロー実行履歴のログ記録を行います。

## 前提条件
<a name="prerequisitesswf"></a>

### デベロッパー環境
<a name="development-environment"></a>

このチュートリアルで使用する開発環境は、以下で構成されます。
+  [AWS SDK for Java](https://aws.amazon.com/sdk-for-java/)。
+  [Apache Maven](http://maven.apache.org/) (3.3.1)。
+ JDK 1.7 以降。このチュートリアルは JDK 1.8.0 を使用して開発され、テスト済みです。
+ 適切な Java テキストエディター (任意の選択)。

**注記**  
Maven とは異なるビルドシステムを使用する場合、環境に適したステップを使用してプロジェクトを作成し、ここに示されている概念を使用して作業を行うことができます。さまざまな構築システムでの AWS SDK for Java の設定と使用の詳細は、「[はじめに](getting-started.md)」で示されています。  
同様に (より多くの努力が必要ですが)、ここに示すステップは、Amazon SWF をサポートしている任意の AWS SDK を使用して実装できます。

すべての必要な外部依存関係は AWS SDK for Java に含まれているため、追加でダウンロードするものはありません。

### AWS アクセス
<a name="aws-access"></a>

このチュートリアルを正常に進めるには、このガイドの[基本設定セクションで説明されている](signup-create-iam-user.md#signup-create-iam-user-overview) AWS アクセスポータルにアクセスできる必要があります。

手順には、ローカル共有 `credentials` ファイルにコピーして貼り付ける一時的な認証情報にアクセスする方法が記載されています。貼り付ける一時的な認証情報は、Amazon SWF へのアクセス権限を持つ IAM ロールに AWS IAM アイデンティティセンター で関連付けられている必要があります。一時的な認証情報を貼り付けると、`credentials` ファイルは次のようになります。

```
[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
aws_session_token=IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZVERYLONGSTRINGEXAMPLE
```

これらの一時的な認証情報は、`default` プロファイルに関連付けられます。

## SWF プロジェクトの作成
<a name="create-a-swf-project"></a>

1. Maven での新しいプロジェクトの開始

   ```
   mvn archetype:generate -DartifactId=helloswf \
   -DgroupId=aws.example.helloswf -DinteractiveMode=false
   ```

   これにより、標準の Maven プロジェクト構造を持つ新しいプロジェクトが作成されます。

   ```
   helloswf
   ├── pom.xml
   └── src
       ├── main
       │   └── java
       │       └── aws
       │           └── example
       │               └── helloswf
       │                   └── App.java
       └── test
           └── ...
   ```

   `test` ディレクトリとそれに含まれるすべては、このチュートリアルでは使用しないため、無視または削除できます。また、新しいクラスに置き換えるため、`App.java` も削除できます。

1. `<dependencies>` ブロック内で依存関係を追加することで、プロジェクトの `pom.xml` ファイルを編集して **aws-java-sdk-simpleworkflow** モジュールを追加します。

   ```
   <dependencies>
     <dependency>
       <groupId>com.amazonaws</groupId>
       <artifactId>aws-java-sdk-simpleworkflow</artifactId>
       <version>1.11.1000</version>
     </dependency>
   </dependencies>
   ```

1.  *Maven によって JDK 1.7 以降のサポートがあるプロジェクトが構築されることを確認します*。プロジェクトの `<dependencies>` に以下を追加します (`pom.xml` ブロックの前または後)。

   ```
   <build>
     <plugins>
       <plugin>
         <artifactId>maven-compiler-plugin</artifactId>
         <version>3.6.1</version>
         <configuration>
             <source>1.8</source>
             <target>1.8</target>
         </configuration>
       </plugin>
     </plugins>
   </build>
   ```

## プロジェクトのコーディング
<a name="code-the-project"></a>

サンプルプロジェクトは 4 つの個別のアプリケーションで構成されます。それらについて 1 つずつ説明します。
+  **HelloTypes.java**--プロジェクトのドメイン、アクティビティ、およびワークフロータイプデータが含まれ、他のコンポーネントと共有されます。また、SWF でのこれらのタイプの登録も処理されます。
+  **ActivityWorker.java**--アクティビティタスクをポーリングし、それに応じてアクティビティを実行するアクティビティワーカーを含みます。
+  **WorkflowWorker.java**--決定タスクをポーリングし、新しいアクティビティをスケジュールするワークフローワーカー (ディサイダー) を含みます。
+  **WorkflowStarter.java**--新しいワークフローの実行を開始するワークフロースターターを含みます。ワークフロースターターにより、SWF はワーカーが使用する決定とワークフロータスクを生成します。

### すべてのソースファイルに共通のステップ
<a name="swf-hello-common"></a>

Java クラスを格納するために作成するすべてのファイルには、いくつか共通の事柄があります。時間を節約するため、これらのステップは*プロジェクトに新しいファイルを追加するたびに暗黙的に示されます*。

1. プロジェクトの `src/main/java/aws/example/helloswf/` ディレクトリでファイルを作成します。

1. 各ファイルの先頭に `package` 宣言を追加して名前空間を宣言します。サンプルプロジェクトでは以下を使用します。

   ```
   package aws.example.helloswf;
   ```

1. [AmazonSimpleWorkflowClient](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/AmazonSimpleWorkflowClient.html) クラスおよび `com.amazonaws.services.simpleworkflow.model` 名前空間内の複数のクラスの `import` 宣言を追加します。作業を簡素化するため、以下を使用します。

   ```
   import com.amazonaws.regions.Regions;
   import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow;
   import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClientBuilder;
   import com.amazonaws.services.simpleworkflow.model.*;
   ```

### ドメイン、ワークフロー、およびアクティビティタイプの登録
<a name="swf-hello-hellotypes"></a>

最初に、新しい実行可能クラス `HelloTypes.java` を作成します。このファイルには、ワークフローの各部分必要となる共有データ (アクティビティとワークフロータイプの名前とバージョン、ドメイン名、タスクリスト名など) が含まれます。

1. テキストエディターを開き、ファイル `HelloTypes.java` を作成して、[共通のステップ](#swf-hello-common)に従ってパッケージ宣言とインポートを追加します。

1. `HelloTypes` クラスを宣言し、登録されたアクティビティとワークフロータイプで使用する値を指定します。

   ```
       public static final String DOMAIN = "HelloDomain";
       public static final String TASKLIST = "HelloTasklist";
       public static final String WORKFLOW = "HelloWorkflow";
       public static final String WORKFLOW_VERSION = "1.0";
       public static final String ACTIVITY = "HelloActivity";
       public static final String ACTIVITY_VERSION = "1.0";
   ```

   これらの値は、コード全体で使用されます。

1. 文字列を宣言したら、[AmazonSimpleWorkflowClient](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/AmazonSimpleWorkflowClient.html) クラスのインスタンスを作成します。これは、Amazon SWF で提供される AWS SDK for Java メソッドの基本インタフェースです。

   ```
   private static final AmazonSimpleWorkflow swf =
       AmazonSimpleWorkflowClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
   ```

   前述のスニペットでは、一時的な認証情報が `default` プロファイルに関連付けられていることを前提としています。別のプロファイルを使用する場合は、上記のコードを次のように変更し、*profile\$1name* を実際のプロファイル名の名前に置き換えてください。

   ```
   private static final AmazonSimpleWorkflow swf =
           AmazonSimpleWorkflowClientBuilder
                   .standard()
                   .withCredentials(new ProfileCredentialsProvider("profile_name"))
                   .withRegion(Regions.DEFAULT_REGION)
                   .build();
   ```

1. SWF ドメインを登録するための新しい関数を追加します。*ドメイン*は、数多くの関連 SWF アクティビティおよびワークフロータイプ用の論理コンテナです。SWF コンポーネントは、同じドメイン内に存在する場合にのみ相互に通信できます。

   ```
       try {
           System.out.println("** Registering the domain '" + DOMAIN + "'.");
           swf.registerDomain(new RegisterDomainRequest()
               .withName(DOMAIN)
               .withWorkflowExecutionRetentionPeriodInDays("1"));
       } catch (DomainAlreadyExistsException e) {
           System.out.println("** Domain already exists!");
       }
   ```

   ドメインを登録する場合、*名前* (`:`、`/`、`|` を除く 1～256 文字、制御文字、またはリテラル文字列「arn」の任意のセット) と*保持期間*を指定します。保持期間は、ワークフローの実行が完了してから Amazon SWF がワークフローの実行履歴データを保持する日数です。ワークフロー実行の最大保持期間は 90 日です。詳細については、「[RegisterDomainRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/RegisterDomainRequest.html)」を参照してください。

   その名前のドメインがすでに存在する場合、[DomainAlreadyExistsException](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/DomainAlreadyExistsException.html) が発生します。ドメインがすでに作成されているかどうかは問題ではないため、この例外は無視できます。
**注記**  
このコードは、AWS SDK for Java のメソッドを使用する場合の一般的なパターン、`simpleworkflow.model` 名前空間のクラスで提供されるメソッドのデータを示します。これは、チェーン可能な `0with*` メソッドを使用してインスタンス化および入力します。

1. 新しいアクティビティタイプを登録する関数を追加します。*アクティビティ*はワークフローのワークの単位を表します。

   ```
       try {
           System.out.println("** Registering the activity type '" + ACTIVITY +
               "-" + ACTIVITY_VERSION + "'.");
           swf.registerActivityType(new RegisterActivityTypeRequest()
               .withDomain(DOMAIN)
               .withName(ACTIVITY)
               .withVersion(ACTIVITY_VERSION)
               .withDefaultTaskList(new TaskList().withName(TASKLIST))
               .withDefaultTaskScheduleToStartTimeout("30")
               .withDefaultTaskStartToCloseTimeout("600")
               .withDefaultTaskScheduleToCloseTimeout("630")
               .withDefaultTaskHeartbeatTimeout("10"));
       } catch (TypeAlreadyExistsException e) {
           System.out.println("** Activity type already exists!");
       }
   ```

   アクティビティタイプは*名前*および*バージョン*によって識別されます。これらは、登録されているドメインでこのアクティビティを他のアクティビティから一意に識別するために使用されます。アクティビティには、SWF からタスクとデータを受け取るために使用されるデフォルトのタスクリスト、アクティビティ実行の各部分にかかる時間に対する制約適用に使用できるさまざまなタイムアウトなど、数多くのオプションパラメーターも含まれます。詳細については、「[RegisterActivityTypeRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/RegisterActivityTypeRequest.html)」を参照してください。
**注記**  
すべてタイムアウト値は*秒単位*で指定されます。タイムアウトのワークフローの実行への影響の詳細については、「[Amazon SWF Timeout Types](https://docs.aws.amazon.com/amazonswf/latest/developerguide/swf-timeout-types.html)」を参照してください。

登録しようとしているアクティビティタイプが既に存在する場合は、[TypeAlreadyExistsException](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/TypeAlreadyExistsException.html) が発生します。新しいワークフロータイプを登録する関数を追加します。*ワークフロー*は*ディサイダー*とも呼ばれ、ワークフロー実行のロジックを表します。

\$1

```
    try {
        System.out.println("** Registering the workflow type '" + WORKFLOW +
            "-" + WORKFLOW_VERSION + "'.");
        swf.registerWorkflowType(new RegisterWorkflowTypeRequest()
            .withDomain(DOMAIN)
            .withName(WORKFLOW)
            .withVersion(WORKFLOW_VERSION)
            .withDefaultChildPolicy(ChildPolicy.TERMINATE)
            .withDefaultTaskList(new TaskList().withName(TASKLIST))
            .withDefaultTaskStartToCloseTimeout("30"));
    } catch (TypeAlreadyExistsException e) {
        System.out.println("** Workflow type already exists!");
    }
```

\$1

アクティビティタイプと同様に、ワークフロータイプは*名前*と*バージョン*によって識別され、設定可能なタイムアウトがあります。詳細については、「[RegisterWorkflowTypeRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/RegisterWorkflowTypeRequest.html)」を参照してください。

\$1

登録しようとしているワークフロータイプが既に存在する場合は、[TypeAlreadyExistsException](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/TypeAlreadyExistsException.html) が発生します。最後に、`main` メソッドを提供してクラスを実行可能にします。これはドメイン、アクティビティタイプ、およびワークフロータイプを登録します。

\$1

```
    registerDomain();
    registerWorkflowType();
    registerActivityType();
```

ここで、アプリケーションを[構築](#swf-hello-build)および[実行](#swf-hello-run-register)して登録スクリプトを実行するか、アクティビティとワークフローワーカーのコーディングを続行できます。ドメイン、ワークフロー、およびアクティビティが登録されたら、これを再度実行する必要はありません。これらのタイプは、ユーザーが自ら非推奨とするまで保持されます。

### アクティビティワーカーの実装
<a name="implement-the-activity-worker"></a>

*アクティビティ*は、ワークフローのワークの基本的な単位です。ワークフローは、ディシジョンタスクに応じて、ロジック、実行するスケジュールアクティビティ (または実行するその他のアクション) を提供します。通常、一般的なワークフローは、同期、非同期、またはそれらの組み合わせで実行できる数多くのアクティビティで構成されます。

*アクティビティワーカー*は、ワークフローの決定に応じて Amazon SWF によって生成されるアクティビティタスクをポーリングするコードです。アクティビティタスクを受け取ると、対応するアクティビティを実行し、ワークフローに成功/失敗の応答を返します。

単一のアクティビティを駆動するシンプルなアクティビティワーカーを実装します。

1. テキストエディターを開き、ファイル `ActivityWorker.java` を作成して、[共通のステップ](#swf-hello-common)に従ってパッケージ宣言とインポートを追加します。

   ```
   import com.amazonaws.regions.Regions;
   import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow;
   import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClientBuilder;
   import com.amazonaws.services.simpleworkflow.model.*;
   ```

1. `ActivityWorker` クラスをファイルに追加し、Amazon SWF を操作するために使用する SWF クライアントを保持するためのデータメンバーを提供します。

   ```
       private static final AmazonSimpleWorkflow swf =
               AmazonSimpleWorkflowClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
   ```

1. アクティビティとして使用するメソッドを追加します。

   ```
   private static String sayHello(String input) throws Throwable {
       return "Hello, " + input + "!";
   }
   ```

   アクティビティは単純に文字列を受け取り、それをあいさつに組み合わせて、結果を返します。このアクティビティで例外が発生する可能性はほとんどありませんが、何か問題が発生した場合にエラーを発生させるアクティビティを設計することをお勧めします。

1. アクティビティタスクのポーリングメソッドとして使用する `main` メソッドを追加します。最初に、アクティビティタスクについてタスクリストをポーリングするコードを追加します。

   ```
           System.out.println("Polling for an activity task from the tasklist '"
                   + HelloTypes.TASKLIST + "' in the domain '" +
                   HelloTypes.DOMAIN + "'.");
   
           ActivityTask task = swf.pollForActivityTask(
               new PollForActivityTaskRequest()
                   .withDomain(HelloTypes.DOMAIN)
                   .withTaskList(
                       new TaskList().withName(HelloTypes.TASKLIST)));
   
           String task_token = task.getTaskToken();
   ```

   アクティビティは SWF クライアントの `pollForActivityTask` メソッドを呼び出して Amazon SWF からタスクを受け取り、渡された [PollForActivityTaskRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/PollForActivityTaskRequest.html) で使用するドメインとタスクリストを指定します。

   タスクを受け取ったら、タスクの `getTaskToken` メソッドを呼び出して、その固有の識別子を取得します。

1. 次に、入ってきたタスクを処理するコードを記述します。`main` メソッドで、タスクをポーリングし、タスクトークンを取得するコードの直後に以下を追加します。

   ```
       if (task_token != null) {
           String result = null;
           Throwable error = null;
   
           try {
               System.out.println("Executing the activity task with input '" +
                       task.getInput() + "'.");
               result = sayHello(task.getInput());
           } catch (Throwable th) {
               error = th;
           }
   
           if (error == null) {
               System.out.println("The activity task succeeded with result '"
                       + result + "'.");
               swf.respondActivityTaskCompleted(
                   new RespondActivityTaskCompletedRequest()
                       .withTaskToken(task_token)
                       .withResult(result));
           } else {
               System.out.println("The activity task failed with the error '"
                       + error.getClass().getSimpleName() + "'.");
               swf.respondActivityTaskFailed(
                   new RespondActivityTaskFailedRequest()
                       .withTaskToken(task_token)
                       .withReason(error.getClass().getSimpleName())
                       .withDetails(error.getMessage()));
           }
       }
   ```

   タスクトークンが `null` でない場合、アクティビティメソッド (`sayHello`) の実行を開始し、タスクとともに送信された入力データを指定することができます。

   タスクが*成功した*場合 (エラーが生成されなかった場合)、ワーカーは、タスクトークンとアクティビティの結果データを含む [RespondActivityTaskCompletedRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/RespondActivityTaskCompletedRequest.html) オブジェクトを使用して SWF クライアントの `respondActivityTaskCompleted` メソッドを呼び出すことにより、SWF に応答します。

   一方、タスクが*失敗*した場合、`respondActivityTaskFailed`RespondActivityTaskFailedRequest[ オブジェクトとともに ](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/RespondActivityTaskFailedRequest.html) メソッドを呼び出し、タスクトークンとエラーに関する情報を渡して応答します。

**注記**  
このアクティビティは、強制終了した場合は適切にシャットダウンしません。このチュートリアルの対象外ですが、このアクティビティワーカーの代替の実装が、付随するトピック「[アクティビティおよびワークフローワーカーの適切なシャットダウン](swf-graceful-shutdown.md)」で示されています。

### ワークフローワーカーの実装
<a name="implement-the-workflow-worker"></a>

ワークフローは、**ワークフローワーカー**と呼ばれるコードに置かれます。ワークフローワーカーは、ドメイン内の Amazon SWF によって送信され、ワークフロータイプが登録されたデフォルトのタスクリスト上にある決定タスクをポーリングします。

ワークフローワーカーがタスクを受信すると、何らかの決定 (通常は新しいアクティビティタスクをスケジュールするかどうか) を行い、適切なアクション (アクティビティのスケジューリングなど) を実行します。

1. テキストエディターを開き、ファイル `WorkflowWorker.java` を作成して、[共通のステップ](#swf-hello-common)に従ってパッケージ宣言とインポートを追加します。

1. いくつかのインポートをファイルに追加します。

   ```
   import com.amazonaws.regions.Regions;
   import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow;
   import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClientBuilder;
   import com.amazonaws.services.simpleworkflow.model.*;
   import java.util.ArrayList;
   import java.util.List;
   import java.util.UUID;
   ```

1. `WorkflowWorker` クラスを宣言し、SWF メソッドへのアクセスに使用する [AmazonSimpleWorkflowClient](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/AmazonSimpleWorkflowClient.html) クラスのインスタンスを作成します。

   ```
       private static final AmazonSimpleWorkflow swf =
               AmazonSimpleWorkflowClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
   ```

1. `main` メソッドを追加します。このメソッドは連続してループし、SWF クライアントの `pollForDecisionTask` メソッドを使用して決定タスクをポーリングします。[PollForDecisionTaskRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/PollForDecisionTaskRequest.html) によって詳細が提供されます。

   ```
       PollForDecisionTaskRequest task_request =
           new PollForDecisionTaskRequest()
               .withDomain(HelloTypes.DOMAIN)
               .withTaskList(new TaskList().withName(HelloTypes.TASKLIST));
   
       while (true) {
           System.out.println(
                   "Polling for a decision task from the tasklist '" +
                   HelloTypes.TASKLIST + "' in the domain '" +
                   HelloTypes.DOMAIN + "'.");
   
           DecisionTask task = swf.pollForDecisionTask(task_request);
   
           String taskToken = task.getTaskToken();
           if (taskToken != null) {
               try {
                   executeDecisionTask(taskToken, task.getEvents());
               } catch (Throwable th) {
                   th.printStackTrace();
               }
           }
       }
   ```

   タスクを受け取ったら、その `getTaskToken` メソッドを呼び出します。これにより、タスクの識別に使用できる文字列が返されます。返されたトークンが `null` でない場合、`executeDecisionTask` メソッドでさらに処理し、タスクトークンおよびそのタスクで送信された [HistoryEvent](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/HistoryEvent.html) オブジェクトのリストを渡します。

1. `executeDecisionTask` メソッドを追加し、タスクトークン (`String`) および `HistoryEvent` リストを受け取ります。

   ```
       List<Decision> decisions = new ArrayList<Decision>();
       String workflow_input = null;
       int scheduled_activities = 0;
       int open_activities = 0;
       boolean activity_completed = false;
       String result = null;
   ```

   また、以下のような項目を追跡するためにいくつかのデータメンバーを設定します。
   + タスクの処理結果を報告するために使用される [Decision](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/Decision.html) オブジェクトのリスト。
   + "WorkflowExecutionStarted" イベントによって提供されるワークフロー入力を保持する文字列。
   + すでにスケジュールされているか、現在実行中の場合に、同じアクティビティのスケジュールを回避するためにスケジュールされ、開いている (実行中) のアクティビティの数。
   + アクティビティが完了したことを示すブール。
   + ワークフローの結果として返すためにアクティビティの結果を保持する文字列。

1. 次に、`executeDecisionTask` メソッドによって報告されたイベントタイプに基づいて、タスクとともに送信された `HistoryEvent` オブジェクトを処理するコードを `getEventType` に追加します。

   ```
   System.out.println("Executing the decision task for the history events: [");
   for (HistoryEvent event : events) {
       System.out.println("  " + event);
       switch(event.getEventType()) {
           case "WorkflowExecutionStarted":
               workflow_input =
                   event.getWorkflowExecutionStartedEventAttributes()
                        .getInput();
               break;
           case "ActivityTaskScheduled":
               scheduled_activities++;
               break;
           case "ScheduleActivityTaskFailed":
               scheduled_activities--;
               break;
           case "ActivityTaskStarted":
               scheduled_activities--;
               open_activities++;
               break;
           case "ActivityTaskCompleted":
               open_activities--;
               activity_completed = true;
               result = event.getActivityTaskCompletedEventAttributes()
                             .getResult();
               break;
           case "ActivityTaskFailed":
               open_activities--;
               break;
           case "ActivityTaskTimedOut":
               open_activities--;
               break;
       }
   }
   System.out.println("]");
   ```

   ワークフローでは、以下が最も重要です。
   + ワークフローの実行が開始したことを示し (通常はワークフローの最初のアクティビティを実行する必要があることを意味します)、ワークフローに渡される最初の入力を提供する、"WorkflowExecutionStarted" イベント。この場合、これはあいさつの名前部分であるため、アクティビティの実行をスケジュールするときに使用する文字列に保存されます。
   + スケジュールされたアクティビティが完了すると送信される、"ActivityTaskCompleted" イベント。イベントデータには、完了したアクティビティの戻り値も含まれます。1 つのアクティビティのみがあるため、この値をワークフロー全体の結果として使用します。

   他のイベントタイプは、ワークフローで必要な場合に使用できます。各イベントタイプの詳細については、[HistoryEvent](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/HistoryEvent.html) クラスの説明を参照してください。

   \$1 注: `switch` ステートメントの文字列は Java 7 で導入されました。以前のバージョンの Java を使用している場合は、[EventType](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/simpleworkflow/model/EventType.html) クラスを使用して、`history_event.getType()` で返される `String` を列挙値に変換し、必要に応じて `String` に戻すことができます。

```
EventType et = EventType.fromValue(event.getEventType());
```

1. `switch` ステートメントの後で、受け取ったタスクに応じて、適切な*決定*を使用して応答するコードを追加します。

   ```
   if (activity_completed) {
       decisions.add(
           new Decision()
               .withDecisionType(DecisionType.CompleteWorkflowExecution)
               .withCompleteWorkflowExecutionDecisionAttributes(
                   new CompleteWorkflowExecutionDecisionAttributes()
                       .withResult(result)));
   } else {
       if (open_activities == 0 && scheduled_activities == 0) {
   
           ScheduleActivityTaskDecisionAttributes attrs =
               new ScheduleActivityTaskDecisionAttributes()
                   .withActivityType(new ActivityType()
                       .withName(HelloTypes.ACTIVITY)
                       .withVersion(HelloTypes.ACTIVITY_VERSION))
                   .withActivityId(UUID.randomUUID().toString())
                   .withInput(workflow_input);
   
           decisions.add(
                   new Decision()
                       .withDecisionType(DecisionType.ScheduleActivityTask)
                       .withScheduleActivityTaskDecisionAttributes(attrs));
       } else {
           // an instance of HelloActivity is already scheduled or running. Do nothing, another
           // task will be scheduled once the activity completes, fails or times out
       }
   }
   
   System.out.println("Exiting the decision task with the decisions " + decisions);
   ```
   + まだアクティビティがスケジュールされていない場合、`ScheduleActivityTask` 決定で応答します。これにより、Amazon SWF が次にスケジュールするアクティビティに関する情報が、Amazon SWF がアクティビティに送信するデータを含めて、[ScheduleActivityTaskDecisionAttributes](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/ScheduleActivityTaskDecisionAttributes.html) 構造で提供されます。
   + アクティビティが完了すると、全体のワークフローが完了したと見なし、`CompletedWorkflowExecution` 決定で応答します。[CompleteWorkflowExecutionDecisionAttributes](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/CompleteWorkflowExecutionDecisionAttributes.html) 構造に入力し、完了したワークフローに関する詳細を提供します。この場合、アクティビティの結果を返します。

   いずれの場合も、メソッドの先頭で `Decision` リストに決定情報が追加されます。

1. タスクの処理中に収集された `Decision` オブジェクトのリストを返して、決定タスクを完了します。このコードを、これまで記述した `executeDecisionTask` メソッドの最後に追加します。

   ```
   swf.respondDecisionTaskCompleted(
       new RespondDecisionTaskCompletedRequest()
           .withTaskToken(taskToken)
           .withDecisions(decisions));
   ```

   SWF クライアントの `respondDecisionTaskCompleted` メソッドは、タスクと、`Decision` オブジェクトのリストを識別するタスクトークンを受け取ります。

### ワークフロースターターの実装
<a name="implement-the-workflow-starter"></a>

最後に、ワークフロー実行を開始するコードを書きます。

1. テキストエディターを開き、ファイル `WorkflowStarter.java` を作成して、[共通のステップ](#swf-hello-common)に従ってパッケージ宣言とインポートを追加します。

1. `WorkflowStarter` クラスを追加します。

   ```
   package aws.example.helloswf;
   
   
   import com.amazonaws.regions.Regions;
   import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow;
   import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClientBuilder;
   import com.amazonaws.services.simpleworkflow.model.*;
   
   public class WorkflowStarter {
       private static final AmazonSimpleWorkflow swf =
               AmazonSimpleWorkflowClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
       public static final String WORKFLOW_EXECUTION = "HelloWorldWorkflowExecution";
   
       public static void main(String[] args) {
           String workflow_input = "{SWF}";
           if (args.length > 0) {
               workflow_input = args[0];
           }
   
           System.out.println("Starting the workflow execution '" + WORKFLOW_EXECUTION +
                   "' with input '" + workflow_input + "'.");
   
           WorkflowType wf_type = new WorkflowType()
               .withName(HelloTypes.WORKFLOW)
               .withVersion(HelloTypes.WORKFLOW_VERSION);
   
           Run run = swf.startWorkflowExecution(new StartWorkflowExecutionRequest()
               .withDomain(HelloTypes.DOMAIN)
               .withWorkflowType(wf_type)
               .withWorkflowId(WORKFLOW_EXECUTION)
               .withInput(workflow_input)
               .withExecutionStartToCloseTimeout("90"));
   
           System.out.println("Workflow execution started with the run id '" +
                   run.getRunId() + "'.");
       }
   }
   ```

   `WorkflowStarter` クラスは単一のメソッド `main` で構成されます。このメソッドはコマンドラインで渡されたオプションの引数を、ワークフローの入力データとして受け取ります。

   SWF のクライアントメソッド `startWorkflowExecution` は、[StartWorkflowExecutionRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/StartWorkflowExecutionRequest.html) オブジェクトを入力として受け取ります。ここで、ドメインと実行するワークフロータイプの指定に加えて、以下を指定します。
   + 人間が読み取れるワークフロー実行の名前
   + ワークフローの入力データ (この例のコマンドラインで提供)
   + ワークフロー全体の実行時間 (秒単位) を表すタイムアウト値

   [ が返す ](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/Run.html)Run`startWorkflowExecution` オブジェクトは、*実行 ID* を提供します。これは、ワークフロー実行の Amazon SWF の履歴でこの特定のワークフロー実行を識別するために使用できる値です。

   \$1 注: 実行 ID は Amazon SWF によって生成され、ワークフローの実行を開始するときに渡すワークフロー実行名と同じでは*ありません*。

## 例の作成
<a name="swf-hello-build"></a>

Maven でサンプルプロジェクトを構築するには、`helloswf` ディレクトリに移動し、次のように入力します。

```
mvn package
```

結果的に生じる `helloswf-1.0.jar` が `target` ディレクトリに生成されます。

## 例の実行
<a name="run-the-example"></a>

この例は、4 つの異なる実行可能クラスで構成されます。これらは互いに独立して実行されます。

**注記**  
Linux、macOS、または Unix システムを使用している場合、それらのすべてを 1 つずつ、1 つのターミナルウィンドウで実行できます。Windows を実行している場合は、2 つの追加インスタンスのコマンドラインを開き、それぞれの `helloswf` ディレクトリに移動します。

### Java クラスパスの設定
<a name="swf-hello-set-classpath"></a>

Maven によって依存関係が処理されましたが、この例を実行するには、Java のクラスパスで AWS SDK ライブラリとその依存関係を指定する必要があります。`CLASSPATH` 環境変数を AWS SDK ライブラリの場所に設定し、必要な依存関係を含む SDK の `third-party/lib` ディレクトリに設定できます。

```
export CLASSPATH='target/helloswf-1.0.jar:/path/to/sdk/lib/*:/path/to/sdk/third-party/lib/*'
java example.swf.hello.HelloTypes
```

または、** ` java ` ** コマンドの `-cp` オプションを使用して、各アプリケーションの実行中にクラスパスを設定できます。

```
java -cp target/helloswf-1.0.jar:/path/to/sdk/lib/*:/path/to/sdk/third-party/lib/* \
  example.swf.hello.HelloTypes
```

使用するスタイルはユーザーが選択できます。コードが問題なく作成されても、例を実行しようとすると一連の "NoClassDefFound" エラーが表示される場合、クラスパスが正しく設定されていない可能性があります。

### ドメイン、ワークフロー、およびアクティビティタイプの登録
<a name="swf-hello-run-register"></a>

ワーカーおよびワークフロースターターを実行する前に、ドメイン、ワークフロータイプ、およびアクティビティタイプを登録する必要があります。これを行うコードは、[ドメイン、ワークフロー、およびアクティビティタイプの登録](#swf-hello-hellotypes)で実装しました。

構築後に [CLASSPATH を設定](#swf-hello-set-classpath)した場合、次のコマンドを実行して登録コードを実行できます。

```
    echo 'Supply the name of one of the example classes as an argument.'
```

### アクティビティおよびワークフローワーカーの開始
<a name="swf-hello-run-workers"></a>

これでタイプが登録されたため、アクティビティとワークフローワーカーを開始できます。これらは継続して実行され、強制終了されるまでタスクをポーリングするため、別のターミナルウィンドウで実行するか、Linux、macOS、または Unix で実行している場合は `&` 演算子を使用して、実行時にそれぞれが別のプロセスとして生成されるようにできます。

```
    echo 'If there are arguments to the class, put them in quotes after the class name.'
    exit 1
```

別のウィンドウでこれらのコマンドを実行している場合は、各行から最終的な `&` 演算子を省略します。

### ワークフロー実行の開始
<a name="swf-hello-start-execution"></a>

これでアクティビティとワークフローワーカーがポーリングを実行しているため、ワークフロー実行を開始できます。このプロセスは、ワークフローが完了したステータスを返すまで実行されます。(`&` オペレーターを使用して新しく生成されたプロセスとしてワーカーを実行していない限り) このプロセスは新しいターミナルウィンドウで実行する必要があります。

```
fi
```

**注記**  
独自の入力データを提供する場合 (最初にワークフロー、次にアクティビティに渡されます)、コマンドラインに追加します。例:  

```
echo "## Running $className..."
```

ワークフロー実行を開始すると、両方のワーカーおよびワークフロー実行そのものによって提供された出力が表示され始めます。ワークフローが最終的に完了すると、その出力が画面に表示されます。

## この例の完全なソース。
<a name="complete-source-for-this-example"></a>

この例の[完全なソース](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/java/example_code/swf)は、Github の *aws-java-developer-guide* レポジトリで参照できます。

## 詳細については
<a name="for-more-information"></a>
+ ここに示すワーカーにより、ワークフローポーリングがまだ行われている間にシャットダウンされた場合、タスクが失われる可能性があります。ワーカーを適切にシャットダウンする方法を確認するには、「[アクティビティおよびワークフローワーカーの適切なシャットダウン](swf-graceful-shutdown.md)」を参照してください。
+ Amazon SWF の詳細については、[Amazon SWF](https://aws.amazon.com/swf/) のホームページにアクセスするか、「[Amazon SWF デベロッパーガイド](https://docs.aws.amazon.com/amazonswf/latest/developerguide/)」を参照してください。
+ AWS Flow Framework for Java を使用すると、注釈を使ってスマートな Java スタイルでより複雑なワークフローを記述できます。詳細については、「[AWS Flow Framework for Java デベロッパーガイド](https://docs.aws.amazon.com/amazonswf/latest/awsflowguide/)」を参照してください。

# Lambda タスク
<a name="swf-lambda-task"></a>

Amazon SWF アクティビティの代わりに、またはこれに併せて [Lambda](https://aws.amazon.com/lambda/) 関数を使用してワークフローの作業単位を表し、それらをアクティビティに合わせて同様にスケジュールできます。

このトピックでは、AWS SDK for Java を使用して Amazon SWF Lambda タスクを実装する方法について説明します。一般的な Lambda タスクの詳細については、「Amazon SWF デベロッパーガイド」の「[AWS Lambda Tasks](https://docs.aws.amazon.com/amazonswf/latest/developerguide/lambda-task.html)」を参照してください。

## Lambda 関数を実行するサービス間 IAM ロールの設定
<a name="set-up-a-cross-service-iam-role-to-run-your-lambda-function"></a>

Amazon SWF が Lambda 関数を実行するには、事前に、ユーザーに代わって Lambda 関数を実行するための Amazon SWF 許可を付与するよう IAM ロールを設定する必要があります。これを行う方法に関する詳細については、「[AWS Lambda Tasks](https://docs.aws.amazon.com/amazonswf/latest/developerguide/lambda-task.html)」を参照してください。

Lambda タスクを使用するワークフローを登録するときに、この IAM ロールの Amazon リソースネーム (ARN) が必要になります。

## Lambda 関数の作成
<a name="create-a-lambda-function"></a>

Java を含め、多数の異なる言語で Lambda 関数を記述できます。Lambda 関数の作成、デプロイ、および使用の詳細については、「[AWS Lambda デベロッパーガイド](https://docs.aws.amazon.com/lambda/latest/dg/)」を参照してください。

**注記**  
Lambda 関数の記述に使用する言語は何であってもかまいません。ワークフローコードが記述されている言語にかかわらず、*任意の* Amazon SWF ワークフローによってスケジュールおよび実行できます。Amazon SWF は関数の実行の詳細を処理し、データをやり取りします。

[シンプルな Amazon SWF アプリケーションの構築](swf-hello.md)のアクティビティの代わりに使用できるシンプルな Lambda 関数を次に示します。
+ このバージョンは JavaScript で書かれており、[AWS マネジメントコンソール](https://console.aws.amazon.com/console/home)を使用して直接入力できます。

  ```
  exports.handler = function(event, context) {
      context.succeed("Hello, " + event.who + "!");
  };
  ```
+ 次に示すのは、Java で書かれた同じ関数です。これも Lambda でデプロイして実行できます。

  ```
  package example.swf.hellolambda;
  
  import com.amazonaws.services.lambda.runtime.Context;
  import com.amazonaws.services.lambda.runtime.RequestHandler;
  import com.amazonaws.util.json.JSONException;
  import com.amazonaws.util.json.JSONObject;
  
  public class SwfHelloLambdaFunction implements RequestHandler<Object, Object> {
      @Override
      public Object handleRequest(Object input, Context context) {
          String who = "{SWF}";
          if (input != null) {
              JSONObject jso = null;
              try {
                  jso = new JSONObject(input.toString());
                  who = jso.getString("who");
              } catch (JSONException e) {
                  e.printStackTrace();
              }
          }
          return ("Hello, " + who + "!");
      }
  }
  ```
**注記**  
Java 関数の Lambda へのデプロイの詳細については、AWS Lambda デベロッパーガイドの[デプロイパッケージの作成 (Java)](https://docs.aws.amazon.com/lambda/latest/dg/lambda-java-how-to-create-deployment-package.html) を参照してください。また、[Java で Lambda 関数を作成するためのプログラミングモデル](https://docs.aws.amazon.com/lambda/latest/dg/java-programming-model.html)というタイトルのセクションも参照することをお勧めします。

 Lambda 関数は、*event* または *input* オブジェクトを最初のパラメータとして受け取り、*context* オブジェクトを 2 番目のパラメータとして受け取ります。このオブジェクトは、Lambda 関数を実行するリクエストに関する情報を提供します。この特定の関数は、入力が JSON で、`who` フィールドがあいさつの作成に使用される名前に設定されていることを想定しています。

## Lambda で使用するワークフローを登録する
<a name="register-a-workflow-for-use-with-lam"></a>

ワークフローで Lambda 関数をスケジュールするには、Amazon SWF 関数を呼び出すアクセス権限を Lambda に提供する IAM ロールの名前を指定する必要があります。これは、`withDefaultLambdaRole`RegisterWorkflowTypeRequest`setDefaultLambdaRole` の [ または ](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/RegisterWorkflowTypeRequest.html) メソッドを使用して、ワークフロー登録中に設定できます。

```
System.out.println("** Registering the workflow type '" + WORKFLOW + "-" + WORKFLOW_VERSION
        + "'.");
try {
    swf.registerWorkflowType(new RegisterWorkflowTypeRequest()
        .withDomain(DOMAIN)
        .withName(WORKFLOW)
        .withDefaultLambdaRole(lambda_role_arn)
        .withVersion(WORKFLOW_VERSION)
        .withDefaultChildPolicy(ChildPolicy.TERMINATE)
        .withDefaultTaskList(new TaskList().withName(TASKLIST))
        .withDefaultTaskStartToCloseTimeout("30"));
}
catch (TypeAlreadyExistsException e) {
```

## Lambda タスクのスケジュール
<a name="schedule-a-lam-task"></a>

Lambda タスクのスケジュールは、アクティビティのスケジュールに似ています。`ScheduleLambdaFunction`[DecisionType](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/DecisionType.html) と [ScheduleLambdaFunctionDecisionAttributes](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/ScheduleLambdaFunctionDecisionAttributes.html) を使用して [Decision](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/Decision.html) を提供します。

```
running_functions == 0 && scheduled_functions == 0) {
AWSLambda lam = AWSLambdaClientBuilder.defaultClient();
GetFunctionConfigurationResult function_config =
    lam.getFunctionConfiguration(
            new GetFunctionConfigurationRequest()
                .withFunctionName("HelloFunction"));
String function_arn = function_config.getFunctionArn();

ScheduleLambdaFunctionDecisionAttributes attrs =
    new ScheduleLambdaFunctionDecisionAttributes()
        .withId("HelloFunction (Lambda task example)")
        .withName(function_arn)
        .withInput(workflow_input);

decisions.add(
```

`ScheduleLambdaFuntionDecisionAttributes` で、呼び出す Lambda 関数の ARN である *name* と、履歴ログで Lambda 関数を識別するために Amazon SWF が使用する名前である *id* を指定する必要があります。

また、Lambda 関数のオプションの *input* を指定し、その *start to close timeout* 値を設定できます。これは、`LambdaFunctionTimedOut` イベントを生成する前に Lambda 関数に実行が許可される秒数です。

**注記**  
このコードは、[AWSLambdaClient](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/lambda/AWSLambdaClient.html) を使用して、関数名が指定されると Lambda 関数の ARN を取得します。この手法を使用すれば、コードで完全な ARN のハードコーディング (AWS アカウント ID を含む) を行わなくても済みます。

## ディサイダーでの Lambda 関数イベントの処理
<a name="handle-lam-function-events-in-your-decider"></a>

 Lambda タスクでは、ワークフローワーカーの決定タスクでポーリングを行うときにアクションを実行できる数多くのイベントを生成します。これらは、Lambda タスクのライフサイクルに対応し、[、](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/EventType.html)、`LambdaFunctionScheduled` などの `LambdaFunctionStarted`EventType`LambdaFunctionCompleted` 値を取ります。Lambda 関数が失敗するか、設定されたタイムアウト値よりも長い時間がかかる場合、それぞれ `LambdaFunctionFailed` または `LambdaFunctionTimedOut` イベントタイプを受け取ります。

```
boolean function_completed = false;
String result = null;

System.out.println("Executing the decision task for the history events: [");
for (HistoryEvent event : events) {
    System.out.println("  " + event);
    EventType event_type = EventType.fromValue(event.getEventType());
    switch(event_type) {
    case WorkflowExecutionStarted:
        workflow_input =
            event.getWorkflowExecutionStartedEventAttributes()
                 .getInput();
        break;
    case LambdaFunctionScheduled:
        scheduled_functions++;
        break;
    case ScheduleLambdaFunctionFailed:
        scheduled_functions--;
        break;
    case LambdaFunctionStarted:
        scheduled_functions--;
        running_functions++;
        break;
    case LambdaFunctionCompleted:
        running_functions--;
        function_completed = true;
        result = event.getLambdaFunctionCompletedEventAttributes()
                      .getResult();
        break;
    case LambdaFunctionFailed:
        running_functions--;
        break;
    case LambdaFunctionTimedOut:
        running_functions--;
        break;
```

## Lambda 関数からの出力の受け取り
<a name="receive-output-from-your-lam-function"></a>

[LambdaFunctionCompletedEventAttributes](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/LambdaFunctionCompletedEventAttributes.html) オブジェクトを取得するために [HistoryEvent](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/HistoryEvent.html) で `LambdaFunctionCompleted`[EventType](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/EventType.html), you can retrieve your 0 function’s return value by first calling `getLambdaFunctionCompletedEventAttributes` を受け取り、`getResult` メソッドを呼び出して Lambda 関数の出力を取得する場合は以下のようになります。

```
 LambdaFunctionCompleted:
running_functions--;
```

## この例の完全なソース。
<a name="complete-source-for-this-example"></a>

この例の*完全なソース :github:`<awsdocs/aws-java-developer-guide/tree/master/doc\$1source/snippets/helloswf\$1lambda/>* は、Github の *aws-java-developer-guide* レポジトリで参照できます。

# アクティビティおよびワークフローワーカーの適切なシャットダウン
<a name="swf-graceful-shutdown"></a>

[シンプルな Amazon SWF アプリケーションの構築](swf-hello.md)のトピックでは、登録アプリケーション、アクティビティとワークフローワーカー、およびワークフロースターターで構成されるシンプルなワークフローアプリケーションの完全な実装について説明しました。

ワーカークラスは、アクティビティを実行したり、決定を返したりするため継続して実行し、Amazon SWF によって送信されたタスクをポーリングするよう設計されています。ポーリングリクエストが行われると、Amazon SWF はポーリング元を記録し、それにタスクを割り当てるよう試みます。

長いポーリング中にワークフローワーカーが終了すると、Amazon SWF は終了したワーカーへタスクの送信を引き続き試み、その結果 (タスクのタイムアウトまで) タスクが失われる場合があります。

この状況に対応する 1 つの方法は、ワーカーが終了する前に、すべての長いポーリングリクエストが戻るのを待つことです。

このトピックでは、Java のシャットダウンフックを使用してアクティビティワーカーの適切なシャットダウンを試み、`helloswf` からのアクティビティワーカーを再記述します。

完全なコードは次のとおりです。

```
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

import com.amazonaws.regions.Regions;
import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow;
import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClientBuilder;
import com.amazonaws.services.simpleworkflow.model.ActivityTask;
import com.amazonaws.services.simpleworkflow.model.PollForActivityTaskRequest;
import com.amazonaws.services.simpleworkflow.model.RespondActivityTaskCompletedRequest;
import com.amazonaws.services.simpleworkflow.model.RespondActivityTaskFailedRequest;
import com.amazonaws.services.simpleworkflow.model.TaskList;

public class ActivityWorkerWithGracefulShutdown {

    private static final AmazonSimpleWorkflow swf =
        AmazonSimpleWorkflowClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
    private static final CountDownLatch waitForTermination = new CountDownLatch(1);
    private static volatile boolean terminate = false;

    private static String executeActivityTask(String input) throws Throwable {
        return "Hello, " + input + "!";
    }

    public static void main(String[] args) {
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                try {
                    terminate = true;
                    System.out.println("Waiting for the current poll request" +
                            " to return before shutting down.");
                    waitForTermination.await(60, TimeUnit.SECONDS);
                }
                catch (InterruptedException e) {
                    // ignore
                }
            }
        });
        try {
            pollAndExecute();
        }
        finally {
            waitForTermination.countDown();
        }
    }

    public static void pollAndExecute() {
        while (!terminate) {
            System.out.println("Polling for an activity task from the tasklist '"
                    + HelloTypes.TASKLIST + "' in the domain '" +
                    HelloTypes.DOMAIN + "'.");

            ActivityTask task = swf.pollForActivityTask(new PollForActivityTaskRequest()
                .withDomain(HelloTypes.DOMAIN)
                .withTaskList(new TaskList().withName(HelloTypes.TASKLIST)));

            String taskToken = task.getTaskToken();

            if (taskToken != null) {
                String result = null;
                Throwable error = null;

                try {
                    System.out.println("Executing the activity task with input '"
                            + task.getInput() + "'.");
                    result = executeActivityTask(task.getInput());
                }
                catch (Throwable th) {
                    error = th;
                }

                if (error == null) {
                    System.out.println("The activity task succeeded with result '"
                            + result + "'.");
                    swf.respondActivityTaskCompleted(
                        new RespondActivityTaskCompletedRequest()
                            .withTaskToken(taskToken)
                            .withResult(result));
                }
                else {
                    System.out.println("The activity task failed with the error '"
                            + error.getClass().getSimpleName() + "'.");
                    swf.respondActivityTaskFailed(
                        new RespondActivityTaskFailedRequest()
                            .withTaskToken(taskToken)
                            .withReason(error.getClass().getSimpleName())
                            .withDetails(error.getMessage()));
                }
            }
        }
    }
}
```

このバージョンでは、元のバージョンの `main` 関数にあったポーリングコードが、独自のメソッドに移動されました。`pollAndExecute`

`main` 関数は [CountDownLatch](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/concurrent/CountDownLatch.html) を[シャットダウンフック](https://docs.oracle.com/javase/8/docs/api/index.html?java/lang/Runtime.html)とともに使用して、終了がリクエストされた後で最大 60 秒待ってから、スレッドをシャットダウンさせます。

# ドメインの登録
<a name="prog-services-swf-register-domain"></a>

[Amazon SWF](https://aws.amazon.com/swf/) の各ワークフローとアクティビティでは、実行する*ドメイン*が必要です。

1. 新しい [RegisterDomainRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/RegisterDomainRequest.html) オブジェクトを作成し、これに少なくともドメイン名とワークフロー実行保持期間を指定します (これらのパラメーターは両方とも必須です)。

1. [AmazonSimpleWorkflowClient.registerDomain](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/AmazonSimpleWorkflowClient.html#registerDomain-com.amazonaws.services.simpleworkflow.model.RegisterDomainRequest-) メソッドを、*RegisterDomainRequest* オブジェクトで呼び出します。

1. リクエストしているドメインがすでに存在している場合 (その場合、アクションは通常必要ありません)、[DomainAlreadyExistsException](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/DomainAlreadyExistsException.html) をキャッチします。

次のコードは、この手順を示しています。

```
public void register_swf_domain(AmazonSimpleWorkflowClient swf, String name)
{
    RegisterDomainRequest request = new RegisterDomainRequest().withName(name);
    request.setWorkflowExecutionRetentionPeriodInDays("10");
    try
    {
        swf.registerDomain(request);
    }
    catch (DomainAlreadyExistsException e)
    {
        System.out.println("Domain already exists!");
    }
}
```

# ドメインの一覧表示
<a name="prog-services-swf-list-domains"></a>

登録タイプ別に、アカウントと AWS リージョンに関連付けられた [Amazon SWF](https://aws.amazon.com/swf/) ドメインを一覧表示できます。

1. [ListDomainsRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/ListDomainsRequest.html) オブジェクトを作成し、関心のあるドメインの登録ステータスを指定します。これは必須です。

1. [AmazonSimpleWorkflowClient.listDomains](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/AmazonSimpleWorkflowClient.html#listDomains-com.amazonaws.services.simpleworkflow.model.ListDomainsRequest-) を *ListDomainRequest* オブジェクトで呼び出します。結果は [DomainInfos](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/DomainInfos.html) オブジェクトで示されます。

1. 返されたオブジェクトで [getDomainInfos](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/DomainInfos.html#getDomainInfos--) を呼び出して、[DomainInfo](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/DomainInfo.html) オブジェクトの一覧を取得します。

1. 各 *DomainInfo* オブジェクトで [getName](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/DomainInfo.html#getName--) を呼び出して、その名前を取得します。

次のコードは、この手順を示しています。

```
public void list_swf_domains(AmazonSimpleWorkflowClient swf)
{
    ListDomainsRequest request = new ListDomainsRequest();
    request.setRegistrationStatus("REGISTERED");
    DomainInfos domains = swf.listDomains(request);
    System.out.println("Current Domains:");
    for (DomainInfo di : domains.getDomainInfos())
    {
        System.out.println(" * " + di.getName());
    }
}
```

# SDK に含まれるコードサンプル
<a name="java-dg-samples"></a>

AWS SDK for Java は、SDK のビルドおよび実行可能なプログラムの多くの機能を示す多数のコードサンプルでパッケージ化されています。AWS SDK for Java を使用して独自の AWS ソリューションを実装する際に、これらを検討または変更できます。

## サンプルの入手方法
<a name="how-to-get-the-samples"></a>

AWS SDK for Java コードサンプルは、SDK の*サンプル*ディレクトリで提供されています。[AWS SDK for Javaのセットアップ](setup-install.md)での説明に従って SDK をダウンロードおよびインストールしていれば、サンプルは既にシステムに存在しています。

また、AWS SDK for Java の GitHub リポジトリの [src/samples](https://github.com/aws/aws-sdk-java/tree/master/src/samples) ディレクトリで、最新のサンプルを確認することもできます。

## コマンドラインを使用したサンプルのビルドと実行
<a name="samples-cmdline"></a>

サンプルには [Ant](http://ant.apache.org/) ビルドスクリプトが含まれているため、コマンドラインからこれらを簡単にビルドおよび実行できます。また、各サンプルには、各サンプルに固有の情報を含む README ファイルが HTML 形式で含まれています。

**注記**  
GitHub でサンプルコードを参照している場合は、サンプルの README.html ファイルを表示するときに、ソースコード表示の [**Raw**] ボタンをクリックします。raw モードでは、HTML はお使いのブラウザで目的どおりにレンダリングされます。

### 前提条件
<a name="prerequisitessamples"></a>

AWS SDK for Java のサンプルを実行する前に、[開発用の AWS 認証情報とリージョンのセットアップ](setup-credentials.md)での説明に従って、環境 または AWS CLI で AWS 認証情報を設定する必要があります。サンプルは、可能な限りデフォルトの認証情報プロバイダチェーンを使用します。そのため、この方法で認証情報を設定することにより、ソースコードディレクトリ内のファイルに AWS 認証情報を挿入するリスクの高い方法を回避できます (この方法では、意図せずにファイルにチェックインし、ファイルを公開する可能性があります)。

### サンプルの実行
<a name="running-the-samples"></a>

1. サンプルのコードを含むディレクトリに変更します。例えば、AWS SDK ダウンロードのルートディレクトリで `AwsConsoleApp` サンプルを実行する場合は、次のように入力します。

   ```
   cd samples/AwsConsoleApp
   ```

1. Ant を使用してサンプルをビルドおよび実行します。デフォルトのビルドターゲットでは両方のアクションが実行されるため、次のように入力できます。

   ```
   ant
   ```

サンプルは、情報を標準出力に出力します。以下に例を示します。

```
===========================================

Welcome to the {AWS} Java SDK!

===========================================
You have access to 4 Availability Zones.

You have 0 {EC2} instance(s) running.

You have 13 Amazon SimpleDB domain(s) containing a total of 62 items.

You have 23 {S3} bucket(s), containing 44 objects with a total size of 154767691 bytes.
```

## Eclipse IDE を使用したサンプルのビルドと実行
<a name="building-and-running-the-samples-using-the-eclipse-ide"></a>

AWS Toolkit for Eclipse を使用する場合は、AWS SDK for Java に基づいて Eclipse で新しいプロジェクトを開始したり、既存の Java プロジェクトに SDK を追加したりすることができます。

### 前提条件
<a name="id1samples"></a>

AWS Toolkit for Eclipse をインストールした後で、セキュリティ認証情報を使用して Toolkit を設定することをお勧めします。これは、Eclipse の **[Window]** メニューから **[詳細設定]** を選択し、**[AWS ツールキット]** セクションを選択することで、いつでも実行できます。

### サンプルの実行
<a name="id2"></a>

1. Eclipse を開きます。

1. 新しい AWS Java プロジェクトを作成します。Eclipse の [**File**] メニューで [**New**] を選択し、[**Project**] をクリックします。[**New Project**] ウィザードが起動します。

1. **[AWS]** カテゴリを展開し、**[AWS Java プロジェクト]** を選択します。

1. [**次へ**] を選択します。プロジェクトの設定ページが表示されます。

1. [**Pattern Name**] ボックスに名前を入力します。AWS SDK for Java サンプルグループに、既に説明した SDK で使用できるサンプルが表示されます。

1. 各チェックボックスをオンにして、プロジェクトに含めるサンプルを選択します。

1. AWS 認証情報を入力します。認証情報を使用してすでに AWS Toolkit for Eclipse を設定している場合、この情報は自動的に入力されます。

1. [**Finish**] を選択してください。プロジェクトが作成され、**[Project Explorer]** に追加されます。

1. 実行するサンプルの `.java` ファイルを選択します。たとえば、Amazon S3 サンプルの場合は `S3Sample.java` を選択します。

1. [**Run**] メニューで、[**Run**] を選択します。

1. [**Project Explorer**] でプロジェクトを右クリックし、[**Build Path**] をポイントして、[**Add Libraries**] を選択します。

1. [**AWS Java SDK**] を選択し、[**Next**] (次へ) を選択して、画面のその他の手順を実行します。