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.
Démonstration : créer un mécanisme de délai avec une ressource personnalisée prise en charge par Lambda
Cette procédure pas à pas vous explique comment configurer et lancer une ressource personnalisée basée sur Lambda à l'aide d'un exemple de modèle. CloudFormation Ce modèle crée un mécanisme de délai qui suspend les déploiements de pile pendant une durée spécifiée. Cela peut être utile lorsque vous devez introduire des délais délibérés pendant l’approvisionnement en ressources, par exemple lorsque vous attendez que les ressources se stabilisent avant de créer des ressources dépendantes.
Note
Alors que les ressources personnalisées soutenues par Lambda étaient auparavant recommandées pour récupérer les AMI IDs, nous recommandons désormais d'utiliser des paramètres. AWS Systems Manager Cette approche rend vos modèles plus réutilisables et plus faciles à maintenir. Pour de plus amples informations, veuillez consulter Obtenir une valeur en texte brut depuis le magasin de paramètres Systems Manager.
Rubriques
Aperçu
Le modèle de pile utilisé dans cette démonstration crée une ressource personnalisée basée sur Lambda. Cette ressource personnalisée introduit un délai configurable (60 secondes par défaut) pendant la création de la pile. Le délai se produit pendant les mises à jour de la pile uniquement lorsque les propriétés de la ressource personnalisée sont modifiées.
Le modèle provisionne les ressources suivantes :
-
une ressource personnalisée,
-
une fonction Lambda, et
-
un rôle IAM qui permet à Lambda d'écrire des journaux dans. CloudWatch
Il définit également deux sorties :
-
Le temps réel pendant lequel la fonction a attendu.
-
Un identifiant unique généré lors de chaque exécution de la fonction Lambda.
Note
CloudFormation est un service gratuit, mais Lambda facture en fonction du nombre de requêtes pour vos fonctions et de la durée d'exécution de votre code. Pour plus d’informations sur la tarification Lambda, consultez Tarification AWS Lambda
Exemple de modèle
Vous pouvez consulter le modèle de ressource personnalisée prise en charge par Lambda avec le mécanisme de délai ci-dessous :
JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "LambdaExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Statement": [{ "Effect": "Allow", "Principal": { "Service": ["lambda.amazonaws.com"] }, "Action": ["sts:AssumeRole"] }] }, "Path": "/", "Policies": [{ "PolicyName": "AllowLogs", "PolicyDocument": { "Statement": [{ "Effect": "Allow", "Action": ["logs:*"], "Resource": "*" }] } }] } }, "CFNWaiter": { "Type": "AWS::Lambda::Function", "Properties": { "Handler": "index.handler", "Runtime": "python3.9", "Timeout": 900, "Role": { "Fn::GetAtt": ["LambdaExecutionRole", "Arn"] }, "Code": { "ZipFile": { "Fn::Join": ["\n", [ "from time import sleep", "import json", "import cfnresponse", "import uuid", "", "def handler(event, context):", " wait_seconds = 0", " id = str(uuid.uuid1())", " if event[\"RequestType\"] in [\"Create\", \"Update\"]:", " wait_seconds = int(event[\"ResourceProperties\"].get(\"ServiceTimeout\", 0))", " sleep(wait_seconds)", " response = {", " \"TimeWaited\": wait_seconds,", " \"Id\": id ", " }", " cfnresponse.send(event, context, cfnresponse.SUCCESS, response, \"Waiter-\"+id)" ]]} } } }, "CFNWaiterCustomResource": { "Type": "AWS::CloudFormation::CustomResource", "Properties": { "ServiceToken": { "Fn::GetAtt": ["CFNWaiter", "Arn"] }, "ServiceTimeout": 60 } } }, "Outputs": { "TimeWaited": { "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "TimeWaited"] }, "Export": { "Name": "TimeWaited" } }, "WaiterId": { "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "Id"] }, "Export": { "Name": "WaiterId" } } } }
YAML
AWSTemplateFormatVersion: "2010-09-09" Resources: LambdaExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: "Allow" Principal: Service: - "lambda.amazonaws.com" Action: - "sts:AssumeRole" Path: "/" Policies: - PolicyName: "AllowLogs" PolicyDocument: Statement: - Effect: "Allow" Action: - "logs:*" Resource: "*" CFNWaiter: Type: AWS::Lambda::Function Properties: Handler: index.handler Runtime: python3.9 Timeout: 900 Role: !GetAtt LambdaExecutionRole.Arn Code: ZipFile: !Sub | from time import sleep import json import cfnresponse import uuid def handler(event, context): wait_seconds = 0 id = str(uuid.uuid1()) if event["RequestType"] in ["Create", "Update"]: wait_seconds = int(event["ResourceProperties"].get("ServiceTimeout", 0)) sleep(wait_seconds) response = { "TimeWaited": wait_seconds, "Id": id } cfnresponse.send(event, context, cfnresponse.SUCCESS, response, "Waiter-"+id) CFNWaiterCustomResource: Type: "AWS::CloudFormation::CustomResource" Properties: ServiceToken: !GetAtt CFNWaiter.Arn ServiceTimeout: 60 Outputs: TimeWaited: Value: !GetAtt CFNWaiterCustomResource.TimeWaited Export: Name: TimeWaited WaiterId: Value: !GetAtt CFNWaiterCustomResource.Id Export: Name: WaiterId
Démonstration du modèle d’exemple
Les extraits suivants expliquent les parties pertinentes du modèle d’exemple afin de vous aider à comprendre comment la fonction Lambda est associée à une ressource personnalisée et à comprendre la sortie.
- AWS::Lambda::Functionressource
CFNWaiter -
La ressource
AWS::Lambda::Functionspécifie le code source de la fonction, le nom du gestionnaire, l’environnement d’exécution et le rôle d’exécution Amazon Resource Name (ARN).La propriété
Handlerest définie surindex.handlercar elle utilise un code source Python. Pour plus d'informations sur les identifiants de gestionnaire acceptés lors de l'utilisation de codes source de fonctions en ligne, consultez Code. AWS::Lambda::FunctionLa propriété
Runtimeest définie surpython3.9car le fichier source est un code Python.La propriété
Timeoutest définie sur 900 secondes.La propriété
Roleutilise la fonctionFn::GetAttpour obtenir l’ARN du rôle d’exécutionLambdaExecutionRoledéclaré dans la ressourceAWS::IAM::Roledu modèle.La propriété
Codedéfinit le code de la fonction en ligne à l’aide d’une fonction Python. La fonction Python du modèle d’exemple effectue les opérations suivantes :-
Créer un ID unique à l’aide de l’UUID
-
Vérifier si la demande est une demande de création ou de mise à jour
-
Mettre en veille pendant la durée spécifiée pour
ServiceTimeoutpendant les demandesCreateouUpdate -
Renvoyer le temps d’attente et l’ID unique
-
JSON
... "CFNWaiter": { "Type": "AWS::Lambda::Function", "Properties": { "Handler": "index.handler", "Runtime": "python3.9", "Timeout": 900, "Role": { "Fn::GetAtt": ["LambdaExecutionRole", "Arn"] }, "Code": { "ZipFile": { "Fn::Join": ["\n", [ "from time import sleep", "import json", "import cfnresponse", "import uuid", "", "def handler(event, context):", " wait_seconds = 0", " id = str(uuid.uuid1())", " if event[\"RequestType\"] in [\"Create\", \"Update\"]:", " wait_seconds = int(event[\"ResourceProperties\"].get(\"ServiceTimeout\", 0))", " sleep(wait_seconds)", " response = {", " \"TimeWaited\": wait_seconds,", " \"Id\": id ", " }", " cfnresponse.send(event, context, cfnresponse.SUCCESS, response, \"Waiter-\"+id)" ]]} } } }, ...
YAML
... CFNWaiter: Type: AWS::Lambda::Function Properties: Handler: index.handler Runtime: python3.9 Timeout: 900 Role: !GetAtt LambdaExecutionRole.Arn Code: ZipFile: !Sub | from time import sleep import json import cfnresponse import uuid def handler(event, context): wait_seconds = 0 id = str(uuid.uuid1()) if event["RequestType"] in ["Create", "Update"]: wait_seconds = int(event["ResourceProperties"].get("ServiceTimeout", 0)) sleep(wait_seconds) response = { "TimeWaited": wait_seconds, "Id": id } cfnresponse.send(event, context, cfnresponse.SUCCESS, response, "Waiter-"+id) ...
- AWS::IAM::Roleressource
LambdaExecutionRole -
La ressource
AWS::IAM:Rolecrée un rôle d’exécution pour la fonction Lambda, qui inclut une politique d’assomption de rôle permettant à Lambda de l’utiliser. Il contient également une politique autorisant l'accès aux CloudWatch journaux.
JSON
... "LambdaExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Statement": [{ "Effect": "Allow", "Principal": { "Service": ["lambda.amazonaws.com"] }, "Action": ["sts:AssumeRole"] }] }, "Path": "/", "Policies": [{ "PolicyName": "AllowLogs", "PolicyDocument": { "Statement": [{ "Effect": "Allow", "Action": ["logs:*"], "Resource": "*" }] } }] } }, ...
YAML
... LambdaExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: "Allow" Principal: Service: - "lambda.amazonaws.com" Action: - "sts:AssumeRole" Path: "/" Policies: - PolicyName: "AllowLogs" PolicyDocument: Statement: - Effect: "Allow" Action: - "logs:*" Resource: "*" ...
- AWS::CloudFormation::CustomResourceressource
CFNWaiterCustomResource -
La ressource personnalisée est liée à la fonction Lambda avec son ARN à l’aide de
!GetAtt CFNWaiter.Arn. Elle mettra en œuvre un temps d’attente de 60 secondes pour les opérations de création et de mise à jour, comme défini dansServiceTimeout. La ressource ne sera invoquée pour une opération de mise à jour que si les propriétés sont modifiées.
JSON
... "CFNWaiterCustomResource": { "Type": "AWS::CloudFormation::CustomResource", "Properties": { "ServiceToken": { "Fn::GetAtt": ["CFNWaiter", "Arn"] }, "ServiceTimeout": 60 } } }, ...
YAML
... CFNWaiterCustomResource: Type: "AWS::CloudFormation::CustomResource" Properties: ServiceToken: !GetAtt CFNWaiter.Arn ServiceTimeout: 60 ...
Outputs-
Les
Outputsde ce modèle sont lesTimeWaitedet lesWaiterId. La valeurTimeWaitedutilise une fonctionFn::GetAttpour fournir le temps d’attente réel de la ressource. LeWaiterIdutilise une fonctionFn::GetAttpour fournir l’ID unique qui a été généré et associé à l’exécution.
JSON
... "Outputs": { "TimeWaited": { "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "TimeWaited"] }, "Export": { "Name": "TimeWaited" } }, "WaiterId": { "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "Id"] }, "Export": { "Name": "WaiterId" } } } } ...
YAML
... Outputs: TimeWaited: Value: !GetAtt CFNWaiterCustomResource.TimeWaited Export: Name: TimeWaited WaiterId: Value: !GetAtt CFNWaiterCustomResource.Id Export: Name: WaiterId ...
Prérequis
Vous devez disposer des autorisations IAM pour utiliser tous les services correspondants, tels que CloudFormation Lambda et.
Lancement de la pile
Pour créer la pile
-
Recherchez le modèle de votre choix (YAML ou JSON) dans la section Exemple de modèle et enregistrez-le sur votre ordinateur sous le nom
samplelambdabackedcustomresource.template. -
Ouvrez la CloudFormation console à l'adresse https://console.aws.amazon.com/cloudformation/
. -
Depuis la page CloudFormation, choisissez Piles, puis Créer une pile avec de nouvelles ressources (standard).
-
Pour la Condition préalable – Préparer le modèle, sélectionnez Choisir un modèle existant.
-
Pour Spécifier le modèle, sélectionnez Charger un fichier modèle, puis Choisir un fichier.
-
Sélectionnez le fichier de modèle
samplelambdabackedcustomresource.templateque vous avez enregistré précédemment. -
Choisissez Suivant.
-
Pour Nom de la pile, saisissez
SampleCustomResourceStacket sélectionnez Suivant. -
Dans cette procédure détaillée, vous n'avez pas besoin d'ajouter des balises ni de spécifier des paramètres avancés. Dès lors, cliquez sur Suivant.
-
Vérifiez que le nom de la pile est correct, puis sélectionnez Créer.
La création de votre pile peut prendre plusieurs minutes. CloudFormation Pour surveiller la progression, affichez les événements de la pile. Pour de plus amples informations, veuillez consulter Affichage des informations d’une pile à partir de la console CloudFormation.
Si la création de la pile réussit, toutes les ressources de la pile, telles que la fonction Lambda et la ressource personnalisée, ont été créées. Vous avez utilisé avec succès une fonction Lambda et une ressource personnalisée.
Si la fonction Lambda renvoie une erreur, consultez les journaux de la fonction dans la console CloudWatch Logs.
Nettoyage des ressources
Supprimez la pile pour nettoyer toutes les ressources que vous y avez créées et pour éviter d'être facturé pour des ressources que vous n'utilisez pas.
Pour supprimer la pile
-
Dans la CloudFormation console, choisissez la SampleCustomResourceStackpile.
-
Choisissez Actions, puis Supprimer la pile.
-
Dans le message de confirmation, choisissez Oui, supprimer.
Toutes les ressources que vous avez créées seront supprimées.
Maintenant que vous comprenez comment créer et utiliser une ressource personnalisée prise en charge par Lambda, vous pouvez utiliser le modèle et le code d’exemple de cette démonstration pour créer et tester d’autres piles et fonctions.