搭配使用 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 Resource Name (ARN) 。您也可以加入更多屬性,例如 AWS CloudFormation 原樣傳遞至您函式的 FunctionName

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。

範例 error-processor/template.yml - 自訂資源函數
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

如果自訂資源叫用的函數沒有在範本中定義,可從《AWS CloudFormation 使用者指南》中的 cfn-response 模組取得 cfn-response 的原始碼。

如需使用自訂資源,確保函數的日誌群組已建立後,再讓其他資源以該群組為基礎的範例應用程式,請參閱 適用於 AWS Lambda 的錯誤處理器範例應用程式

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