Verwenden von AWS Lambda mit CloudFormation
In einer AWS CloudFormation-Vorlage können Sie eine Lambda-Funktion als Ziel einer benutzerdefinierten Ressource angeben. Mittels benutzerdefinierter Ressourcen können Sie Parameter verarbeiten, Konfigurationswerte abrufen oder während Stack-Lebenszyklusereignissen andere AWS-Services aufrufen.
Das folgende Beispiel ruft eine Funktion auf, die an anderer Stelle in der Vorlage definiert ist.
Beispiel – benutzerdefinierte Ressourcendefinition
Resources: primerinvoke: Type: AWS::CloudFormation::CustomResource Version: "1.0" Properties:ServiceToken: !GetAtt primer.Arn FunctionName: !Ref randomerror
Das Service-Token ist der Amazon-Ressourcenname (ARN) der Funktion, die von CloudFormation aufgerufen wird, wenn Sie den Stack erstellen, aktualisieren oder löschen. Sie können auch zusätzliche Eigenschaften wie FunctionName einschließen, die von CloudFormation unverändert an Ihre Funktion übergeben werden.
CloudFormation ruft Ihre Lambda-Funktion asynchron mit einem Ereignis mit einer Callback-URL auf.
Beispiel – CloudFormation-Nachrichtenereignis
{ "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" } }
Die Funktion ist für die Rückgabe einer Antwort an die Rückruf-URL zuständig, die Erfolg oder Misserfolg bedeutet. Die vollständige Antwortsyntax finden Sie unter Benutzerdefinierte Ressourcenantwortobjekte.
Beispiel – CloudFormation benutzerdefinierte -Ressourcenantwort
{ "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" }
CloudFormation bietet eine Bibliothek mit dem Namen cfn-response, die das Senden der Antwort bearbeitet. Wenn Sie Ihre Funktion in einer Vorlage definieren, können Sie die Bibliothek nach Namen anfordern. CloudFormation fügt die Bibliothek dann dem Bereitstellungspaket hinzu, das es für die Funktion erstellt.
Wenn Ihre Funktion, die eine benutzerdefinierte Ressource verwendet, mit einer Elastic Network Interface verbunden ist, fügen Sie die folgenden Ressourcen zur VPC-Richtlinie hinzu, wobei region die Region ist, in der sich die Funktion befindet, ohne Bindestriche angegeben ist. Zum Beispie, us-east-1 ist useast1. Dadurch kann die benutzerdefinierte Ressource auf die Callback-URL reagieren, die ein Signal zurück an den CloudFormation-Stack sendet.
arn:aws:s3:::cloudformation-custom-resource-response-region", "arn:aws:s3:::cloudformation-custom-resource-response-region/*",
Die folgende Beispielfunktion ruft eine zweite Funktion auf. Wenn der Aufruf erfolgreich ist, sendet die Funktion eine entsprechende Antwort an CloudFormation, und die Stack-Aktualisierung wird fortgesetzt. Die Vorlage verwendet den Ressourcentyp AWS::Serverless::Function, der von AWS Serverless Application Model bereitgestellt wird.
Beispiel – Benutzerdefinierte Ressourcenfunktion
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
Wenn die von der benutzerdefinierten Ressource aufgerufene Funktion in keiner Vorlage definiert ist, können Sie den Quellcode für cfn-response dem cfn-response-Modul im AWS CloudFormation-Benutzerhandbuch entnehmen.
Weitere Informationen zu benutzerdefinierten Ressourcen finden Sie unter Benutzerdefinierte Ressourcen im AWS CloudFormation-Benutzerhandbuch.