實作 AWS Lambda 任務 - AWS Flow Framework 適用於 Java

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

實作 AWS Lambda 任務

關於 AWS Lambda

AWS Lambda是一種完整受管的運算服務,可執行程式碼回應自訂程式碼產生的事件,或來自各種AWS服務,例如 Amazon S3、DynamoDB、Amazon Kinesis、Amazon SNS 和 Amazon Cognito。如需有關 Lambda 的詳細資訊,請參閱 AWS Lambda 開發人員指南

亞馬遜簡單工作流程服務提供 Lambda 任務,以讓您執行 Lambda 函數來取代傳統 Amazon SWF 活動或與之並存。

重要

您的AWS帳户將會收取 Amazon SWF 代您執行 Lambda 執行 (請求) 的費用。如需 Lambda 定價的詳細資訊,請參https://aws.amazon.com/lambda/pricing/

使用 Lambda 任務的優點和限制

使用 Lambda 任務取代傳統 Amazon SWF 活動有多項優點:

  • Lambda 任務不用像 Amazon SWF 活動類型一樣需要註冊或版本控制。

  • 您可使用您已於工作流程中定義的任何現有 Lambda 函數。

  • 會直接呼叫 Lambda 函數;有別於傳統活動的執行所需,您不需要實作工作者程式即可予以執行。

  • Lambda 為您提供用於跟蹤和分析函數執行的指標和日誌。

您還需要知道數個 Lambda 任務的相關限制:

  • Lambda 任務只能在AWS區域,為 Lambda 提供支援。請參閱Lambda 區域與端點中的Amazon Web Services 一般參考,瞭解有關 Lambda 當前支持的區域的詳細信息。

  • 目前只有基本 SWF HTTP API 和適用於 Java 的 AWS Flow Framework 支援 Lambda 任務。適用於 Ruby 的 AWS Flow Framework 目前不支援 Lambda 任務。

在您的AWS Flow Framework適用於 Java 工作流程

您需 Lambda 到三項要求才可在您的AWS Flow Framework適用於 Java 工作流程:

  • 執行的 Lambda 函數。您可以使用您已定義的任何 Lambda 函數。如需如何建立 Lambda 函數的詳細資訊,請參AWS Lambda開發人員指南

  • 是一種 IAM 角色,可提供從 Amazon SWF 工作流程執行 Lambda 函數的存取權。

  • 從您工作流程內排程 Lambda 任務的程式碼。

設定 IAM 角色

在您可以從 Amazon SWF 呼叫 Lambda 函數之前,您必須先提供能從 Amazon SWF 訪問 Lambda 的 IAM 角色。您可擇一方法:

  • 選擇一個預定義的角色,AWSLambdaRole,允許您的工作流程呼叫與您帳户相關聯的任何 Lambda 函數。

  • 定義您自己的政策和相關聯的角色將許可授予工作流程,以呼叫其 Amazon Resource Names (ARN) 指定的特定 Lambda 函數。

限制 IAM 角色的許可

您可以限制您向 Amazon SWF 提供的 IAM 角色的權限,方法是使用SourceArnSourceAccount上下文鍵。這些密鑰限制 IAM 策略的使用,以便僅從屬於指定域 ARN 的 Amazon 簡單工作流服務執行中使用。如果您同時使用兩個全域條件內容鍵,aws:SourceAccount值和aws:SourceArn當在同一政策陳述式中使用時,值必須使用相同的帳户 ID。

在下列信任政策範例中,我們使用SourceArn上下文鍵限制 IAM 服務角色僅用於屬於someDomain在帳户中,123456789012

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "swf.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:swf:*:123456789012:/domain/someDomain" } } } ] }

在下列信任政策範例中,我們使用SourceAccount上下文鍵將 IAM 服務角色限制在賬户中的 Amazon 簡單工作流服務執行中使用,123456789012

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "swf.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringLike": { "aws:SourceAccount": "123456789012" } } } ] }

向 Amazon SWF 提供呼叫任何 Lambda 角色的存取權

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

使用AWSLambdaRole授予 Amazon SWF 以呼叫 Lambda 函數的存取權
  1. 開啟 Amazon IAM 主控台

  2. 選擇 Roles (角色),然後選擇 Create New Role (建立新角色)。

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

  4. UNDERAWS服務角色,選擇Amazon SWF,然後選擇後續步驟

  5. 連接政策屏幕上,選擇AWSLambdaRole從清單中。

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

定義 IAM 角色以提供呼叫特定 Lambda 函數的存取權

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

建立 IAM 政策以提供特定 Lambda 函數的存取權
  1. 開啟 Amazon IAM 主控台

  2. 選擇 Policies (政策),然後選擇 Create Policy (建立政策)。

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

  4. 在 中資源欄位Policy Document (政策文件),添加 Lambda 函數的 ARN。例如:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": [ "arn:aws:lambda:us-east-1:111111000000:function:hello_lambda_function" ] } ] }
    注意

    有關如何在 IAM 角色中指定資源的完整説明,請參閲IAM 政策概觀使用 IAM

  5. 選擇 Create Policy (建立政策) 來完成您的政策建立程序。

然後您可以在建立新的 IAM 角色時選取此政策,並使用該角色授予呼叫您 Amazon SWF 工作流程的存取權。此程序與使用AWSLambdaRole政策。而是在建立角色時選擇您自己的政策。

使用您的 Lambda 策略創建 Amazon SWF 角色
  1. 開啟 Amazon IAM 主控台

  2. 選擇 Roles (角色),然後選擇 Create New Role (建立新角色)。

  3. 為您的角色提供名稱,例如 swf-lambda-function,然後選擇 Next Step (下一步)。

  4. UNDERAWS服務角色,選擇Amazon SWF,然後選擇後續步驟

  5. 連接政策窗口中,從清單中選取 Lambda 函數專用政策。

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

排程 Lambda 任務以執行

當您定義好可讓您呼叫 Lambda 函數的 IAM 角色後,您就可以排程它們以執行,作為您工作流程的一部分。

注意

此程序充分證明瞭HelloLambda樣本中的AWS SDK for Java。

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

    // Get a LambdaFunctionClient instance DecisionContextProvider decisionProvider = new DecisionContextProviderImpl(); DecisionContext decisionContext = decisionProvider.getDecisionContext(); LambdaFunctionClient lambdaClient = decisionContext.getLambdaFunctionClient();
  2. 使用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);
  3. 在您的工作流程執行啟動者中,使用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樣本

提供使用 Lambda 任務的工作流程實作範例,位於AWS SDK for Java。若要加以檢視及/或執行,請下載來源

如何構建和運行HelloLambda示例在自述文件中提供,其中包含AWS Flow Framework,以獲取 Java 範例。