AWS Lambda 搭配使用 AWS CloudFormation - AWS Lambda

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

AWS Lambda 搭配使用 AWS CloudFormation

在 AWS CloudFormation 範本中,您可以指定 Lambda 函數做為自訂資源的目標。在堆疊生命週期事件期間,使用自訂資源來處理參數、擷取組態值或呼叫其他 AWS 服務。

下列範例叫用在範本中其他地方定義的函數。

範例 - 自訂資源定義
Resources: primerinvoke: Type: AWS::CloudFormation::CustomResource Version: "1.0" Properties: ServiceToken: !GetAtt primer.Arn FunctionName: !Ref randomerror

服務令牌是在您建立、更新或刪除堆疊時 AWS CloudFormation 呼叫的函數的 Amazon 資源名稱 (ARN)。您還可以包含其他屬性FunctionName,例如,按原樣 AWS CloudFormation 傳遞給您的函數。

AWS CloudFormation 使用包含回呼 URL 的事件以非同步方式叫用 Lambda 函數。

範例 — AWS CloudFormation 消息事件
{ "RequestType": "Create", "ServiceToken": "arn:aws:lambda:us-east-1:123456789012:function:lambda-error-processor-primer-14ROR2T3JKU66", "ResponseURL": "https://cloudformation-custom-resource-response-useast1.s3-us-east-1.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-1%3A123456789012%3Astack/lambda-error-processor/1134083a-2608-1e91-9897-022501a2c456%7Cprimerinvoke%7C5d478078-13e9-baf0-464a-7ef285ecc786?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Expires=1555451971&Signature=28UijZePE5I4dvukKQqM%2F9Rf1o4%3D", "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/lambda-error-processor/1134083a-2608-1e91-9897-022501a2c456", "RequestId": "5d478078-13e9-baf0-464a-7ef285ecc786", "LogicalResourceId": "primerinvoke", "ResourceType": "AWS::CloudFormation::CustomResource", "ResourceProperties": { "ServiceToken": "arn:aws:lambda:us-east-1:123456789012:function:lambda-error-processor-primer-14ROR2T3JKU66", "FunctionName": "lambda-error-processor-randomerror-ZWUC391MQAJK" } }

函式負責回傳回應到回呼 URL,說明呼叫成功或失敗。如需完整的回應語法,請參閱自訂資源回應物件

範例 — AWS CloudFormation 自訂資源回應
{ "Status": "SUCCESS", "PhysicalResourceId": "2019/04/18/[$LATEST]b3d1bfc65f19ec610654e4d9b9de47a0", "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/lambda-error-processor/1134083a-2608-1e91-9897-022501a2c456", "RequestId": "5d478078-13e9-baf0-464a-7ef285ecc786", "LogicalResourceId": "primerinvoke" }

AWS CloudFormation 提供一個名cfn-response為處理發送響應的庫。如果您在範本中定義函數,則可以依名稱要求資源庫。 AWS CloudFormation 然後將程式庫新增至為函數建立的部署套件。

如果自訂資源使用的函數已連接彈性網路介面,則請將下列資源新增至 VPC 政策,其中 region 是函數所在的區域 (不含破折號)。例如,us-east-1useast1。這將允許自定義資源響應將信號發回到 AWS CloudFormation 堆棧的回調 URL。

arn:aws:s3:::cloudformation-custom-resource-response-region", "arn:aws:s3:::cloudformation-custom-resource-response-region/*",

下列的範例函式會叫用第二個函式。如果呼叫成功,函式會傳送成功回應 AWS CloudFormation,而堆疊更新會繼續進行。範本使用提供的AWS::Serverless::Function資源類型 AWS Serverless Application Model。

範例 -自定義資源功能
Transform: 'AWS::Serverless-2016-10-31' Resources: primer: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs16.x InlineCode: | var aws = require('aws-sdk'); var response = require('cfn-response'); exports.handler = function(event, context) { // For Delete requests, immediately send a SUCCESS response. if (event.RequestType == "Delete") { response.send(event, context, "SUCCESS"); return; } var responseStatus = "FAILED"; var responseData = {}; var functionName = event.ResourceProperties.FunctionName var lambda = new aws.Lambda(); lambda.invoke({ FunctionName: functionName }, function(err, invokeResult) { if (err) { responseData = {Error: "Invoke call failed"}; console.log(responseData.Error + ":\n", err); } else responseStatus = "SUCCESS"; response.send(event, context, responseStatus, responseData); }); }; Description: Invoke a function to create a log stream. MemorySize: 128 Timeout: 8 Role: !GetAtt role.Arn Tracing: Active

如果自定義資源調用的函數未在模板中定義,則可以cfn-response從用戶指南的 cfn-response 模塊中獲取源代碼。 AWS CloudFormation

如需自訂資源的詳細資訊,請參閱 AWS CloudFormation 使用者指南中的自訂資源