すべてのプロダクト
Search
ドキュメントセンター

Cloud Config:カスタム関数ルール

最終更新日:Jun 05, 2026

カスタム関数ルールがトリガーされると、Cloud Config は Function Compute 内の関連付けられた関数を呼び出してリソースを評価し、コンプライアンス結果を返します。このページでは、Python のサンプルを用いて関数コードの構造と入力パラメーターについて説明します。

カスタム関数ルール

カスタム関数ルールは、Function Compute 関数を使用して評価ロジックを定義し、実行します。

シナリオ

マネージドルールと条件ルールがコンプライアンス要件を満たさない場合は、複雑な評価のためにカスタム関数を作成できます。追加のシナリオとコードサンプルは、カスタム関数ルールサンプルライブラリで入手できます。

仕組み

次の図は、カスタム関数ルールの実行フローを示しています。

image.png

実行手順:

  1. Function Compute で関数を作成します。

  2. Cloud Config でその関数に基づいてカスタムルールを作成します。評価が自動的にトリガーされます。

    説明

    Cloud Config は、ルール作成後に自動的に評価をトリガーします。

  3. Cloud Config は、サービスリンクロール (AliyunServiceRoleForConfig) を使用して、GetFunction API および InvokeFunction API の権限を取得します。

  4. Cloud Config は InvokeFunction API を呼び出して関数を実行し、設定項目とルール情報を渡します。

  5. 関数がリソースを評価します。

  6. 関数は PutEvaluations API を呼び出して、コンプライアンス評価結果を Cloud Config に返します。

    Cloud Config は結果を保存し、コンソールに表示します。その後、非準拠リソースを修復したり、データを他の Alibaba Cloud サービスに配信したりできます。

関数コード

ルールは、関数内に保存された評価ロジックです。Cloud Config は、監査中にこの関数を呼び出します。関数コードは 2 つの部分で構成されます。

  • handler

    handler は、ルールがトリガーされたときに呼び出されるエントリ関数です。Function Compute コンソールで関数を作成する際に、ハンドラーを指定する必要があります。詳細については、「ハンドラー」をご参照ください。

    説明

    Cloud Config はイベントハンドラーのみをサポートしています。

  • put_evaluations

    この関数は PutEvaluations API を呼び出して、コンプライアンス評価結果を Cloud Config に送信します。

次のコードは Python のサンプルです。

# #!/usr/bin/env python
# # -*- encoding: utf-8 -*-
import json
import logging

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest


logger = logging.getLogger()
# リソースのコンプライアンスタイプ
COMPLIANCE_TYPE_COMPLIANT = 'COMPLIANT'
COMPLIANCE_TYPE_NON_COMPLIANT = 'NON_COMPLIANT'
COMPLIANCE_TYPE_NOT_APPLICABLE = 'NOT_APPLICABLE'
# リソース設定の配信タイプ
CONFIGURATION_TYPE_COMMON = 'COMMON'
CONFIGURATION_TYPE_OVERSIZE = 'OVERSIZE'
CONFIGURATION_TYPE_NONE = 'NONE'


# ビジネスロジックを実装するエントリ関数
def handler(event, context):
    """
    ハンドラー関数。
    :param event: イベント。
    :param context: コンテキスト。
    :return: 評価結果。
    """
    # イベントを検証します。このコードブロックはコピーできます。
    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')

    # リソースの設定。ルールのトリガーを「設定変更」に設定する必要があります。ルールを作成または手動実行すると、Cloud Config は関数を呼び出してすべてのリソースを 1 つずつ評価します。リソースの設定が変更されると、Cloud Config は変更情報に基づいて自動的に関数を呼び出してリソースを評価します。
    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')

    # 配信されたリソース設定のサイズが 100 KB 以上かどうかを確認します。100 KB 以上の場合は、GetDiscoveredResource オペレーションを呼び出してリソースの詳細を取得する必要があります。
    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"]

    # リソースを評価します。ビジネス要件に基づいて評価ロジックを実装する必要があります。次のコードは参考用です。
    compliance_type, annotation = evaluate_configuration_item(
        rule_parameters, configuration_item)

    # 評価結果を設定します。形式は次の例に準拠する必要があります。
    evaluations = [
        {
            'accountId': account_id,
            'complianceResourceId': resource_id,
            'complianceResourceType': resource_type,
            'complianceRegionId': region_id,
            'orderingTimestamp': ordering_timestamp,
            'complianceType': compliance_type,
            'annotation': annotation
        }
    ]

    # 評価結果を Cloud Config に送信します。このコードブロックはコピーできます。
    put_evaluations(creds, result_token, evaluations)
    return evaluations


