Panduan: Memperbarui tumpukan - AWS CloudFormation

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Panduan: Memperbarui tumpukan

Dengan CloudFormation, Anda dapat memperbarui properti untuk sumber daya di tumpukan yang ada. Perubahan ini dapat berkisar dari perubahan konfigurasi sederhana, seperti memperbarui ambang alarm pada CloudWatch alarm, hingga perubahan yang lebih kompleks, seperti memperbarui Amazon Machine Image (AMI) yang berjalan pada instans Amazon EC2. Banyak sumber AWS daya dalam template dapat diperbarui, dan kami terus menambahkan dukungan untuk lebih banyak.

Bagian ini membahas perkembangan sederhana dari pembaruan tumpukan yang sedang berjalan. Ini menunjukkan bagaimana penggunaan template memungkinkan untuk menggunakan sistem kontrol versi untuk konfigurasi AWS infrastruktur Anda, sama seperti Anda menggunakan kontrol versi untuk perangkat lunak yang Anda jalankan. Kita akan mengikuti panduan dengan langkah-langkah berikut:

  1. Membuat tumpukan awal— membuat tumpukan menggunakan basis Amazon Linux AMI, menginstal Apache Web Server dan aplikasi PHP sederhana menggunakan skrip CloudFormation pembantu.

  2. Memperbarui aplikasi— perbarui salah satu file dalam aplikasi dan gunakan perangkat lunak menggunakan CloudFormation.

  3. Memperbarui tipe instans— ubah jenis instans instans Amazon EC2 yang mendasarinya.

  4. Perbarui AMI pada instans Amazon EC2— ubah Amazon Machine Image (AMI) untuk instans Amazon EC2 di tumpukan Anda.

  5. Menambahkan pasangan kunci ke sebuah instans— tambahkan key pair Amazon EC2 ke instance, lalu perbarui grup keamanan untuk memungkinkan akses SSH ke instance.

  6. Mengubah sumber daya tumpukan— menambah dan menghapus sumber daya dari tumpukan, mengubahnya menjadi aplikasi yang diskalakan otomatis dan seimbang beban dengan memperbarui template.

Sebuah aplikasi sederhana

Kita akan mulai dengan membuat tumpukan yang dapat kita gunakan di seluruh bagian ini. Kami telah menyediakan template sederhana yang meluncurkan satu contoh aplikasi web PHP yang dihosting di Apache Web Server dan berjalan di Amazon Linux AMI.

Apache Web Server, PHP, dan aplikasi PHP sederhana semuanya diinstal oleh skrip CloudFormation pembantu yang diinstal secara default di Amazon Linux AMI. Cuplikan template berikut menunjukkan metadata yang menjelaskan paket dan file yang akan diinstal, dalam hal ini Apache Web Server dan infrastruktur PHP dari repositori Yum untuk Amazon Linux AMI. Snippet juga menunjukkan bagian Layanan, yang memastikan bahwa Apache Web Server berjalan. Di bagian Properties dari definisi instans Amazon EC2, UserData properti berisi CloudInit skrip yang memanggil cfn-init untuk menginstal paket dan file.

"WebServerInstance": { "Type" : "AWS::EC2::Instance", "Metadata" : { "AWS::CloudFormation::Init" : { "config" : { "packages" : { "yum" : { "httpd" : [], "php" : [] } }, "files" : { "/var/www/html/index.php" : { "content" : { "Fn::Join" : ["", [ "<?php\n", "echo '<h1>AWS CloudFormation sample PHP application</h1>';\n", "echo '<p>", { "Ref" : "WelcomeMessage" }, "</p>';\n", "?>\n" ]]}, "mode" : "000644", "owner" : "apache", "group" : "apache" }, }, : "services" : { "sysvinit" : { "httpd" : { "enabled" : "true", "ensureRunning" : "true" } } } } } }, "Properties": { : "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash\n", "yum install -y aws-cfn-bootstrap\n", : "# Install the files and packages from the metadata\n", "/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServerInstance ", " --region ", { "Ref" : "AWS::Region" }, "\n", : ]]}} } },

Aplikasi itu sendiri adalah contoh dua baris “Hello World” yang sepenuhnya didefinisikan dalam template. Untuk aplikasi dunia nyata, file dapat disimpan di Amazon S3 GitHub,, atau repositori lain dan direferensikan dari template. CloudFormation dapat mengunduh paket (seperti RPM atau RubyGems), dan referensi file individual dan memperluas .zip dan .tar file untuk membuat artefak aplikasi pada instans Amazon EC2.

Template mengaktifkan dan mengonfigurasi daemon cfn-hup untuk mendengarkan perubahan pada konfigurasi yang ditentukan dalam metadata untuk instans Amazon EC2. Dengan menggunakan daemon cfn-hup, Anda dapat memperbarui perangkat lunak aplikasi, seperti versi Apache atau PHP, atau Anda dapat memperbarui file aplikasi PHP itu sendiri. CloudFormation Cuplikan berikut dari sumber daya Amazon EC2 yang sama di template menunjukkan bagian yang diperlukan untuk mengonfigurasi cfn-hup untuk memanggil cfn-init guna memperbarui perangkat lunak jika ada perubahan pada metadata yang terdeteksi:

