Cloud Config memungkinkan Anda membuat aturan kustom berdasarkan Function Compute untuk mengaudit sumber daya terkait. Ketika sebuah aturan dipicu, Cloud Config memanggil fungsi aturan yang sesuai untuk mengevaluasi sumber daya tersebut dan mengembalikan hasil evaluasi kepatuhan. Topik ini menjelaskan parameter input dari aturan fungsi kustom serta menyediakan contoh kode Python yang relevan.
Pengenalan aturan fungsi kustom
Aturan fungsi kustom adalah aturan kustom yang digunakan oleh Cloud Config untuk melakukan audit dengan memanggil fungsi Function Compute.
Skenario
Jika template aturan preset dan aturan kondisi Cloud Config tidak dapat memenuhi persyaratan deteksi kepatuhan sumber daya, Anda dapat menulis kode fungsi untuk mengaudit sumber daya dalam skenario kompleks. Untuk informasi lebih lanjut, lihat alibabacloud-config-samples.
Cara kerjanya
Gambar berikut menunjukkan cara kerja aturan kustom yang dibuat berdasarkan Function Compute.

Berikut ini penjelasan tentang cara kerja aturan kustom berdasarkan Function Compute:
Fungsi dibuat di Function Compute.
Aturan kustom dibuat berdasarkan Function Compute di Cloud Config, dan Cloud Config secara otomatis memicu evaluasi.
CatatanSetelah Anda membuat aturan, Cloud Config secara otomatis memicu evaluasi.
Cloud Config mendapatkan izin untuk memanggil operasi GetFunction dan InvokeFunction menggunakan peran terhubung layanan AliyunServiceRoleForConfig.
Cloud Config memanggil operasi InvokeFunction untuk mengeksekusi fungsi guna mendapatkan konfigurasi sumber daya dan informasi aturan.
Fungsi tersebut mengevaluasi sumber daya.
Function Compute mengembalikan hasil evaluasi sumber daya ke Cloud Config dengan memanggil operasi PutEvaluations.
Cloud Config menyimpan hasil evaluasi sumber daya dan menampilkannya di konsol Cloud Config. Anda dapat melihat hasilnya di konsol Cloud Config atau memperbaiki sumber daya yang tidak sesuai serta mengirimkan data sumber daya ke layanan cloud yang sesuai.
Kode Fungsi
Aturan adalah potongan kode penilaian logis yang disimpan dalam fungsi aturan. Cloud Config mengaudit sumber daya berdasarkan aturan. Ketika aturan dipicu, Cloud Config memanggil fungsi aturan yang sesuai untuk mengevaluasi sumber daya terkait. Dalam contoh ini, kode fungsi aturan kustom mencakup fungsi-fungsi utama berikut:
handlerFungsi
handleradalah fungsi masukan yang dipanggil ketika aturan dipicu. Saat membuat fungsi di konsol Function Compute, Anda harus mengonfigurasi fungsi handler. Untuk informasi lebih lanjut, lihat Handlers.CatatanCloud Config hanya mendukung penanganan acara. Untuk informasi lebih lanjut, lihat Penanganan Acara.
put_evaluationsHasil evaluasi sumber daya dikembalikan ke Cloud Config dengan memanggil operasi PutEvaluations.
Anda dapat menggunakan kode Python sampel berikut untuk membuat aturan:
# # !/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 evaluasi kepatuhan sumber daya.
COMPLIANCE_TYPE_COMPLIANT = 'COMPLIANT'
COMPLIANCE_TYPE_NON_COMPLIANT = 'NON_COMPLIANT'
COMPLIANCE_TYPE_NOT_APPLICABLE = 'NOT_APPLICABLE'
# Jenis konfigurasi sumber daya yang didorong.
CONFIGURATION_TYPE_COMMON = 'COMMON'
CONFIGURATION_TYPE_OVERSIZE = 'OVERSIZE'
CONFIGURATION_TYPE_NONE = 'NONE'
# Fungsi masukan yang mengoordinasikan dan memproses logika bisnis.
def handler(event, context):
"""
Proses suatu acara.
:param event: acara.
:param context: konteks.
:return: hasil evaluasi kepatuhan.
"""
# Periksa apakah acara tersebut valid. Anda dapat langsung menyalin kode contoh berikut.
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. Aturan harus diatur untuk dipicu saat terjadi perubahan konfigurasi. 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 sumber daya berubah, Cloud Config secara otomatis memanggil fungsi aturan yang sesuai untuk mengevaluasi sumber daya.
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')
# Periksa apakah ukuran konfigurasi sumber daya yang ingin Anda dorong tidak kurang dari 100 KB. Jika ya, operasi GetDiscoveredResource dipanggil untuk menanyakan detail sumber daya.
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 menerapkan logika evaluasi berdasarkan skenario bisnis Anda. Kode berikut hanya untuk referensi:
compliance_type, annotation = evaluate_configuration_item(
rule_parameters, configuration_item)
# Tentukan hasil evaluasi kepatuhan. Hasilnya harus menggunakan sintaks yang ditunjukkan dalam contoh berikut:
evaluations = [
{
'accountId': account_id,
'complianceResourceId': resource_id,
'complianceResourceType': resource_type,
'complianceRegionId': region_id,
'orderingTimestamp': ordering_timestamp,
'complianceType': compliance_type,
'annotation': annotation
}
]
# Kembalikan hasil evaluasi kepatuhan dan tulis ke Cloud Config. Anda dapat langsung menyalin kode contoh berikut.
put_evaluations(creds, result_token, evaluations)
return evaluations
# Evaluasi sumber daya berdasarkan informasi aturan dan konfigurasi sumber daya. Anda harus menerapkan logika evaluasi berdasarkan skenario bisnis. Kode berikut hanya untuk referensi:
def evaluate_configuration_item(rule_parameters, configuration_item):
"""
Evaluasi sumber daya.
:param rule_parameters: informasi aturan.
:param configuration_item: konfigurasi sumber daya.
:return: hasil evaluasi kepatuhan.
"""
# Inisialisasi nilai pengembalian.
compliance_type = COMPLIANCE_TYPE_NON_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 ke objek JSON.
configuration = parse_json(full_configuration)
if not configuration:
annotation = 'Konfigurasi:{} tidak valid.'.format(full_configuration)
return compliance_type, annotation
return compliance_type, annotation
def validate_event(event):
"""
Periksa apakah suatu acara valid.
:param event: acara.
:return: objek JSON.
"""
if not event:
logger.error('Acara kosong.')
evt = parse_json(event)
logger.info('Memuat acara: %s .' % 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 string JSON menjadi objek JSON.
:param content: string JSON.
:return: objek JSON.
"""
try:
return json.loads(content)
except Exception as e:
logger.error('Parse konten:{} ke json error:{}.'.format(content, e))
return None
# Kembalikan hasil evaluasi kepatuhan dan tulis ke Cloud Config. Anda dapat langsung menyalin kode contoh berikut.
def put_evaluations(creds, result_token, evaluations):
"""
Panggil API Cloud Config untuk mengembalikan hasil evaluasi kepatuhan dan tulis 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 dengan kebijakan AliyunConfigFullAccess.
client = AcsClient(creds.access_key_id, creds.access_key_secret, region_id='ap-southeast-1')
# Buat permintaan dan tentukan parameter. Dalam contoh ini, parameter domain diatur ke config.ap-southeast-1.aliyuncs.com.
request = CommonRequest()
request.set_domain('config.ap-southeast-1.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: {}, respons: {}.'.format(request, response))
except Exception as e:
logger.error('PutEvaluations error: %s' % e)
# Dapatkan detail sumber daya. Anda dapat menyalin kode contoh berikut berdasarkan skenario bisnis Anda.
def get_discovered_resource(creds, resource_id, resource_type, region_id):
"""
Panggil operasi API untuk mendapatkan detail sumber daya.
:param context: konteks Function Compute.
:param resource_id: ID sumber daya.
:param resource_type: jenis sumber daya.
:param region_id: ID wilayah tempat sumber daya berada.
:return: detail sumber daya.
"""
# Akun Anda harus diberi peran layanan Function Compute yang dilampirkan dengan kebijakan AliyunConfigFullAccess.
client = AcsClient(creds.access_key_id, creds.access_key_secret, region_id='ap-southeast-1')
request = CommonRequest()
request.set_domain('config.ap-southeast-1.aliyuncs.com')
request.set_version('2020-09-07')
request.set_action_name('GetDiscoveredResource')
request.add_query_param('ResourceId', resource_id)
request.add_query_param('ResourceType', resource_type)
request.add_query_param('Region', region_id)
request.add_query_param('SecurityToken', creds.security_token)
request.set_method('GET')
try:
response = client.do_action_with_exception(request)
resource_result = str(response, encoding='utf-8')
return resource_result
except Exception as e:
logger.error('GetDiscoveredResource error: %s' % e)Untuk mendapatkan nama parameter aturan yang ingin Anda konfigurasikan, kami sarankan Anda melihat parameter inti dari konfigurasi sumber daya yang ditentukan oleh parameter konfigurasi dalam kode di konsol Cloud Config. Untuk informasi lebih lanjut, lihat Langkah 6 dalam Lihat Informasi tentang Sumber Daya.
Parameter Input
Parameter input dari fungsi aturan Function Compute dapat dibagi menjadi dua kategori: konfigurasi sumber daya dan informasi aturan. Dalam pesan acara, bidang configurationItem menyimpan parameter input konfigurasi sumber daya, dan bidang ruleParameters menyimpan parameter input fungsi aturan. Konten yang dikirim Cloud Config ke Function Compute bervariasi berdasarkan trigger type aturan.
Untuk informasi lebih lanjut tentang cara mendapatkan parameter input fungsi aturan dari Function Compute, lihat Konfigurasi Pencatatan.
Jika parameter Trigger diatur ke Periodic Execution, Cloud Config tidak mengirim konfigurasi sumber daya ke Function Compute.
Saat aturan baru dieksekusi untuk pertama kali, aturan dieksekusi secara otomatis secara berkala, atau aturan dieksekusi secara manual, Cloud Config hanya mengirim catatan yang tidak berisi konfigurasi sumber daya ke Function Compute. Contoh kode berikut menunjukkan contoh JSON.
{ "orderingTimestamp": 1716365226714, "invokingEvent": { "accountId": 120886317861****, "messageType": "ScheduledNotification", "notificationCreationTimestamp": 1716365226714, "configurationType": "NONE" }, "ruleParameters": { "CpuCount": "2" }, "resultToken": "HLQr3BZx/C+DLjwudFcYdXxZFPF2HnGqlg1uHceZ5kDEFeQF2K5LZGofyhn+GE4NP5VgkwANUH3qcdeSjWwODk1ymtmLWLzFV4JForVWYIKdbwwhbDBOgVwF7Ov9c3uVCNz/KpxNElwhTzMkZB95U1vmLs4vUYXuB/Txw4jiCYBYZZnVumhwXWswTLvAhIe5Y451FckObyM3I47AaB+4KtDW3I5q8O+Kx7eSYkqqGTawmJEYjvWXz9CHHMLFtNYyJX54a35mpVdxFSvgeXYDJTStxqb+d9UH/162fZh7T78OHxpQZgl8bcXzZhml****" }Jika parameter Trigger diatur ke Configuration Change, Cloud Config mengirim konfigurasi sumber daya ke Function Compute.
Saat aturan baru dieksekusi untuk pertama kali, aturan dieksekusi secara otomatis secara berkala, atau aturan dieksekusi secara manual, Cloud Config mengirim konfigurasi sumber daya ke Function Compute satu per satu. Saat sumber daya baru ditambahkan atau sumber daya yang ada diubah, Cloud Config hanya mengirim konfigurasi sumber daya tunggal yang berubah ke Function Compute. Contoh kode berikut menunjukkan contoh JSON.
{ "orderingTimestamp":1695786337959, "invokingEvent":{ "accountId":120886317861****, "messageType":"Manual", "notificationCreationTimestamp":1695786337959, "configurationType":"COMMON", "configurationItem":{ "accountId":120886317861****, "arn":"acs:ecs:ap-southeast-1:120886317861****:instance/i-t4n0vr6x7v54jdbu****", "availabilityZone":"ap-southeast-1a", "regionId":"ap-southeast-1", "configuration":"{\\"ResourceGroupId\\":\\"\\",\\"Memory\\":4096,\\"InstanceChargeType\\":\\"PostPaid\\",\\"Cpu\\":2,\\"OSName\\":\\"Alibaba Cloud Linux 3.2104 LTS 64\xe4\xbd\x8d\\",\\"InstanceNetworkType\\":\\"vpc\\",\\"InnerIpAddress\\":{\\"IpAddress\\":[]},\\"ExpiredTime\\":\\"2099-12-31T15:59Z\\",\\"ImageId\\":\\"aliyun_3_x64_20G_alibase_20230727.vhd\\",\\"EipAddress\\":{\\"AllocationId\\":\\"\\",\\"IpAddress\\":\\"\\",\\"InternetChargeType\\":\\"\\"},\\"ImageOptions\\":{},\\"VlanId\\":\\"\\",\\"HostName\\":\\"iZt4n0vr6x7v54jdbuk****\\",\\"Status\\":\\"Running\\",\\"HibernationOptions\\":{\\"Configured\\":false},\\"MetadataOptions\\":{\\"HttpTokens\\":\\"\\",\\"HttpEndpoint\\":\\"\\"},\\"InstanceId\\":\\"i-t4n0vr6x7v54jdbu****\\",\\"StoppedMode\\":\\"Not-applicable\\",\\"CpuOptions\\":{\\"ThreadsPerCore\\":2,\\"Numa\\":\\"ON\\",\\"CoreCount\\":1},\\"StartTime\\":\\"2023-08-18T09:02Z\\",\\"DeletionProtection\\":false,\\"VpcAttributes\\":{\\"PrivateIpAddress\\":{\\"IpAddress\\":[\\"192.168.XX.XX\\"]},\\"VpcId\\":\\"vpc-t4nmwd0l9a7aj09yr****\\",\\"VSwitchId\\":\\"vsw-t4njclm0dlz2szayi****\\",\\"NatIpAddress\\":\\"\\"},\\"SecurityGroupIds\\":{\\"SecurityGroupId\\":[\\"sg-t4n5pulxj2lvechw****\\"]},\\"InternetChargeType\\":\\"PayByTraffic\\",\\"InstanceName\\":\\"zs-test-peer****\\",\\"DeploymentSetId\\":\\"\\",\\"InternetMaxBandwidthOut\\":0,\\"SerialNumber\\":\\"8c3fadf7-2ea1-4486-84ce-7784aeb7****\\",\\"OSType\\":\\"linux\\",\\"CreationTime\\":\\"2023-08-18T09:02Z\\",\\"AutoReleaseTime\\":\\"\\",\\"Description\\":\\"\\",\\"InstanceTypeFamily\\":\\"ecs.c7\\",\\"DedicatedInstanceAttribute\\":{\\"Tenancy\\":\\"\\",\\"Affinity\\":\\"\\"},\\"PublicIpAddress\\":{\\"IpAddress\\":[]},\\"GPUSpec\\":\\"\\",\\"NetworkInterfaces\\":{\\"NetworkInterface\\":[{\\"Type\\":\\"Primary\\",\\"PrimaryIpAddress\\":\\"192.168.XX.XX\\",\\"MacAddress\\":\\"00:16:3e:04:XX:XX\\",\\"NetworkInterfaceId\\":\\"eni-t4n16tmnpp794y1o****\\",\\"PrivateIpSets\\":{\\"PrivateIpSet\\":[{\\"PrivateIpAddress\\":\\"192.168.XX.XX\\",\\"Primary\\":true}]}}]},\\"SpotPriceLimit\\":0.0,\\"SaleCycle\\":\\"\\",\\"DeviceAvailable\\":true,\\"InstanceType\\":\\"ecs.c7.large\\",\\"OSNameEn\\":\\"Alibaba Cloud Linux 3.2104 LTS 64 bit\\",\\"SpotStrategy\\":\\"NoSpot\\",\\"IoOptimized\\":true,\\"ZoneId\\":\\"ap-southeast-1a\\",\\"ClusterId\\":\\"\\",\\"EcsCapacityReservationAttr\\":{\\"CapacityReservationPreference\\":\\"\\",\\"CapacityReservationId\\":\\"\\"},\\"DedicatedHostAttribute\\":{\\"DedicatedHostId\\":\\"\\",\\"DedicatedHostName\\":\\"\\",\\"DedicatedHostClusterId\\":\\"\\"},\\"GPUAmount\\":0,\\"OperationLocks\\":{\\"LockReason\\":[]},\\"InternetMaxBandwidthIn\\":-1,\\"Recyclable\\":false,\\"RegionId\\":\\"ap-southeast-1\\",\\"CreditSpecification\\":\\"\\"}", "captureTime":1695786337959, "resourceCreateTime":1692349320000, "resourceId":"i-t4n0vr6x7v54jdbu****", "resourceName":"zs-test-peer****", "resourceGroupId":"rg-acfmw3ty5y7****", "resourceType":"ACS::ECS::Instance", "tags":"{}" } }, "ruleParameters":{ "CpuCount":"2" }, "resultToken":"HLQr3BZx/C+DLjwudFcYdXxZFPF2HnGqlg1uHceZ5kDEFeQF2K5LZGofyhn+GE4NP5VgkwANUH3qcdeSjWwODk1ymtmLWLzFV4JForVWYIKdbwwhbDBOgVwF7Ov9c3uVCNz/KpxNElwhTzMkZB95U1vmLs4vUYXuB/Txw4jiCYBYZZnVumhwXWswTLvAhIe5Y451FckObyM3I47AaB+4KtDW3I5q8O+Kx7eSYkqqGTawmJEYjvWXz9CHHMLFtNYyJX54a35mpVdxFSvgeXYDJTStxqb+d9UH/162fZh7T78OHxpQZgl8bcXzZhml****" }Jika ukuran file konfigurasi sumber daya yang dikirim oleh Cloud Config tidak kurang dari 100 KB, Cloud Config hanya mengirim informasi ringkasan sumber daya, tidak termasuk bidang
konfigurasidalam file konfigurasi sumber daya. Contoh kode berikut menunjukkan contoh JSON.CatatanAnda dapat memanggil operasi GetDiscoveredResource untuk mendapatkan konfigurasi sumber daya lengkap.
{ "orderingTimestamp":1695786337959, "invokingEvent":{ "accountId":120886317861****, "messageType":"Manual", "notificationCreationTimestamp":1695786337959, "configurationType":"OVERSIZE", "configurationItem":{ "accountId":120886317861****, "arn":"acs:ecs:ap-southeast-1:120886317861****:instance/i-t4n0vr6x7v54jdbu****", "availabilityZone":"ap-southeast-1a", "regionId":"ap-southeast-1", "captureTime":1695786337959, "resourceCreateTime":1692349320000, "resourceId":"i-t4n0vr6x7v54jdbu****", "resourceName":"zs-test-peer****", "resourceGroupId":"rg-acfmw3ty5y7****", "resourceType":"ACS::ECS::Instance", "tags":"{}" } }, "ruleParameters":{ "CpuCount":"2" }, "resultToken":"HLQr3BZx/C+DLjwudFcYdXxZFPF2HnGqlg1uHceZ5kDEFeQF2K5LZGofyhn+GE4NP5VgkwANUH3qcdeSjWwODk1ymtmLWLzFV4JForVWYIKdbwwhbDBOgVwF7Ov9c3uVCNz/KpxNElwhTzMkZB95U1vmLs4vUYXuB/Txw4jiCYBYZZnVumhwXWswTLvAhIe5Y451FckObyM3I47AaB+4KtDW3I5q8O+Kx7eSYkqqGTawmJEYjvWXz9CHHMLFtNYyJX54a35mpVdxFSvgeXYDJTStxqb+d9UH/162fZh7T78OHxpQZgl8bcXzZhml****" }
Tabel berikut menjelaskan jenis parameter input dan parameter utama.
Kategori | Parameter | Deskripsi |
Konfigurasi Sumber Daya | configurationItem | Konfigurasi sumber daya. Konfigurasi berikut disertakan: ID akun Alibaba Cloud tempat sumber daya berada, Nama Sumber Daya Alibaba Cloud (ARN) dari sumber daya, ID zona tempat sumber daya berada, ID wilayah tempat sumber daya berada, konfigurasi detail sumber daya, timestamp ketika Cloud Config mendeteksi perubahan sumber daya dan membuat log, timestamp saat sumber daya dibuat, status sumber daya, ID sumber daya, nama sumber daya, tipe sumber daya, dan tag. |
configurationType | Tipe konfigurasi yang didorong. Nilai valid:
| |
Informasi Aturan | orderingTimestamp | Timestamp awal eksekusi evaluasi. |
invokingEvent | Acara pemanggilan. | |
accountId | ID akun dari acara pemanggilan. | |
messageType | Tipe pesan. Nilai valid:
| |
notificationCreationTimestamp | Timestamp ketika aturan dipicu. | |
ruleParameters | Parameter input aturan kustom. Nama dan nilai yang diharapkan dari parameter input aturan kustom harus ditentukan. | |
resultToken | Token hasil di Function Compute. |