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.

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 SNS Amazon untuk mempublikasikan notifikasi tentang aktivitas penskalaan.

Template ini membuat satu atau beberapa EC2 instans Amazon 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 EC2 instance yang disediakan Amazon EC2 Auto Scaling. Jika tidak ditentukan, default dari t3.micro digunakan.

  • KeyName: Sebuah EC2 key pair yang ada untuk memungkinkan SSH akses ke instance.

  • LatestAmiId: Amazon Machine Image (AMI) untuk instance. Jika tidak ditentukan, instans Anda diluncurkan dengan Amazon Linux 2AMI, 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 SSH untuk 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 subnet default VPC dan default untuk memungkinkan instance mengakses internet. Jika menggunakan milik Anda sendiriVPC, pastikan subnet 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 TCP ingress yang memungkinkan akses dari semua alamat IP (” CidrIp ": “0.0.0.0/0") pada port 80.

AWS::EC2::SecurityGroupsumber daya EC2SecurityGroup

  • SecurityGroupIngressberisi dua aturan masuk: 1) aturan TCP masuk yang memungkinkan SSH akses (port 22) dari rentang alamat IP yang Anda berikan untuk parameter SSHLocation input dan 2) aturan TCP masuk yang memungkinkan akses dari penyeimbang beban dengan menentukan grup keamanan penyeimbang beban. GetAttFungsi ini digunakan untuk mendapatkan ID grup keamanan dengan nama logisELBSecurityGroup.

AWS:: ElasticLoadBalancing V2:: TargetGroup sumber daya EC2TargetGroup

  • Port,Protocol, dan HealthCheckProtocol tentukan port EC2 instance (80) dan protocol (HTTP) yang digunakan lalu lintas ApplicationLoadBalancer rute dan Elastic Load Balancing yang digunakan untuk memeriksa kesehatan instance. EC2

  • HealthCheckIntervalSecondsmenentukan bahwa EC2 instance 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 pemeriksaan kesehatan instans EC2 tersebut sebagai tidak sehat. Ketika sebuah EC2 instans gagal tiga pemeriksaan kesehatan berturut-turut (UnhealthyThresholdCount), Elastic Load Balancing berhenti merutekan lalu lintas ke instance EC2 itu sampai 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:: ElasticLoadBalancing V2: :Sumber daya pendengar ALBListener

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

AWS:: ElasticLoadBalancing V2:: LoadBalancer sumber 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: LaunchTemplate sumber daya LaunchTemplate

  • ImageIdmengambil nilai parameter LatestAmiId input sebagai AMI untuk digunakan.

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

  • SecurityGroupIdsmendapatkan ID grup keamanan dengan nama logis EC2SecurityGroup yang bertindak sebagai firewall virtual untuk EC2 instance 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: :Sumber daya topik NotificationTopic

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

AWS:::AutoScaling: AutoScalingGroup sumber daya WebServerGroup

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

  • TargetGroupARNsmengambil kelompok target dengan nama logisEC2TargetGroup. ARN 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 EC2 instance dapat dibuat.

Langkah 1: Luncurkan tumpukan

Sebelum meluncurkan stack, periksa apakah Anda memiliki izin AWS Identity and Access Management (IAM) untuk menggunakan semua layanan berikut: AmazonEC2, Amazon EC2 Auto Scaling,, Elastic Load Balancing AWS Systems Manager, 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 Selanjutnya.

  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 OperatorEmail, SSHLocation,, 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 SNS notifikasi Amazon saat grup Auto Scaling Anda menskalakan di Panduan Pengguna Amazon Auto EC2 Scaling.

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 untuk SampleLoadBalancedAppStackperubahan 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 diseimbangkan beban di Panduan Pengguna Amazon EC2Auto Scaling.