

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

# AWS Lambda Amazon SWF 中的 任務
<a name="lambda-task"></a>

**Topics**
+ [關於 AWS Lambda](#about-aws-lambda)
+ [使用 Lambda 任務的優點和限制](#benefits-limitations-lambda-tasks)
+ [在工作流程中使用 Lambda 任務](#using-lambda-tasks-in-workflows)

## 關於 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 任務。

## 在工作流程中使用 Lambda 任務
<a name="using-lambda-tasks-in-workflows"></a>

若要在 Amazon SWF 工作流程中使用 Lambda 任務，您需要：

1. 設定 IAM 角色為 Amazon SWF 提供叫用 Lambda 函數的許可。

1. 將 IAM 角色連接至工作流程。

1. 在工作流程執行期間，呼叫 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:SourceAccount`值中參考`aws:SourceArn`的值和帳戶在相同政策陳述式中使用時，必須使用相同的帳戶 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** (建立角色)。

### 將 IAM 角色連接至工作流程
<a name="attach-iam-role-to-workflow"></a>

定義 IAM 角色後，您需要將其連接至將使用該角色的工作流程，以呼叫您為 Amazon SWF 提供存取權的 Lambda 函數。

有兩個地方可讓您將角色連接至工作流程：
+ 工作流程類型註冊期間。接著可能會使用此角色做為每次執行該工作流程類型的預設 Lambda 角色。
+ 重新啟動工作流程執行時。只有在此工作流程執行期間 (和整個執行期間) 才會使用此角色。

**提供工作流程類型的預設 Lambda 角色**
+ 呼叫 RegisterWorkflowType 時，請將 defaultLambdaRole 欄位設定為所定義角色的 ARN。

**提供要在工作流程執行期間使用的 Lambda 角色**
+ 呼叫 StartWorkflowExecution 時，請將 lambdaRole 欄位設定為所定義角色的 ARN。

**注意**  
如果呼叫 RegisterWorkflowType 或 StartWorkflowExecution 的帳戶不具使用指定角色的許可，則呼叫會因 OperationNotPermittedFault 而失敗。

### 從 Amazon SWF 工作流程呼叫 Lambda 函數
<a name="call-lambda-function-from-swf-workflow"></a>

您可以使用 ScheduleLambdaFunctionDecisionAttributes 資料類型，識別要在工作流程執行期間呼叫的 Lambda 函數。

在呼叫 RespondDecisionTaskCompleted 期間，將 ScheduleLambdaFunctionDecisionAttributes 提供給決策清單。例如：

```
{
  "decisions": [{
    "ScheduleLambdaFunctionDecisionAttributes": {
      "id": "lambdaTaskId",
      "name": "myLambdaFunctionName",
      "input": "inputToLambdaFunction",
      "startToCloseTimeout": "30"
    },
  }],
}
```

設定下列參數：
+ 具有 Lambda 任務識別符的 *id*。這必須是 1-256 個字元的字串，而且不得包含 : (冒號)、/ (斜線)、\$1 (垂直線) 字元、任何控制字元 (\$1u0000 - \$1u001f 和 \$1u007f - \$1u009f)，以及文字字串 `arn`。
+ 具有 Lambda 函數名稱的 *name*。您的 Amazon SWF 工作流程必須具備 IAM 角色，讓它能夠呼叫 Lambda 函數。提供的名稱必須遵循 FunctionName 參數的限制條件 (例如在「Lambda 呼叫」動作中)。
+ 具有函數之選用輸入資料的 *input*。設定時，這必須遵循 ClientContext 參數的限制條件 (例如在「Lambda 呼叫」動作中)。
+ 在任務因逾時例外狀況而失敗之前，函數能夠執行之選用最長期間 (秒) 的 *startToCloseTimeout*。NONE 值可以用來指定持續時間無限制。

如需詳細資訊，請參閱[實作 AWS Lambda 任務](https://docs.aws.amazon.com/amazonswf/latest/awsflowguide/lambda-task.html) 