

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 實作 AWS Lambda 任務
<a name="lambda-task"></a>

**Topics**
+ [關於 AWS Lambda](#about-aws-lambda)
+ [使用 Lambda 任務的優點和限制](#benefits-limitations-lambda-tasks)
+ [在 AWS Flow Framework 適用於 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、Amazon Kinesis、Amazon SNS 和 Amazon Cognito 等各種 AWS 服務的事件。如需有關 Lambda 的詳細資訊，請參閱 [AWS Lambda 開發人員指南](https://docs.aws.amazon.com/lambda/latest/dg/)。

Amazon Simple Workflow Service 提供 Lambda 任務，讓您可以執行 Lambda 函數來取代或搭配傳統 Amazon SWF 活動。

**重要**  
 AWS 您的帳戶將針對 Amazon SWF 代表您執行的 Lambda 執行 （請求） 付費。如需 Lambda 定價的詳細資訊，請參閱 https：//[https://aws.amazon.com/lambda/pricing/](https://aws.amazon.com/lambda/pricing/)。

## 使用 Lambda 任務的優點和限制
<a name="benefits-limitations-lambda-tasks"></a>

使用 Lambda 任務取代傳統 Amazon SWF 活動有許多好處：
+ Lambda 任務不需要像 Amazon SWF 活動類型一樣進行註冊或版本控制。
+ 您可以使用已在工作流程中定義的任何現有 Lambda 函數。
+ Lambda 函數由 Amazon SWF 直接呼叫；您不需要實作工作者程式來執行它們，就像傳統活動一樣。
+ Lambda 為您提供用於追蹤和分析函數執行的指標和日誌。

您還需要知道數個 Lambda 任務的相關限制：
+ Lambda 任務只能在支援 Lambda AWS 的區域執行。如需 [Lambda 目前支援區域的詳細資訊，請參閱 Amazon Web Services 一般參考中的 Lambda 區域和端點](https://docs.aws.amazon.com/general/latest/gr/rande.html#lambda_region)。 **
+ Lambda 任務目前僅受基礎 SWF HTTP API 和 AWS Flow Framework 適用於 Java 的 支援。目前不支援 AWS Flow Framework 適用於 Ruby 的 中的 Lambda 任務。

## 在 AWS Flow Framework 適用於 Java 的 工作流程中使用 Lambda 任務
<a name="using-lambda-tasks-in-java-flow-workflows"></a>

在 AWS Flow Framework 適用於 Java 的 工作流程中使用 Lambda 任務有三個要求：
+ 要執行的 Lambda 函數。您可以使用您定義的任何 Lambda 函數。如需如何建立 Lambda 函數的詳細資訊，請參閱 [AWS Lambda 開發人員指南](https://docs.aws.amazon.com/lambda/latest/dg/)。
+ IAM 角色，可讓您從 Amazon SWF 工作流程執行 Lambda 函數。
+ 從工作流程中排程 Lambda 任務的程式碼。

### 設定 IAM 角色
<a name="set-up-lambda-role"></a>

您必須先提供可從 Amazon SWF 存取 Lambda 的 IAM 角色，才能從 Amazon SWF 叫用 Lambda 函數。您可擇一方法：
+ 選擇預先定義的角色 *AWSLambdaRole*，讓您的工作流程有權叫用與您的帳戶相關聯的任何 Lambda 函數。
+ 定義您自己的政策和相關聯的角色，以授予工作流程叫用特定 Lambda 函數的許可，這些函數由其 Amazon Resource Name (ARNs) 指定。

#### 限制 IAM 角色的許可
<a name="limit-iam-role-permissions"></a>

您可以使用 資源信任政策中的 `SourceArn`和 `SourceAccount`內容索引鍵，限制您提供給 Amazon SWF 之 IAM 角色的許可。這些金鑰會限制 IAM 政策的用量，使其僅用於屬於指定網域 ARN 的 Amazon Simple Workflow Service 執行。如果您同時使用兩個全域條件內容索引鍵，值中參考`aws:SourceArn`的 `aws:SourceAccount`值和帳戶在使用相同的政策陳述式時，必須使用相同的帳戶 ID。

在下列範例中，`SourceArn`內容索引鍵限制 IAM 服務角色只能用於屬於帳戶 `someDomain`的 Amazon Simple Workflow Service 執行`123456789012`。


+ **陳述式 1**

  **委託人** ： `"Service": "swf.amazonaws.com"`

  **動作：**`sts:AssumeRole`

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

在下列範例中，`SourceAccount`內容索引鍵限制 IAM 服務角色只能用於帳戶中的 Amazon Simple Workflow Service 執行。 `123456789012`

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

#### 為 Amazon SWF 提供叫用任何 Lambda 角色的存取權
<a name="providing-swf-access-invoke-any-lambda-role"></a>

您可以使用預先定義的角色 *AWSLambdaRole*，讓 Amazon SWF 工作流程能夠叫用與您的帳戶相關聯的任何 Lambda 函數。

**使用 AWSLambdaRole 讓 Amazon SWF 能夠叫用 Lambda 函數**

1. 開啟 [Amazon IAM 主控台](https://console.aws.amazon.com/iam/)。

1. 選擇 **Roles** (角色)，然後選擇 **Create New Role** (建立新角色)。

1. 為您的角色提供名稱，例如 `swf-lambda`，然後選擇 **Next Step** (下一步)。

1. 在**AWS 服務角色**下，選擇 **Amazon SWF**，然後選擇**下一步**。

1. 在 **Attach Policy** (附加政策) 畫面上，從清單選擇 **AWSLambdaRole**。

1. 當您檢閱好角色後，請選擇 **Next Step** (下一步)，然後選擇 **Create Role** (建立角色)。

#### 定義 IAM 角色以提供叫用特定 Lambda 函數的存取權
<a name="defining-iam-role-provide-access-invoke-specific-lambda-function"></a>

如果您想要提供從工作流程叫用特定 Lambda 函數的存取權，您將需要定義自己的 IAM 政策。

**建立 IAM 政策以提供特定 Lambda 函數的存取權**

1. 開啟 [Amazon IAM 主控台](https://console.aws.amazon.com/iam/)。

1. 選擇 **Policies** (政策)，然後選擇 **Create Policy** (建立政策)。

1. 選擇**複製 AWS 受管政策**，然後從清單中選擇 **AWSLambdaRole**。即會為您產生政策。您可選擇性編輯其名稱及描述，以符合您的需求。

1. 在**政策文件***的資源*欄位中，新增 Lambda 函數的 ARN (Lambda)。例如：
   + **資源：**`arn:aws:lambda:us-east-1:111122223333:function:hello_lambda_function`
**注意**  
如需如何在 IAM 角色中指定資源的完整描述，請參閱使用 [IAM 中的 IAM 政策概觀](https://docs.aws.amazon.com/IAM/latest/UserGuide/policies_overview.html)。 **

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 角色後，您可以將它們排程為工作流程的一部分來執行。

**注意**  
[HelloLambda 範例](#see-lambda-sample)會在 適用於 Java 的 AWS SDK中完整示範此程序。

**排程 Lambda 任務以執行**

1. 在您的工作流程實作中，於 `DecisionContext` 執行個體上呼叫 `getLambdaFunctionClient()` 以取得 `LambdaFunctionClient` 執行個體。

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

1. 使用 上的 `scheduleLambdaFunction()`方法排程任務`LambdaFunctionClient`，傳遞您建立的 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 任務之工作流程實作的範例 適用於 Java 的 AWS SDK。若要加以檢視及/或執行，請[下載來源](https://aws.amazon.com/code/3015904745387737)。

有關如何建置和執行 *HelloLambda* 範例的完整描述，請參閱隨 AWS Flow Framework 適用於 Java 的 範例提供的 README 檔案。