Buat aturan kustom di Cloud Config dengan menulis fungsi Function Compute. Contoh ini memeriksa jumlah core CPU pada instance ECS.
Prasyarat
Function Compute telah diaktifkan. Aktifkan Function Compute.
Function Compute dikenai biaya. Ikhtisar penagihan.
Informasi latar belakang
Untuk memahami konsep, kasus penggunaan, dan prinsip kerja aturan fungsi kustom, lihat Definisi dan prinsip kerja aturan fungsi kustom.
Prosedur
Contoh ini menulis fungsi yang memeriksa jumlah core CPU pada instance ECS. Instance dengan dua atau kurang core CPU dianggap tidak sesuai (non-compliant).
-
Buat layanan.
-
Masuk ke Konsol Function Compute.
-
Di panel navigasi sebelah kiri, klik Services & Functions.
-
Di bilah navigasi atas, pilih wilayah, seperti atau Singapore (Singapore).
-
Pada halaman Services, klik Create Service.
-
Di panel Create Service, masukkan Name layanan dan gunakan 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 Request Handler Type menjadi Event Handler dan Runtime menjadi Python 3.10. Gunakan nilai default untuk parameter lainnya.
-
Klik Create.
-
-
Konfigurasikan kode fungsi.
-
Salin kode berikut dan tempelkan 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 kepatuhan. COMPLIANCE_TYPE_COMPLIANT = 'COMPLIANT' COMPLIANCE_TYPE_NON_COMPLIANT = 'NON_COMPLIANT' COMPLIANCE_TYPE_NOT_APPLICABLE = 'NOT_APPLICABLE' # Jenis pengiriman konfigurasi resource. CONFIGURATION_TYPE_COMMON = 'COMMON' CONFIGURATION_TYPE_OVERSIZE = 'OVERSIZE' CONFIGURATION_TYPE_NONE = 'NONE' # Fungsi titik masuk yang mengoordinasikan dan memproses logika bisnis. def handler(event, context): """ Fungsi handler. :param event: Data event. :param context: Objek konteks. :return: Hasil evaluasi. """ # Parameter input fungsi. logger.info(f'Printing function input parameters:{event}') # Validasi event. Anda dapat menyalin blok kode ini secara langsung. 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') # Konfigurasi resource. Parameter ini memiliki nilai ketika pemicu diatur ke Configuration Change. # Saat Anda membuat atau menjalankan aturan secara manual, Cloud Config memanggil fungsi untuk mengevaluasi semua resource yang ditentukan satu per satu. # Jika konfigurasi suatu resource berubah, Cloud Config secara otomatis memanggil fungsi untuk mengevaluasi resource tersebut berdasarkan 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 dikirimkan melebihi batas atas (100 KB). # Jika ya, Anda harus memanggil API untuk mengkueri detail resource guna mendapatkan 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 menerapkan logika evaluasi sesuai kebutuhan bisnis Anda. 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 } ] # Kirimkan hasil evaluasi ke Cloud Config. Anda dapat menyalin blok kode ini secara langsung. put_evaluations(creds, result_token, evaluations) return evaluations # Evaluasi jumlah core CPU pada instance ECS. def evaluate_configuration_item(rule_parameters, configuration_item): """ Logika evaluasi. :param rule_parameters: Parameter aturan. :param configuration_item: Item konfigurasi. :return: Hasil evaluasi kepatuhan. """ # Inisialisasi nilai kembali. compliance_type = COMPLIANCE_TYPE_COMPLIANT annotation = None # Dapatkan konfigurasi lengkap resource. full_configuration = configuration_item['configuration'] if not full_configuration: annotation = 'Configuration is empty.' return compliance_type, annotation # Konversi konfigurasi ke format 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: Data event. :return: Objek JSON. """ if not event: logger.error('Event is empty.') evt = parse_json(event) logger.info('Loading event: %s .' % json.dumps(evt)) if 'resultToken' not in evt: logger.error('ResultToken is empty.') return None if 'ruleParameters' not in evt: logger.error('RuleParameters is empty.') return None if 'invokingEvent' not in evt: logger.error('InvokingEvent is empty.') return None return evt def parse_json(content): """ Uraikan string JSON. :param content: String JSON. :return: Objek JSON. """ try: return json.loads(content) except Exception as e: logger.error('Parse content:{} to json error:{}.'.format(content, e)) return None # Kirimkan hasil evaluasi ke Cloud Config. Anda dapat menyalin blok kode ini secara langsung. def put_evaluations(creds, result_token, evaluations): """ Mengirimkan hasil evaluasi ke Cloud Config. :param context: Konteks Function Compute. :param result_token: Token callback. :param evaluations: Hasil evaluasi. :return: None """ # Peran layanan Function Compute harus memiliki izin AliyunConfigFullAccess. client = AcsClient(creds.access_key_id, creds.access_key_secret, region_id='cn-shanghai') # Buat permintaan dan atur parameternya. 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 with request: {}, response: {}.'.format(request, response)) except Exception as e: logger.error('PutEvaluations error: %s' % e)CatatanKode ini memeriksa jumlah core CPU. Untuk menemukan nama parameter aturan Anda, periksa konfigurasi resource (
configuration) guna mendapatkan nama parameter aturan Anda. Lihat informasi resource, Langkah 6. Misalnya, di bagian Configuration Details instance ECS, klik View JSON. Parameter jumlah core CPU adalahCpu. Dapatkan nilaiCpuCountyang diharapkan darirule_parameters.Fungsi ini mengirimkan hasil evaluasi melalui API PutEvaluations. Perhatikan bidang
DeleteMode. Jika diaktifkan, hasil evaluasi yang tidak diperbarui selama evaluasi saat ini akan dihapus secara otomatis. -
Di pojok kiri atas, klik Deploy Code.
-
-
Buat aturan kustom menggunakan Function Compute.
Masuk ke Konsol Cloud Config.
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 Based on Function Compute, pilih Function ARN, lalu klik Next.
Untuk Function ARN, atur Region menjadi atau 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 dan klik Add Rule Parameter. Masukkan CpuCount untuk Rule Parameters dan 2 untuk Expected Value. Lalu, atur Trigger menjadi Configuration Changes dan klik Next.
Catatan-
Nama parameter aturan harus sesuai dengan kunci
rule_parametersdalam kode di Langkah 3. -
Saat Anda membuat, mengubah, atau mengevaluasi ulang aturan, Cloud Config mengirimkan konfigurasi semua resource jenis yang ditentukan ke Function Compute untuk dievaluasi.
-
-
Pada halaman Set Effective Scope, atur Resource Type menjadi ECS Instance dan klik Next.
Catatan-
Untuk menghindari evaluasi yang tidak valid, pilih hanya jenis resource yang ingin Anda evaluasi.
-
Aturan ini mengevaluasi semua resource jenis terkait di akun Anda.
-
-
Pada halaman Set Correction, klik Submit.
CatatanAnda dapat mengaktifkan sakelar Set Correction dan mengonfigurasi remediasi kustom. Atur remediasi kustom.
-
Lihat hasil deteksi.
Daftar Rules menampilkan jumlah resource tidak sesuai yang dideteksi oleh aturan tersebut.
CatatanKlik Rule Identifier atau klik Details di kolom Actions untuk melihat Compliance Result of Related Resources.
Jika kolom Non-compliant Resources untuk aturan tersebut menampilkan No Data, tetapi resource yang sesuai ada di akun Anda, pemanggilan fungsi atau pengiriman evaluasi mungkin gagal. Di tab Invocation Log fungsi, klik Request Log di kolom Actions untuk pemecahan masalah. Lihat log pemanggilan.