Apakah mungkin untuk memaksa Re-creation EC2 :: Instance atau RDS :: DBInstance di amazon cloudformation?

16

Dimungkinkan untuk memaksa pembuatan ulang instance EC2 atau RDS menggunakan tumpukan cloudformation?

Tumpukan saya macet di titik di mana hanya menghancurkan dan membuat sumber daya akan memperbaikinya, alih-alih saya harus menghapus seluruh tumpukan untuk melanjutkan pekerjaan.

edit:

Masalah ini memukul saya dua kali. Pertama saya membuat AWS :: RDS :: Instance dengan beberapa default dan kemudian mencoba untuk menurunkannya ke "EngineVersion": "5.5". Mengubah ini seharusnya terjadi dengan beberapa gangguan, tetapi contoh mysql tidak dapat diturunkan dari 5,6 menjadi 5,5 sehingga tumpukan dibiarkan dalam keadaan UPDATE_FAILED dan saya tidak dapat dapat membuat kembali RDS tanpa trik yang buruk.

Kejadian lain adalah bahwa saya memiliki beberapa "AWS :: EC2 :: Instance" yang mengunduh dan mengeksekusi skrip dari itu "UserData" jelas jika Y mengubah skrip yang diunduh saya harus merekam kembali instance, dan tidak ada cara untuk melakukannya. Sekali lagi saya menggunakan trik jahat yang sama untuk membuat mesin diciptakan kembali.

Trik jahat:

Alih-alih menggunakan kelompok autoscaling dari satu mesin, saya memecahkan kedua masalah mengubah zona ketersediaan di properti ... tetapi meninggalkan saya dengan selera yang buruk

teis
sumber
Perlu info lebih lanjut untuk menjawab. Apakah instance Anda macet saat startup? Apakah layanan menjadi tidak responsif? Jika Anda mencari untuk membuat ulang instance EC2 secara manual, Anda dapat membuat grup penskalaan otomatis dengan satu instance. Saat Anda menghentikan instance, yang lain akan dibuat.
Edwin
diedit untuk klarifikasi. Saya juga bertanya di sini: forums.aws.amazon.com/thread.jspa?threadID=135295&tstart=0
teis
Ini tidak secara langsung menjawab pertanyaan Anda, tetapi untuk menjalankan kembali skrip UserData ketika diubah, Anda dapat melihat cfn-hup: docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…
Reed Kraft-Murphy

Jawaban:

10

Misalnya instance EC2 yang didukung toko, satu trik adalah menambahkan komentar ke skrip data pengguna yang berisi nomor versi, tanggal, atau yang serupa, lalu ubah setiap kali Anda ingin instance dibuat:

{
    "Resources" : {
        "MyEC2Instance" : {
            "Type" : "AWS::EC2::Instance",
            "Properties" : {
                // ... other properties ...
                "UserData": { 
                    "Fn::Base64" : {
                        "Fn::Join" : [ ":", [
                        "#!/bin/bash\n",
                        "# Version: 1.0\n",
                        // ... rest of user data ...
                    ]]}
            }
        }
    }
}

Setiap perubahan UserDataakan menyebabkan instance diganti (yaitu, dibuat ulang). Perilaku skrip data pengguna harus sama, karena satu-satunya modifikasi adalah komentar. Perhatikan bahwa ini tidak berfungsi untuk mesin virtual yang didukung EBS.

Untuk RDS, Anda bisa mengambil snapshot DB dari instance RDS saat ini, lalu memodifikasi templat Anda untuk menggunakan snapshot itu dengan DBSnapshotIdentifier:

{
    "Resources" : {
        "MyDB" : {
        "Type" : "AWS::RDS::DBInstance",
        "Properties" : {
            // ... other properties ...
            "DBSnapshotIdentifier": "<db snapshot ID>"
        }
    }    
}

Setiap kali DBSnapshotIdentifierdiubah, instance database akan diganti. Menggunakan snapshot juga akan membuat Anda menyimpan data dari saat snapshot dibuat. (Jika Anda ingin menghapus data, Anda dapat membuat snapshot kosong dan mengirimkannya sebagai input. Atau menghapus dan membuat ulang seluruh tumpukan CloudFormation.)

Pendekatan yang lebih umum adalah mengubah nama logis sumber daya tersebut. Dari Memodifikasi Template Tumpukan di dokumen CloudFormation:

Untuk sebagian besar sumber daya, mengubah nama logis suatu sumber daya sama dengan menghapus sumber daya itu dan menggantinya dengan yang baru. Sumber daya lain apa pun yang bergantung pada sumber daya yang diganti juga perlu diperbarui dan mungkin menyebabkannya diganti. Sumber daya lain mengharuskan Anda memperbarui properti (bukan hanya nama logis) untuk memicu pembaruan.

markusk
sumber
Tampaknya satu-satunya solusi adalah melakukan "trik kotor" Saya mencapai solusi serupa (memaksa perubahan ketersediaan zona) beberapa waktu setelah bertanya :)
theist
4
Hanya ingin menunjukkan bahwa instance diganti dan dengan demikian UserData dieksekusi ketika instance EC2 adalah instance store -backed. Jika didukung EBS, perubahan UserData hanya akan membuat instance restart dan UserData tidak dieksekusi lagi. Anda dapat menggunakan cfn-hup untuk menjalankan UserData lagi bahkan dalam kasus ini, tetapi instance tetap sama.
Kaitsu
@ Koitsu: Terima kasih, itu klarifikasi yang sangat berharga. Saya memperbarui jawaban saya sesuai.
markusk
@ Koitsu tetapi jika Anda menjalankan kembali skrip secara manual (terletak di / var / lib / cloud / instance / skrip / bagian-001) Anda harus memastikan skrip tersebut defensif untuk menjalankan perintah yang sama beberapa kali :(
c24w
1

Jika Anda memasukkannya ke dalam AutoScalingGroup, Anda dapat mengedit min AutoScalingGroup min / maks / default ke 0, kemudian segera setelah mulai menghancurkan contoh lama, Anda kemudian dapat menempatkan min / max / default ke 1/1/1 dan presto: contoh baru.

Tim Bassett
sumber
0

Jika EC2 Anda menjadi AutoScalingGroup Anda dapat mengatur AutoScalingGroupNameproperti dengan nomor versi di dalamnya.

Setiap kali Anda mengubah nomor versi itu CFN akan: 1. membuat grup penskalaan otomatis baru dan memutar instance yang diinginkan 2. membunuh instans dalam grup penskalaan otomatis yang lama dan menghapusnya

Berikut adalah sepotong kode dari tumpukan saya di mana saya menggunakan teknik ini untuk memaksa sejumlah besar mesin EC2 untuk membuat ulang dan secara otomatis menarik perangkat lunak baru dari S3.

AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
        AutoScalingGroupName: !Sub "${StackName}-${ServiceName}-${ServiceVersion}"
marcopeg
sumber