Usar o AWS Lambda com o CloudFormation - AWS Lambda

Usar o AWS Lambda com o CloudFormation

Em um modelo do AWS CloudFormation, você pode especificar uma função do Lambda como o destino de um recurso personalizado. Use recursos personalizados para processar parâmetros, recuperar valores de configurações ou chamar outros Serviços da AWS durante eventos de ciclo de vida da pilha.

O exemplo a seguir invoca uma função que foi definida em outro lugar do modelo.

exemplo– Definição de recurso personalizado
Resources: primerinvoke: Type: AWS::CloudFormation::CustomResource Version: "1.0" Properties: ServiceToken: !GetAtt primer.Arn FunctionName: !Ref randomerror

O token do serviço é o nome de recurso da Amazon (ARN) da função que o CloudFormation invoca quando você cria, atualiza ou exclui a pilha. Você também pode incluir propriedades, como FunctionName, que o CloudFormation transmite à sua função como está.

O CloudFormation invoca a função do Lambda de forma assíncrona com um evento que inclui um URL de retorno de chamada.

exemplo– Evento de mensagem do 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" } }

A função é responsável por retornar uma resposta ao URL de retorno que indica êxito ou falha. Para sintaxe de resposta completa, consulte Objetos de resposta de recursos personalizados.

exemplo– Resposta de recursos personalizados do 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" }

O CloudFormation fornece uma biblioteca chamada cfn-response que lida com o envio da resposta. Se definir a função dentro de um modelo, você poderá exigir a biblioteca pelo nome. O CloudFormation adiciona a biblioteca ao pacote de implantação que cria para a função.

Se sua função usada por um recurso personalizado tiver uma interface de rede elástica vinculada a ela, adicione os recursos a seguir à política da VPC, onde region é a região em que a função está, sem os traços. Por exemplo, us-east-1 é useast1. Isso permitirá que o recurso personalizado responda ao URL de retorno de chamada que envia um sinal de volta para a pilha do CloudFormation.

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

O exemplo a seguir invoca uma segunda função. Se a chamada tiver êxito, a função enviará uma resposta de êxito ao CloudFormation e a atualização da pilha continuará. O modelo usa o tipo de recurso AWS::Serverless::Function fornecido pelo AWS Serverless Application Model.

exemplo– Função de recurso personalizado
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 a função que o recurso personalizado invocar não estiver definida em um modelo, você poderá obter o código fonte para o cfn-response no módulo cfn-response no Manual do usuário do AWS CloudFormation.

Para obter mais informações sobre recursos personalizados, consulte Recursos personalizadosno Guia do usuário do AWS CloudFormation.