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

Cloud Config:Function Compute に基づいてカスタムルールを作成する

最終更新日:Nov 14, 2025

このトピックでは、Function Compute 2.0 に基づいてカスタムルールを作成する方法について説明します。このトピックでは、Elastic Compute Service (ECS) インスタンスの CPU コア数を確認するための関数コードを開発します。

前提条件

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

説明

Function Compute の課金ルールの詳細については、「課金の概要」をご参照ください。

背景情報

カスタムルール関数の概念、使用シナリオ、および原則の詳細については、「カスタムルール関数の定義と実装」をご参照ください。

手順

このセクションでは、ECS インスタンスの CPU コア数を確認するための関数コードの記述方法について説明します。ECS インスタンスの CPU コア数が 2 以下の場合、評価結果は準拠となります。ECS インスタンスの CPU コア数が 2 より大きい場合、評価結果は非準拠となります。

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

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

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

    3. 上部のナビゲーションバーで、シンガポール (シンガポール) などのリージョンを選択します。

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

    5. [サービスの作成] パネルで、[名前] フィールドにサービス名を入力し、他のパラメーターはデフォルト値のままにします。

    6. [OK] をクリックします。

  2. 関数を作成します。

    1. ステップ 1 で作成したサービスの名前をクリックします。表示されたページで、[関数の作成] をクリックします。

    2. [関数の作成] ページで、[関数名] を設定し、[ハンドラタイプ][イベントハンドラ] に、[ランタイム][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'Print the input parameter of the function:{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":"Greater","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 文字列を 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 API を呼び出してコンプライアンス評価結果を返し、結果を Cloud Config に書き込みます。
          :param context: Function Compute コンテキスト。
          :param result_token: 結果トークン。
          :param evaluations: コンプライアンス評価結果。
          :return: None
          """
          # アカウントには、AliyunConfigFullAccess ポリシーがアタッチされた Function Compute のサービスロールを割り当てる必要があります。
          client = AcsClient(creds.access_key_id, creds.access_key_secret, region_id='cn-shanghai')
      
          # リクエストを作成し、パラメーターを設定します。Domain パラメーターを 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 with request: {}, response: {}.'.format(request, response))
          except Exception as e:
              logger.error('PutEvaluations error: %s' % e)
      説明

      前述のコードは、CPU コアの数を確認します。ルールのパラメーター名を取得するには、Cloud Config コンソールでリソース構成 (configuration) の主要なパラメーターを表示することをお勧めします。詳細については、「リソース情報を表示する」および「ステップ 6」をご参照ください。たとえば、ECS インスタンスの [コア構成情報] セクションで、[JSON の表示] をクリックします。CPU コア数用のパラメーターは Cpu です。CpuCount の目的の値を rule_parameters から取得します。

    2. [コード] タブの左上隅にある [デプロイ] をクリックします。

  4. Function Compute に基づいてカスタムルールを作成します。

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

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

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

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

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

    5. [作成方法の選択] ステップで、[Function Compute に基づく] を選択し、[関数 ARN] セクションで関数を指定してから、[次へ] をクリックします。

      `Function ARN` セクションでは、[リージョン] パラメーターには [Singapore] を選択し、[サービス] パラメーターには ステップ 1 で作成したサービスを選択し、次に `Function` パラメーターには ステップ 2 で作成した関数を選択します。

    6. On the Set Basic Properties page, enter a Rule Name. Click Add Rule Parameter. Set Rule Parameter to CpuCount and Desired Value to 2. Set Trigger to Configuration Change. Then, click Next.

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

      • ルールを作成、変更、またはルールに基づいてリソースを再監査すると、Cloud Config は、目的のリソースタイプのすべてのリソース設定を Function Compute に 1 つずつプッシュし、関数をトリガーしてリソースを評価します。

    7. [有効範囲の設定] ステップで、[すべてのリソースタイプ] リストから [Elastic Compute Service] を選択し、[次へ] をクリックします。

      説明
      • 評価したいリソースのタイプのみを選択することをお勧めします。すべてのリソースタイプを選択すると、無効な評価結果が生成されます。

      • リソースタイプを指定すると、Cloud Config はルールに基づいて指定されたタイプのすべてのリソースを評価します。

    8. [修復の設定] ステップで、[送信] をクリックします。

      説明

      [修復の設定] をオンにして、プロンプトに従ってルールのカスタム修復を設定できます。詳細については、「カスタム修復を設定する」をご参照ください。

  5. ECS インスタンスの CPU コア数に関するルールのチェック結果を表示します。

    [ルール] ページで、ルールによって検出された非準拠リソースの数を表示できます。

    説明

    [アクション] 列の [ルール ID] または [詳細] をクリックして、[最新の検出データリスト] を表示します。

    [非準拠リソース] 列の目的のルールに対して [データなし] が [ルール] ページに表示されても、ルールで指定されたリソースが現在のアカウントで利用可能であることを確認した場合、関数の呼び出しに失敗したか、Function Compute が評価結果を Cloud Config に送信できませんでした。表示したい関数の [ログ] タブで、[アクション] 列の [リクエストログ] をクリックして、失敗の原因を特定します。詳細については、「関数呼び出しログの表示」をご参照ください。

参考