Topik ini menjelaskan cara membuat aturan kustom menggunakan Function Compute 2.0. Dalam contoh ini, Anda menulis kode fungsi untuk memeriksa jumlah core CPU pada instans Elastic Compute Service (ECS).
Prasyarat
Pastikan Anda telah mengaktifkan Function Compute. Untuk informasi selengkapnya, lihat Aktifkan Function Compute.
Untuk informasi selengkapnya tentang penagihan Function Compute, lihat Ikhtisar penagihan.
Informasi latar belakang
Untuk informasi selengkapnya tentang konsep, skenario, dan prinsip kerja aturan fungsi kustom, lihat Definisi dan prinsip kerja aturan fungsi kustom.
Prosedur
Topik ini menunjukkan cara menulis kode fungsi untuk memeriksa jumlah core CPU pada instans ECS. Jika jumlah core CPU kurang dari atau sama dengan 2, instans ECS tersebut compliant. Jika tidak, instans tersebut non-compliant.
Buat layanan.
Masuk ke Function Compute console.
Di panel navigasi sebelah kiri, klik Services & Functions.
Di bilah menu atas, pilih wilayah, misalnya Singapore (Singapore).
Pada halaman Services, klik Create Service.
Di panel Create Service, masukkan Name layanan dan pertahankan nilai default untuk parameter lainnya.
Klik OK.
Buat fungsi.
Di layanan yang Anda buat di Langkah 1, klik Create Function.
Pada halaman Create Function, masukkan Function Name. Atur Handler Type ke Event Handler dan Runtime ke Python 3.10. Pertahankan nilai default untuk parameter lainnya.
Klik Create.
Konfigurasikan kode fungsi.
Salin dan tempel kode berikut ke dalam file index.py.
# # !/usr/bin/env python # # -*- encoding: utf-8 -*- import json import logging from aliyunsdkcore.client import AcsClient from aliyunsdkcore.request import CommonRequest logger = logging.getLogger() # Jenis compliance COMPLIANCE_TYPE_COMPLIANT = 'COMPLIANT' COMPLIANCE_TYPE_NON_COMPLIANT = 'NON_COMPLIANT' COMPLIANCE_TYPE_NOT_APPLICABLE = 'NOT_APPLICABLE' # Jenis push konfigurasi CONFIGURATION_TYPE_COMMON = 'COMMON' CONFIGURATION_TYPE_OVERSIZE = 'OVERSIZE' CONFIGURATION_TYPE_NONE = 'NONE' # Fungsi entri untuk mengoordinasikan dan memproses logika bisnis. def handler(event, context): """ Fungsi penanganan :param event: Event. :param context: Konteks. :return: Hasil evaluasi. """ # Parameter input fungsi logger.info(f'Print parameter input fungsi:{event}') # Validasi event. Anda dapat menyalin kode ini. evt = validate_event(event) if not evt: return None creds = context.credentials rule_parameters = evt.get('ruleParameters') result_token = evt.get('resultToken') invoking_event = evt.get('invokingEvent') ordering_timestamp = evt.get('orderingTimestamp') # Informasi konfigurasi resource. Parameter ini memiliki nilai ketika aturan dipicu oleh perubahan konfigurasi. Saat Anda membuat aturan atau menjalankan aturan secara manual, Cloud Config memanggil fungsi untuk mengevaluasi semua resource satu per satu. Jika konfigurasi resource berubah, Cloud Config secara otomatis memanggil fungsi untuk mengevaluasi resource berdasarkan informasi perubahan tersebut. configuration_item = invoking_event.get('configurationItem') account_id = configuration_item.get('accountId') resource_id = configuration_item.get('resourceId') resource_type = configuration_item.get('resourceType') region_id = configuration_item.get('regionId') resource_name = configuration_item.get('resourceName') # Periksa apakah ukuran konfigurasi resource yang didorong melebihi batas (100 KB). Jika iya, panggil API detail resource untuk mengambil data lengkap. configuration_type = invoking_event.get('configurationType') if configuration_type and configuration_type == CONFIGURATION_TYPE_OVERSIZE: resource_result = get_discovered_resource(creds, resource_id, resource_type, region_id) resource_json = json.loads(resource_result) configuration_item["configuration"] = resource_json["DiscoveredResourceDetail"]["Configuration"] # Evaluasi resource. Anda harus mengimplementasikan logika evaluasi sesuai kebutuhan. Kode berikut hanya sebagai referensi. compliance_type, annotation = evaluate_configuration_item( rule_parameters, configuration_item) # Tetapkan hasil evaluasi. Formatnya harus sesuai contoh berikut. evaluations = [ { 'accountId': account_id, 'complianceResourceId': resource_id, 'complianceResourceName': resource_name, 'complianceResourceType': resource_type, 'complianceRegionId': region_id, 'orderingTimestamp': ordering_timestamp, 'complianceType': compliance_type, 'annotation': annotation } ] # Kembalikan hasil evaluasi dan tulis ke Cloud Config. Anda dapat menyalin kode ini. put_evaluations(creds, result_token, evaluations) return evaluations # Evaluasi jumlah core CPU untuk instans ECS. def evaluate_configuration_item(rule_parameters, configuration_item): """ Logika evaluasi :param rule_parameters: Parameter aturan. :param configuration_item: Item konfigurasi. :return: Jenis evaluasi. """ # Inisialisasi nilai kembali. compliance_type = COMPLIANCE_TYPE_COMPLIANT annotation = None # Dapatkan informasi konfigurasi resource lengkap. full_configuration = configuration_item['configuration'] if not full_configuration: annotation = 'Konfigurasi kosong.' return compliance_type, annotation # Konversi ke JSON. configuration = parse_json(full_configuration) cpu_count = configuration.get('Cpu') eq_count = rule_parameters.get('CpuCount') if cpu_count and cpu_count <= int(eq_count): annotation = json.dumps({"configuration":cpu_count,"desiredValue":eq_count,"operator":"Greater","property":"$.Cpu"}) compliance_type = COMPLIANCE_TYPE_NON_COMPLIANT return compliance_type, annotation return compliance_type, annotation def validate_event(event): """ Validasi event. :param event: Event. :return: Objek JSON. """ if not event: logger.error('Event kosong.') evt = parse_json(event) logger.info('Memuat event: %s .' % json.dumps(evt)) if 'resultToken' not in evt: logger.error('ResultToken kosong.') return None if 'ruleParameters' not in evt: logger.error('RuleParameters kosong.') return None if 'invokingEvent' not in evt: logger.error('InvokingEvent kosong.') return None return evt def parse_json(content): """ Konversi tipe JSON :param content: String JSON. :return: Objek JSON. """ try: return json.loads(content) except Exception as e: logger.error('Mengurai konten:{} ke json error:{}.'.format(content, e)) return None # Kembalikan hasil evaluasi dan tulis ke Cloud Config. Anda dapat menyalin kode ini. def put_evaluations(creds, result_token, evaluations): """ Panggil API untuk mengembalikan dan menulis hasil evaluasi. :param context: Konteks Function Compute. :param result_token: Token callback. :param evaluations: Hasil evaluasi. :return: None """ # Peran layanan untuk Function Compute (FC) harus memiliki izin AliyunConfigFullAccess. client = AcsClient(creds.access_key_id, creds.access_key_secret, region_id='cn-shanghai') # Buat permintaan dan atur parameter. Domain-nya adalah config.cn-shanghai.aliyuncs.com. request = CommonRequest() request.set_domain('config.cn-shanghai.aliyuncs.com') request.set_version('2020-09-07') request.set_action_name('PutEvaluations') request.add_body_params('ResultToken', result_token) request.add_body_params('Evaluations', evaluations) request.add_body_params('SecurityToken', creds.security_token) request.set_method('POST') try: response = client.do_action_with_exception(request) logger.info('PutEvaluations dengan permintaan: {}, respons: {}.'.format(request, response)) except Exception as e: logger.error('PutEvaluations error: %s' % e)CatatanKode di atas memeriksa jumlah core CPU. Untuk mendapatkan nama parameter aturan Anda, lihat parameter inti konfigurasi resource (
configuration) di Konsol Cloud Config. Untuk informasi selengkapnya, lihat Langkah 6 dalam Lihat informasi resource. Misalnya, di bagian Core Configuration Information instans ECS, klik View JSON untuk mengambil parameter jumlah core CPU, yaituCpu. Ambil nilai yang diharapkan dariCpuCountdarirule_parameters.Hasil evaluasi Function Compute dikirimkan oleh fungsi Anda melalui API PutEvaluations. Perhatikan bidang
DeleteMode. Jika mode hapus diaktifkan, hasil evaluasi yang tidak diperbarui selama evaluasi saat ini akan dihapus secara otomatis.Di pojok kiri atas, klik Deploy Code.
Buat aturan kustom berdasarkan Function Compute.
Masuk ke Cloud Config console.
Opsional. Di pojok kiri atas, pilih kelompok akun.
Operasi ini hanya diperlukan jika Anda menggunakan akun manajemen dari direktori sumber daya. Jika tidak, Anda tidak perlu melakukan operasi ini.
Di panel navigasi sebelah kiri, pilih .
Pada halaman Rules, klik Create Rule.
Pada halaman Select Create Method, pilih Custom with Function Compute, pilih Function ARN, lalu klik Next.
Untuk Region Function ARN, pilih Singapore (Singapore). Untuk Service, pilih layanan yang Anda buat di Langkah 1. Untuk Function, pilih fungsi yang Anda buat di Langkah 2.
Pada halaman Set Basic Properties, masukkan Rule Name, klik Add Rule Parameter, masukkan CpuCount untuk Rule Parameter, dan masukkan 2 untuk Expected Value. Lalu, atur Trigger ke Configuration Change dan klik Next.
CatatanNama parameter aturan harus sesuai dengan kunci
rule_parametersdalam kode di Langkah 3.Saat Anda membuat aturan, mengubah aturan, atau mengevaluasi ulang resource menggunakan aturan, Cloud Config mendorong semua konfigurasi resource dari tipe resource yang ditentukan ke Function Compute satu per satu dan memicu fungsi untuk mengevaluasinya.
Pada halaman Set Scope, atur Resource Type ke ECS Instance dan klik Next.
CatatanPilih hanya tipe resource yang ingin Anda evaluasi untuk menghindari pemicuan evaluasi yang tidak perlu.
Setelah Anda mengaitkan resource dengan aturan, aturan tersebut akan mengevaluasi semua resource dari tipe yang ditentukan di akun Anda.
Pada halaman Set Remediation, klik Submit.
CatatanAnda dapat mengaktifkan sakelar Set Remediation dan mengonfigurasi remediasi kustom sesuai petunjuk. Untuk informasi selengkapnya, lihat Atur remediasi kustom.
Lihat hasil deteksi aturan terhadap jumlah core CPU pada instans ECS.
Di daftar Rules, Anda dapat melihat jumlah resource non-compliant yang terdeteksi oleh aturan.
CatatanKlik Rule ID atau Details di kolom Actions untuk melihat daftar Latest Detection Data.
Jika kolom Non-compliant Resources untuk aturan menampilkan No Data, tetapi Anda memastikan bahwa resource yang sesuai dengan aturan ada di akun Anda, fungsi gagal dipanggil atau Function Compute gagal mengirimkan hasil evaluasi ke Cloud Config. Di tab Invocation Log fungsi, klik Request Log di kolom Actions untuk mengidentifikasi penyebab kegagalan dan memperbaikinya. Untuk informasi selengkapnya, lihat Lihat log pemanggilan.