AWS telah memindahkan fungsionalitas manajemen tag Editor Tag dari AWS Resource Groups konsol ke Penjelajah Sumber Daya AWS konsol. Dengan Resource Explorer, Anda dapat mencari dan memfilter sumber daya dan kemudian mengelola tag sumber daya dari satu konsol. Untuk mempelajari lebih lanjut tentang mengelola tag sumber daya di Resource Explorer, tinjau Mengelola sumber daya di panduan pengguna Resource Explorer.
Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Tutorial: Secara otomatis menghentikan EC2 instans Amazon yang tidak memiliki tag yang diperlukan
Ketika kumpulan AWS sumber daya Anda dan Akun AWS yang Anda kelola tumbuh, Anda dapat menggunakan tag untuk membuatnya lebih mudah untuk mengkategorikan sumber daya Anda. Tag biasanya digunakan untuk kasus penggunaan kritis seperti alokasi biaya dan keamanan. Untuk mengelola AWS sumber daya secara efektif, sumber daya Anda perlu ditandai secara konsisten. Seringkali, ketika sumber daya disediakan, ia mendapatkan semua tag yang sesuai. Namun, proses selanjutnya dapat menghasilkan perubahan tag yang menghasilkan penyimpangan dari kebijakan tag perusahaan. Dengan memantau perubahan pada tag Anda, Anda dapat melihat penyimpangan tag dan segera merespons. Ini memberi Anda lebih percaya diri bahwa proses yang bergantung pada sumber daya Anda yang dikategorikan dengan benar akan menghasilkan hasil yang diinginkan.
Contoh berikut menunjukkan cara memantau perubahan tag pada EC2 instance Amazon untuk memverifikasi bahwa instance tertentu terus memiliki tag yang diperlukan. Jika tag instance berubah dan instance tidak lagi memiliki tag yang diperlukan, fungsi Lambda dipanggil untuk mematikan instance secara otomatis. Mengapa Anda ingin melakukan ini? Ini memastikan bahwa semua sumber daya ditandai sesuai dengan kebijakan tag perusahaan Anda, untuk alokasi biaya yang efektif, atau untuk dapat mempercayai keamanan berdasarkan kontrol akses berbasis atribut (ABAC).
penting
Kami sangat menyarankan agar Anda melakukan tutorial ini di akun non-produksi di mana Anda tidak dapat secara tidak sengaja mematikan instance penting.
Kode contoh dalam tutorial ini sengaja membatasi dampak skenario ini hanya pada instance pada daftar instance. IDs Anda harus memperbarui daftar dengan contoh IDs bahwa Anda bersedia untuk menutup untuk tes. Ini membantu memastikan bahwa Anda tidak dapat secara tidak sengaja mematikan setiap instance di Wilayah Anda Akun AWS.
Setelah pengujian, pastikan semua instance Anda ditandai sesuai dengan strategi penandaan perusahaan Anda. Kemudian, Anda dapat menghapus kode yang membatasi fungsi hanya pada instance IDs pada daftar.
Contoh ini menggunakan JavaScript dan versi 16.x dari Node.js. Contoh menggunakan contoh Akun AWS ID 123456789012 dan Wilayah AWS US East (N. Virginia) (). us-east-1
Ganti ini dengan ID dan Wilayah akun pengujian Anda sendiri.
catatan
Jika konsol Anda menggunakan Wilayah yang berbeda untuk defaultnya, pastikan Anda mengganti Wilayah yang Anda gunakan dalam tutorial ini setiap kali Anda mengubah konsol. Penyebab umum kegagalan tutorial ini adalah memiliki instance dan fungsi di dua Wilayah yang berbeda.
Jika Anda menggunakan Wilayah yang berbeda darius-east-1
, pastikan bahwa Anda mengubah semua referensi dalam contoh kode berikut ke Wilayah pilihan Anda.
Topik
Langkah 1. Buat fungsi Lambda
Untuk membuat fungsi Lambda
-
Pilih Buat fungsi dan kemudian Tulis dari awal.
-
Untuk Nama fungsi, ketik
AutoEC2Termination
. -
Untuk Runtime, pilih Node.js 16.x.
-
Simpan semua bidang lain pada nilai defaultnya, dan pilih Create function.
-
Pada tab Kode pada halaman
AutoEC2Termination
detail, buka file index.js untuk melihat kodenya.-
Jika tab dengan index.js terbuka, Anda dapat memilih kotak edit di tab itu untuk mengedit kodenya.
-
Jika tab dengan index.js tidak terbuka, klik sekunder file index.js di bawah folder Auto EC2 Terminator di panel navigasi. Kemudian pilih Buka.
-
-
Di tab index.js, tempel kode berikut di kotak editor, ganti apa pun yang sudah ada.
Ganti nilainya
RegionToMonitor
dengan Region tempat Anda ingin menjalankan fungsi ini.// Set the following line to specify which Region's instances you want to monitor // Only instances in this Region are succesfully stopped on a match const RegionToMonitor = "us-east-1" // Specify the instance ARNs to check. // This limits the function for safety to avoid the tutorial shutting down all instances in account // The first ARN is a "dummy" that matches the test event you create in Step 3. // Replace the second ARN with one that matches a real instance that you want to monitor and that you can // safely stop const InstanceList = [ "i-0000000aaaaaaaaaa", "i-05db4466d02744f07" ]; // The tag key name and value that marks a "valid" instance. Instances in the previous list that // do NOT have the following tag key and value are stopped by this function const ValidKeyName = "valid-key"; const ValidKeyValue = "valid-value"; // Load and configure the AWS SDK const AWS = require('aws-sdk'); // Set the AWS Region AWS.config.update({region: RegionToMonitor}); // Create EC2 service object. const ec2 = new AWS.EC2({apiVersion: '2016-11-15'}); exports.handler = (event, context, callback) => { // Retrieve the details of the reported event. var detail = event.detail; var tags = detail["tags"]; var service = detail["service"]; var resourceType = detail["resource-type"]; var resource = event.resources[0]; var resourceSplit = resource.split("/"); var instanceId = resourceSplit[resourceSplit.length - 1]; // If this event is not for an EC2 resource, then do nothing. if (!(service === "ec2")) { console.log("Event not for correct service -- no action (", service, ")" ); return; } // If this event is not about an instance, then do nothing. if (!(resourceType === "instance")) { console.log("Event not for correct resource type -- no action (", resourceType, ")" ); return; } // CAUTION - Removing the following 'if' statement causes the function to run against // every EC2 instance in the specified Region in the calling Akun AWS. // If you do this and an instance is not tagged with the approved tag key // and value, this function stops that instance. // If this event is not for the ARN of an instance in our include list, then do nothing. if (InstanceList.indexOf(instanceId)<0) { console.log("Event not for one of the monitored instances -- no action (", resource, ")"); return; } console.log("Tags changed on monitored EC2 instance (",instanceId,")"); // Check attached tags for expected tag key and value pair if ( tags.hasOwnProperty(ValidKeyName) && tags[ValidKeyName] == "valid-value"){ // Required tags ARE present console.log("The instance has the required tag key and value -- no action"); callback(null, "no action"); return; } // Required tags NOT present console.log("This instance is missing the required tag key or value -- attempting to stop the instance"); var params = { InstanceIds: [instanceId], DryRun: true }; // call EC2 to stop the selected instances ec2.stopInstances(params, function(err, data) { if (err && err.code === 'DryRunOperation') { // dryrun succeeded, so proceed with "real" stop operation params.DryRun = false; ec2.stopInstances(params, function(err, data) { if (err) { console.log("Failed to stop instance"); callback(err, "fail"); } else if (data) { console.log("Successfully stopped instance", data.StoppingInstances); callback(null, "Success"); } }); } else { console.log("Dryrun attempt failed"); callback(err); } }); };
-
Pilih Deploy untuk menyimpan perubahan Anda dan membuat versi baru fungsi aktif.
Fungsi Lambda ini memeriksa tag EC2 instance Amazon, seperti yang dilaporkan oleh peristiwa perubahan tag di. EventBridge Dalam contoh ini, jika instance dalam acara tersebut kehilangan kunci tag yang diperlukan valid-key
atau jika tag tersebut tidak memiliki nilaivalid-value
, maka fungsi tersebut mencoba menghentikan instance. Anda dapat mengubah pemeriksaan logis ini atau persyaratan tag untuk kasus penggunaan spesifik Anda sendiri.
Biarkan jendela konsol Lambda tetap terbuka di browser Anda.
Langkah 2. Siapkan izin IAM yang diperlukan
Sebelum fungsi berhasil dijalankan, Anda harus memberikan fungsi izin untuk menghentikan sebuah EC2 instance. Peran AWS yang diberikan lambda_basic_executionAutoEC2Termination-role-
. Izin tambahan minimum yang diperlukan untuk tutorial ini adalahuniqueid
ec2:StopInstances
.
Untuk informasi selengkapnya tentang membuat kebijakan IAM EC2 khusus Amazon, lihat Amazon EC2: Mengizinkan memulai atau menghentikan EC2 Instans dan memodifikasi grup keamanan, secara terprogram dan di konsol di Panduan Pengguna IAM.
Untuk membuat kebijakan izin IAM dan melampirkannya ke peran eksekusi fungsi Lambda
-
Di tab atau jendela browser yang berbeda, buka halaman Peran
konsol IAM. -
Mulai mengetik nama peran
AutoEC2Termination
, dan ketika muncul dalam daftar, pilih nama peran. -
Pada halaman Ringkasan peran, pilih tab Izin dan pilih nama satu kebijakan yang sudah dilampirkan.
-
Pada halaman Ringkasan kebijakan, pilih Edit kebijakan.
-
Pada tab Editor Visual, pilih Tambahkan izin tambahan.
-
Untuk Layanan, pilih EC2.
-
Untuk Tindakan, pilih StopInstances. Anda dapat mengetik
Stop
di bilah pencarian, dan kemudian memilihStopInstances
kapan itu muncul. -
Untuk Sumber Daya, pilih Semua sumber daya, pilih Kebijakan tinjauan, lalu pilih Simpan perubahan.
Ini secara otomatis membuat versi baru kebijakan dan menetapkan versi tersebut sebagai default.
Kebijakan akhir Anda akan terlihat mirip dengan contoh berikut.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "ec2:StopInstances", "Resource": "*" }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:us-east-1:123456789012:*" }, { "Sid": "VisualEditor2", "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:us-east-1:123456789012:log-group:/aws/lambda/AutoEC2Termination:*" } ] }
Langkah 3. Lakukan tes pendahuluan fungsi Lambda Anda
Pada langkah ini, Anda mengirimkan acara pengujian ke fungsi Anda. Fungsionalitas pengujian Lambda bekerja dengan mengirimkan peristiwa pengujian yang disediakan secara manual. Fungsi memproses peristiwa uji seperti jika acara itu berasal EventBridge. Anda dapat menentukan beberapa peristiwa pengujian dengan nilai yang berbeda untuk menjalankan semua bagian yang berbeda dari kode Anda. Pada langkah ini, Anda mengirimkan peristiwa pengujian yang menunjukkan bahwa tag EC2 instans Amazon berubah, dan tag baru tidak menyertakan kunci dan nilai tag yang diperlukan.
Untuk menguji fungsi Lambda Anda
-
Kembali ke jendela atau tab dengan konsol Lambda dan buka tab Uji untuk fungsi EC2Penghentian Otomatis Anda.
-
Pilih Buat acara baru.
-
Untuk Nama peristiwa, masukkan
SampleBadTagChangeEvent
. -
Dalam Event JSON, ganti teks dengan contoh peristiwa yang ditunjukkan dalam contoh teks berikut. Anda tidak perlu mengubah akun, Wilayah, atau ID instans agar peristiwa pengujian ini berfungsi dengan benar.
{ "version": "0", "id": "bddcf1d6-0251-35a1-aab0-adc1fb47c11c", "detail-type": "Tag Change on Resource", "source": "aws.tag", "account": "123456789012", "time": "2018-09-18T20:41:38Z", "region": "us-east-1", "resources": [ "arn:aws:ec2:us-east-1:123456789012:instance/i-0000000aaaaaaaaaa" ], "detail": { "changed-tag-keys": [ "valid-key" ], "tags": { "valid-key": "NOT-valid-value" }, "service": "ec2", "resource-type": "instance", "version": 3 } }
-
Pilih Simpan, lalu pilih Uji.
Tes tampaknya gagal, tapi tidak apa-apa.
Anda akan melihat kesalahan berikut di tab Hasil eksekusi di bawah Respons.
{ "errorType": "InvalidInstanceID.NotFound", "errorMessage": "The instance ID 'i-0000000aaaaaaaaaa' does not exist", ... }
Kesalahan terjadi karena instance yang ditentukan dalam acara pengujian tidak ada.
Informasi pada tab Hasil eksekusi, di bagian Function Logs, menunjukkan bahwa fungsi Lambda Anda berhasil mencoba menghentikan sebuah instance. EC2 Namun, gagal karena kode awalnya mencoba
DryRun
operasi untuk menghentikan instance, yang menunjukkan bahwa ID instance tidak valid.START RequestId: 390c1f8d-0d9b-4b44-b087-8de64479ab44 Version: $LATEST 2022-11-30T20:17:30.427Z 390c1f8d-0d9b-4b44-b087-8de64479ab44 INFO Tags changed on monitored EC2 instance ( i-0000000aaaaaaaaaa ) 2022-11-30T20:17:30.427Z 390c1f8d-0d9b-4b44-b087-8de64479ab44 INFO This instance is missing the required tag key or value -- attempting to stop the instance 2022-11-30T20:17:31.206Z 390c1f8d-0d9b-4b44-b087-8de64479ab44 INFO Dryrun attempt failed 2022-11-30T20:17:31.207Z 390c1f8d-0d9b-4b44-b087-8de64479ab44 ERROR Invoke Error {"errorType":"InvalidInstanceID.NotFound","errorMessage":"The instance ID 'i-0000000aaaaaaaaaa' does not exist","code":"InvalidInstanceID.NotFound","message":"The instance ID 'i-0000000aaaaaaaaaa' does not exist","time":"2022-11-30T20:17:31.205Z","requestId":"a5192c3b-142d-4cec-bdbc-685a9b7c7abf","statusCode":400,"retryable":false,"retryDelay":36.87870631147607,"stack":["InvalidInstanceID.NotFound: The instance ID 'i-0000000aaaaaaaaaa' does not exist"," at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/services/ec2.js:50:35)"," at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20)"," at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:78:10)"," at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:686:14)"," at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)"," at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)"," at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10"," at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)"," at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:688:12)"," at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:116:18)"]} END RequestId: 390c1f8d-0d9b-4b44-b087-8de64479ab44
-
Untuk membuktikan bahwa kode tidak mencoba menghentikan instance ketika tag yang benar digunakan, Anda dapat membuat dan mengirimkan peristiwa pengujian lain.
Pilih tab Uji di atas Sumber kode. Konsol menampilkan acara SampleBadTagChangeEventpengujian yang ada.
-
Pilih Buat acara baru.
-
Untuk nama Acara, ketik
SampleGoodTagChangeEvent
. -
Pada baris 17, hapus
NOT-
untuk mengubah nilainya menjadivalid-value
. -
Di bagian atas jendela Test event, pilih Save, lalu pilih Test.
Output menampilkan berikut ini, yang menunjukkan bahwa fungsi mengenali tag yang valid dan tidak mencoba untuk mematikan instance.
START RequestId: 53631a49-2b54-42fe-bf61-85b9e91e86c4 Version: $LATEST 2022-12-01T23:24:12.244Z 53631a49-2b54-42fe-bf61-85b9e91e86c4 INFO Tags changed on monitored EC2 instance ( i-0000000aaaaaaaaaa ) 2022-12-01T23:24:12.244Z 53631a49-2b54-42fe-bf61-85b9e91e86c4 INFO The instance has the required tag key and value -- no action END RequestId: 53631a49-2b54-42fe-bf61-85b9e91e86c4
Biarkan konsol Lambda tetap terbuka di browser Anda.
Langkah 4. Buat EventBridge aturan yang meluncurkan fungsi
Sekarang Anda dapat membuat EventBridge aturan yang cocok dengan acara dan menunjuk ke fungsi Lambda Anda.
Untuk membuat EventBridge aturan
-
Di tab atau jendela browser yang berbeda, buka EventBridge konsol
ke halaman Buat Aturan. -
Untuk Nama, masukkan
ec2-instance-rule
, lalu pilih Berikutnya. -
Gulir ke bawah ke metode Creation dan pilih Custom pattern (JSON editor).
-
Di kotak pengeditan, tempel teks pola berikut, lalu pilih Berikutnya.
{ "source": [ "aws.tag" ], "detail-type": [ "Tag Change on Resource" ], "detail": { "service": [ "ec2" ], "resource-type": [ "instance" ] } }
Aturan ini cocok dengan
Tag Change on Resource
peristiwa untuk EC2 instans Amazon dan memanggil apa pun yang Anda tentukan sebagai Target di langkah berikutnya. -
Selanjutnya, tambahkan fungsi Lambda Anda sebagai target. Dalam kotak Target 1, di bawah Pilih target, pilih fungsi Lambda.
-
Di bawah Fungsi, pilih fungsi EC2Pengakhiran Otomatis yang Anda buat sebelumnya, lalu pilih Berikutnya.
-
Pada halaman Konfigurasi tag, pilih Berikutnya. Kemudian pada halaman Tinjau dan buat, pilih Buat aturan. Ini juga secara otomatis memberikan izin EventBridge untuk menjalankan fungsi Lambda yang ditentukan.
Langkah 5. Uji solusi lengkapnya
Anda dapat menguji hasil akhir Anda dengan membuat EC2 instance dan melihat apa yang terjadi ketika Anda mengubah tagnya.
Untuk menguji solusi pemantauan dengan instance nyata
-
Buka EC2konsol Amazon
ke halaman Instans. -
Buat EC2 instance Amazon. Sebelum Anda meluncurkannya, lampirkan tag dengan kunci
valid-key
dan nilainyavalid-value
. Untuk informasi tentang cara membuat dan meluncurkan instance, lihat Langkah 1: Meluncurkan instance di Panduan EC2 Pengguna Amazon. Dalam prosedur Untuk meluncurkan instance, pada langkah 3, di mana Anda memasukkan tag Nama, juga pilih Tambahkan tag tambahan, pilih Tambah tag, lalu masukkan Kuncivalid-key
dan Nilai darivalid-value
. Anda dapat Melanjutkan tanpa key pair jika instance ini semata-mata untuk keperluan tutorial ini dan Anda berencana menghapus instance ini setelah Anda menyelesaikannya. Kembali ke tutorial ini ketika Anda mencapai akhir Langkah 1; Anda tidak perlu melakukan Langkah 2: Connect to your instance. -
Salin InstanceIddari konsol.
-
Beralih dari EC2 konsol Amazon ke konsol Lambda. Pilih fungsi Auto EC2 Termination Anda, pilih tab Code, lalu pilih tab index.js untuk mengedit kode Anda.
-
Ubah entri kedua di
InstanceList
dengan menempelkan nilai yang Anda salin dari konsol Amazon EC2 . PastikanRegionToMonitor
nilainya cocok dengan Wilayah yang berisi instance yang Anda tempel. -
Pilih Deploy untuk membuat perubahan Anda aktif. Fungsi ini sekarang siap untuk diaktifkan oleh perubahan tag ke instance itu di Wilayah tertentu.
-
Beralih dari konsol Lambda ke konsol Amazon EC2 .
-
Ubah Tag yang dilampirkan ke instance dengan menghapus tag kunci valid atau dengan mengubah nilai kunci itu.
catatan
Untuk informasi tentang cara mengubah tag pada EC2 instance Amazon yang sedang berjalan, lihat Menambahkan dan menghapus tag pada sumber daya individual di Panduan EC2 Pengguna Amazon.
-
Tunggu beberapa detik, lalu segarkan konsol. Instance harus mengubah status Instance menjadi Stopping dan kemudian ke Stopped.
-
Beralih dari EC2 konsol Amazon ke konsol Lambda dengan fungsi Anda, dan pilih tab Monitor.
-
Pilih tab Log, dan dalam tabel Pemanggilan terbaru, pilih entri terbaru di LogStreamkolom.
CloudWatch Konsol Amazon terbuka ke halaman peristiwa Log untuk pemanggilan terakhir fungsi Lambda Anda. Entri terakhir akan terlihat mirip dengan contoh berikut.
2022-11-30T12:03:57.544-08:00 START RequestId: b5befd18-2c41-43c8-a320-3a4b2317cdac Version: $LATEST 2022-11-30T12:03:57.548-08:00 2022-11-30T20:03:57.548Z b5befd18-2c41-43c8-a320-3a4b2317cdac INFO Tags changed on monitored EC2 instance ( arn:aws:ec2:us-west-2:123456789012:instance/i-1234567890abcdef0 ) 2022-11-30T12:03:57.548-08:00 2022-11-30T20:03:57.548Z b5befd18-2c41-43c8-a320-3a4b2317cdac INFO This instance is missing the required tag key or value -- attempting to stop the instance 2022-11-30T12:03:58.488-08:00 2022-11-30T20:03:58.488Z b5befd18-2c41-43c8-a320-3a4b2317cdac INFO Successfully stopped instance [ { CurrentState: { Code: 64, Name: 'stopping' }, InstanceId: 'i-1234567890abcdef0', PreviousState: { Code: 16, Name: 'running' } } ] 2022-11-30T12:03:58.546-08:00 END RequestId: b5befd18-2c41-43c8-a320-3a4b2317cdac
Ringkasan tutorial
Tutorial ini menunjukkan cara membuat EventBridge aturan agar sesuai dengan perubahan tag pada peristiwa sumber daya untuk EC2 instance Amazon. Aturan menunjuk ke fungsi Lambda yang secara otomatis mematikan instance jika tidak memiliki tag yang diperlukan.
EventBridge Dukungan Amazon untuk perubahan tag pada AWS sumber daya membuka kemungkinan untuk membangun otomatisasi berbasis peristiwa di banyak sumber daya. Layanan AWS Menggabungkan kemampuan ini dengan AWS Lambda memberi Anda alat untuk membangun solusi tanpa server yang mengakses AWS sumber daya dengan aman, skala sesuai permintaan, dan hemat biaya.
Kasus penggunaan lain yang mungkin untuk tag-change-on-resource EventBridge acara tersebut meliputi:
-
Luncurkan peringatan jika seseorang mengakses sumber daya Anda dari alamat IP yang tidak biasa — Gunakan tag untuk menyimpan alamat IP sumber setiap pengunjung yang mengakses sumber daya Anda. Perubahan pada tag menghasilkan CloudWatch peristiwa. Anda dapat menggunakan peristiwa itu untuk membandingkan alamat IP sumber dengan daftar alamat IP yang valid dan mengaktifkan email peringatan jika alamat IP sumber tidak valid.
-
Pantau jika ada perubahan pada kontrol akses berbasis tag untuk sumber daya — Jika Anda telah menyiapkan akses ke sumber daya menggunakan kontrol akses berbasis atribut (tag) (ABAC), Anda dapat menggunakan EventBridge peristiwa yang dihasilkan oleh perubahan apa pun pada tag untuk meminta audit oleh tim keamanan Anda.