

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.

# Création d'une application redimensionnée et équilibrée de charge
<a name="walkthrough-autoscaling"></a>

Pour cette procédure, vous devez créer une pile qui vous aide à configurer une application redimensionnée et équilibrée de charge. Un exemple de code et un exemple de modèle sont mis à votre disposition pour créer la pile. L'exemple de modèle fournit un groupe Auto Scaling, une Application Load Balancer, des groupes de sécurité qui contrôlent le trafic vers l'équilibreur de charge et vers le groupe Auto Scaling, ainsi qu'une configuration de notification Amazon SNS pour publier des notifications concernant les activités de dimensionnement. 

Ce modèle crée au moins une instance Amazon EC2 et une Application Load Balancer. Vous serez facturé pour les ressources AWS utilisées si vous créez une pile à partir de ce modèle. 

## Modèle de pile complète
<a name="example-templates-autoscaling-full-stack-template"></a>

Commençons par le modèle.

**YAML**

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  InstanceType:
    Description: The EC2 instance type
    Type: String
    Default: t3.micro
    AllowedValues:
      - t3.micro
      - t3.small
      - t3.medium
  KeyName:
    Description: Name of an existing EC2 key pair to allow SSH access to the instances
    Type: AWS::EC2::KeyPair::KeyName
  LatestAmiId:
    Description: The latest Amazon Linux 2 AMI from the Parameter Store
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
  OperatorEmail:
    Description: The email address to notify when there are any scaling activities
    Type: String
  SSHLocation:
    Description: The IP address range that can be used to SSH to the EC2 instances
    Type: String
    MinLength: 9
    MaxLength: 18
    Default: 0.0.0.0/0
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  Subnets:
    Type: 'List<AWS::EC2::Subnet::Id>'
    Description: At least two public subnets in different Availability Zones in the selected VPC
  VPC:
    Type: AWS::EC2::VPC::Id
    Description: A virtual private cloud (VPC) that enables resources in public subnets to connect to the internet
Resources:
  ELBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: ELB Security Group
      VpcId: !Ref VPC
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 80
        ToPort: 80
        CidrIp: 0.0.0.0/0
  EC2SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: EC2 Security Group
      VpcId: !Ref VPC
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 80
        ToPort: 80
        SourceSecurityGroupId:
          Fn::GetAtt:
          - ELBSecurityGroup
          - GroupId
      - IpProtocol: tcp
        FromPort: 22
        ToPort: 22
        CidrIp: !Ref SSHLocation
  EC2TargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 30
      HealthCheckProtocol: HTTP
      HealthCheckTimeoutSeconds: 15
      HealthyThresholdCount: 5
      Matcher:
        HttpCode: '200'
      Name: EC2TargetGroup
      Port: 80
      Protocol: HTTP
      TargetGroupAttributes:
      - Key: deregistration_delay.timeout_seconds
        Value: '20'
      UnhealthyThresholdCount: 3
      VpcId: !Ref VPC
  ALBListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          TargetGroupArn: !Ref EC2TargetGroup
      LoadBalancerArn: !Ref ApplicationLoadBalancer
      Port: 80
      Protocol: HTTP
  ApplicationLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Scheme: internet-facing
      Subnets: !Ref Subnets
      SecurityGroups:
        - !GetAtt ELBSecurityGroup.GroupId
  LaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties: 
      LaunchTemplateName: !Sub ${AWS::StackName}-launch-template
      LaunchTemplateData:
        ImageId: !Ref LatestAmiId
        InstanceType: !Ref InstanceType
        KeyName: !Ref KeyName
        SecurityGroupIds: 
          - !Ref EC2SecurityGroup
        UserData:
          Fn::Base64: !Sub |
            #!/bin/bash
            yum update -y
            yum install -y httpd
            systemctl start httpd
            systemctl enable httpd
            echo "<h1>Hello World!</h1>" > /var/www/html/index.html
  NotificationTopic:
    Type: AWS::SNS::Topic
    Properties:
      Subscription:
        - Endpoint: !Ref OperatorEmail
          Protocol: email
  WebServerGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      LaunchTemplate:
        LaunchTemplateId: !Ref LaunchTemplate
        Version: !GetAtt LaunchTemplate.LatestVersionNumber
      MaxSize: '3'
      MinSize: '1'
      NotificationConfigurations:
        - TopicARN: !Ref NotificationTopic
          NotificationTypes: ['autoscaling:EC2_INSTANCE_LAUNCH', 'autoscaling:EC2_INSTANCE_LAUNCH_ERROR', 'autoscaling:EC2_INSTANCE_TERMINATE', 'autoscaling:EC2_INSTANCE_TERMINATE_ERROR']
      TargetGroupARNs:
        - !Ref EC2TargetGroup
      VPCZoneIdentifier: !Ref Subnets
