Utilisation d’AWS Lambda avec AWS CloudFormation - AWS Lambda

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation d’AWS Lambda avec AWS CloudFormation

Dans un modèle AWS CloudFormation, vous pouvez spécifier une fonction Lambda comme cible pour une ressource personnalisée. Utilisez des ressources personnalisées pour traiter les paramètres, récupérer des valeurs de configuration ou appeler d’autres services AWS lors d’événements du cycle de vie de la pile.

L’exemple suivant appelle une fonction qui est définie ailleurs dans le modèle.

Exemple – Définition de ressource personnalisée
Resources: primerinvoke: Type: AWS::CloudFormation::CustomResource Version: "1.0" Properties: ServiceToken: !GetAtt primer.Arn FunctionName: !Ref randomerror

Le jeton de service est l’Amazon Resource Name (ARN) de la fonction appelée par AWS CloudFormation lorsque vous créez, mettez à jour ou supprimez la pile. Vous pouvez également inclure des propriétés supplémentaires comme FunctionName, transmises par AWS CloudFormation à votre fonction en l’état.

AWS CloudFormation appelle votre fonction Lambda de façon asynchrone avec un événement qui inclut une URL de rappel.

Exemple – Événement de message 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 fonction se charge de renvoyer à l’URL de rappel une réponse indiquant le succès ou l’échec. Pour obtenir la syntaxe de réponse complète, consultez Objets de réponse des ressources personnalisées.

Exemple – AWS CloudFormation Réponse de ressource personnalisée
{ "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 fournit une bibliothèque appelée cfn-response qui traite l’envoi de la réponse. Si vous définissez votre fonction au sein d’un modèle, vous pouvez demander la bibliothèque par son nom. AWS CloudFormation ajoute alors la bibliothèque au package de déploiement qu’il crée pour la fonction.

Si votre fonction qu'une ressource personnalisée utilise possède une interface réseau Elastic qui lui est associée, ajoutez les ressources suivantes à la politique VPC où region est la région dans laquelle se trouve la fonction sans les tirets. Par exemple, us-east-1 est useast1. Cela permettra à la ressource personnalisée de répondre à l'URL de rappel qui envoie un signal à la pile AWS CloudFormation.

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

L’exemple de fonction suivant appelle une deuxième fonction. Si l’appel aboutit, la fonction envoie une réponse de réussite à AWS CloudFormation et la mise à jour de la pile continue. Le modèle utilise le type de AWS::Serverless::Functionressource fourni parAWS Serverless Application Model.

Exemple error-processor/template.yml – Fonction de ressource personnalisée
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 fonction appelée par la ressource personnalisée n’est pas définie dans un modèle, vous pouvez obtenir le code source pour cfn-response à partir de Module cfn-response dans le Guide de l'utilisateur AWS CloudFormation.

Pour obtenir un exemple d’application qui utilise une ressource personnalisée pour s’assurer que le groupe de journaux d’une fonction est créé avant la ressource qui en dépend, veuillez consulter Exemple d'application du processeur d'erreurs pour AWS Lambda.

Pour plus d'informations sur les ressources personnalisées, consultez Ressources personnalisées dans le Guide de l'utilisateur AWS CloudFormation.