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

Cloud Config:カスタム修正の設定

最終更新日:Nov 14, 2025

マネージドルールに基づいてルールを作成するか、カスタムルールを作成する場合、ルールにカスタム修正を設定して Function Compute を使用して非準拠のリソースを修正できます。このルールに関連付けられているリソースが [非準拠] と評価された場合、テンプレートが有効になり、リソースは迅速に修正されます。

前提条件

Function Compute が有効化されていること。詳細については、「Function Compute の有効化」をご参照ください。

背景情報

このトピックでは、カスタム修正を設定して実行する方法について説明します。この例では、[ecs-running-instance-no-public-ip] マネージドルールを使用します。

[ecs-running-instance-no-public-ip] マネージドルールを使用すると、実行中の Elastic Compute Service (ECS) インスタンスにパブリック IPv4 アドレスまたは EIP (Elastic IP Address) が関連付けられているかどうかを確認できます。パブリック IPv4 アドレスまたは EIP が ECS インスタンスに関連付けられている場合、評価結果は非準拠になります。パブリック IPv4 アドレスまたは EIP が関連付けられている ECS インスタンスは停止されます。

手順

  1. Cloud Config コンソールにログインします。

  2. 任意。左上隅で、アカウントグループを選択します。

    この操作は、リソースディレクトリの管理アカウントを使用している場合にのみ必要です。それ以外の場合は、この操作を実行する必要はありません。

  3. 左側のナビゲーションウィンドウで、[コンプライアンスと監査] > [ルール] を選択します。

  4. [ルール] ページで、[ルールの作成] をクリックします。

  5. [作成方法の選択] ステップで、[マネージドルールに基づく] を選択し、テンプレートリストから [ecs-running-instance-no-public-ip] を選択して、[次へ] をクリックします。

  6. [基本プロパティの設定] ステップで、パラメーターにデフォルト値を使用して [次へ] をクリックします。

  7. [有効範囲の設定] ステップで、パラメーターにデフォルト値を使用して [次へ] をクリックします。

  8. [修正設定] ページで、[修正の設定] スイッチをオンにし、[カスタム修正] を選択し、[トリガー方法][手動トリガー] に設定し、[関数 ARN] を選択して、[送信] をクリックします。

    重要
    • 呼び出しタイプを自動修正に設定すると、Cloud Config は設定に基づいて非準拠リソースの構成を自動的に修正します。これは業務継続性に影響を与える可能性があります。したがって、デフォルトでは [呼び出しタイプ][手動修正] に設定されています。デフォルト設定を維持することをお勧めします。

    • 修正がビジネスに影響しない場合は、[呼び出しタイプ][自動修正] に設定できます。この場合、Cloud Config は設定に基づいて非準拠リソースの構成を自動的に修正します。

    Create New Function をクリックして、Function Compute コンソールでサービスと修正関数を作成します。詳細については、「関数をすばやく作成する」をご参照ください。

    修正関数を作成するときは、[関数タイプ] パラメーターを [イベント関数] に、[ランタイム] パラメーターを [Python 3] に設定します。必要に応じて他のパラメーターを設定できます。サンプルコード:

    #!/usr/bin/env python
    # -*- encoding: utf-8 -*-
    import json
    from aliyunsdkcore.client import AcsClient
    from aliyunsdkcore.acs_exception.exceptions import ClientException
    from aliyunsdkcore.acs_exception.exceptions import ServerException
    from aliyunsdkcore.auth.credentials import AccessKeyCredential
    from aliyunsdkcore.auth.credentials import StsTokenCredential
    from aliyunsdkecs.request.v20140526.StopInstanceRequest import StopInstanceRequest
    from aliyunsdkcore.auth.credentials import AccessKeyCredential
    from aliyunsdkcore.auth.credentials import StsTokenCredential
    from aliyunsdkkms.request.v20160120.DecryptRequest import DecryptRequest
    
    # -*- coding: utf-8 -*-
    
    import logging
    import json
    
    logger = logging.getLogger()
    
    
    def handler(event, context):
        get_resources_non_compliant(event, context)
    
    
    def get_resources_non_compliant(event, context):
        resources = parse_json(event)
        for resource in resources:
            remediation(resource, context)
    
    
    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
    
    
    def remediation(resource, context):
        logger.info(resource)
        region_id = resource['regionId']
        account_id = resource['accountId']
        resource_id = resource['resourceId']
        resource_type = resource['resourceType']
        config_rule_id = resource['configRuleId']
        if resource_type == 'ACS::ECS::Instance' and config_rule_id == 'cr-f8a1626622af005d****':
            print(region_id, account_id, resource_id, resource_type, config_rule_id)
            stop_ecs_instance(context, region_id, resource_id)
    
    def stop_ecs_instance(context, resource_region_id, resource_id):
        logger.info("Note: Starting to stop the instance: {}{}".format(resource_region_id, resource_id))
    
        creds = context.credentials
        client = AcsClient(creds.access_key_id, creds.access_key_secret, region_id=resource_region_id)
    
        request = StopInstanceRequest()
        request.set_accept_format('json')
        request.set_InstanceId("i-hp3f6lofgrnml5mt****")
        request.set_StoppedMode("KeepCharging")
        request.add_query_param('SecurityToken', creds.security_token)
    
        response = client.do_action_with_exception(request)
        logger.info(response)
    説明

    修正関数の最新のサンプルコードの詳細については、「aliyun-config-remediation.py」をご参照ください。

    修正関数には、次の主要なサブ関数が含まれています。

    • handler: カスタム修正がトリガーされたときに CloudConfig によって呼び出されるデフォルトの関数エントリポイントです。関数を作成するときに handler を設定します。

    • get_resources_non_compliant: 非準拠のリソースを解析します。

    • remediation: カスタム修正のエントリポイントです。修正要件に基づいてこの関数をカスタマイズできます。たとえば、「ecs-running-instance-no-public-ip」ルールの場合、リソースが非準拠と評価された場合 (つまり、パブリック IP アドレスがアタッチされている場合)、修正アクションはインスタンスを停止することです。

  9. 手動で修正を実行します。

    1. [ルール] ページで、管理するルールを見つけ、[修正テンプレート] 列の [修正の詳細] をクリックします。

    2. [修正の詳細] タブで、[修正の詳細] の横にある [手動修正の実行] をクリックします。

      [実行結果リスト] セクションでは、修正結果を表示できます。リソースの修正に失敗した理由も表示できます。

      説明

      [修正の詳細] タブで、[修正テンプレート] の横にある関数 ARN をクリックして、Function Compute コンソールの修正関数の [コード] タブに移動します。

参考

マルチアカウントシナリオでの機能コードと権限付与設定の詳細については、「リソースディレクトリを使用して、企業内のアカウント間で非準拠リソースを自動的に修正する」をご参照ください。