Uso de AWS Lambda con AWS CloudFormation - AWS Lambda

Uso de AWS Lambda con AWS CloudFormation

En una plantilla de AWS CloudFormation puede especificar una función de Lambda como destino de un recurso personalizado. Utilice los recursos personalizados para procesar parámetros, recuperar valores de configuración o llamar a otros servicios de AWS durante los eventos del ciclo de vida de la pila.

El ejemplo siguiente invoca una función definida en otra parte de la plantilla.

ejemplo - Definición de recurso personalizado

Resources: primerinvoke: Type: AWS::CloudFormation::CustomResource Version: "1.0" Properties: ServiceToken: !GetAtt primer.Arn FunctionName: !Ref randomerror

El token de servicio es el Nombre de recurso de Amazon (ARN) de la función que AWS CloudFormation invoca al crear, actualizar o eliminar la pila. También puede incluir propiedades adicionales como FunctionName, que AWS CloudFormation pasa a su función tal cual.

AWS CloudFormation invoca la función de Lambda de forma asíncrona con un evento que incluye una URL de devolución de llamada.

ejemplo - Evento de mensaje de AWS CloudFormation

{ "RequestType": "Create", "ServiceToken": "arn:aws:lambda:us-east-2:123456789012:function:lambda-error-processor-primer-14ROR2T3JKU66", "ResponseURL": "https://cloudformation-custom-resource-response-useast2.s3-us-east-2.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-2%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-2: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-2:123456789012:function:lambda-error-processor-primer-14ROR2T3JKU66", "FunctionName": "lambda-error-processor-randomerror-ZWUC391MQAJK" } }

La función es responsable de devolver una respuesta a la URL de devolución de llamada que indica el éxito o el error de la operación. Para ver la sintaxis de respuesta completa, consulte Objetos de respuesta de recursos personalizados.

ejemplo - Respuesta de recursos personalizados de AWS CloudFormation

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

AWS CloudFormation proporciona una biblioteca llamada cfn-response que controla el envío de la respuesta. Si define su función dentro de una plantilla, puede solicitar la biblioteca por nombre. A continuación, AWS CloudFormation añade la biblioteca al paquete de implementación que crea para la función.

La función de ejemplo siguiente invoca una segunda función. Si la llamada se realiza sin error, la función envía una respuesta de operación correcta a AWS CloudFormation y la actualización de la pila continúa. La plantilla utiliza el tipo de recurso AWS::Serverless::Function proporcionado por AWS Serverless Application Model.

ejemplo error-processor/template.yml: función de recurso personalizado

Transform: 'AWS::Serverless-2016-10-31' Resources: primer: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs12.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

Si la función que el recurso personalizado invoca no está definida en una plantilla, puede obtener el código fuente de cfn-response desde el módulo cfn-response en la Guía del usuario de AWS CloudFormation .

Para ver una aplicación de ejemplo que utiliza un recurso personalizado para asegurarse de que el grupo de registros de una función se crea antes que un recurso dependiente, consulte Aplicación de ejemplo de procesamiento de errores para AWS Lambda.

Para obtener más información sobre los recursos personalizados, consulte Recursos personalizados en la Guía del usuario de AWS CloudFormation .