Divisez un modèle en pièces réutilisables à l'aide de piles imbriquées - AWS CloudFormation

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.

Divisez un modèle en pièces réutilisables à l'aide de piles imbriquées

Au fur et à mesure que votre infrastructure se développe, vous risquez de créer à plusieurs reprises des configurations de ressources identiques sur plusieurs modèles. Pour éviter cette redondance, vous pouvez séparer ces configurations courantes dans des modèles dédiés. Vous pouvez ensuite utiliser la AWS::CloudFormation::Stackressource dans d'autres modèles pour référencer ces modèles dédiés, en créant des piles imbriquées.

Supposons, par exemple, que vous utilisiez une configuration d'équilibreur de charge pour la plupart de vos piles. Au lieu de copier et coller les mêmes configurations dans vos modèles, vous pouvez créer un modèle dédié pour l'équilibreur de charge. Vous pouvez ensuite référencer ce modèle à partir d'autres modèles qui nécessitent la même configuration d'équilibreur de charge.

Les piles imbriquées peuvent elles-mêmes contenir d'autres piles imbriquées, ce qui donne lieu à une hiérarchie de piles, comme le montre le schéma ci-dessous. La pile racine est la pile de niveau supérieur à laquelle toutes les piles imbriquées appartiennent en fin de compte. Chaque pile imbriquée possède une pile parent immédiate. Pour le premier niveau de piles imbriquées, la pile racine est également la pile parent.

  • La pile A est la pile racine de toutes les autres piles, imbriquées, dans la hiérarchie.

  • Pour la pile B, la pile A est à la fois la pile parent et la pile racine.

  • Pour la pile D, la pile C est la pile parent, tandis que pour la pile C, la pile B est la pile parent.

Les piles imbriquées, qui sont créées dans le cadre d'une autre pile, ont une pile parent directe et une pile racine au premier niveau.

Exemple de fractionnement d'un modèle avant et après

Cet exemple montre comment vous pouvez prendre un CloudFormation modèle unique de grande taille et le réorganiser en un design plus structuré et réutilisable à l'aide de modèles imbriqués. Dans un premier temps, le modèle « Before nesting stacks » affiche toutes les ressources définies dans un seul fichier. Cela peut devenir compliqué et difficile à gérer à mesure que le nombre de ressources augmente. Le modèle « After nesting Stacks » divise les ressources en modèles distincts plus petits. Chaque pile imbriquée gère un ensemble spécifique de ressources connexes, ce qui rend la structure globale plus organisée et plus facile à gérer.

Avant la nidification, piles

Après la nidification, des piles

AWSTemplateFormatVersion: 2010-09-09 Parameters: InstanceType: Type: String Default: t2.micro Description: The EC2 instance type Environment: Type: String Default: Production Description: The deployment environment Resources: MyEC2Instance: Type: AWS::EC2::Instance Properties: ImageId: ami-1234567890abcdef0 InstanceType: !Ref InstanceType MyS3Bucket: Type: AWS::S3::Bucket
AWSTemplateFormatVersion: 2010-09-09 Resources: MyFirstNestedStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: https://s3.amazonaws.com/amzn-s3-demo-bucket/first-nested-stack.yaml Parameters: # Pass parameters to the nested stack if needed InstanceType: t3.micro MySecondNestedStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: https://s3.amazonaws.com/amzn-s3-demo-bucket/second-nested-stack.yaml Parameters: # Pass parameters to the nested stack if needed Environment: Testing DependsOn: MyFirstNestedStack

Exemple d'architecture à pile imbriquée

Cette section présente une architecture de pile imbriquée composée d'une pile de niveau supérieur faisant référence à une pile imbriquée. La pile imbriquée déploie une fonction Lambda Node.js, reçoit une valeur de paramètre de la pile de niveau supérieur et renvoie une sortie qui est exposée via la pile de niveau supérieur.

Étape 1 : créer un modèle pour la pile imbriquée sur votre système local

L'exemple suivant montre le format du modèle de pile imbriquée.

YAML

AWSTemplateFormatVersion: 2010-09-09 Description: Nested stack template for Lambda function deployment Parameters: MemorySize: Type: Number Default: 128 MinValue: 128 MaxValue: 10240 Description: Lambda function memory allocation (128-10240 MB) Resources: LambdaFunction: Type: AWS::Lambda::Function Properties: FunctionName: !Sub "${AWS::StackName}-Function" Runtime: nodejs18.x Handler: index.handler Role: !GetAtt LambdaExecutionRole.Arn Code: ZipFile: | exports.handler = async (event) => { return { statusCode: 200, body: JSON.stringify('Hello from Lambda!') }; }; MemorySize: !Ref MemorySize LambdaExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole' Outputs: LambdaArn: Description: ARN of the created Lambda function Value: !GetAtt LambdaFunction.Arn

