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-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" } }

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-1: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.

Si la función que utiliza un recurso personalizado tiene asociada una interfaz de red elástica, agregue los siguientes recursos a la política de VPC, donde region es la región en la que se encuentra la función, sin guiones. Por ejemplo, us-east-1 es useast1. Esto permitirá que el recurso personalizado responda a la URL de devolución de llamada que envía una señal de vuelta a la pila de AWS CloudFormation.

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

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 -Función de recursos personalizados
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

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 obtener más información sobre los recursos personalizados, consulte Recursos personalizados en la Guía del usuario de AWS CloudFormation.