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

Cloud Config:Function Compute を使用したカスタムルールの作成

最終更新日:Jun 11, 2026

Cloud Config では、Function Compute の関数を作成することで、カスタムルールを作成します。この例では、ECS インスタンスの CPU コア数を確認します。

前提条件

Function Compute が有効化されていること。「Function Compute の有効化」をご参照ください。

説明

Function Compute は料金が発生します。「課金概要」をご参照ください。

背景情報

カスタム関数ルールの概念、ユースケース、および動作原理については、「カスタム関数ルールの定義と動作原理」をご参照ください。

操作手順

この例では、ECS インスタンスの CPU コア数を確認する関数を作成します。CPU コアが 2 つ以下のインスタンスは、非準拠と判断されます。

  1. サービスを作成します。

    1. Function Compute コンソールにログインします。

    2. 左側のナビゲーションペインで、[Services & Functions] をクリックします。

    3. 上部メニューで、 や シンガポール (シンガポール) などのリージョンを選択します。

    4. [Services] ページで、[Create Service] をクリックします。

    5. [Create Service] パネルで、サービスの Name を入力し、他のパラメーターはデフォルト値のままにします。

    6. を選択して、 をクリックします。

  2. 関数を作成します。

    1. 手順 1 で作成したサービスで、関数の作成 をクリックします。

    2. 関数の作成 ページで、関数名 を入力します。[Request Handler Type][Event Handler] に、[Runtime][Python 3.10] に設定します。他のパラメーターはデフォルト値のままにします。

    3. 作成 をクリックします。

  3. 関数コードを設定します。

    1. 次のコードをコピーし、[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()
      # コンプライアンスタイプ
      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: 評価結果。
          """
          # 関数の入力パラメーターを出力します。
          logger.info(f'Printing function input parameters:{event}')
      
          # イベントを検証します。このコードブロックは直接コピーできます。
          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')
          resource_name = configuration_item.get('resourceName')
      
          # 配信されたリソース設定のサイズが上限 (100 KB) を超えているかどうかを確認します。
          # 超えている場合は、リソース詳細を取得する API を呼び出して、完全なデータを取得する必要があります。
          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,
                  'complianceResourceName': resource_name,
                  'complianceResourceType': resource_type,
                  'complianceRegionId': region_id,
                  'orderingTimestamp': ordering_timestamp,
                  'complianceType': compliance_type,
                  'annotation': annotation
              }
          ]
      
          # 評価結果を Cloud Config に送信します。このコードブロックは直接コピーできます。
          put_evaluations(creds, result_token, evaluations)
          return evaluations
      
      
      # ECS インスタンスの CPU コア数を評価します
      def evaluate_configuration_item(rule_parameters, configuration_item):
          """
          評価ロジック。
          :param rule_parameters: ルールのパラメーター。
          :param configuration_item: 設定項目。
          :return: コンプライアンス評価結果。
          """
          # 戻り値を初期化します。
          compliance_type = COMPLIANCE_TYPE_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)
          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":"LessOrEqual","property":"$.Cpu"})
            compliance_type = COMPLIANCE_TYPE_NON_COMPLIANT
            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 .' % 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):
          """
          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):
          """
          評価結果を Cloud Config に送信します。
          :param context: Function Compute のコンテキスト。
          :param result_token: コールバックトークン。
          :param evaluations: 評価結果。
          :return: なし
          """
          # Function Compute のサービスロールには、AliyunConfigFullAccess 権限が必要です。
          client = AcsClient(creds.access_key_id, creds.access_key_secret, region_id='cn-shanghai')
      
          # リクエストを作成し、そのパラメーターを設定します。ドメインは 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)
      説明

      このコードは CPU コア数をチェックします。 ルールのパラメーター名を確認するには、リソース設定 (configuration) を参照します (リソース情報の表示ステップ 6 をご参照ください)。 たとえば、ECS インスタンスの Configuration Details セクションで、View JSON をクリックします。 CPU コア数のパラメーターは Cpu です。 rule_parameters から、期待される CpuCount 値を取得します。

      この関数は、PutEvaluations API を使用して評価結果を送信します。DeleteMode フィールドにご留意ください。このフィールドを有効にすると、今回の評価で更新されなかった評価結果は自動的に削除されます。

    2. 左上隅の [Deploy Code] をクリックします。

  4. Function Compute を使用してカスタムルールを作成します。

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

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

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

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

    4. ルール ページで、Create Rule をクリックします。

    5. 作成方法の選択 ページで、関数に基づくカスタマイズの計算 を選択し、関数ですARN を選択してから Next をクリックします。

      Function ARN について、Region を または [Singapore (Singapore)] に設定します。Service には、手順 1 で作成したサービスを選択します。Function には、手順 2 で作成した関数を選択します。

    6. 基本プロパティの設定 ページで、Rule Name を入力し、Add Rule Parameter をクリックします。[Rule Parameters]Rule Parameters を、[Expected Value]Expected Value を入力します。次に、TriggerConfiguration Changes に設定し、Next をクリックします。

      説明
      • ルールパラメーター名は、ステップ 3 のコード内の rule_parameters キーと一致する必要があります。

      • ルールを作成、変更、または再評価すると、Cloud Config は指定されたタイプのすべてのリソースの設定を Function Compute に送信し、評価を実行します。

    7. リソース範囲の設定 ページで、Resource Type[ECS Instance] に設定し、Next をクリックします。

      説明
      • 無効な評価を避けるため、評価したいリソースタイプのみを選択してください。

      • このルールは、アカウント内で関連付けられたタイプのすべてのリソースを評価します。

    8. 修正を設定 ページで、Submit をクリックします。

      説明

      修正を設定 スイッチをオンにして、カスタム修復を設定できます。「カスタム修復の設定」をご参照ください。

  5. 検出結果を表示します。

    ルール の一覧には、ルールによって検出された非準拠リソースの数が表示されます。

    説明

    ルール表示です をクリックするか、Actions 列の Details をクリックして、最新の検出データリスト を表示します。

    ルールの Non-compliant Resources 列に No Data と表示されていても、アカウント内に一致するリソースが存在する場合、関数呼び出しまたは評価の送信に失敗した可能性があります。関数の [Invocation Log] タブで、Actions 列の [Request Log] をクリックしてトラブルシューティングを行います。「呼び出しログの表示」をご参照ください。

関連トピック