Walkthrough: Buat aplikasi yang diskalakan dan diseimbangkan beban - AWS CloudFormation

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 dari t3.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.

  • VPCVirtual 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

  • SecurityGroupIngressberisi aturan masuknya TCP yang memungkinkan akses dari semua alamat IP (” CidrIp ": “0.0.0.0/0") pada port 80.

AWS::EC2::SecurityGroupsumber daya EC2SecurityGroup

  • SecurityGroupIngressberisi dua aturan ingress: 1) aturan masuknya TCP yang memungkinkan akses SSH (port 22) dari rentang alamat IP yang Anda berikan untuk parameter SSHLocation 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, dan HealthCheckProtocol tentukan port instans EC2 (80) dan protokol (HTTP) yang digunakan lalu lintas ApplicationLoadBalancer rute dan Elastic Load Balancing yang digunakan untuk memeriksa kesehatan instans EC2.

  • HealthCheckIntervalSecondsmenentukan bahwa instans EC2 memiliki interval 30 detik antara pemeriksaan kesehatan. HealthCheckTimeoutSecondsIni 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.

  • TargetGroupAttributesmemperbarui 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

  • DefaultActionsmenentukan port yang didengarkan penyeimbang beban, grup target tempat penyeimbang beban meneruskan permintaan, dan protokol yang digunakan untuk merutekan permintaan.

AWS::ElasticLoadBalancingV2::LoadBalancersumber daya ApplicationLoadBalancer

  • Subnetsmengambil nilai parameter Subnets input sebagai daftar subnet publik di mana node penyeimbang beban akan dibuat.

  • SecurityGroupmendapatkan 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

  • ImageIdmengambil nilai parameter LatestAmiId input sebagai AMI untuk digunakan.

  • KeyNamemengambil nilai parameter KeyName input sebagai key pair EC2 untuk digunakan.

  • SecurityGroupIdsmendapatkan ID grup keamanan dengan nama logis EC2SecurityGroup yang bertindak sebagai firewall virtual untuk instans EC2 Anda untuk mengontrol lalu lintas masuk.

  • UserDataadalah 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

  • Subscriptionmengambil nilai parameter OperatorEmail input sebagai alamat email untuk penerima notifikasi ketika ada aktivitas penskalaan.

AWS::AutoScaling::AutoScalingSumber daya grup WebServerGroup

  • MinSizedan MaxSize atur jumlah minimum dan maksimum instans EC2 di grup Auto Scaling.

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

  • VPCZoneIdentifiermengambil nilai parameter Subnets 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

  1. Masuk ke AWS Management Console dan buka AWS CloudFormation konsol di https://console.aws.amazon.com/cloudformation.

  2. Pilih Buat tumpukan, Dengan sumber daya baru (standar).

  3. Di bawah Tentukan templat, pilih Unggah file templat, Pilih file untuk mengunggah sampleloadbalancedappstack.template file.

  4. Pilih Berikutnya.

  5. Pada halaman Tentukan detail tumpukan, ketik nama tumpukan (misalnya,SampleLoadBalancedAppStack).

  6. Di bawah Parameter, tinjau parameter untuk tumpukan dan berikan nilai untuk semua parameter yang tidak memiliki nilai default, termasuk, SSHLocation OperatorEmail,, KeyNameVPC, dan Subnet.

  7. Pilih Selanjutnya dua kali.

  8. Pada halaman Ulasan, tinjau dan konfirmasikan pengaturan.

  9. 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
  1. Di AWS CloudFormation konsol, pilih SampleLoadBalancedAppStacktumpukan.

  2. Pilih Hapus.

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