Uso di AWS Lambda con CloudFormation
In un modello AWS CloudFormation, puoi specificare una funzione Lambda come target di una risorsa personalizzata. Utilizza risorse personalizzate per elaborare parametri, recuperare valori di configurazioni o chiamare altri Servizi AWS durante gli eventi del ciclo di vita dello stack.
L'esempio seguente invoca una funzione definita in un altro punto del modello.
Esempio – Definizione di risorse personalizzate
Resources: primerinvoke: Type: AWS::CloudFormation::CustomResource Version: "1.0" Properties:ServiceToken: !GetAtt primer.Arn FunctionName: !Ref randomerror
Il token del servizio è l'Amazon Resource Name (ARN) della funzione che CloudFormation invoca quando crei, aggiorni o elimini lo stack. Puoi anche includere proprietà aggiuntive come FunctionName, che CloudFormation passa alla funzione senza modifiche.
CloudFormation richiama la funzione Lambda in modo asincrono con un evento che include un URL di callback.
Esempio –CloudFormation Evento messaggio di
{ "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" } }
Da questa funzione dipende la risposta all'URL di callback che indica un esito positivo o negativo. Per la sintassi di risposta completa, consulta Oggetti di risposta delle risorse personalizzate.
Esempio –CloudFormation Risposta della risorsa personalizzata
{ "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 offre una libreria chiamata cfn-response che gestisce l'invio della risposta. Se definisci la funzione all'interno di un modello, puoi richiamare la libreria per nome. CloudFormation quindi aggiunge la libreria al pacchetto di distribuzione che crea per la funzione.
Se alla funzione utilizzata da una risorsa personalizzata è collegata un'interfaccia di rete elastica, aggiungi le seguenti risorse alla policy VPC, dove region è la regione in cui si trova la funzione senza i trattini. Ad esempio, us-east-1 è useast1. Ciò consentirà alla risorsa personalizzata di rispondere all'URL di callback che restituisce un segnale allo stack CloudFormation.
arn:aws:s3:::cloudformation-custom-resource-response-region", "arn:aws:s3:::cloudformation-custom-resource-response-region/*",
La seguente funzione di esempio invoca una seconda funzione. Se la chiamata ha esito positivo, la funzione invia una risposta positiva a CloudFormation e l'aggiornamento dello stack prosegue. Il modello utilizza il tipo di risorsa AWS::Serverless::Function fornito da AWS Serverless Application Model.
Esempio : funzione relativa alle risorse personalizzate
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
Se la funzione che la risorsa personalizzata invoca non è definita in un modello, è possibile ottenere il codice sorgente di cfn-response dal modulo cfn-response nella Guida per l'utente di AWS CloudFormation.
Per ulteriori informazioni sulle risorse personalizzate, consulta Risorse personalizzate nella Guida per l'utente di AWS CloudFormation.