Procédure : créer une application redimensionnée et équilibrée de charge - 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.

Procédure : créer une application redimensionnée et équilibrée de charge

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

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

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 AWS 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 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.

AWS::EC2::SecurityGroupressource ELBSecurityGroup

  • SecurityGroupIngresscontient 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.

AWS::EC2::SecurityGroupressource 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ètreSSHLocation 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 GetAttfonction est utilisée pour obtenir l'ID du groupe de sécurité avec le nom logiqueELBSecurityGroup.

AWS::ElasticLoadBalancingV2::TargetGroupressource 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::Listenerressource 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::LoadBalancerressource 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 GetAttfonction est utilisée pour obtenir l'ID du groupe de sécurité avec le nom logiqueELBSecurityGroup.

AWS::EC2::LaunchTemplateressource 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::Topicressource 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 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

Avant de lancer la pile, vérifiez que vous disposez des autorisations AWS Identity and Access Management (IAM) nécessaires pour utiliser tous les services suivants : Amazon EC2, Amazon EC2 AWS Systems Manager Auto Scaling, Elastic Load Balancing, Amazon SNS et. AWS 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 AWS CloudFormation console AWS Management Console et ouvrez-la à l'adresse https://console.aws.amazon.com/cloudformation.

  2. Sélectionnez Créer une pile, Avec de nouvelles ressources (standard).

  3. Pour Spécifier un modèle, choisissez Télécharger un fichier de modèle, puis Choisir un fichier pour télécharger le fichier sampleloadbalancedappstack.template.

  4. Choisissez Suivant.

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

  6. 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 OperatorEmail, notamment SSHLocation, KeyNameVPC et Subnets.

  7. Choisissez Next (Suivant) deux fois.

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

  9. Sélectionnez Envoyer.

    Vous pouvez consulter l'état de la pile dans la AWS CloudFormation console dans la colonne État. Une AWS CloudFormation fois la pile créée avec succès, vous recevez le statut CREATE_COMPLETE.

    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 dans le Guide de l'utilisateur Amazon EC2 Auto Scaling.

Étape 2 : nettoyage des exemples de ressources

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 AWS CloudFormation console, sélectionnez la SampleLoadBalancedAppStackpile.

  2. Sélectionnez Delete (Supprimer).

  3. Dans le message de confirmation, choisissez Supprimer la pile.

    État des SampleLoadBalancedAppStackmodifications apportées à DELETE_IN_PROGRESS. Lorsque la suppression de la pile est AWS 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 dans le Guide de l'utilisateur Amazon EC2 Auto Scaling.