

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

# AWS Lambda タスクの実装
<a name="lambda-task"></a>

**Topics**
+ [について AWS Lambda](#about-aws-lambda)
+ [Lambda タスクを使用する利点と制限](#benefits-limitations-lambda-tasks)
+ [AWS Flow Framework for Java ワークフローでの Lambda タスクの使用](#using-lambda-tasks-in-java-flow-workflows)
+ [HelloLambda サンプルを表示する](#see-lambda-sample)

## について AWS Lambda
<a name="about-aws-lambda"></a>

AWS Lambda は、カスタムコードまたは Amazon S3、DynamoDB DynamoDB 、Amazon Kinesis、Amazon SNS、Amazon Cognito などのさまざまな AWS サービスによって生成されたイベントに応答してコードを実行するフルマネージド型のコンピューティングサービスです。Lambda の詳細については、[ デベロッパーガイドAWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/) を参照してください。

Amazon Simple Workflow Service は Lambda タスクを提供し、従来の Amazon SWF アクティビティの代わりに、またはそれと一緒に Lambda 関数を実行できるようにします。

**重要**  
 AWS アカウントは、Amazon SWF がユーザーに代わって実行した Lambda 実行 (リクエスト) に対して課金されます。Lambda の料金の詳細については、[https://aws.amazon.com/lambda/pricing/](https://aws.amazon.com/lambda/pricing/) を参照してください。

## Lambda タスクを使用する利点と制限
<a name="benefits-limitations-lambda-tasks"></a>

従来の Amazon SWF アクティビティの代わりに Lambda タスクを使用することには、多くの利点があります。
+ Lambda タスクは、Amazon SWF アクティビティタイプのように登録またはバージョン管理する必要はありません。
+ 既にワークフローで定義している既存の Lambda 関数を使用することができます。
+ Lambda 関数は Amazon SWF によって直接呼び出されます。従来のアクティビティのように実行するためのワーカープログラムを実装する必要はありません。
+ Lambda では、関数の実行を追跡し分析するためのメトリクスとログが用意されています。

Lambda タスクには注意すべきいくつかの制限があります。
+ Lambda タスクは、Lambda をサポートする AWS リージョンでのみ実行できます。Lambda で現在サポートされているリージョンの詳細については、「*Amazon Web Services General Reference*」(Amazon Web Services 全般リファレンス) の「[Lambda Regions and Endpoints](https://docs.aws.amazon.com/general/latest/gr/rande.html#lambda_region)」(Lambda リージョンとエンドポイント) を参照してください。
+ Lambda タスクは現在、ベース SWF HTTP API と AWS Flow Framework for Java でのみサポートされています。現在、 AWS Flow Framework for Ruby では Lambda タスクはサポートされていません。

## AWS Flow Framework for Java ワークフローでの Lambda タスクの使用
<a name="using-lambda-tasks-in-java-flow-workflows"></a>

 AWS Flow Framework for Java ワークフローで Lambda タスクを使用するには、次の 3 つの要件があります。
+ 実行するための Lambda 関数。定義した任意の Lambda 関数を使用できます。Lambda関数を作成する方法の詳細については、「[AWS Lambda デベロッパーガイド](https://docs.aws.amazon.com/lambda/latest/dg/)」を参照してください。
+ Amazon SWF ワークフローから Lambda 関数を実行するアクセス権限を付与する IAM ロール。
+ ワークフロー内から Lambda タスクをスケジュールするコード。

### IAM ロールのセットアップ
<a name="set-up-lambda-role"></a>

Amazon SWF から Lambda 関数を呼び出す前に、Amazon SWF から Lambda へのアクセス権を付与する IAM ロールを準備する必要があります。次のいずれかを行うことができます。
+ あらかじめ定義されたロール、*AWSLambdaRole* を選択して、ワークフローにアカウントに関連する Lambda 関数を呼び出すアクセス許可を付与します。
+ 独自のポリシーと関連付けられたロールを定義して、Amazon リソースネーム (ARN) で指定された特定の Lambda 関数を呼び出すためのワークフローのアクセス許可を付与します。

#### IAM ロールのアクセス許可を制限する
<a name="limit-iam-role-permissions"></a>

Amazon SWF に提供する IAM ロールに対するアクセス許可を制限するには、リソースの信頼ポリシーの `SourceArn` および `SourceAccount` コンテキストキーを使用します。これらのキーは、指定されたドメイン ARN に属する Amazon Simple Workflow Service の実行からのみ使用されるように、IAM ポリシーの使用を制限します。これらのグローバル条件コンテキストキーの両方を、同じポリシーステートメントで使用する場合、`aws:SourceAccount` 値と `aws:SourceArn` 値の中の参照されるアカウントには、同じアカウント ID を使用する必要があります。

次の例では、`SourceArn`コンテキストキーは、アカウント の に属する Amazon Simple Workflow Service の実行でのみ IAM サービスロールを使用するように制限`someDomain`します`123456789012`。


+ **ステートメント 1**

  **プリンシパル** : `"Service": "swf.amazonaws.com"` 

  **アクション: ** `sts:AssumeRole` 

```
"Condition": {
   "ArnLike": {
     "aws:SourceArn": "arn:aws:swf:*:123456789012:/domain/someDomain"
   }
}
```

次の例では、`SourceAccount`コンテキストキーは、アカウント の Amazon Simple Workflow Service 実行でのみ IAM サービスロールを使用するように制限します`123456789012`。

```
"Condition": {
   "StringLike": {
     "aws:SourceAccount": "123456789012"
   }
}
```

#### Amazon SWF に Lambda ロールを呼び出すためのアクセスを提供する
<a name="providing-swf-access-invoke-any-lambda-role"></a>

あらかじめ定義されたロール、*AWSLambdaRole* を使用して、Amazon SWF ワークフローがアカウントに関連する Lambda 関数を呼び出せるようにできます。

**AWSLambdaRole を使用して、Lambda 関数を呼び出すアクセス権を Amazon SWF に付与するには**

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

1. [**Roles**] (ロール) を選択してから [**Create New Role**] (ロールの新規作成) を選びます。

1. ロールに `swf-lambda` などの名前を付け、[**Next Step**] (次のステップ) を選択します。

1. [**AWS サービスロール**] で、[**Amazon SWF**]、[**次のステップ**] の順に選択します。

1. [**ポリシーのアタッチ**] 画面で、リストから [**AWSLambdaRole**] を選択します。

1. ロールを確認したら、[**Next Step**] (次のステップ) を選択してから、[**Create Role**] (ロールの作成) を選択します。

#### 特定の Lambda 関数を呼び出すためのアクセス権を付与する IAM ロールの定義
<a name="defining-iam-role-provide-access-invoke-specific-lambda-function"></a>

ワークフローから特定の Lambda 関数を呼び出すためのアクセスを提供する場合は、独自の IAM ポリシーを定義する必要があります。

**特定の Lambda 関数へのアクセスを提供する IAM ポリシーを作成するには**

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

1. [**Policies**] (ポリシー) を選択して、[**Create Policy**] (ポリシーの作成) を選択します。

1. ** AWS 管理ポリシーのコピー**を選択し、リストから **AWSLambdaRole** を選択します。ポリシーが生成されます。必要に応じて名前と説明を編集することもできます。

1. [**Policy Document**] (ポリシードキュメント) の [*Resource*] (リソース) フィールドに、Lambda 関数の ARN を追加します。例:
   + **リソース**: `arn:aws:lambda:us-east-1:111122223333:function:hello_lambda_function` 
**注記**  
IAM ロールでリソースを指定する方法の詳細については、「*Using IAM*」(IAM の使用) の「[Overview of IAM Policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/policies_overview.html)」(IAM ポリシーの概要) を参照してください。

1. [**Create Policy**] (ポリシーの作成) を選択してポリシーの作成を完了します。

新しい IAM ロールを作成するときにこのポリシーを選択し、そのロールを使用して Amazon SWF ワークフローへのアクセスを呼び出すことができます。この手順は、*AWSLambdaRole* ポリシーを使用してロールを作成する場合と非常によく似ています。代わりに、ロールを作成するときに独自のポリシーを選択します。

**Lambda ポリシーを使用して Amazon SWF ロールを作成するには**

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

1. [**Roles**] (ロール) を選択してから [**Create New Role**] (ロールの新規作成) を選びます。

1. ロールに `swf-lambda-function` などの名前を付け、[**Next Step**] (次のステップ) を選択します。

1. [**AWS サービスロール**] で、[**Amazon SWF**]、[**次のステップ**] の順に選択します。

1. [**ポリシーのアタッチ**] 画面で、リストから Lambda 関数固有のポリシーを選択します。

1. ロールを確認したら、[**Next Step**] (次のステップ) を選択してから、[**Create Role**] (ロールの作成) を選択します。

### Lambda タスクの実行をスケジュール設定する
<a name="schedule-lambda-tasks-for-execution"></a>

Lambda 関数の呼び出しを許可する IAM ロールを定義したら、ワークフローの一部として、実行スケジュールを設定できます。

**注記**  
このプロセスは、 AWS SDK for Javaに含まれる [HelloLambda サンプル](#see-lambda-sample)で完全に実証されています。

**Lambda タスクの実行をスケジュール設定するには**

1. ワークフロー実装で、`LambdaFunctionClient` のインスタンスを取得するには、`DecisionContext` インスタンスで `getLambdaFunctionClient()` を呼び出します。

   ```
   // Get a LambdaFunctionClient instance
   DecisionContextProvider decisionProvider = new DecisionContextProviderImpl();
   DecisionContext decisionContext = decisionProvider.getDecisionContext();
   LambdaFunctionClient lambdaClient = decisionContext.getLambdaFunctionClient();
   ```

1. `LambdaFunctionClient` の `scheduleLambdaFunction()` メソッドを使用してタスクをスケジュール設定します。その際、作成した Lambda 関数の名前と、Lambda タスクの入力データを渡します。

   ```
   // Schedule the Lambda function for execution, using your IAM role for access.
   String lambda_function_name = "The name of your Lambda function.";
   String lambda_function_input = "Input data for your Lambda task.";
   
   lambdaClient.scheduleLambdaFunction(lambda_function_name, lambda_function_input);
   ```

1. ワークフロー実行スターターで、IAM lambda ロールをデフォルトワークフローオプションに追加するには、`StartWorkflowOptions.withLambdaRole()` を使用して、ワークフロー開始時にオプションを渡します。

   ```
   // Workflow client classes are generated for you when you use the @Workflow
   // annotation on your workflow interface declaration.
   MyWorkflowClientExternalFactory clientFactory =
     new MyWorkflowClientExternalFactoryImpl(sdk_swf_client, swf_domain);
   
   MyWorkflowClientExternal workflow_client = clientFactory.getClient();
   
   // Give the ARN of an IAM role that allows SWF to invoke Lambda functions on
   // your behalf.
   String lambda_iam_role = "arn:aws:iam::111111000000:role/swf_lambda_role";
   
   StartWorkflowOptions workflow_options =
     new StartWorkflowOptions().withLambdaRole(lambda_iam_role);
   
   // Start the workflow execution
   workflow_client.helloWorld("User", workflow_options);
   ```

## HelloLambda サンプルを表示する
<a name="see-lambda-sample"></a>

Lambda タスクを使用するワークフローを実装するサンプルは、 AWS SDK for Javaで入手できます。表示して実行するには、[ソースをダウンロードします](https://aws.amazon.com/code/3015904745387737)。

*HelloLambda* サンプルを構築して実行する方法の詳細については、 AWS Flow Framework for Java サンプルに付属の README ファイルを参照してください。