"WebServerInstance": { "Type" : "AWS::EC2::Instance", "Metadata" : { "AWS::CloudFormation::Init" : { "config" : { : "files" : { : "/etc/cfn/cfn-hup.conf" : { "content" : { "Fn::Join" : ["", [ "[main]\n", "stack=", { "Ref" : "AWS::StackName" }, "\n", "region=", { "Ref" : "AWS::Region" }, "\n" ]]}, "mode" : "000400", "owner" : "root", "group" : "root" }, "/etc/cfn/hooks.d/cfn-auto-reloader.conf" : { "content": { "Fn::Join" : ["", [ "[cfn-auto-reloader-hook]\n", "triggers=post.update\n", "path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init\n", "action=/opt/aws/bin/cfn-init -s ", { "Ref" : "AWS::StackId" }, " -r WebServerInstance ", " --region ", { "Ref" : "AWS::Region" }, "\n", "runas=root\n" ]]} } }, : }, "Properties": { : "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ : "# Start up the cfn-hup daemon to listen for changes to the Web Server metadata\n", "/opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup'\n", : ]]}} } },

Untuk menyelesaikan tumpukan, template membuat grup keamanan Amazon EC2.

{ "AWSTemplateFormatVersion" : "2010-09-09", "Description" : "AWS CloudFormation Sample Template: Sample template that can be used to test EC2 updates. **WARNING** This template creates an Amazon Ec2 Instance. You will be billed for the AWS resources used if you create a stack from this template.", "Parameters" : { "InstanceType" : { "Description" : "WebServer EC2 instance type", "Type" : "String", "Default" : "t2.small", "AllowedValues" : [ "t1.micro", "t2.nano", "t2.micro", "t2.small", "t2.medium", "t2.large", "m1.small", "m1.medium", "m1.large", "m1.xlarge", "m2.xlarge", "m2.2xlarge", "m2.4xlarge", "m3.medium", "m3.large", "m3.xlarge", "m3.2xlarge", "m4.large", "m4.xlarge", "m4.2xlarge", "m4.4xlarge", "m4.10xlarge", "c1.medium", "c1.xlarge", "c3.large", "c3.xlarge", "c3.2xlarge", "c3.4xlarge", "c3.8xlarge", "c4.large", "c4.xlarge", "c4.2xlarge", "c4.4xlarge", "c4.8xlarge", "g2.2xlarge", "g2.8xlarge", "r3.large", "r3.xlarge", "r3.2xlarge", "r3.4xlarge", "r3.8xlarge", "i2.xlarge", "i2.2xlarge", "i2.4xlarge", "i2.8xlarge", "d2.xlarge", "d2.2xlarge", "d2.4xlarge", "d2.8xlarge", "hi1.4xlarge", "hs1.8xlarge", "cr1.8xlarge", "cc2.8xlarge", "cg1.4xlarge" ], "ConstraintDescription" : "must be a valid EC2 instance type." } }, "Mappings" : { "AWSInstanceType2Arch" : { "t1.micro" : { "Arch" : "HVM64" }, "t2.nano" : { "Arch" : "HVM64" }, "t2.micro" : { "Arch" : "HVM64" }, "t2.small" : { "Arch" : "HVM64" }, "t2.medium" : { "Arch" : "HVM64" }, "t2.large" : { "Arch" : "HVM64" }, "m1.small" : { "Arch" : "HVM64" }, "m1.medium" : { "Arch" : "HVM64" }, "m1.large" : { "Arch" : "HVM64" }, "m1.xlarge" : { "Arch" : "HVM64" }, "m2.xlarge" : { "Arch" : "HVM64" }, "m2.2xlarge" : { "Arch" : "HVM64" }, "m2.4xlarge" : { "Arch" : "HVM64" }, "m3.medium" : { "Arch" : "HVM64" }, "m3.large" : { "Arch" : "HVM64" }, "m3.xlarge" : { "Arch" : "HVM64" }, "m3.2xlarge" : { "Arch" : "HVM64" }, "m4.large" : { "Arch" : "HVM64" }, "m4.xlarge" : { "Arch" : "HVM64" }, "m4.2xlarge" : { "Arch" : "HVM64" }, "m4.4xlarge" : { "Arch" : "HVM64" }, "m4.10xlarge" : { "Arch" : "HVM64" }, "c1.medium" : { "Arch" : "HVM64" }, "c1.xlarge" : { "Arch" : "HVM64" }, "c3.large" : { "Arch" : "HVM64" }, "c3.xlarge" : { "Arch" : "HVM64" }, "c3.2xlarge" : { "Arch" : "HVM64" }, "c3.4xlarge" : { "Arch" : "HVM64" }, "c3.8xlarge" : { "Arch" : "HVM64" }, "c4.large" : { "Arch" : "HVM64" }, "c4.xlarge" : { "Arch" : "HVM64" }, "c4.2xlarge" : { "Arch" : "HVM64" }, "c4.4xlarge" : { "Arch" : "HVM64" }, "c4.8xlarge" : { "Arch" : "HVM64" }, "g2.2xlarge" : { "Arch" : "HVMG2" }, "g2.8xlarge" : { "Arch" : "HVMG2" }, "r3.large" : { "Arch" : "HVM64" }, "r3.xlarge" : { "Arch" : "HVM64" }, "r3.2xlarge" : { "Arch" : "HVM64" }, "r3.4xlarge" : { "Arch" : "HVM64" }, "r3.8xlarge" : { "Arch" : "HVM64" }, "i2.xlarge" : { "Arch" : "HVM64" }, "i2.2xlarge" : { "Arch" : "HVM64" }, "i2.4xlarge" : { "Arch" : "HVM64" }, "i2.8xlarge" : { "Arch" : "HVM64" }, "d2.xlarge" : { "Arch" : "HVM64" }, "d2.2xlarge" : { "Arch" : "HVM64" }, "d2.4xlarge" : { "Arch" : "HVM64" }, "d2.8xlarge" : { "Arch" : "HVM64" }, "hi1.4xlarge" : { "Arch" : "HVM64" }, "hs1.8xlarge" : { "Arch" : "HVM64" }, "cr1.8xlarge" : { "Arch" : "HVM64" }, "cc2.8xlarge" : { "Arch" : "HVM64" } }, "AWSRegionArch2AMI" : { "us-east-1" : {"HVM64" : "ami-0ff8a91507f77f867", "HVMG2" : "ami-0a584ac55a7631c0c"}, "us-west-2" : {"HVM64" : "ami-a0cfeed8", "HVMG2" : "ami-0e09505bc235aa82d"}, "us-west-1" : {"HVM64" : "ami-0bdb828fd58c52235", "HVMG2" : "ami-066ee5fd4a9ef77f1"}, "eu-west-1" : {"HVM64" : "ami-047bb4163c506cd98", "HVMG2" : "ami-0a7c483d527806435"}, "eu-west-2" : {"HVM64" : "ami-f976839e", "HVMG2" : "NOT_SUPPORTED"}, "eu-west-3" : {"HVM64" : "ami-0ebc281c20e89ba4b", "HVMG2" : "NOT_SUPPORTED"}, "eu-central-1" : {"HVM64" : "ami-0233214e13e500f77", "HVMG2" : "ami-06223d46a6d0661c7"}, "ap-northeast-1" : {"HVM64" : "ami-06cd52961ce9f0d85", "HVMG2" : "ami-053cdd503598e4a9d"}, "ap-northeast-2" : {"HVM64" : "ami-0a10b2721688ce9d2", "HVMG2" : "NOT_SUPPORTED"}, "ap-northeast-3" : {"HVM64" : "ami-0d98120a9fb693f07", "HVMG2" : "NOT_SUPPORTED"}, "ap-southeast-1" : {"HVM64" : "ami-08569b978cc4dfa10", "HVMG2" : "ami-0be9df32ae9f92309"}, "ap-southeast-2" : {"HVM64" : "ami-09b42976632b27e9b", "HVMG2" : "ami-0a9ce9fecc3d1daf8"}, "ap-south-1" : {"HVM64" : "ami-0912f71e06545ad88", "HVMG2" : "ami-097b15e89dbdcfcf4"}, "us-east-2" : {"HVM64" : "ami-0b59bfac6be064b78", "HVMG2" : "NOT_SUPPORTED"}, "ca-central-1" : {"HVM64" : "ami-0b18956f", "HVMG2" : "NOT_SUPPORTED"}, "sa-east-1" : {"HVM64" : "ami-07b14488da8ea02a0", "HVMG2" : "NOT_SUPPORTED"}, "cn-north-1" : {"HVM64" : "ami-0a4eaf6c4454eda75", "HVMG2" : "NOT_SUPPORTED"}, "cn-northwest-1" : {"HVM64" : "ami-6b6a7d09", "HVMG2" : "NOT_SUPPORTED"} } }, "Resources" : { "WebServerInstance": { "Type" : "AWS::EC2::Instance", "Metadata" : { "Comment" : "Install a simple PHP application", "AWS::CloudFormation::Init" : { "config" : { "packages" : { "yum" : { "httpd" : [], "php" : [] } }, "files" : { "/var/www/html/index.php" : { "content" : { "Fn::Join" : ["", [ "<?php\n", "echo '<h1>AWS CloudFormation sample PHP application</h1>';\n", "?>\n" ]]}, "mode" : "000644", "owner" : "apache", "group" : "apache" }, "/etc/cfn/cfn-hup.conf" : { "content" : { "Fn::Join" : ["", [ "[main]\n", "stack=", { "Ref" : "AWS::StackId" }, "\n", "region=", { "Ref" : "AWS::Region" }, "\n" ]]}, "mode" : "000400", "owner" : "root", "group" : "root" }, "/etc/cfn/hooks.d/cfn-auto-reloader.conf" : { "content": { "Fn::Join" : ["", [ "[cfn-auto-reloader-hook]\n", "triggers=post.update\n", "path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init\n", "action=/opt/aws/bin/cfn-init -s ", { "Ref" : "AWS::StackId" }, " -r WebServerInstance ", " --region ", { "Ref" : "AWS::Region" }, "\n", "runas=root\n" ]]} } }, "services" : { "sysvinit" : { "httpd" : { "enabled" : "true", "ensureRunning" : "true" }, "cfn-hup" : { "enabled" : "true", "ensureRunning" : "true", "files" : ["/etc/cfn/cfn-hup.conf", "/etc/cfn/hooks.d/cfn-auto-reloader.conf"]} } } } } }, "Properties": { "ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" }, { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ] }, "InstanceType" : { "Ref" : "InstanceType" }, "SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ], "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash -xe\n", "yum install -y aws-cfn-bootstrap\n", "# Install the files and packages from the metadata\n", "/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServerInstance ", " --region ", { "Ref" : "AWS::Region" }, "\n", "# Start up the cfn-hup daemon to listen for changes to the Web Server metadata\n", "/opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup'\n", "# Signal the status from cfn-init\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServerInstance ", " --region ", { "Ref" : "AWS::Region" }, "\n" ]]}} }, "CreationPolicy" : { "ResourceSignal" : { "Timeout" : "PT5M" } } }, "WebServerSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP access via port 80", "SecurityGroupIngress" : [ {"IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : "0.0.0.0/0"} ] } } }, "Outputs" : { "WebsiteURL" : { "Description" : "Application URL", "Value" : { "Fn::Join" : ["", ["http://", { "Fn::GetAtt" : [ "WebServerInstance", "PublicDnsName" ]}]] } } } }

Contoh ini menggunakan instans Amazon EC2 tunggal, tetapi Anda dapat menggunakan mekanisme yang sama pada solusi yang lebih kompleks yang menggunakan Elastic Load Balancing Amazon EC2 Auto Scaling dan grup untuk mengelola kumpulan server aplikasi. Namun, ada beberapa pertimbangan khusus untuk grup Auto Scaling. Untuk informasi selengkapnya, lihat Memperbarui grup Auto Scaling.

Membuat tumpukan awal

Untuk keperluan contoh ini, kita akan menggunakan AWS Management Console untuk membuat tumpukan awal dari template sampel.

Awas

Menyelesaikan prosedur ini akan menggunakan AWS layanan langsung. Anda akan dikenakan tarif penggunaan standar selama layanan ini berjalan.

Untuk membuat tumpukan dari AWS Management Console
  1. Salin templat sebelumnya dan simpan secara lokal pada sistem Anda sebagai file teks. Catat lokasinya karena Anda harus menggunakan file di langkah berikutnya.

  2. Masuk ke CloudFormation konsol di https://console.aws.amazon.com/cloudformation.

  3. Pilih Buat Tumpukan Baru.

  4. Di panduan Membuat Tumpukan Baru, pada layar Pilih Templat, ketikkan UpdateTutorial di bidang Nama. Pada halaman yang sama, pilih Unggah templat ke Amazon S3 Lalu jelajahi file yang Anda unduh di langkah pertama, lalu pilih Selanjutnya.

  5. Di layar Tentukan Parameter, di kotak Tipe instans, ketikkan t1.micro. Lalu pilih Selanjutnya.

  6. Di layar Opsi, pilih Selanjutnya.

  7. Di layar Tinjau, pastikan semua pengaturan sesuai keinginan Anda, lalu pilih Buat.

Setelah status tumpukan Anda CREATE_COMPLETE, tab output akan menampilkan URL dari situs web Anda. Jika Anda memilih nilai output WebsiteURL, Anda akan melihat aplikasi PHP baru Anda bekerja.

Memperbarui aplikasi

Karena kita sudah men-deploy tumpukan, mari kita perbarui aplikasi ini. Kami akan membuat perubahan sederhana pada teks yang dicetak oleh aplikasi. Untuk melakukannya, kita akan menambahkan perintah echo ke file index.php seperti yang ditunjukkan dalam snippet templat ini:

"WebServerInstance": { "Type" : "AWS::EC2::Instance", "Metadata" : { "AWS::CloudFormation::Init" : { "config" : { : "files" : { "/var/www/html/index.php" : { "content" : { "Fn::Join" : ["", [ "<?php\n", "echo '<h1>AWS CloudFormation sample PHP application</h1>';\n", "echo '<p>Updated version via UpdateStack</p>';\n ", "?>\n" ]]}, "mode" : "000644", "owner" : "apache", "group" : "apache" }, : } },

Gunakan editor teks untuk secara manual mengedit file templat yang Anda simpan secara lokal.

Sekarang, kita akan memperbarui tumpukan.

Untuk memperbarui tumpukan dari AWS Management Console
  1. Masuk ke CloudFormation konsol, di: https://console.aws.amazon.com/cloudformation.

  2. Di CloudFormation dasbor, pilih tumpukan yang Anda buat sebelumnya, lalu pilih Update Stack.

  3. Di panduan Memperbarui Tumpukan, di layar Pilih templat, pilih Unggah templat ke Amazon S3, pilih templat yang dimodifikasi, kemudian pilih Selanjutnya.

  4. Di layar Opsi, pilih Selanjutnya.

  5. Pilih Selanjutnya karena tumpukan tidak memiliki kebijakan tumpukan. Semua sumber daya dapat diperbarui tanpa kebijakan timpa.

  6. Di layar Tinjau, pastikan semua pengaturan sesuai keinginan Anda, lalu pilih Perbarui.

Jika Anda memperbarui tumpukan dari AWS Management Console, Anda akan melihat bahwa parameter yang digunakan untuk membuat tumpukan awal telah diisi sebelumnya di halaman Parameter wizard Update Stack. Jika Anda menggunakan perintah aws cloudformation update-stack, pastikan untuk mengetikkan nilai yang sama untuk parameter yang Anda gunakan awalnya untuk membuat tumpukan.

Ketika tumpukan Anda dalam status UPDATE_COMPLETE, Anda dapat memilih nilai output WebsiteURL lagi untuk memastikan bahwa perubahan di aplikasi Anda telah berlaku. Secara default, daemon cfn-hup berjalan setiap 15 menit, sehingga mungkin diperlukan waktu hingga 15 menit untuk hingga perubahan diterapkan di aplikasi setelah tumpukan telah diperbarui.

Untuk melihat kumpulan sumber daya yang diperbarui, buka CloudFormation konsol. Di tab Peristiwa, llihat peristiwa tumpukan. Dalam kasus khusus ini, metadata untuk WebServerInstance instans Amazon EC2 diperbarui, yang CloudFormation menyebabkan juga mengevaluasi kembali resource WebServerSecurityGroup () lainnya untuk memastikan bahwa tidak ada perubahan lain. Tak satu pun dari sumber daya tumpukan lainnya yang dimodifikasi. CloudFormation hanya akan memperbarui sumber daya di tumpukan yang dipengaruhi oleh perubahan apa pun pada tumpukan. Perubahan tersebut dapat bersifat langsung, seperti perubahan properti atau metadata, atau dapat disebabkan oleh dependensi atau aliran data melalui Ref, GetAtt, atau fungsi template intrinsik lainnya.

Pembaruan sederhana ini menggambarkan prosesnya; namun, Anda dapat membuat perubahan yang jauh lebih kompleks pada file dan paket yang digunakan ke instans Amazon EC2 Anda. Misalnya, Anda mungkin memutuskan bahwa Anda perlu menambahkan MySQL ke instans, bersama dengan dukungan PHP untuk MySQL. Untuk melakukannya, cukup tambahkan paket dan file tambahan bersama dengan layanan tambahan apa pun ke konfigurasi, lalu perbarui tumpukan untuk menerapkan perubahan. Dalam snippet templat berikut, perubahan disorot dalam warna merah:

"WebServerInstance": { "Type" : "AWS::EC2::Instance", "Metadata" : { "Comment" : "Install a simple PHP application", "AWS::CloudFormation::Init" : { "config" : { "packages" : { "yum" : { "httpd" : [], "php" : [], "php-mysql" : [], "mysql-server" : [], "mysql-libs" : [], "mysql" : [] } }, : "services" : { "sysvinit" : { "httpd" : { "enabled" : "true", "ensureRunning" : "true" }, "cfn-hup" : { "enabled" : "true", "ensureRunning" : "true", "files" : ["/etc/cfn/cfn-hup.conf", "/etc/cfn/hooks.d/cfn-auto-reloader.conf"]}, "mysqld" : { "enabled" : "true", "ensureRunning" : "true" } } } } } }, "Properties": { : } }

Anda dapat memperbarui CloudFormation metadata untuk memperbarui ke versi baru dari paket yang digunakan oleh aplikasi. Di contoh sebelumnya, properti versi untuk setiap paket kosong, menunjukkan bahwa cfn-init harus menginstal versi terbaru dari paket.

"packages" : { "yum" : { "httpd" : [], "php" : [] }

Anda dapat secara opsional menentukan string versi untuk paket. Jika Anda mengubah string versi dalam panggilan tumpukan pembaruan berikutnya, versi baru dari paket akan di-deploy. Berikut adalah contoh penggunaan nomor versi untuk RubyGems paket. Setiap paket yang mendukung versioning dapat memiliki versi tertentu.

"packages" : { "rubygems" : { "mysql" : [], "rubygems-update" : ["1.6.2"], "rake" : ["0.8.7"], "rails" : ["2.3.11"] } }

Memperbarui grup Auto Scaling

Jika Anda menggunakan grup Auto Scaling di template Anda, sebagai lawan dari sumber daya instans Amazon EC2, memperbarui aplikasi akan bekerja dengan cara yang persis sama; namun CloudFormation , tidak menyediakan sinkronisasi atau serialisasi apa pun di seluruh instans Amazon EC2 dalam grup Auto Scaling. Daemon cfn-hup pada setiap host akan berjalan sendiri dan memperbarui aplikasi sesuai jadwalnya sendiri. Ketika Anda menggunakan cfn-hup untuk memperbarui konfigurasi pada instans, setiap instans akan menjalankan kait cfn-hup sesuai jadwalnya sendiri; tidak ada koordinasi di antara instans di tumpukan. Anda harus mempertimbangkan hal berikut:

  • Jika perubahan cfn-hup berjalan di semua instans Amazon EC2 di grup Auto Scaling secara bersamaan, layanan Anda mungkin tidak tersedia selama pembaruan.

  • Jika perubahan cfn-hup berjalan pada waktu yang berbeda, versi lama dan baru dari perangkat lunak mungkin berjalan pada waktu yang sama.

Untuk menghindari masalah ini, pertimbangkan untuk memaksa pembaruan bergulir pada instans Anda di grup Auto Scaling. Untuk informasi selengkapnya, lihat UpdatePolicyatribut.

Mengubah properti sumber daya

Dengan CloudFormation, Anda dapat mengubah properti sumber daya yang ada di tumpukan. Bagian berikut menjelaskan berbagai pembaruan yang memecahkan masalah tertentu; tetapi, properti apa pun dari sumber daya apa pun yang mendukung pembaruan dalam tumpukan dapat dimodifikasi seperlunya.

Memperbarui tipe instans

Tumpukan yang kami buat sejauh ini menggunakan instans Amazon EC2 t1.micro. Misalkan situs web Anda yang baru dibuat mendapatkan lebih banyak lalu lintas daripada yang dapat ditangani oleh instans t1.micro, dan sekarang Anda ingin pindah ke jenis instans Amazon EC2 m1.small. Jika arsitektur tipe instans berubah, instans akan dibuat dengan AMI yang berbeda. Jika Anda memeriksa pemetaan di template, Anda akan melihat bahwa t1.micro dan m1.small adalah arsitektur yang sama dan menggunakan AMI Amazon Linux yang sama.

"Mappings" : { "AWSInstanceType2Arch" : { "t1.micro" : { "Arch" : "HVM64" }, "t2.nano" : { "Arch" : "HVM64" }, "t2.micro" : { "Arch" : "HVM64" }, "t2.small" : { "Arch" : "HVM64" }, "t2.medium" : { "Arch" : "HVM64" }, "t2.large" : { "Arch" : "HVM64" }, "m1.small" : { "Arch" : "HVM64" }, "m1.medium" : { "Arch" : "HVM64" }, "m1.large" : { "Arch" : "HVM64" }, "m1.xlarge" : { "Arch" : "HVM64" }, "m2.xlarge" : { "Arch" : "HVM64" }, "m2.2xlarge" : { "Arch" : "HVM64" }, "m2.4xlarge" : { "Arch" : "HVM64" }, "m3.medium" : { "Arch" : "HVM64" }, "m3.large" : { "Arch" : "HVM64" }, "m3.xlarge" : { "Arch" : "HVM64" }, "m3.2xlarge" : { "Arch" : "HVM64" }, "m4.large" : { "Arch" : "HVM64" }, "m4.xlarge" : { "Arch" : "HVM64" }, "m4.2xlarge" : { "Arch" : "HVM64" }, "m4.4xlarge" : { "Arch" : "HVM64" }, "m4.10xlarge" : { "Arch" : "HVM64" }, "c1.medium" : { "Arch" : "HVM64" }, "c1.xlarge" : { "Arch" : "HVM64" }, "c3.large" : { "Arch" : "HVM64" }, "c3.xlarge" : { "Arch" : "HVM64" }, "c3.2xlarge" : { "Arch" : "HVM64" }, "c3.4xlarge" : { "Arch" : "HVM64" }, "c3.8xlarge" : { "Arch" : "HVM64" }, "c4.large" : { "Arch" : "HVM64" }, "c4.xlarge" : { "Arch" : "HVM64" }, "c4.2xlarge" : { "Arch" : "HVM64" }, "c4.4xlarge" : { "Arch" : "HVM64" }, "c4.8xlarge" : { "Arch" : "HVM64" }, "g2.2xlarge" : { "Arch" : "HVMG2" }, "g2.8xlarge" : { "Arch" : "HVMG2" }, "r3.large" : { "Arch" : "HVM64" }, "r3.xlarge" : { "Arch" : "HVM64" }, "r3.2xlarge" : { "Arch" : "HVM64" }, "r3.4xlarge" : { "Arch" : "HVM64" }, "r3.8xlarge" : { "Arch" : "HVM64" }, "i2.xlarge" : { "Arch" : "HVM64" }, "i2.2xlarge" : { "Arch" : "HVM64" }, "i2.4xlarge" : { "Arch" : "HVM64" }, "i2.8xlarge" : { "Arch" : "HVM64" }, "d2.xlarge" : { "Arch" : "HVM64" }, "d2.2xlarge" : { "Arch" : "HVM64" }, "d2.4xlarge" : { "Arch" : "HVM64" }, "d2.8xlarge" : { "Arch" : "HVM64" }, "hi1.4xlarge" : { "Arch" : "HVM64" }, "hs1.8xlarge" : { "Arch" : "HVM64" }, "cr1.8xlarge" : { "Arch" : "HVM64" }, "cc2.8xlarge" : { "Arch" : "HVM64" } }, "AWSRegionArch2AMI" : { "us-east-1" : {"HVM64" : "ami-0ff8a91507f77f867", "HVMG2" : "ami-0a584ac55a7631c0c"}, "us-west-2" : {"HVM64" : "ami-a0cfeed8", "HVMG2" : "ami-0e09505bc235aa82d"}, "us-west-1" : {"HVM64" : "ami-0bdb828fd58c52235", "HVMG2" : "ami-066ee5fd4a9ef77f1"}, "eu-west-1" : {"HVM64" : "ami-047bb4163c506cd98", "HVMG2" : "ami-0a7c483d527806435"}, "eu-west-2" : {"HVM64" : "ami-f976839e", "HVMG2" : "NOT_SUPPORTED"}, "eu-west-3" : {"HVM64" : "ami-0ebc281c20e89ba4b", "HVMG2" : "NOT_SUPPORTED"}, "eu-central-1" : {"HVM64" : "ami-0233214e13e500f77", "HVMG2" : "ami-06223d46a6d0661c7"}, "ap-northeast-1" : {"HVM64" : "ami-06cd52961ce9f0d85", "HVMG2" : "ami-053cdd503598e4a9d"}, "ap-northeast-2" : {"HVM64" : "ami-0a10b2721688ce9d2", "HVMG2" : "NOT_SUPPORTED"}, "ap-northeast-3" : {"HVM64" : "ami-0d98120a9fb693f07", "HVMG2" : "NOT_SUPPORTED"}, "ap-southeast-1" : {"HVM64" : "ami-08569b978cc4dfa10", "HVMG2" : "ami-0be9df32ae9f92309"}, "ap-southeast-2" : {"HVM64" : "ami-09b42976632b27e9b", "HVMG2" : "ami-0a9ce9fecc3d1daf8"}, "ap-south-1" : {"HVM64" : "ami-0912f71e06545ad88", "HVMG2" : "ami-097b15e89dbdcfcf4"}, "us-east-2" : {"HVM64" : "ami-0b59bfac6be064b78", "HVMG2" : "NOT_SUPPORTED"}, "ca-central-1" : {"HVM64" : "ami-0b18956f", "HVMG2" : "NOT_SUPPORTED"}, "sa-east-1" : {"HVM64" : "ami-07b14488da8ea02a0", "HVMG2" : "NOT_SUPPORTED"}, "cn-north-1" : {"HVM64" : "ami-0a4eaf6c4454eda75", "HVMG2" : "NOT_SUPPORTED"}, "cn-northwest-1" : {"HVM64" : "ami-6b6a7d09", "HVMG2" : "NOT_SUPPORTED"} }

Mari kita gunakan templat yang kita modifikasi di bagian sebelumnya untuk mengubah tipe instans. Karena InstanceType merupakan parameter input ke template, kita tidak perlu memodifikasi template; kita dapat mengubah nilai parameter di wizard Stack Update, pada halaman Specify Parameters.

Untuk memperbarui tumpukan dari AWS Management Console
  1. Masuk ke CloudFormation konsol di https://console.aws.amazon.com/cloudformation.

  2. Di CloudFormation dasbor, pilih tumpukan yang Anda buat sebelumnya, lalu pilih Update Stack.

  3. Di panduan Memperbarui Tumpukan, di templat Pilih Templat pilih Gunakan templat saat ini, lalu pilih Selanjutnya.

    Halaman Tentukan Rincian muncul dengan parameter yang digunakan untuk membuat tumpukan awal yang telah diisi sebelumnya di bagian Tentukan Parameter.

  4. Ubah nilai kotak InstanceTypeteks dari t1.micro kem1.small. Lalu, pilih Selanjutnya.

  5. Di layar Opsi, pilih Selanjutnya.

  6. Pilih Selanjutnya karena tumpukan tidak memiliki kebijakan tumpukan. Semua sumber daya dapat diperbarui tanpa kebijakan timpa.

  7. Di layar Tinjau, pastikan semua pengaturan sesuai keinginan Anda, lalu pilih Perbarui.

Anda dapat mengubah jenis instans instans Amazon EC2 yang didukung EBS secara dinamis dengan memulai dan menghentikan instans. CloudFormation mencoba mengoptimalkan perubahan dengan memperbarui jenis instance dan memulai ulang instance, sehingga ID instance tidak berubah. Ketika instans dimulai ulang, tetapi, alamat IP publik dari instans tidak berubah. Untuk memastikan bahwa alamat IP Elastis terikat dengan benar setelah perubahan, juga CloudFormation akan memperbarui alamat IP Elastis. Anda dapat melihat perubahan di CloudFormation konsol pada tab Acara.

Untuk memeriksa jenis instans dari AWS Management Console, buka konsol Amazon EC2, dan temukan instans Anda di sana.

Perbarui AMI pada instans Amazon EC2

Sekarang mari kita lihat bagaimana kita dapat mengubah Amazon Machine Image (AMI) yang berjalan pada instans. Kami akan memulai perubahan AMI dengan memperbarui tumpukan untuk menggunakan jenis instans Amazon EC2 baru, seperti t2.medium, yang merupakan tipe instans HVM64.

Seperti di bagian sebelumnya, kita akan menggunakan templat yang ada untuk mengubah tipe instans yang digunakan oleh contoh tumpukan kita. Di panduan Memperbarui Tumpukan, di halaman Tentukan Parameter, ubah nilai dari Tipe Instans.

Dalam hal ini, kita tidak bisa begitu saja memulai dan menghentikan instance untuk memodifikasi AMI; CloudFormation menganggap ini sebagai perubahan pada properti sumber daya yang tidak dapat diubah. Untuk membuat perubahan pada properti yang tidak dapat diubah, CloudFormation harus meluncurkan sumber daya pengganti, dalam hal ini instans Amazon EC2 baru yang menjalankan AMI baru.

Setelah instance baru berjalan, CloudFormation perbarui sumber daya lain di tumpukan untuk menunjuk ke sumber daya baru. Ketika semua sumber daya baru dibuat, sumber daya lama dihapus, sebuah proses yang dikenal sebagaiUPDATE_CLEANUP. Kali ini, Anda akan melihat bahwa ID instans dan URL aplikasi dari instans di dalam tumpukan telah berubah sebagai hasil dari pembaruan. Peristiwa dalam tabel Peristiwa berisi deskripsi "Pembaruan yang diminta memiliki perubahan pada properti yang tidak dapat diubah dan karenanya membuat sumber daya fisik baru" untuk menunjukkan bahwa sumber daya telah diganti.

Jika Anda memiliki kode aplikasi yang ditulis ke dalam AMI yang ingin Anda perbarui, Anda dapat menggunakan mekanisme pembaruan tumpukan yang sama untuk memperbarui AMI untuk memuat aplikasi baru Anda.

Untuk memperbarui AMI untuk instans di tumpukan Anda
  1. Buat AMI baru yang berisi aplikasi atau perubahan sistem operasi Anda. Untuk informasi selengkapnya, buka Membuat AMI Anda sendiri di Panduan Pengguna Amazon EC2.

  2. Perbarui templat Anda untuk memasukkan ID AMI baru.

  3. Perbarui tumpukan, baik dari AWS Management Console seperti yang dijelaskan dalam Memperbarui aplikasi atau dengan menggunakan AWS perintah aws cloudformation update-stack.

Saat Anda memperbarui tumpukan, CloudFormation mendeteksi bahwa ID AMI telah berubah, dan kemudian memicu pembaruan tumpukan dengan cara yang sama seperti kami memulai yang di atas.

Perbarui konfigurasi peluncuran Amazon EC2 untuk grup Auto Scaling

Jika Anda menggunakan grup Auto Scaling daripada instans Amazon EC2, proses memperbarui instans yang sedang berjalan sedikit berbeda. Dengan sumber daya Auto Scaling, konfigurasi instans Amazon EC2, seperti jenis instans atau ID AMI dienkapsulasi dalam konfigurasi peluncuran Auto Scaling. Anda dapat membuat perubahan pada konfigurasi peluncuran dengan cara yang sama seperti kami membuat perubahan pada sumber daya instans Amazon EC2 di bagian sebelumnya. Namun, mengubah konfigurasi peluncuran tidak memengaruhi instans Amazon EC2 yang sedang berjalan di grup Auto Scaling. Konfigurasi peluncuran yang diperbarui hanya berlaku untuk instance baru yang dibuat setelah pembaruan.

Jika Anda ingin menerapkan perubahan ke konfigurasi peluncuran di semua instans dalam grup Auto Scaling, Anda dapat menggunakan atribut update. Untuk informasi selengkapnya, lihat UpdatePolicyatribut.

Menambahkan properti sumber daya

Sejauh ini, kita telah melihat perubahan properti sumber daya yang ada dalam templat. Anda juga dapat menambahkan properti yang awalnya tidak ditentukan dalam templat. Untuk mengilustrasikannya, kita akan menambahkan pasangan kunci Amazon EC2 ke instans EC2 yang ada dan kemudian membuka port 22 di Grup Keamanan Amazon EC2 sehingga Anda dapat menggunakan Secure Shell (SSH) untuk mengakses instans.

Menambahkan pasangan kunci ke sebuah instans

Untuk menambahkan akses SSH ke instans Amazon EC2 yang ada
  1. Tambahkan dua parameter tambahan ke template untuk meneruskan nama key pair Amazon EC2 dan lokasi SSH yang ada.

    "Parameters" : { "KeyName" : { "Description" : "Name of an existing Amazon EC2 key pair for SSH access", "Type": "AWS::EC2::KeyPair::KeyName" }, "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", "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})", "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x." } : },
  2. Tambahkan KeyName properti ke instans Amazon EC2.

    "WebServerInstance": { "Type" : "AWS::EC2::Instance", : "Properties": { : "KeyName" : { "Ref" : "KeyName" }, : } },
  3. Tambahkan port 22 dan lokasi SSH ke aturan masuk untuk grup keamanan Amazon EC2.

    "WebServerSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP and SSH", "SecurityGroupIngress" : [ {"IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : { "Ref" : "SSHLocation"}}, {"IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : "0.0.0.0/0"} ] } },
  4. Perbarui tumpukan, baik dari AWS Management Console seperti yang dijelaskan dalam Memperbarui aplikasi atau dengan menggunakan AWS perintah aws cloudformation update-stack.

Mengubah sumber daya tumpukan

Kebutuhan aplikasi dapat berubah seiring waktu, CloudFormation memungkinkan Anda mengubah kumpulan sumber daya yang membentuk tumpukan. Untuk mendemonstrasikannya, kita akan mengambil aplikasi instans tunggal dari Menambahkan properti sumber daya dan mengonversinya menjadi aplikasi yang diskalakan secara otomatis dan memiliki beban seimbang dengan memperbarui tumpukan.

Ini akan membuat satu aplikasi PHP instans menggunakan alamat IP Elastis. Kita sekarang akan mengubah aplikasi menjadi aplikasi yang sangat tersedia, diskalakan otomatis, memiliki beban seimbang dengan mengubah sumber dayanya selama pembaruan.

  1. Tambahkan sumber daya Elastic Load Balancer.

    "ElasticLoadBalancer" : { "Type" : "AWS::ElasticLoadBalancing::LoadBalancer", "Properties" : { "CrossZone" : "true", "AvailabilityZones" : { "Fn::GetAZs" : "" }, "LBCookieStickinessPolicy" : [ { "PolicyName" : "CookieBasedPolicy", "CookieExpirationPeriod" : "30" } ], "Listeners" : [ { "LoadBalancerPort" : "80", "InstancePort" : "80", "Protocol" : "HTTP", "PolicyNames" : [ "CookieBasedPolicy" ] } ], "HealthCheck" : { "Target" : "HTTP:80/", "HealthyThreshold" : "2", "UnhealthyThreshold" : "5", "Interval" : "10", "Timeout" : "5" } } }
  2. Konversikan instans EC2 dalam templat menjadi Konfigurasi Peluncuran Auto Scaling. Propertinya serupa, jadi kita hanya perlu mengubah nama tipe dari:

    "WebServerInstance": { "Type" : "AWS::EC2::Instance",

    ke:

    "LaunchConfig": { "Type" : "AWS::AutoScaling::LaunchConfiguration",

    Untuk kejelasan dalam template, kami mengubah nama sumber daya dari WebServerInstancemenjadi LaunchConfig, jadi Anda harus memperbarui nama sumber daya yang direferensikan oleh cfn-init dan cfn-hup (cukup cari WebServerInstance dan ganti dengan LaunchConfig, kecuali untuk cfn-signal). Untuk cfn-signal, Anda harus memberi sinyal pada grup Auto Scaling WebServerGroup () bukan instance, seperti yang ditunjukkan pada cuplikan berikut:

    "# Signal the status from cfn-init\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServerGroup ", " --region ", { "Ref" : "AWS::Region" }, "\n"
  3. Tambahkan sumber daya grup Auto Scaling.

    "WebServerGroup" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "AvailabilityZones" : { "Fn::GetAZs" : "" }, "LaunchConfigurationName" : { "Ref" : "LaunchConfig" }, "MinSize" : "1", "DesiredCapacity" : "1", "MaxSize" : "5", "LoadBalancerNames" : [ { "Ref" : "ElasticLoadBalancer" } ] }, "CreationPolicy" : { "ResourceSignal" : { "Timeout" : "PT15M" } }, "UpdatePolicy": { "AutoScalingRollingUpdate": { "MinInstancesInService": "1", "MaxBatchSize": "1", "PauseTime" : "PT15M", "WaitOnResourceSignals": "true" } } }
  4. Perbarui definisi Grup Keamanan untuk mengunci lalu lintas untuk instans dari penyeimbang beban.

    "WebServerSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP access via port 80 locked down to the ELB and SSH access", "SecurityGroupIngress" : [ {"IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "SourceSecurityGroupOwnerId" : {"Fn::GetAtt" : ["ElasticLoadBalancer", "SourceSecurityGroup.OwnerAlias"]}, "SourceSecurityGroupName" : {"Fn::GetAtt" : ["ElasticLoadBalancer", "SourceSecurityGroup.GroupName"]}}, {"IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : { "Ref" : "SSHLocation"}} ] } }
  5. Perbarui Output untuk mengembalikan Nama DNS Elastic Load Balancer sebagai lokasi aplikasi dari:

    "WebsiteURL" : { "Value" : { "Fn::Join" : ["", ["http://", { "Fn::GetAtt" : [ "WebServerInstance", "PublicDnsName" ]}]]}, "Description" : "Application URL" }

    ke:

    "WebsiteURL" : { "Value" : { "Fn::Join" : ["", ["http://", { "Fn::GetAtt" : [ "ElasticLoadBalancer", "DNSName" ]}]]}, "Description" : "Application URL" }

Untuk referensi, contoh berikut menunjukkan templat lengkap. Jika Anda menggunakan template ini untuk memperbarui tumpukan, Anda akan mengonversi aplikasi instance tunggal Anda yang sederhana menjadi aplikasi multi-AZ, berskala otomatis, dan load balanced yang sangat tersedia. Hanya sumber daya yang perlu diperbarui yang akan diubah, jadi misalnya ada penyimpanan data untuk aplikasi ini, data akan tetap utuh. Sekarang, Anda dapat menggunakannya CloudFormation untuk menumbuhkan atau meningkatkan tumpukan Anda saat kebutuhan Anda berubah.

{ "AWSTemplateFormatVersion" : "2010-09-09", "Description" : "AWS CloudFormation Sample Template: Sample template that can be used to test EC2 updates. **WARNING** This template creates an Amazon Ec2 Instance. You will be billed for the AWS resources used if you create a stack from this template.", "Parameters" : { "KeyName": { "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instance", "Type": "AWS::EC2::KeyPair::KeyName", "ConstraintDescription" : "must be the name of an existing EC2 KeyPair." }, "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", "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})", "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x." }, "InstanceType" : { "Description" : "WebServer EC2 instance type", "Type" : "String", "Default" : "t2.small", "AllowedValues" : [ "t1.micro", "t2.nano", "t2.micro", "t2.small", "t2.medium", "t2.large", "m1.small", "m1.medium", "m1.large", "m1.xlarge", "m2.xlarge", "m2.2xlarge", "m2.4xlarge", "m3.medium", "m3.large", "m3.xlarge", "m3.2xlarge", "m4.large", "m4.xlarge", "m4.2xlarge", "m4.4xlarge", "m4.10xlarge", "c1.medium", "c1.xlarge", "c3.large", "c3.xlarge", "c3.2xlarge", "c3.4xlarge", "c3.8xlarge", "c4.large", "c4.xlarge", "c4.2xlarge", "c4.4xlarge", "c4.8xlarge", "g2.2xlarge", "g2.8xlarge", "r3.large", "r3.xlarge", "r3.2xlarge", "r3.4xlarge", "r3.8xlarge", "i2.xlarge", "i2.2xlarge", "i2.4xlarge", "i2.8xlarge", "d2.xlarge", "d2.2xlarge", "d2.4xlarge", "d2.8xlarge", "hi1.4xlarge", "hs1.8xlarge", "cr1.8xlarge", "cc2.8xlarge", "cg1.4xlarge" ], "ConstraintDescription" : "must be a valid EC2 instance type." } }, "Mappings" : { "AWSInstanceType2Arch" : { "t1.micro" : { "Arch" : "HVM64" }, "t2.nano" : { "Arch" : "HVM64" }, "t2.micro" : { "Arch" : "HVM64" }, "t2.small" : { "Arch" : "HVM64" }, "t2.medium" : { "Arch" : "HVM64" }, "t2.large" : { "Arch" : "HVM64" }, "m1.small" : { "Arch" : "HVM64" }, "m1.medium" : { "Arch" : "HVM64" }, "m1.large" : { "Arch" : "HVM64" }, "m1.xlarge" : { "Arch" : "HVM64" }, "m2.xlarge" : { "Arch" : "HVM64" }, "m2.2xlarge" : { "Arch" : "HVM64" }, "m2.4xlarge" : { "Arch" : "HVM64" }, "m3.medium" : { "Arch" : "HVM64" }, "m3.large" : { "Arch" : "HVM64" }, "m3.xlarge" : { "Arch" : "HVM64" }, "m3.2xlarge" : { "Arch" : "HVM64" }, "m4.large" : { "Arch" : "HVM64" }, "m4.xlarge" : { "Arch" : "HVM64" }, "m4.2xlarge" : { "Arch" : "HVM64" }, "m4.4xlarge" : { "Arch" : "HVM64" }, "m4.10xlarge" : { "Arch" : "HVM64" }, "c1.medium" : { "Arch" : "HVM64" }, "c1.xlarge" : { "Arch" : "HVM64" }, "c3.large" : { "Arch" : "HVM64" }, "c3.xlarge" : { "Arch" : "HVM64" }, "c3.2xlarge" : { "Arch" : "HVM64" }, "c3.4xlarge" : { "Arch" : "HVM64" }, "c3.8xlarge" : { "Arch" : "HVM64" }, "c4.large" : { "Arch" : "HVM64" }, "c4.xlarge" : { "Arch" : "HVM64" }, "c4.2xlarge" : { "Arch" : "HVM64" }, "c4.4xlarge" : { "Arch" : "HVM64" }, "c4.8xlarge" : { "Arch" : "HVM64" }, "g2.2xlarge" : { "Arch" : "HVMG2" }, "g2.8xlarge" : { "Arch" : "HVMG2" }, "r3.large" : { "Arch" : "HVM64" }, "r3.xlarge" : { "Arch" : "HVM64" }, "r3.2xlarge" : { "Arch" : "HVM64" }, "r3.4xlarge" : { "Arch" : "HVM64" }, "r3.8xlarge" : { "Arch" : "HVM64" }, "i2.xlarge" : { "Arch" : "HVM64" }, "i2.2xlarge" : { "Arch" : "HVM64" }, "i2.4xlarge" : { "Arch" : "HVM64" }, "i2.8xlarge" : { "Arch" : "HVM64" }, "d2.xlarge" : { "Arch" : "HVM64" }, "d2.2xlarge" : { "Arch" : "HVM64" }, "d2.4xlarge" : { "Arch" : "HVM64" }, "d2.8xlarge" : { "Arch" : "HVM64" }, "hi1.4xlarge" : { "Arch" : "HVM64" }, "hs1.8xlarge" : { "Arch" : "HVM64" }, "cr1.8xlarge" : { "Arch" : "HVM64" }, "cc2.8xlarge" : { "Arch" : "HVM64" } }, "AWSRegionArch2AMI" : { "us-east-1" : {"HVM64" : "ami-0ff8a91507f77f867", "HVMG2" : "ami-0a584ac55a7631c0c"}, "us-west-2" : {"HVM64" : "ami-a0cfeed8", "HVMG2" : "ami-0e09505bc235aa82d"}, "us-west-1" : {"HVM64" : "ami-0bdb828fd58c52235", "HVMG2" : "ami-066ee5fd4a9ef77f1"}, "eu-west-1" : {"HVM64" : "ami-047bb4163c506cd98", "HVMG2" : "ami-0a7c483d527806435"}, "eu-west-2" : {"HVM64" : "ami-f976839e", "HVMG2" : "NOT_SUPPORTED"}, "eu-west-3" : {"HVM64" : "ami-0ebc281c20e89ba4b", "HVMG2" : "NOT_SUPPORTED"}, "eu-central-1" : {"HVM64" : "ami-0233214e13e500f77", "HVMG2" : "ami-06223d46a6d0661c7"}, "ap-northeast-1" : {"HVM64" : "ami-06cd52961ce9f0d85", "HVMG2" : "ami-053cdd503598e4a9d"}, "ap-northeast-2" : {"HVM64" : "ami-0a10b2721688ce9d2", "HVMG2" : "NOT_SUPPORTED"}, "ap-northeast-3" : {"HVM64" : "ami-0d98120a9fb693f07", "HVMG2" : "NOT_SUPPORTED"}, "ap-southeast-1" : {"HVM64" : "ami-08569b978cc4dfa10", "HVMG2" : "ami-0be9df32ae9f92309"}, "ap-southeast-2" : {"HVM64" : "ami-09b42976632b27e9b", "HVMG2" : "ami-0a9ce9fecc3d1daf8"}, "ap-south-1" : {"HVM64" : "ami-0912f71e06545ad88", "HVMG2" : "ami-097b15e89dbdcfcf4"}, "us-east-2" : {"HVM64" : "ami-0b59bfac6be064b78", "HVMG2" : "NOT_SUPPORTED"}, "ca-central-1" : {"HVM64" : "ami-0b18956f", "HVMG2" : "NOT_SUPPORTED"}, "sa-east-1" : {"HVM64" : "ami-07b14488da8ea02a0", "HVMG2" : "NOT_SUPPORTED"}, "cn-north-1" : {"HVM64" : "ami-0a4eaf6c4454eda75", "HVMG2" : "NOT_SUPPORTED"}, "cn-northwest-1" : {"HVM64" : "ami-6b6a7d09", "HVMG2" : "NOT_SUPPORTED"} } }, "Resources" : { "ElasticLoadBalancer" : { "Type" : "AWS::ElasticLoadBalancing::LoadBalancer", "Properties" : { "CrossZone" : "true", "AvailabilityZones" : { "Fn::GetAZs" : "" }, "LBCookieStickinessPolicy" : [ { "PolicyName" : "CookieBasedPolicy", "CookieExpirationPeriod" : "30" } ], "Listeners" : [ { "LoadBalancerPort" : "80", "InstancePort" : "80", "Protocol" : "HTTP", "PolicyNames" : [ "CookieBasedPolicy" ] } ], "HealthCheck" : { "Target" : "HTTP:80/", "HealthyThreshold" : "2", "UnhealthyThreshold" : "5", "Interval" : "10", "Timeout" : "5" } } }, "WebServerGroup" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "AvailabilityZones" : { "Fn::GetAZs" : "" }, "LaunchConfigurationName" : { "Ref" : "LaunchConfig" }, "MinSize" : "1", "DesiredCapacity" : "1", "MaxSize" : "5", "LoadBalancerNames" : [ { "Ref" : "ElasticLoadBalancer" } ] }, "CreationPolicy" : { "ResourceSignal" : { "Timeout" : "PT15M" } }, "UpdatePolicy": { "AutoScalingRollingUpdate": { "MinInstancesInService": "1", "MaxBatchSize": "1", "PauseTime" : "PT15M", "WaitOnResourceSignals": "true" } } }, "LaunchConfig": { "Type" : "AWS::AutoScaling::LaunchConfiguration", "Metadata" : { "Comment" : "Install a simple PHP application", "AWS::CloudFormation::Init" : { "config" : { "packages" : { "yum" : { "httpd" : [], "php" : [] } }, "files" : { "/var/www/html/index.php" : { "content" : { "Fn::Join" : ["", [ "<?php\n", "echo '<h1>AWS CloudFormation sample PHP application</h1>';\n", "echo 'Updated version via UpdateStack';\n ", "?>\n" ]]}, "mode" : "000644", "owner" : "apache", "group" : "apache" }, "/etc/cfn/cfn-hup.conf" : { "content" : { "Fn::Join" : ["", [ "[main]\n", "stack=", { "Ref" : "AWS::StackId" }, "\n", "region=", { "Ref" : "AWS::Region" }, "\n" ]]}, "mode" : "000400", "owner" : "root", "group" : "root" }, "/etc/cfn/hooks.d/cfn-auto-reloader.conf" : { "content": { "Fn::Join" : ["", [ "[cfn-auto-reloader-hook]\n", "triggers=post.update\n", "path=Resources.LaunchConfig.Metadata.AWS::CloudFormation::Init\n", "action=/opt/aws/bin/cfn-init -s ", { "Ref" : "AWS::StackId" }, " -r LaunchConfig ", " --region ", { "Ref" : "AWS::Region" }, "\n", "runas=root\n" ]]} } }, "services" : { "sysvinit" : { "httpd" : { "enabled" : "true", "ensureRunning" : "true" }, "cfn-hup" : { "enabled" : "true", "ensureRunning" : "true", "files" : ["/etc/cfn/cfn-hup.conf", "/etc/cfn/hooks.d/cfn-auto-reloader.conf"]} } } } } }, "Properties": { "ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" }, { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ] }, "InstanceType" : { "Ref" : "InstanceType" }, "KeyName" : { "Ref" : "KeyName" }, "SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ], "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash -xe\n", "yum install -y aws-cfn-bootstrap\n", "# Install the files and packages from the metadata\n", "/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource LaunchConfig ", " --region ", { "Ref" : "AWS::Region" }, "\n", "# Start up the cfn-hup daemon to listen for changes to the Web Server metadata\n", "/opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup'\n", "# Signal the status from cfn-init\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServerGroup ", " --region ", { "Ref" : "AWS::Region" }, "\n" ]]}} } }, "WebServerSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP access via port 80 locked down to the ELB and SSH access", "SecurityGroupIngress" : [ {"IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "SourceSecurityGroupOwnerId" : {"Fn::GetAtt" : ["ElasticLoadBalancer", "SourceSecurityGroup.OwnerAlias"]},"SourceSecurityGroupName" : {"Fn::GetAtt" : ["ElasticLoadBalancer", "SourceSecurityGroup.GroupName"]}}, {"IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : { "Ref" : "SSHLocation"}} ] } } }, "Outputs" : { "WebsiteURL" : { "Description" : "Application URL", "Value" : { "Fn::Join" : ["", ["http://", { "Fn::GetAtt" : [ "ElasticLoadBalancer", "DNSName" ]}]] } } } }

Pertimbangan ketersediaan dan dampak

Properti yang berbeda memiliki dampak yang berbeda pada sumber daya dalam tumpukan. Anda dapat menggunakan CloudFormation untuk memperbarui properti apa pun; Namun, sebelum Anda membuat perubahan, Anda harus mempertimbangkan pertanyaan-pertanyaan ini:

  1. Bagaimana pembaruan memengaruhi sumber daya itu sendiri? Misalnya, memperbarui ambang batas alarm akan membuat alarm tidak aktif selama pembaruan. Seperti yang telah kita lihat, mengubah jenis instance mengharuskan instance dihentikan dan dimulai ulang. CloudFormation menggunakan tindakan pembaruan atau modifikasi untuk sumber daya yang mendasarinya untuk membuat perubahan pada sumber daya. Untuk memahami dampak pembaruan, Anda harus memeriksa dokumentasi untuk sumber daya tertentu.

  2. Apakah perubahan itu dapat berubah atau tidak dapat berubah? Beberapa perubahan pada properti sumber daya, seperti mengubah AMI pada instans Amazon EC2, tidak didukung oleh layanan yang mendasarinya. Dalam kasus perubahan yang dapat berubah, CloudFormation akan menggunakan API jenis Perbarui atau Ubah untuk sumber daya yang mendasarinya. Untuk perubahan properti yang tidak dapat diubah, CloudFormation akan membuat sumber daya baru dengan properti yang diperbarui dan kemudian menautkannya ke tumpukan sebelum menghapus sumber daya lama. Meskipun CloudFormation mencoba mengurangi waktu henti sumber daya tumpukan, mengganti sumber daya adalah proses multistep, dan itu akan memakan waktu. Selama konfigurasi ulang tumpukan, aplikasi Anda tidak akan beroperasi penuh. Misalnya, aplikasi mungkin tidak dapat melayani permintaan atau mengakses database.

Sumber daya terkait

Untuk informasi selengkapnya tentang penggunaan CloudFormation untuk memulai aplikasi dan mengintegrasikan dengan layanan konfigurasi dan penyebaran lainnya seperti Puppet dan Opscode Chef, lihat whitepaper berikut:

Template yang digunakan di seluruh bagian ini adalah aplikasi PHP “Hello World”. Pustaka template juga memiliki template ElastiCache sampel Amazon yang menunjukkan cara mengintegrasikan aplikasi PHP dengan ElasticCache menggunakan cfn-hup dan cfn-init untuk menanggapi perubahan dalam konfigurasi ElastiCache Cache Cluster Amazon, yang semuanya dapat dilakukan oleh Update Stack.