Création d'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.

Création d'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, un 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 SNS notification Amazon pour publier des notifications concernant les activités de dimensionnement.

Ce modèle crée une ou plusieurs EC2 instances Amazon et un 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'EC2instance qu'Amazon EC2 Auto Scaling fournit. À défaut de précision, la valeur par défaut t3.micro est utilisée.

  • KeyName: une paire de EC2 clés existante pour autoriser l'SSHaccès aux instances.

  • LatestAmiId: Amazon Machine Image (AMI) pour les instances. Si ce n'est pas spécifié, vos instances sont lancées avec un Amazon Linux 2AMI, à 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: plage d'adresses IP pouvant être utilisée SSH pour les instances.

  • Subnets : au moins deux sous-réseaux dans des zones de disponibilité différentes.

  • VPC: un cloud privé virtuel (VPC) dans votre compte qui permet aux ressources des sous-réseaux publics de se connecter à Internet.

    Note

    Vous pouvez utiliser les sous-réseaux par défaut VPC et par défaut pour autoriser les instances à accéder à Internet. Si vous utilisez le vôtreVPC, assurez-vous qu'il possède 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'TCPentrée qui autorise l'accès depuis toutes les adresses IP (» CidrIp ": « 0.0.0.0/0") sur le port 80.

AWS::EC2::SecurityGroupressource EC2SecurityGroup

  • SecurityGroupIngresscontient deux règles d'entrée : 1) une règle d'TCPentrée qui autorise l'SSHaccès (port 22) à partir de la plage d'adresses IP que vous fournissez pour le paramètre SSHLocation d'entrée et 2) une TCP règle d'entrée qui autorise l'accès depuis 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: : ElasticLoadBalancing V2 : : TargetGroup ressource EC2TargetGroup

  • PortProtocol, et HealthCheckProtocol spécifiez le port d'EC2instance (80) et le protocole (HTTP) vers lesquels le trafic est ApplicationLoadBalancer acheminé et qu'Elastic Load Balancing utilise pour vérifier l'état des EC2 instances.

  • HealthCheckIntervalSecondsindique que les EC2 instances ont un intervalle de 30 secondes entre les tests de santé. 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). Une fois le délai expiré, Elastic Load Balancing indique que le bilan de santé de cette EC2 instance n'est pas satisfaisant. Lorsqu'une EC2 instance échoue à trois tests de santé consécutifs (UnhealthyThresholdCount), Elastic Load Balancing arrête d'acheminer le trafic vers cette EC2 instance jusqu'à ce que cette instance fasse l'objet de cinq tests de santé consécutifs (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).

AWSRessource : : ElasticLoadBalancing V2 : :Listener 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: : ElasticLoadBalancing V2 : : LoadBalancer 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 GetAttfonction est utilisée pour obtenir l'ID du groupe de sécurité avec le nom logiqueELBSecurityGroup.

AWS: EC2 : : LaunchTemplate ressource LaunchTemplate

  • ImageIdprend la valeur du paramètre LatestAmiId d'entrée comme valeur AMI à utiliser.

  • KeyNameprend la valeur du paramètre KeyName d'entrée comme paire de EC2 clés à utiliser.

  • SecurityGroupIdsobtient l'ID du groupe de sécurité avec le nom logique EC2SecurityGroup qui agit comme un pare-feu virtuel permettant à vos EC2 instances 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 : :Ressource thématique 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 : : AutoScalingGroup ressource WebServerGroup

  • MinSizeet MaxSize définissez le nombre minimum et maximum d'EC2instances dans le groupe Auto Scaling.

  • TargetGroupARNsprend le nom ARN du groupe cible avec le nom logiqueEC2TargetGroup. Au fur et à mesure que ce groupe Auto Scaling évolue, il enregistre et annule automatiquement les instances auprès de ce groupe cible.

  • VPCZoneIdentifierprend la valeur du paramètre Subnets d'entrée comme liste des sous-réseaux publics dans lesquels les EC2 instances peuvent être créées.

Étape 1 : Lancement la pile

Avant de lancer la stack, vérifiez que vous êtes AWS Identity and Access Management (IAM) autorisé à utiliser tous les services suivants : AmazonEC2, Amazon EC2 Auto Scaling AWS Systems Manager, Elastic Load BalancingSNS, Amazon 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, y compris OperatorEmail, SSHLocation, KeyNameVPC, et les sous-réseaux.

  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, consultez la section Recevoir SNS des notifications Amazon lorsque votre groupe Auto Scaling évolue dans le guide de l'utilisateur d'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 plus d'informations, consultez Tutoriel : Configuration d'une application dimensionnée et équilibrée dans le manuel Amazon EC2Auto Scaling User Guide.