Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Walkthrough: Buat aplikasi yang diskalakan dan diseimbangkan beban
Untuk panduan ini, Anda membuat tumpukan yang membantu Anda mengatur aplikasi yang diskalakan dan seimbang beban. Panduan ini menyediakan contoh template yang Anda gunakan untuk membuat tumpukan. Contoh template menyediakan grup Auto Scaling, Application Load Balancer, grup keamanan yang mengontrol lalu lintas ke penyeimbang beban dan ke grup Auto Scaling, dan konfigurasi notifikasi Amazon SNS untuk mempublikasikan pemberitahuan tentang aktivitas penskalaan.
Template ini membuat satu atau beberapa instans Amazon EC2 dan Application Load Balancer. Anda akan ditagih untuk sumber daya AWS yang digunakan jika Anda membuat tumpukan dari templat ini.
Template tumpukan penuh
Mari kita mulai dengan template.
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" } } } } }
Panduan templat
Bagian pertama dari template ini menentukan. Parameters
Setiap parameter harus diberi nilai saat runtime AWS CloudFormation agar berhasil menyediakan tumpukan. Sumber daya yang ditentukan kemudian dalam templat mereferensikan nilai-nilai ini dan menggunakan data.
-
InstanceType
: Jenis instans EC2 yang disediakan oleh Amazon EC2 Auto Scaling. Jika tidak ditentukan, default darit3.micro
digunakan. -
KeyName
: Sebuah key pair EC2 yang ada untuk memungkinkan akses SSH ke instance. -
LatestAmiId
: Amazon Machine Image (AMI) untuk instans. Jika tidak ditentukan, instans Anda diluncurkan dengan Amazon Linux 2 AMI, menggunakan parameter AWS Systems Manager publik yang dikelola oleh AWS. Untuk informasi selengkapnya, lihat Menemukan parameter publik di Panduan AWS Systems Manager Pengguna. -
OperatorEmail
: Alamat email tempat Anda ingin mengirim pemberitahuan aktivitas penskalaan. -
SSHLocation
: Rentang alamat IP yang dapat digunakan untuk SSH ke instance. -
Subnets
: Setidaknya dua subnet publik di Availability Zone yang berbeda. -
VPC
Virtual Private Cloud (VPC) di akun Anda yang memungkinkan sumber daya di subnet publik untuk terhubung ke internet.catatan
Anda dapat menggunakan VPC default dan subnet default untuk memungkinkan instance mengakses internet. Jika menggunakan VPC Anda sendiri, pastikan bahwa itu memiliki subnet yang dipetakan ke setiap Availability Zone dari Wilayah tempat Anda bekerja. Minimal, Anda harus memiliki dua subnet publik yang tersedia untuk membuat penyeimbang beban.
Bagian selanjutnya dari template ini menentukan. Resources
Bagian ini menentukan sumber daya tumpukan dan propertinya.
AWS::EC2::SecurityGroupsumber daya ELBSecurityGroup
-
SecurityGroupIngress
berisi aturan masuknya TCP yang memungkinkan akses dari semua alamat IP (” CidrIp ": “0.0.0.0/0") pada port 80.
AWS::EC2::SecurityGroupsumber daya EC2SecurityGroup
-
SecurityGroupIngress
berisi dua aturan ingress: 1) aturan masuknya TCP yang memungkinkan akses SSH (port 22) dari rentang alamat IP yang Anda berikan untuk parameterSSHLocation
input dan 2) aturan masuknya TCP yang memungkinkan akses dari penyeimbang beban dengan menentukan grup keamanan penyeimbang beban. GetAttFungsi ini digunakan untuk mendapatkan ID grup keamanan dengan nama logisELBSecurityGroup
.
AWS::ElasticLoadBalancingV2::TargetGroupsumber daya EC2TargetGroup
-
Port
,Protocol
, danHealthCheckProtocol
tentukan port instans EC2 (80) dan protokol (HTTP) yang digunakan lalu lintasApplicationLoadBalancer
rute dan Elastic Load Balancing yang digunakan untuk memeriksa kesehatan instans EC2. -
HealthCheckIntervalSeconds
menentukan bahwa instans EC2 memiliki interval 30 detik antara pemeriksaan kesehatan.HealthCheckTimeoutSeconds
Ini didefinisikan sebagai lamanya waktu Elastic Load Balancing menunggu respons dari target pemeriksaan kesehatan (15 detik dalam contoh ini). Setelah periode batas waktu berlalu, Elastic Load Balancing menandai bahwa pemeriksaan kesehatan instans EC2 tidak sehat. Ketika instans EC2 gagal tiga pemeriksaan kesehatan berturut-turut (UnhealthyThresholdCount
), Elastic Load Balancing menghentikan perutean lalu lintas ke instans EC2 tersebut hingga instance tersebut memiliki lima pemeriksaan kesehatan sehat berturut-turut ().HealthyThresholdCount
Pada saat itu, Elastic Load Balancing menganggap instance sehat dan mulai merutekan lalu lintas ke instance lagi. -
TargetGroupAttributes
memperbarui nilai penundaan deregistrasi grup target menjadi 20 detik. Secara default, Elastic Load Balancing menunggu 300 detik sebelum menyelesaikan proses deregistrasi.
AWS::ElasticLoadBalancingV2::Listenersumber daya ALBListener
-
DefaultActions
menentukan port yang didengarkan penyeimbang beban, grup target tempat penyeimbang beban meneruskan permintaan, dan protokol yang digunakan untuk merutekan permintaan.
AWS::ElasticLoadBalancingV2::LoadBalancersumber daya ApplicationLoadBalancer
-
Subnets
mengambil nilai parameterSubnets
input sebagai daftar subnet publik di mana node penyeimbang beban akan dibuat. -
SecurityGroup
mendapatkan ID grup keamanan yang bertindak sebagai firewall virtual untuk node penyeimbang beban Anda untuk mengontrol lalu lintas masuk. GetAttFungsi ini digunakan untuk mendapatkan ID grup keamanan dengan nama logisELBSecurityGroup
.
AWS::EC2::LaunchTemplatesumber daya LaunchTemplate
-
ImageId
mengambil nilai parameterLatestAmiId
input sebagai AMI untuk digunakan. -
KeyName
mengambil nilai parameterKeyName
input sebagai key pair EC2 untuk digunakan. -
SecurityGroupIds
mendapatkan ID grup keamanan dengan nama logisEC2SecurityGroup
yang bertindak sebagai firewall virtual untuk instans EC2 Anda untuk mengontrol lalu lintas masuk. -
UserData
adalah skrip konfigurasi yang berjalan setelah instance aktif dan berjalan. Dalam contoh ini, skrip menginstal Apache dan membuat file index.html.
AWS::SNS::Topicsumber daya NotificationTopic
-
Subscription
mengambil nilai parameterOperatorEmail
input sebagai alamat email untuk penerima notifikasi ketika ada aktivitas penskalaan.
AWS::AutoScaling::AutoScalingSumber daya grup WebServerGroup
-
MinSize
danMaxSize
atur jumlah minimum dan maksimum instans EC2 di grup Auto Scaling. -
TargetGroupARNs
mengambil ARN dari kelompok target dengan nama logis.EC2TargetGroup
Saat grup Auto Scaling ini menskalakan, grup Auto Scaling secara otomatis mendaftarkan dan membatalkan pendaftaran instance dengan grup target ini. -
VPCZoneIdentifier
mengambil nilai parameterSubnets
input sebagai daftar subnet publik tempat instans EC2 dapat dibuat.
Langkah 1: Luncurkan tumpukan
Sebelum meluncurkan tumpukan, periksa apakah Anda memiliki izin AWS Identity and Access Management (IAM) untuk menggunakan semua layanan berikut: Amazon EC2, Auto Scaling Amazon EC2,, AWS Systems Manager Elastic Load Balancing, Amazon SNS, dan. AWS CloudFormation
Prosedur berikut melibatkan mengunggah template tumpukan sampel dari file. Buka editor teks di mesin lokal Anda dan tambahkan salah satu templat. Simpan file dengan namasampleloadbalancedappstack.template
.
Untuk meluncurkan template tumpukan
-
Masuk ke AWS Management Console dan buka AWS CloudFormation konsol di https://console.aws.amazon.com/cloudformation
. -
Pilih Buat tumpukan, Dengan sumber daya baru (standar).
-
Di bawah Tentukan templat, pilih Unggah file templat, Pilih file untuk mengunggah
sampleloadbalancedappstack.template
file. -
Pilih Berikutnya.
-
Pada halaman Tentukan detail tumpukan, ketik nama tumpukan (misalnya,
SampleLoadBalancedAppStack
). -
Di bawah Parameter, tinjau parameter untuk tumpukan dan berikan nilai untuk semua parameter yang tidak memiliki nilai default, termasuk, SSHLocation OperatorEmail,, KeyNameVPC, dan Subnet.
-
Pilih Selanjutnya dua kali.
-
Pada halaman Ulasan, tinjau dan konfirmasikan pengaturan.
-
Pilih Kirim.
Anda dapat melihat status tumpukan di AWS CloudFormation konsol di kolom Status. Ketika AWS CloudFormation telah berhasil membuat tumpukan, Anda menerima status CREATE_COMPLETE.
catatan
Setelah Anda membuat tumpukan, Anda harus mengonfirmasi langganan sebelum alamat email dapat mulai menerima pemberitahuan. Untuk informasi selengkapnya, lihat Mendapatkan notifikasi Amazon SNS saat grup Auto Scaling Anda menskalakan di Panduan Pengguna Auto Scaling Amazon EC2.
Langkah 2: Bersihkan sumber daya sampel Anda
Untuk memastikan bahwa Anda tidak dikenakan biaya untuk sumber daya sampel yang tidak digunakan, hapus tumpukan.
Untuk menghapus tumpukan
-
Di AWS CloudFormation konsol, pilih SampleLoadBalancedAppStacktumpukan.
-
Pilih Hapus.
-
Dalam pesan konfirmasi, pilih Hapus tumpukan.
Status SampleLoadBalancedAppStackperubahan pada DELETE_IN_PROGRESS. Ketika AWS CloudFormation menyelesaikan penghapusan tumpukan, itu menghapus tumpukan dari daftar.
Gunakan contoh template dari panduan ini untuk membangun template tumpukan Anda sendiri. Untuk informasi selengkapnya, lihat Tutorial: Menyiapkan aplikasi yang diskalakan dan seimbang beban di Panduan Pengguna Auto Scaling Amazon EC2.