Topik ini menjelaskan cara membuat aturan kustom berdasarkan Function Compute 2.0. Kode fungsi dalam topik ini dikembangkan untuk memeriksa jumlah core CPU pada instance Elastic Compute Service (ECS).
Prasyarat
Function Compute telah diaktifkan. Untuk informasi selengkapnya, lihat Aktifkan Function Compute.
Untuk informasi selengkapnya mengenai aturan penagihan Function Compute, lihat Ikhtisar penagihan.
Informasi latar belakang
Untuk informasi selengkapnya mengenai konsep, skenario penggunaan, dan prinsip fungsi aturan kustom, lihat Definisi dan implementasi fungsi aturan kustom.
Prosedur
Bagian ini menjelaskan cara menulis kode fungsi untuk memeriksa jumlah core CPU pada instance ECS. Jika jumlah core CPU pada instance ECS kurang dari atau sama dengan 2, hasil evaluasi adalah compliant. Jika jumlah core CPU pada instance ECS lebih dari 2, hasil evaluasi adalah non-compliant.
Buat layanan.
Masuk ke Konsol Function Compute.
Di panel navigasi sebelah kiri, klik Services & Functions.
Di bilah navigasi atas, pilih wilayah, misalnya Singapura (Singapura).
Pada halaman Services, klik Create Service.
Di panel Create Service, masukkan nama layanan di bidang Name dan pertahankan nilai default untuk parameter lainnya.
Klik OK.
Buat fungsi.
Klik nama layanan yang Anda buat di Langkah 1. Pada halaman yang muncul, klik Create Function.
Pada halaman Create Function, konfigurasikan Function Name, dan atur Handler Type menjadi Event Handler serta Runtime menjadi Python 3.10. Pertahankan nilai default untuk parameter lainnya.
Klik Create.
Konfigurasikan kode fungsi.
Salin dan tempel kode berikut ke 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() # Hasil evaluasi kepatuhan. COMPLIANCE_TYPE_COMPLIANT = 'COMPLIANT' COMPLIANCE_TYPE_NON_COMPLIANT = 'NON_COMPLIANT' COMPLIANCE_TYPE_NOT_APPLICABLE = 'NOT_APPLICABLE' # Jenis konfigurasi yang didorong. CONFIGURATION_TYPE_COMMON = 'COMMON' CONFIGURATION_TYPE_OVERSIZE = 'OVERSIZE' CONFIGURATION_TYPE_NONE = 'NONE' # Fungsi entri yang mengoordinasikan dan memproses logika bisnis. def handler(event, context): """ Memproses sebuah event. :param event: event tersebut. :param context: konteksnya. :return: hasil evaluasi kepatuhan. """ # Parameter input fungsi. logger.info(f'Cetak parameter input fungsi:{event}') # Periksa apakah event valid. Anda dapat menyalin contoh kode berikut sesuai kebutuhan. 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') # Dapatkan konfigurasi sumber daya. Jika aturan diatur untuk dipicu saat terjadi perubahan konfigurasi, parameter input ditentukan. Setelah aturan yang Anda buat dipicu atau Anda memicu aturan secara manual, Cloud Config memanggil fungsi aturan untuk mengevaluasi sumber daya terkait satu per satu. Jika konfigurasi suatu sumber daya berubah, Cloud Config secara otomatis memanggil fungsi aturan terkait untuk mengevaluasi sumber daya 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 sumber daya yang didorong lebih besar dari 100 KB. Jika ya, panggil operasi API 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 sumber daya. Anda harus mengimplementasikan logika evaluasi berdasarkan skenario bisnis Anda. Kode berikut hanya sebagai referensi: compliance_type, annotation = evaluate_configuration_item( rule_parameters, configuration_item) # Tentukan hasil evaluasi kepatuhan. Hasilnya harus menggunakan sintaks seperti pada 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 kepatuhan dan tulis hasilnya ke Cloud Config. Anda dapat langsung menggunakan contoh kode berikut dalam kode fungsi Anda. put_evaluations(creds, result_token, evaluations) return evaluations # Evaluasi jumlah core CPU pada instance ECS. def evaluate_configuration_item(rule_parameters, configuration_item): """ Mengevaluasi sebuah sumber daya. :param rule_parameters: parameter input aturan. :param configuration_item: konfigurasi sumber daya. :return: hasil evaluasi kepatuhan. """ # Inisialisasi nilai kembali. compliance_type = COMPLIANCE_TYPE_COMPLIANT annotation = None # Dapatkan konfigurasi sumber daya lengkap. full_configuration = configuration_item['configuration'] if not full_configuration: annotation = 'Konfigurasi kosong.' return compliance_type, annotation # Konversi konfigurasi menjadi objek 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): """ Periksa apakah sebuah event valid. :param event: event tersebut. :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): """ Mengonversi string JSON menjadi objek 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 kepatuhan dan tulis hasilnya ke Cloud Config. Anda dapat langsung menggunakan contoh kode berikut dalam kode fungsi Anda. def put_evaluations(creds, result_token, evaluations): """ Panggil API Cloud Config untuk mengembalikan hasil evaluasi kepatuhan dan menulis hasilnya ke Cloud Config. :param context: konteks Function Compute. :param result_token: token hasil. :param evaluations: hasil evaluasi kepatuhan. :return: None """ # Akun Anda harus diberi peran layanan Function Compute yang dilampirkan kebijakan AliyunConfigFullAccess. client = AcsClient(creds.access_key_id, creds.access_key_secret, region_id='cn-shanghai') # Buat permintaan dan konfigurasikan parameternya. Atur parameter Domain menjadi config.cn-shanghai.aliyuncs.com. request = CommonRequest() request.set_domain('config.cn-shanghai.aliyuncs.com') request.set_version('2019-01-08') 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: {}, tanggapan: {}.'.format(request, response)) except Exception as e: logger.error('PutEvaluations error: %s' % e)CatatanKode di atas memeriksa jumlah core CPU. Kami menyarankan agar Anda melihat parameter inti konfigurasi sumber daya (
configuration) di Konsol Cloud Config untuk mendapatkan nama parameter bagi aturan tersebut. Untuk informasi selengkapnya, lihat Lihat informasi sumber daya dan rujuk ke Langkah 6. Misalnya, di bagian Core Configuration Information pada instance ECS, klik View JSON. Parameter untuk jumlah core CPU adalahCpu. Dapatkan nilai yang diinginkan untukCpuCountdarirule_parameters.Di pojok kiri atas tab Code, klik Deploy.
Buat aturan kustom berdasarkan 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 langkah Select Create Method, pilih Based on Function Compute, tentukan fungsi di bagian Function ARN, lalu klik Next.
Di bagian Function ARN, pilih Singapore untuk parameter Region, pilih layanan yang dibuat di Langkah 1 untuk parameter Service, lalu pilih fungsi yang dibuat di Langkah 2 untuk parameter Function.
Pada halaman Set Basic Properties, masukkan Rule Name. Klik Add Rule Parameter. Atur Rule Parameter menjadi CpuCount dan Desired Value menjadi 2. Atur Trigger menjadi Configuration Change. Lalu, klik Next.
CatatanNama parameter aturan harus sama dengan
rule_parametersdalam kode di Langkah 3.Saat Anda membuat aturan, mengubah aturan, atau melakukan audit ulang sumber daya berdasarkan aturan tersebut, Cloud Config mendorong semua konfigurasi sumber daya dari jenis sumber daya yang ditentukan ke Function Compute satu per satu dan memicu fungsi untuk mengevaluasi sumber daya tersebut.
Pada langkah Set Effective Scope, pilih Elastic Compute Service dalam daftar All Resource Type, lalu klik Next.
CatatanKami menyarankan agar Anda hanya memilih jenis sumber daya yang ingin dievaluasi. Jika Anda memilih semua jenis sumber daya, hasil evaluasi yang tidak valid akan dihasilkan.
Setelah Anda menentukan jenis sumber daya, Cloud Config mengevaluasi semua sumber daya dari jenis yang ditentukan berdasarkan aturan tersebut.
Pada langkah Set Remediation, klik Submit.
CatatanAnda dapat mengaktifkan Set Remediation dan mengonfigurasi remediasi kustom untuk aturan tersebut sesuai petunjuk. Untuk informasi selengkapnya, lihat Konfigurasi remediasi kustom.
Lihat hasil pemeriksaan aturan untuk jumlah core CPU pada instance ECS.
Pada halaman Rules, Anda dapat melihat jumlah sumber daya non-compliant yang terdeteksi oleh aturan tersebut.
CatatanKlik Rule ID atau Details di kolom Actions untuk melihat Latest Detection Data List.
Jika No Data ditampilkan di kolom NonCompliant Resource untuk aturan yang diinginkan pada halaman Rules, tetapi Anda memastikan bahwa sumber daya yang ditentukan dalam aturan tersedia di akun saat ini, fungsi gagal dipanggil atau Function Compute gagal mengirimkan hasil evaluasi ke Cloud Config. Di tab Logs fungsi yang ingin Anda lihat, klik Request Logs di kolom Actions untuk menemukan penyebab kegagalannya. Untuk informasi selengkapnya, lihat Lihat log pemanggilan fungsi.