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éfautt3.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
-
SecurityGroupIngress
contient 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
-
SecurityGroupIngress
contient 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ètreSSHLocation
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
-
Port
Protocol
, etHealthCheckProtocol
spécifiez le port d'EC2instance (80) et le protocole (HTTP) vers lesquels le trafic estApplicationLoadBalancer
acheminé et qu'Elastic Load Balancing utilise pour vérifier l'état des EC2 instances. -
HealthCheckIntervalSeconds
indique que les EC2 instances ont un intervalle de 30 secondes entre les tests de santé. LaHealthCheckTimeoutSeconds
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ètreSubnets
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
-
ImageId
prend la valeur du paramètreLatestAmiId
d'entrée comme valeur AMI à utiliser. -
KeyName
prend la valeur du paramètreKeyName
d'entrée comme paire de EC2 clés à utiliser. -
SecurityGroupIds
obtient l'ID du groupe de sécurité avec le nom logiqueEC2SecurityGroup
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ètreOperatorEmail
d'entrée comme adresse e-mail du destinataire des notifications en cas d'activités de dimensionnement.
AWS: AutoScaling : : AutoScalingGroup ressource WebServerGroup
-
MinSize
etMaxSize
définissez le nombre minimum et maximum d'EC2instances dans le groupe Auto Scaling. -
TargetGroupARNs
prend 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. -
VPCZoneIdentifier
prend la valeur du paramètreSubnets
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)
-
Connectez-vous à la AWS CloudFormation console AWS Management Console et ouvrez-la à l'adresse https://console.aws.amazon.com/cloudformation
. -
Sélectionnez Créer une pile, Avec de nouvelles ressources (standard).
-
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
. -
Choisissez Suivant.
-
Dans la page Spécifier les détails, pour Nom de la pile, tapez un nom pour la pile (par exemple
SampleLoadBalancedAppStack
). -
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.
-
Choisissez Next (Suivant) deux fois.
-
Sur la page Vérification, vérifiez et confirmez les paramètres.
-
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
-
Dans la AWS CloudFormation console, sélectionnez la SampleLoadBalancedAppStackpile.
-
Sélectionnez Delete (Supprimer).
-
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.