Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Creazione di un'applicazione dimensionata e con carico bilanciato
Per questa procedura dettagliata, viene creato uno stack che aiuta a configurare un'applicazione dimensionata e con carico bilanciato. La procedura guidata fornisce un modello di esempio che potrai usare per creare lo stack. Il modello di esempio prevede un gruppo Auto Scaling, un Application Load Balancer, gruppi di sicurezza che controllano il traffico verso il load balancer e il gruppo Auto Scaling e una configurazione di notifica SNS Amazon per pubblicare notifiche sulle attività di scaling.
Questo modello crea una o più EC2 istanze Amazon e un Application Load Balancer. Se crei uno stack da questo modello, ti verranno addebitate le risorse AWS utilizzate.
Modello full stack
Cominciamo con il modello.
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" } } } } }
Spiegazione passo per passo del modello
La prima parte di questo modello specifica i Parameters
. A ogni parametro deve essere assegnato un valore in fase di esecuzione per AWS CloudFormation effettuare correttamente il provisioning dello stack. Le risorse specificate più avanti nel modello fanno riferimento a questi valori e utilizzano i dati.
-
InstanceType
: il tipo di EC2 istanza fornito da Amazon EC2 Auto Scaling. Se non viene specificato, viene utilizzato il valore predefinitot3.micro
. -
KeyName
: una EC2 key pair esistente per consentire SSH l'accesso alle istanze. -
LatestAmiId
: Amazon Machine Image (AMI) per le istanze. Se non specificato, le tue istanze vengono avviate con Amazon Linux 2AMI, utilizzando un parametro AWS Systems Manager pubblico gestito da AWS. Per ulteriori informazioni, consulta Ricerca dei parametri pubblici nella Guida per l'utente di AWS Systems Manager . -
OperatorEmail
: l'indirizzo e-mail a cui desideri inviare le notifiche sulle attività di dimensionamento. -
SSHLocation
: L'intervallo di indirizzi IP che può essere utilizzato SSH per le istanze. -
Subnets
: almeno due sottoreti pubbliche in diverse zone di disponibilità. -
VPC
: un cloud privato virtuale (VPC) nel tuo account che consente alle risorse nelle sottoreti pubbliche di connettersi a Internet.Nota
Puoi utilizzare le sottoreti predefinite VPC e predefinite per consentire alle istanze di accedere a Internet. Se usi la tuaVPC, assicurati che abbia una sottorete mappata su ciascuna zona di disponibilità della regione in cui lavori. Per creare il load balancer, ti serviranno almeno due sottoreti pubbliche.
La parte successiva di questo modello specifica le Resources
. Questa sezione specifica le risorse dello stack e le relative proprietà.
AWS::EC2::SecurityGrouprisorsa ELBSecurityGroup
-
SecurityGroupIngress
contiene una regola TCP di ingresso che consente l'accesso da tutti gli indirizzi IP (» CidrIp ": «0.0.0.0/0") sulla porta 80.
AWS::EC2::SecurityGrouprisorsa EC2SecurityGroup
-
SecurityGroupIngress
contiene due regole di ingresso: 1) una regola di TCP ingresso che consente SSH l'accesso (porta 22) dall'intervallo di indirizzi IP fornito per il parametro diSSHLocation
input e 2) una regola di TCP ingresso che consente l'accesso dal load balancer specificando il gruppo di sicurezza del load balancer. La GetAttfunzione viene utilizzata per ottenere l'ID del gruppo di sicurezza con il nome logico.ELBSecurityGroup
AWS:: ElasticLoadBalancing V2:: risorsa TargetGroup EC2TargetGroup
-
Port
Protocol
, eHealthCheckProtocol
specifica la porta dell'EC2istanza (80) e il protocollo (HTTP) verso cuiApplicationLoadBalancer
indirizza il traffico e che Elastic Load Balancing utilizza per verificare lo stato delle EC2 istanze. -
HealthCheckIntervalSeconds
specifica che le EC2 istanze hanno un intervallo di 30 secondi tra i controlli di integrità. PerHealthCheckTimeoutSeconds
si intende il periodo di tempo che Elastic Load Balancing attende per una risposta della destinazione del controllo dell'integrità (15 secondi in questo esempio). Al termine del periodo di timeout, Elastic Load Balancing contrassegna il controllo dello stato dell'istanza come EC2 non integro. Quando un'EC2istanza non supera tre controlli di integrità consecutivi (UnhealthyThresholdCount
), Elastic Load Balancing interrompe l'instradamento del traffico verso quell'EC2istanza fino a quando l'istanza non ha cinque controlli di integrità consecutivi ().HealthyThresholdCount
A quel punto, Elastic Load Balancing considera l'istanza integra e ricomincia a indirizzare il traffico verso l'istanza. -
TargetGroupAttributes
aggiorna il valore del ritardo di annullamento della registrazione del gruppo di destinazione a 20 secondi. Per impostazione predefinita, Elastic Load Balancing attende 300 secondi prima di completare il processo di annullamento della registrazione.
AWS:: ElasticLoadBalancing V2: :Risorsa Listener ALBListener
-
DefaultActions
specifica la porta su cui il sistema di bilanciamento del carico ascolta, il gruppo di destinazione a cui il sistema di bilanciamento del carico inoltra le richieste e il protocollo utilizzato per instradare le richieste.
AWS:: ElasticLoadBalancing V2:: risorsa LoadBalancer ApplicationLoadBalancer
-
Subnets
prende il valore del parametro di inputSubnets
come elenco di sottoreti pubbliche in cui verranno creati i nodi del sistema di bilanciamento del carico. -
SecurityGroup
ottiene l'ID del gruppo di sicurezza che funge da firewall virtuale per i nodi del sistema di bilanciamento del carico per controllare il traffico in entrata. La GetAttfunzione viene utilizzata per ottenere l'ID del gruppo di sicurezza con il nomeELBSecurityGroup
logico.
AWS:EC2:: LaunchTemplate risorsa LaunchTemplate
-
ImageId
prende il valore del parametroLatestAmiId
di input come valore AMI da utilizzare. -
KeyName
prende il valore del parametroKeyName
di input come EC2 key pair da usare. -
SecurityGroupIds
ottiene l'ID del gruppo di sicurezza con il nome logicoEC2SecurityGroup
che funge da firewall virtuale per consentire alle EC2 istanze di controllare il traffico in entrata. -
UserData
è uno script di configurazione che viene eseguito dopo che l'istanza è attiva e funzionante. In questo esempio, lo script installa Apache e crea un file index.html.
AWS::SNS: Risorsa tematica NotificationTopic
-
Subscription
prende il valore del parametro di inputOperatorEmail
come indirizzo e-mail del destinatario delle notifiche in caso di attività di scalabilità.
AWS:::AutoScaling: risorsa AutoScalingGroup WebServerGroup
-
MinSize
eMaxSize
imposta il numero minimo e massimo di EC2 istanze nel gruppo Auto Scaling. -
TargetGroupARNs
prende il nome ARN del gruppo target con il nome logico.EC2TargetGroup
Man mano che questo dimensionamento automatico si dimensiona, registra le istanze e ne annulla automaticamente la registrazione con questo gruppo di destinazione. -
VPCZoneIdentifier
prende il valore del parametro diSubnets
input come elenco di sottoreti pubbliche in cui è possibile creare le EC2 istanze.
Fase 1: Avvio dello stack
Prima di avviare lo stack, verifica di disporre delle autorizzazioni AWS Identity and Access Management (IAM) per utilizzare tutti i seguenti servizi: Amazon, EC2 Amazon Auto EC2 Scaling AWS Systems Manager, Elastic Load Balancing, Amazon e. SNS AWS CloudFormation
La procedura seguente prevede il caricamento del modello di stack di esempio da un file. Apri un editor di testo sul tuo computer locale e aggiungi uno dei modelli. Salva il file con il nome sampleloadbalancedappstack.template
.
Avvio del modello dello stack
-
Scegliere Create stack (Crea pila), With new resources (standard) (Con nuove risorse (standard)).
-
In Specifica modello, seleziona Carica un file di modello e poi Scegli file per caricare il file
sampleloadbalancedappstack.template
. -
Seleziona Successivo.
-
Nella pagina Specifica i dettagli dello stack, immetti il nome dello stack (ad esempio,
SampleLoadBalancedAppStack
). -
In Parametri, esamina i parametri dello stack e fornisci i valori per tutti i parametri che non hanno valori predefiniti, OperatorEmailSSHLocationKeyNameVPC, e le sottoreti.
-
Scegliere Next (Successivo) due volte.
-
Nella pagina Rivedi, verifica e conferma le impostazioni.
-
Scegli Invia.
Puoi visualizzare lo stato dello stack nella AWS CloudFormation console nella colonna Stato. Una volta AWS CloudFormation creato con successo lo stack, si riceve lo stato di CREATE _. COMPLETE
Nota
Dopo aver creato lo stack, perché l'indirizzo e-mail possa iniziare a ricevere notifiche devi confermare la sottoscrizione. Per ulteriori informazioni, consulta Ricevi SNS notifiche Amazon quando il tuo gruppo Auto Scaling aumenta nella Amazon EC2Auto Scaling User Guide.
Fase 2: Cancellazione delle risorse di esempio
Per assicurarti che non ti vengano addebitati costi per le risorse di esempio inutilizzate, elimina lo stack.
Per eliminare lo stack
-
Nella AWS CloudFormation console, seleziona lo stack. SampleLoadBalancedAppStack
-
Scegli Elimina.
-
Nel messaggio di conferma, scegli Elimina stack.
Lo stato delle SampleLoadBalancedAppStackmodifiche a DELETEPROGRESS_IN_. Quando AWS CloudFormation completa l'eliminazione dello stack, lo rimuove dall'elenco.
Usa i modelli di esempio di questa procedura guidata per creare i tuoi modelli stack. Per ulteriori informazioni, consulta Tutorial: Configurare un'applicazione scalata e con carico bilanciato nella Amazon Auto Scaling EC2 User Guide.