Étape 2 : créer un modèle pour la pile de niveau supérieur sur votre système local

L'exemple suivant montre le format du modèle de pile de niveau supérieur et la AWS::CloudFormation::Stackressource qui fait référence à la pile que vous avez créée à l'étape précédente.

YAML

AWSTemplateFormatVersion: 2010-09-09 Description: Top-level stack template that deploys a nested stack Resources: NestedStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: /path_to_template/nested-template.yaml Parameters: MemorySize: 256 Outputs: NestedStackLambdaArn: Description: ARN of the Lambda function from nested stack Value: !GetAtt NestedStack.Outputs.LambdaArn

Étape 3 : Package et déploiement des modèles

Note

Lorsque vous travaillez avec des modèles localement, la AWS CLI package commande peut vous aider à préparer les modèles pour le déploiement. Il gère automatiquement le téléchargement des artefacts locaux vers Amazon S3 (y comprisTemplateURL) et génère un nouveau fichier modèle avec des références mises à jour à ces emplacements S3. Pour de plus amples informations, veuillez consulter Téléchargez des artefacts locaux dans un compartiment S3 à l'aide du AWS CLI.

Ensuite, vous pouvez utiliser la packagecommande pour télécharger le modèle imbriqué dans un compartiment Amazon S3.

aws cloudformation package \ --s3-bucket amzn-s3-demo-bucket \ --template /path_to_template/top-level-template.yaml \ --output-template-file packaged-template.yaml \ --output json

La commande génère un nouveau modèle sur le chemin spécifié par--output-template-file. Il remplace la TemplateURL référence par l'emplacement Amazon S3, comme indiqué ci-dessous.

Modèle obtenu

AWSTemplateFormatVersion: 2010-09-09 Description: Top-level stack template that deploys a nested stack Resources: NestedStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: https://s3.us-west-2.amazonaws.com/amzn-s3-demo-bucket/8b3bb7aa7abfc6e37e2d06b869484bed.template Parameters: MemorySize: 256 Outputs: NestedStackLambdaArn: Description: ARN of the Lambda function from nested stack Value: Fn::GetAtt: - NestedStack - Outputs.LambdaArn

Après avoir exécuté la package commande, vous pouvez déployer le modèle traité à l'aide de la deploycommande. Pour les piles imbriquées contenant des ressources IAM, vous devez reconnaître les fonctionnalités IAM en incluant l'option. --capabilities

aws cloudformation deploy \ --template-file packaged-template.yaml \ --stack-name stack-name \ --capabilities CAPABILITY_NAMED_IAM

Exécution d'opérations de pile sur des piles imbriquées

Lorsque vous travaillez avec des piles imbriquées, vous devez les manipuler avec soin pendant les opérations. Certaines opérations de pile, telles que les mises à jour de piles, doivent être initiées à partir de la pile racine plutôt que d'être effectuées directement sur les piles imbriquées. Lorsque vous mettez à jour une pile racine, seules les piles imbriquées dont le modèle a été modifié sont mises à jour.

De plus, la présence de piles imbriquées peut affecter les opérations sur la pile racine. Par exemple, si une pile imbriquée reste bloquée, la pile racine attendra que cette pile imbriquée ait terminé sa restauration avant de continuer. UPDATE_ROLLBACK_IN_PROGRESS Avant de procéder aux opérations de mise à jour, assurez-vous que vous disposez des autorisations IAM nécessaires pour annuler une mise à jour de la pile en cas d'annulation. Pour de plus amples informations, veuillez consulter Contrôlez CloudFormation l'accès avec AWS Identity and Access Management.

Utilisez les procédures suivantes pour trouver la pile racine et les piles imbriquées.

Pour afficher la pile racine d'une pile imbriquée
  1. Connectez-vous à la AWS CloudFormation console AWS Management Console et ouvrez-la à l'adresse https://console.aws.amazon.com/cloudformation.

  2. Sur la page Stacks, choisissez le nom de la pile imbriquée dont vous souhaitez afficher la pile racine.

    Les piles imbriquées affichent NESTED au-dessus de leur nom de pile.

  3. Dans l'onglet Stack info, dans la section Overview, choisissez le nom de pile répertorié comme Stack racine.

Pour afficher les piles imbriquées qui appartiennent à une pile racine
  1. Dans la pile racine dont vous souhaitez afficher les piles imbriquées, choisissez l'onglet Ressources.

  2. Dans la colonne Type, recherchez les ressources de type AWS::CloudFormation::Stack.