

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.

# Diviser un modèle en éléments réutilisables à l’aide de piles imbriquées
<a name="using-cfn-nested-stacks"></a>

À mesure que votre infrastructure se développe, vous pouvez être amené à créer de manière répétée des configurations de ressources identiques dans plusieurs modèles. Pour éviter cette redondance, vous pouvez séparer ces configurations communes dans des modèles dédiés. Vous pouvez ensuite utiliser la ressource [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html) dans d’autres modèles pour référencer ces modèles dédiés, créant ainsi des piles imbriquées.

Par exemple, supposons que vous disposiez d’une configuration d’équilibreur de charge que vous utilisez 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 alors 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 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 a 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.\]](http://docs.aws.amazon.com/fr_fr/AWSCloudFormation/latest/UserGuide/images/cfn-console-nested-stacks.png)


**Topics**
+ [Exemple avant et après la division d’un modèle](#create-nested-stack-template)
+ [Exemple d’architecture de pile imbriquée](#nested-stack-examples)
+ [Exécution d’opérations sur des piles imbriquées](#perform-stack-operations-on-nested-stacks)
+ [Informations connexes](#nested-stacks-related-information)

## Exemple avant et après la division d’un modèle
<a name="create-nested-stack-template"></a>

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. Au départ, le modèle « Avant l’imbrication des piles » affiche toutes les ressources définies dans un seul fichier. Cela peut devenir confus et difficile à gérer à mesure que le nombre de ressources augmente. Le modèle « Après l’imbrication des piles » divise les ressources en modèles plus petits et distincts. 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 à maintenir.


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

## Exemple d’architecture de pile imbriquée
<a name="nested-stack-examples"></a>

Cette section présente une architecture de pile imbriquée composée d’une pile de niveau supérieur qui fait 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.

**Topics**
+ [Étape 1 : créez un modèle pour la pile imbriquée sur votre système local](#create-a-nested-stack-template)
+ [Étape 2 : créez un modèle pour la pile de niveau supérieur sur votre système local](#create-a-nested-stack-parent-template)
+ [Étape 3 : packagez et déployez les modèles](#create-a-nested-stack-parent-template)

### Étape 1 : créez un modèle pour la pile imbriquée sur votre système local
<a name="create-a-nested-stack-template"></a>

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

#### YAML
<a name="nested-stack-child-example.yaml"></a>

```
 1. AWSTemplateFormatVersion: 2010-09-09
 2. Description: Nested stack template for Lambda function deployment
 3. Parameters:
 4.   MemorySize:
 5.     Type: Number
 6.     Default: 128
 7.     MinValue: 128
 8.     MaxValue: 10240
 9.     Description: Lambda function memory allocation (128-10240 MB)
10. Resources:
11.   LambdaFunction:
12.     Type: AWS::Lambda::Function
13.     Properties:
14.       FunctionName: !Sub "${AWS::StackName}-Function"
15.       Runtime: nodejs18.x
16.       Handler: index.handler
17.       Role: !GetAtt LambdaExecutionRole.Arn
18.       Code:
19.         ZipFile: |
20.           exports.handler = async (event) => {
21.             return {
22.               statusCode: 200,
23.               body: JSON.stringify('Hello from Lambda!')
24.             };
25.           };
26.       MemorySize: !Ref MemorySize
27.   LambdaExecutionRole:
28.     Type: AWS::IAM::Role
29.     Properties:
30.       AssumeRolePolicyDocument:
31.         Version: '2012-10-17'
32.         Statement:
33.           - Effect: Allow
34.             Principal:
35.               Service: lambda.amazonaws.com
36.             Action: sts:AssumeRole
37.       ManagedPolicyArns:
38.         - 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
39. Outputs:
40.   LambdaArn:
41.     Description: ARN of the created Lambda function
42.     Value: !GetAtt LambdaFunction.Arn
```

### Étape 2 : créez un modèle pour la pile de niveau supérieur sur votre système local
<a name="create-a-nested-stack-parent-template"></a>

L’exemple suivant montre le format du modèle de pile de niveau supérieur et la ressource [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html) qui fait référence à la pile que vous avez créée à l’étape précédente.

#### YAML
<a name="nested-stack-parent-example.yaml"></a>

```
 1. AWSTemplateFormatVersion: 2010-09-09
 2. Description: Top-level stack template that deploys a nested stack
 3. Resources:
 4.   NestedStack:
 5.     Type: AWS::CloudFormation::Stack
 6.     Properties:
 7.       TemplateURL: /path_to_template/nested-template.yaml
 8.       Parameters:
 9.         MemorySize: 256
10. Outputs:
11.   NestedStackLambdaArn:
12.     Description: ARN of the Lambda function from nested stack
13.     Value: !GetAtt NestedStack.Outputs.LambdaArn
```

### Étape 3 : packagez et déployez les modèles
<a name="create-a-nested-stack-parent-template"></a>

**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. Elle gère automatiquement le téléchargement des artefacts locaux vers Amazon S3 (y compris `TemplateURL`) et génère un nouveau fichier modèle avec des références mises à jour vers ces emplacements S3. Pour de plus amples informations, veuillez consulter [Téléchargez des artefacts locaux dans un compartiment S3 avec le AWS CLI](using-cfn-cli-package.md). 

Ensuite, vous pouvez utiliser la commande [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html) pour charger le modèle imbriqué vers 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 à l’emplacement spécifié par `--output-template-file`. Elle remplace la référence `TemplateURL` 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 commande **package**, vous pouvez déployer le modèle traité à l’aide de la commande [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/). Pour les piles imbriquées qui contiennent des ressources IAM, vous devez confirmer les capacité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 sur des piles imbriquées
<a name="perform-stack-operations-on-nested-stacks"></a>

Lorsque vous travaillez avec des piles imbriquées, vous devez les manipuler avec précaution pendant les opérations. Certaines opérations sur les piles, telles que les mises à jour, doivent être lancé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é seront mises à jour. 

De plus, la présence des piles imbriquées peut affecter les opérations sur la pile racine. Par exemple, si une pile imbriquée se bloque dans l’état `UPDATE_ROLLBACK_IN_PROGRESS`, la pile racine attendra que cette pile imbriquée restaure son état avant de continuer. 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 pile en cas de restauration. Pour de plus amples informations, veuillez consulter [Contrôlez CloudFormation l'accès avec Gestion des identités et des accès AWS](control-access-with-iam.md).

Suivez 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 CloudFormation console AWS Management Console et ouvrez-la à l'adresse [https://console.aws.amazon.com/cloudformation.](https://console.aws.amazon.com/cloudformation/)

1. Sur la page **Piles**, sélectionnez le nom de la pile imbriquée dont vous voulez afficher la pile racine.

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

1. Dans l’onglet **Infos sur la pile**, dans la section **Présentation**, sélectionnez le nom de la pile répertorié comme **Pile racine**.

**Pour afficher les piles imbriquées qui appartiennent à une pile racine**

1. Dans la pile racine dont vous voulez afficher les piles imbriquées, sélectionnez l’onglet **Ressources**.

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

## Informations connexes
<a name="nested-stacks-related-information"></a>
+ [Imbrication d’une pile existante](resource-import-nested-stacks.md)
+ [Comprendre les comportements de mise à jour des ressources d’une pile](using-cfn-updating-stacks-update-behaviors.md)
+ [Continuer la restauration à partir des mises à jour de piles imbriquées ayant échoué](using-cfn-updating-stacks-continueupdaterollback.md#nested-stacks)
+ [Échec de la restauration des piles imbriquées](troubleshooting.md#troubleshooting-errors-nested-stacks-are-stuck)