```

**JSON**

```
{
  "AWSTemplateFormatVersion":"2010-09-09",
  "Parameters":{
    "InstanceType":{
      "Description":"The EC2 instance type",
      "Type":"String",
      "Default":"t3.micro",
      "AllowedValues":[
        "t3.micro",
        "t3.small",
        "t3.medium"
      ]
    },
    "KeyName":{
      "Description":"Name of an existing EC2 key pair to allow SSH access to the instances",
      "Type":"AWS::EC2::KeyPair::KeyName"
    },
    "LatestAmiId":{
      "Description":"The latest Amazon Linux 2 AMI from the Parameter Store",
      "Type":"AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>",
      "Default":"/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
    },
    "OperatorEmail":{
      "Description":"The email address to notify when there are any scaling activities",
      "Type":"String"
    },
    "SSHLocation":{
      "Description":"The IP address range that can be used to SSH to the EC2 instances",
      "Type":"String",
      "MinLength":9,
      "MaxLength":18,
      "Default":"0.0.0.0/0",
      "ConstraintDescription":"Must be a valid IP CIDR range of the form x.x.x.x/x."
    },
    "Subnets":{
      "Type":"List<AWS::EC2::Subnet::Id>",
      "Description":"At least two public subnets in different Availability Zones in the selected VPC"
    },
    "VPC":{
      "Type":"AWS::EC2::VPC::Id",
      "Description":"A virtual private cloud (VPC) that enables resources in public subnets to connect to the internet"
    }
  },
  "Resources":{
    "ELBSecurityGroup":{
      "Type":"AWS::EC2::SecurityGroup",
      "Properties":{
        "GroupDescription":"ELB Security Group",
        "VpcId":{
          "Ref":"VPC"
        },
        "SecurityGroupIngress":[
          {
            "IpProtocol":"tcp",
            "FromPort":80,
            "ToPort":80,
            "CidrIp":"0.0.0.0/0"
          }
        ]
      }
    },
    "EC2SecurityGroup":{
      "Type":"AWS::EC2::SecurityGroup",
      "Properties":{
        "GroupDescription":"EC2 Security Group",
        "VpcId":{
          "Ref":"VPC"
        },
        "SecurityGroupIngress":[
          {
            "IpProtocol":"tcp",
            "FromPort":80,
            "ToPort":80,
            "SourceSecurityGroupId":{
              "Fn::GetAtt":[
                "ELBSecurityGroup",
                "GroupId"
              ]
            }
          },
          {
            "IpProtocol":"tcp",
            "FromPort":22,
            "ToPort":22,
            "CidrIp":{
              "Ref":"SSHLocation"
            }
          }
        ]
      }
    },
    "EC2TargetGroup":{
      "Type":"AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties":{
        "HealthCheckIntervalSeconds":30,
        "HealthCheckProtocol":"HTTP",
        "HealthCheckTimeoutSeconds":15,
        "HealthyThresholdCount":5,
        "Matcher":{
          "HttpCode":"200"
        },
        "Name":"EC2TargetGroup",
        "Port":80,
        "Protocol":"HTTP",
        "TargetGroupAttributes":[
          {
            "Key":"deregistration_delay.timeout_seconds",
            "Value":"20"
          }
        ],
        "UnhealthyThresholdCount":3,
        "VpcId":{
          "Ref":"VPC"
        }
      }
    },
    "ALBListener":{
      "Type":"AWS::ElasticLoadBalancingV2::Listener",
      "Properties":{
        "DefaultActions":[
          {
            "Type":"forward",
            "TargetGroupArn":{
              "Ref":"EC2TargetGroup"
            }
          }
        ],
        "LoadBalancerArn":{
          "Ref":"ApplicationLoadBalancer"
        },
        "Port":80,
        "Protocol":"HTTP"
      }
    },
    "ApplicationLoadBalancer":{
      "Type":"AWS::ElasticLoadBalancingV2::LoadBalancer",
      "Properties":{
        "Scheme":"internet-facing",
        "Subnets":{
          "Ref":"Subnets"
        },
        "SecurityGroups":[
          {
            "Fn::GetAtt":[
              "ELBSecurityGroup",
              "GroupId"
            ]
          }
        ]
      }
    },
    "LaunchTemplate":{
      "Type":"AWS::EC2::LaunchTemplate",
      "Properties":{
        "LaunchTemplateName":{
          "Fn::Sub":"${AWS::StackName}-launch-template"
        },
        "LaunchTemplateData":{
          "ImageId":{
            "Ref":"LatestAmiId"
          },
          "InstanceType":{
            "Ref":"InstanceType"
          },
          "KeyName":{
            "Ref":"KeyName"
          },
          "SecurityGroupIds":[
            {
              "Ref":"EC2SecurityGroup"
            }
          ],
          "UserData":{
            "Fn::Base64":{
              "Fn::Join":[
                "",
                [
                  "#!/bin/bash\n",
                  "yum update -y\n",
                  "yum install -y httpd\n",
                  "systemctl start httpd\n",
                  "systemctl enable httpd\n",
                  "echo \"<h1>Hello World!</h1>\" > /var/www/html/index.html"
                ]
              ]
            }
          }
        }
      }
    },
    "NotificationTopic":{
      "Type":"AWS::SNS::Topic",
      "Properties":{
        "Subscription":[
          {
            "Endpoint":{
              "Ref":"OperatorEmail"
            },
            "Protocol":"email"
          }
        ]
      }
    },
    "WebServerGroup":{
      "Type":"AWS::AutoScaling::AutoScalingGroup",
      "Properties":{
        "LaunchTemplate":{
          "LaunchTemplateId":{
            "Ref":"LaunchTemplate"
          },
          "Version":{
            "Fn::GetAtt":[
              "LaunchTemplate",
              "LatestVersionNumber"
            ]
          }
        },
        "MaxSize":"3",
        "MinSize":"1",
        "NotificationConfigurations":[
          {
            "TopicARN":{
              "Ref":"NotificationTopic"
            },
            "NotificationTypes":[
              "autoscaling:EC2_INSTANCE_LAUNCH",
              "autoscaling:EC2_INSTANCE_LAUNCH_ERROR",
              "autoscaling:EC2_INSTANCE_TERMINATE",
              "autoscaling:EC2_INSTANCE_TERMINATE_ERROR"
            ]
          }
        ],
        "TargetGroupARNs":[
          {
            "Ref":"EC2TargetGroup"
          }
        ],
        "VPCZoneIdentifier":{
          "Ref":"Subnets"
        }
      }
    }
  }
}
```

## Description du modèle
<a name="example-templates-autoscaling-description"></a>

La première partie de ce modèle spécifie le `Parameters`. Une valeur doit être affectée à chaque paramètre au moment de l'exécution CloudFormation pour approvisionner correctement la pile. Les ressources spécifiées ultérieurement dans le modèle font référence à ces valeurs et utilisent les données.
+ `InstanceType` : le type d'instance EC2 provisionnée par Amazon EC2 Auto Scaling. À défaut de précision, la valeur par défaut `t3.micro` est utilisée.
+ `KeyName` : une paire de clés EC2 existante pour permettre l'accès SSH aux instances.
+ `LatestAmiId` : l'Amazon Machine Image (AMI) de l'instance. Si ce n'est pas spécifié, vos instances sont lancées avec une AMI Amazon Linux 2, à l'aide d'un paramètre AWS Systems Manager public géré par AWS. Pour plus d'informations, veuillez consulter la rubrique [Résultat des paramètres publics](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html) dans le *Guide de l'utilisateur AWS Systems Manager *.
+ `OperatorEmail` : l’adresse e-mail à laquelle vous souhaitez envoyer des notifications d'activité dimensionnée.
+ `SSHLocation` : la plage d'adresses IP pouvant être utilisée pour se connecter aux instances en SSH.
+ `Subnets` : au moins deux sous-réseaux dans des zones de disponibilité différentes. 
+ `VPC` : un cloud privé virtuel (VPC) de votre compte qui permet aux ressources des sous-réseaux publics de se connecter à Internet. 
**Note**  
Vous pouvez utiliser le VPC et les sous-réseaux par défaut pour autoriser les instances à accéder à Internet. Si vous utilisez votre propre VPC, assurez-vous qu'il dispose d'un sous-réseau mappé à chaque zone de disponibilité de la région dans laquelle vous travaillez. Au minimum, vous devez disposer de deux sous-réseaux publics disponibles pour créer l'équilibreur de charge.

La partie suivante de ce modèle spécifie le `Resources`. Cette section spécifie les ressources de la pile et leurs propriétés.

[https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)ressource `ELBSecurityGroup` 
+ `SecurityGroupIngress`contient une règle d'entrée TCP qui autorise l'accès depuis *toutes les adresses IP* (» CidrIp ": « 0.0.0.0/0") sur le port 80.

[https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)ressource `EC2SecurityGroup` 
+ `SecurityGroupIngress` contient deux règles d'entrée : 1) une règle d'entrée TCP qui permet l'accès SSH (port 22) à partir de la plage d'adresses IP que vous spécifiez pour le paramètre`SSHLocation` d'entrée et 2) une règle d'entrée TCP qui permet d'accéder à l'équilibreur de charge en spécifiant le groupe de sécurité de l'équilibreur de charge. La [GetAtt](resources-section-structure.md#resource-properties-getatt)fonction est utilisée pour obtenir l'ID du groupe de sécurité avec le nom logique`ELBSecurityGroup`.

[AWS::ElasticLoadBalancingV2::TargetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html)ressource `EC2TargetGroup`
+ `Port`, `Protocol` et `HealthCheckProtocol` spécifiez le port de l'instance EC2 (80) et le protocole (HTTP) vers lesquels `ApplicationLoadBalancer` acheminer le trafic et qu'Elastic Load Balancing utilise pour vérifier l'état des instances EC2.
+ `HealthCheckIntervalSeconds` spécifie que les instances EC2 ont un intervalle de 30 secondes entre la surveillance de l’état. La `HealthCheckTimeoutSeconds` désigne la durée qu'Elastic Load Balancing peut attendre pour recevoir une réponse de la cible de surveillance de l'état (15 secondes, dans cet exemple). Au delà de ce délai, Elastic Load Balancing marque la surveillance de l’état de l'instance EC2 comme étant défectueuse. Lorsque la vérification de l'état d'une instance EC2 échoue au moins cinq fois consécutives (`UnhealthyThresholdCount`), Elastic Load Balancing cesse d'y acheminer le trafic tant que la vérification de l'état d'une instance EC2 (`HealthyThresholdCount`). À ce stade, Elastic Load Balancing considère que l'instance est saine et recommence à acheminer le trafic vers l'instance.
+ `TargetGroupAttributes` met à jour la valeur du délai de désinscription du groupe cible à 20 secondes. Par défaut, Elastic Load Balancing attend 300 secondes avant de terminer le processus de désinscription (vidange de la connexion).

[AWS::ElasticLoadBalancingV2::Listener](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html)ressource `ALBListener`
+ `DefaultActions` spécifie le port que l'équilibreur de charge écoute, le groupe cible sur lequel l'équilibreur de charge transfère les demandes et le protocole utilisé pour router les demandes.

[AWS::ElasticLoadBalancingV2::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html)ressource `ApplicationLoadBalancer`
+ `Subnets` prend la valeur du paramètre `Subnets` d'entrée comme la liste des sous-réseaux publics dans lesquels les nœuds d'équilibrage de charge seront créés.
+ `SecurityGroup` obtient l'ID du groupe de sécurité qui agit en tant que pare-feu virtuel pour vos nœuds d'équilibreur de charge afin de contrôler le trafic entrant. La [GetAtt](resources-section-structure.md#resource-properties-getatt)fonction est utilisée pour obtenir l'ID du groupe de sécurité avec le nom logique`ELBSecurityGroup`.

[AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html)ressource `LaunchTemplate`
+ `ImageId` prend la valeur du paramètre `LatestAmiId` d'entrée comme AMI à utiliser.
+ `KeyName` utilise la valeur du paramètre d'entrée `KeyName` comme paire de clés EC2 à utiliser.
+ `SecurityGroupIds` obtient l'ID du groupe de sécurité avec le nom logique `EC2SecurityGroup` qui agit en tant que pare-feu virtuel pour vos instances EC2 afin de contrôler le trafic entrant.
+ `UserData` est un script de configuration qui s'exécute une fois que l'instance est opérationnelle. Dans cet exemple, le script installe Apache et crée un fichier index.html.

[AWS::SNS::Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html)ressource `NotificationTopic`
+ `Subscription` prend la valeur du paramètre `OperatorEmail` d'entrée comme adresse e-mail du destinataire des notifications en cas d'activités de dimensionnement. 

AWS::AutoScaling::AutoScalingRessource de [groupe](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html) `WebServerGroup`
+ `MinSize` et `MaxSize` définissent le nombre minimum et maximum d'instances EC2 dans le groupe Auto Scaling.
+ `TargetGroupARNs` prend l'ARN du groupe cible avec le nom logique `EC2TargetGroup`. Au fur et à mesure que ce groupe Auto Scaling évolue, il enregistre et annule automatiquement les instances auprès de ce groupe cible.
+ `VPCZoneIdentifier` prend la valeur du paramètre d'entrée `Subnets` comme la liste des sous-réseaux publics dans lesquels les instances EC2 peuvent être créées.

## Étape 1 : Lancement la pile
<a name="example-templates-autoscaling-launch-stack"></a>

Avant de lancer la pile, vérifiez que vous disposez des autorisations Gestion des identités et des accès AWS (IAM) nécessaires pour utiliser tous les services suivants : Amazon EC2, Amazon EC2 AWS Systems Manager Auto Scaling, Elastic Load Balancing, Amazon SNS et. CloudFormation

La procédure suivante implique le téléchargement du modèle de pile d’échantillons à partir d’un fichier. Ouvrez un éditeur de texte sur votre ordinateur local et ajoutez l'un des modèles. Enregistrez le fichier sous le nom `sampleloadbalancedappstack.template`.

**Pour lancer la pile (modèle)**

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. Sélectionnez **Créer une pile**, **Avec de nouvelles ressources (standard)**.

1. Dans **Spécifier le modèle**, choisissez **Charger un fichier de modèle**, puis **Choisir un fichier** pour charger le fichier `sampleloadbalancedappstack.template`. 

1. Choisissez **Suivant**.

1. Dans la page **Spécifier les détails**, pour Nom de la pile, tapez un nom pour la pile (par exemple **SampleLoadBalancedAppStack**).

1. **Sous **Paramètres**, passez en revue les paramètres de la pile et fournissez des valeurs pour tous les paramètres qui n'ont pas de valeurs par défaut, y compris **OperatorEmail**SSHLocation****,, **KeyName**, **VPC** et sous-réseaux.**

1. Choisissez **Next** (Suivant) deux fois.

1. Sur la page **Vérification**, vérifiez et confirmez les paramètres.

1. Sélectionnez **Soumettre**.

   Vous pouvez consulter l'état de la pile dans la CloudFormation console dans la colonne **État**. Une CloudFormation fois la pile créée avec succès, vous recevez le statut **CREATE\$1COMPLETE**.
**Note**  
Après avoir créé la pile, vous devez confirmer l’abonnement avant que l’adresse e-mail puisse recevoir des notifications. Pour plus d'informations, veuillez consulter la rubrique [Obtenir des notifications Amazon SNS lors de la mise à l'échelle d'un groupe Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-sns-notifications.html) dans le *Guide de l'utilisateur Amazon EC2 Auto Scaling*.

## Étape 2 : nettoyage des exemples de ressources
<a name="example-templates-autoscaling-clean-up"></a>

Pour vous assurer de ne pas être facturé pour des ressources d’échantillons inutilisés, supprimez la pile.

**Pour supprimer la pile**

1. Dans la CloudFormation console, sélectionnez la **SampleLoadBalancedAppStack**pile.

1. Sélectionnez **Delete (Supprimer)**.

1. Dans le message de confirmation, choisissez **Supprimer la pile**.

   État des **SampleLoadBalancedAppStack**modifications apportées à **DELETE\$1IN\$1PROGRESS**. Lorsque la suppression de la pile est CloudFormation terminée, elle supprime la pile de la liste.

Utilisez les exemples de modèles de cette procédure pour créer vos propres modèles de piles. Pour de plus amples informations, consultez [Tutoriel : Configurer une application redimensionnée et à charge équilibrée](https://docs.aws.amazon.com/autoscaling/ec2/userguide/tutorial-ec2-auto-scaling-load-balancer.html) dans le *Guide de l'utilisateur Amazon EC2 Auto Scaling*.