# ルール情報とリソース設定に基づいてリソースを評価します。ビジネス要件に基づいて評価ロジックを実装する必要があります。次のコードは参考用です。
def evaluate_configuration_item(rule_parameters, configuration_item):
    """
    評価ロジック。
    :param rule_parameters: ルール情報。
    :param configuration_item: リソース設定。
    :return: コンプライアンスタイプとアノテーション。
    """
    # 戻り値を初期化します。
    compliance_type = COMPLIANCE_TYPE_NON_COMPLIANT
    annotation = None

    # 完全なリソース設定を取得します。
    full_configuration = configuration_item['configuration']
    if not full_configuration:
        annotation = 'Configuration is empty.'
        return compliance_type, annotation

    # 設定を JSON 形式に変換します。
    configuration = parse_json(full_configuration)
    if not configuration:
        annotation = 'Configuration:{} is invalid.'.format(full_configuration)
        return compliance_type, annotation
    return compliance_type, annotation


def validate_event(event):
    """
    イベントを検証します。
    :param event: イベント。
    :return: JSON オブジェクト。
    """
    if not event:
        logger.error('Event is empty.')
    evt = parse_json(event)
    logger.info('Loading event: %s .' % 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):
    """
    データを JSON 形式に変換します。
    :param content: JSON 文字列。
    :return: JSON オブジェクト。
    """
    try:
        return json.loads(content)
    except Exception as e:
        logger.error('Parse content:{} to json error:{}.'.format(content, e))
        return None


# 評価結果を Cloud Config に送信します。このコードブロックはコピーできます。
def put_evaluations(creds, result_token, evaluations):
    """
    API オペレーションを呼び出して評価結果を送信します。
    :param creds: 関数の認証情報。
    :param result_token: 結果トークン。
    :param evaluations: 評価結果。
    :return: None
    """
    # Function Compute のサービスリンクロールには、AliyunConfigFullAccess ポリシーがアタッチされている必要があります。
    client = AcsClient(creds.access_key_id, creds.access_key_secret, region_id='ap-southeast-1')

    # リクエストを作成してパラメーターを設定します。ドメイン名は 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 with request: {}, response: {}.'.format(request, response))
    except Exception as e:
        logger.error('PutEvaluations error: %s' % e)


# 完全なリソースの詳細を取得します。このコードブロックはコピーできます。
def get_discovered_resource(creds, resource_id, resource_type, region_id):
    """
    API オペレーションを呼び出してリソース設定の詳細を取得します。
    :param creds: 関数の認証情報。
    :param resource_id: リソース ID。
    :param resource_type: リソースタイプ。
    :param region_id: リソースが存在するリージョンの ID。
    :return: リソースの詳細。
    """
    # Function Compute のサービスリンクロールには、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)
重要

ルールのパラメーター名を特定するには、Cloud Config コンソールの設定項目で configuration フィールドを確認してください。詳細については、「リソース情報の確認」のステップ 6 をご参照ください。

関数の入力

関数の入力パラメーターは、設定項目とルール情報で構成されます。Function Compute に送信される内容は、ルールのTriggerに基づいて異なります。

説明

Function Compute で関数の入力パラメーターを取得するには、「呼び出しログの確認」をご参照ください。

  • ルールの TriggerPeriodic のみに設定されている場合、Cloud Config は設定項目を Function Compute に送信しません。

    ルールが初回実行、スケジュール実行、または手動実行される場合、Cloud Config は設定項目なしで単一のレコードを送信します。例:

    {
        "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****"
    }
  • ルールの TriggerConfiguration Changes が含まれている場合、Cloud Config は設定項目を Function Compute に送信します。

    初回実行、スケジュール実行、または手動実行時には、Cloud Config は設定項目を 1 つずつ送信します。リソースが作成または変更されると、Cloud Config は影響を受けた設定項目のみを送信します。例:

    {
        "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****"
    }

    設定項目が 100 KB 以上の場合、Cloud Config は configuration フィールドなしでリソース概要のみを送信します。例:

    説明

    完全なリソース設定を取得するには、GetDiscoveredResource API を呼び出すことができます。

    {
        "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****"
    }

次の表に、関数の主要な入力パラメーターをカテゴリ別に示します。

カテゴリ

パラメーター

説明

設定項目

configurationItem

特定の時点におけるリソース設定の状態を表す JSON オブジェクトです。リソース ID、タイプ、リージョン、作成タイムスタンプ、タグ、完全な設定が含まれます。

configurationType

設定項目の配信タイプです。有効な値:

  • COMMON:完全な設定が配信されます (サイズ < 100 KB)。

  • OVERSIZE:設定が 100 KB 以上です。完全なリソースの詳細を取得するには、GetDiscoveredResource API を呼び出す必要があります。

ルール情報

orderingTimestamp

評価が開始されたときのタイムスタンプです。

invokingEvent

呼び出しイベントです。

accountId

呼び出しイベントに関連付けられたアカウント ID です。

messageType

メッセージタイプです。有効な値:

  • Manual:手動でトリガーされた評価。

  • ConfigurationItemChangeNotification:設定変更によってトリガーされた評価。

  • ScheduledNotification:定期的な評価。

notificationCreationTimestamp

ルールがトリガーされたときのタイムスタンプです。

ruleParameters

カスタムルールの入力パラメーターです。パラメーター名と期待値が含まれます。

resultToken

PutEvaluations API で評価結果を送信する際に必要なトークンです。