本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
實作 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 角色的權限,方法是使用SourceArn
和SourceAccount
上下文鍵。這些密鑰限制 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 函數的存取權
-
開啟 Amazon IAM 主控台
。 -
選擇 Roles (角色),然後選擇 Create New Role (建立新角色)。
-
為您的角色提供名稱,例如
swf-lambda
,然後選擇 Next Step (下一步)。 -
UNDERAWS服務角色,選擇Amazon SWF,然後選擇後續步驟。
-
在連接政策屏幕上,選擇AWSLambdaRole從清單中。
-
當您檢閱好角色後,請選擇 Next Step (下一步),然後選擇 Create Role (建立角色)。
定義 IAM 角色以提供呼叫特定 Lambda 函數的存取權
如果您想要提供從您的工作流程呼叫特定 Lambda 函數的存取權,您需要定義您自己的 IAM 政策。
建立 IAM 政策以提供特定 Lambda 函數的存取權
-
開啟 Amazon IAM 主控台
。 -
選擇 Policies (政策),然後選擇 Create Policy (建立政策)。
-
選擇複製AWS托管策略,然後選取AWSLambdaRole從清單中。即會為您產生政策。您可選擇性編輯其名稱及描述,以符合您的需求。
-
在 中資源欄位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。
-
選擇 Create Policy (建立政策) 來完成您的政策建立程序。
然後您可以在建立新的 IAM 角色時選取此政策,並使用該角色授予呼叫您 Amazon SWF 工作流程的存取權。此程序與使用AWSLambdaRole政策。而是在建立角色時選擇您自己的政策。
使用您的 Lambda 策略創建 Amazon SWF 角色
-
開啟 Amazon IAM 主控台
。 -
選擇 Roles (角色),然後選擇 Create New Role (建立新角色)。
-
為您的角色提供名稱,例如
swf-lambda-function
,然後選擇 Next Step (下一步)。 -
UNDERAWS服務角色,選擇Amazon SWF,然後選擇後續步驟。
-
在連接政策窗口中,從清單中選取 Lambda 函數專用政策。
-
當您檢閱好角色後,請選擇 Next Step (下一步),然後選擇 Create Role (建立角色)。
排程 Lambda 任務以執行
當您定義好可讓您呼叫 Lambda 函數的 IAM 角色後,您就可以排程它們以執行,作為您工作流程的一部分。
注意
此程序充分證明瞭HelloLambda樣本中的AWS SDK for Java。
排程 Lambda 任務以執行
-
在您的工作流程實作中,於
DecisionContext
執行個體上呼叫getLambdaFunctionClient()
以取得LambdaFunctionClient
執行個體。// Get a LambdaFunctionClient instance DecisionContextProvider decisionProvider = new DecisionContextProviderImpl(); DecisionContext decisionContext = decisionProvider.getDecisionContext(); LambdaFunctionClient lambdaClient = decisionContext.getLambdaFunctionClient();
-
使用
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);
-
在您的工作流程執行啟動者中,使用
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 範例。