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

Cloud Config:非準拠リソースのクロスアカウントカスタム修復

最終更新日:Jun 24, 2026

Resource Directory のクロスアカウント管理機能と Cloud Config のアカウントグループ機能を組み合わせることで、複数のアカウントにまたがる非準拠リソースにカスタム修復を適用できます。

前提条件

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

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

    重要

    Function Compute の関数を使用すると、関数呼び出し回数、リソース使用量、およびアウトバウンドインターネットトラフィックに料金が発生します。詳細については、「課金の概要」をご参照ください。

背景情報

Cloud Config は、ルールを実行して非準拠のリソースを検出し、カスタム修復を適用して修正します。複数のアカウントにまたがる非準拠のリソースを修復するには、Resource Directory のマルチレベルのアカウントおよびリソース管理機能を使用します。次の例では、ECS インスタンスに CloudMonitor エージェントがインストールされているかを確認し、アカウントをまたいで非準拠のリソースを検出して自動修復する方法を示します。この例では、アカウント A (ID: 100931896542****) が Resource Directory の管理者権限を持っている (または Cloud Config の委任された管理者アカウントである) とし、アカウント B (ID: 178366182654****) が非準拠のリソースを含むメンバーアカウントであるとします。この手順では、アカウント A を使用してアカウント B の非準拠リソースを検出および修復する方法について説明します。

ステップ 1:管理アカウントのロール作成とポリシーのアタッチ

  1. Resource Access Management (RAM) コンソールにログインします。

  2. RAM ロールを作成します。

    1. 左側メニューで、[Identities] > [Roles] を選択します。

    2. ロールの作成 をクリックします。ロールの作成 パネルで、ロールのパラメーターを設定します。

      1. 信頼できるエンティティタイプの選択Alibaba Cloud アカウント を選択し、次へ をクリックします。

      2. ロール名 に、ConfigCustomRemediationRole などのロール名を入力します。信頼できる Alibaba Cloud アカウントを選択現在の Alibaba Cloud アカウント を選択します。

      3. OK をクリックします。

      4. シャットダウン をクリックします。

  3. 許可ポリシーを作成します。

    1. 左側メニューで、[Permissions] > [Policies] を選択します。

    2. ポリシーの作成 をクリックして、ポリシーの作成 ページに移動します。

      1. [JSON] タブで、次のポリシードキュメントを入力します。

        // このロールを引き受けたエンティティは、CloudMonitor エージェントをインストールできます。
        {
          "Version": "1",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": "cms:InstallMonitoringAgent",
              "Resource": "*"
            },
            {
              "Action": "sts:AssumeRole",
              "Effect": "Allow",
              "Resource": "*"
            }
          ]
        }
      2. 確認 をクリックし、ConfigCustomRemediationPolicy などのポリシー名を入力します。

      3. 保存 をクリックします。

  4. ロールに権限を付与します。

    1. 左側メニューで、[Permissions] > [Grants] を選択します。

    2. 権限の付与 をクリックします。表示されるパネルで、ロールに新しい権限を付与します。

      1. 権限付与の対象[Account] を選択します。

      2. 権限付与の対象 フィールドに ConfigCustomRemediationRole と入力し、結果からロールを選択します。

      3. ポリシーの選択 セクションで、カスタムポリシー タブをクリックします。検索ボックスに ConfigCustomRemediationPolicy と入力し、結果からポリシーを選択します。

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

  5. ロールに信頼ポリシーをアタッチします。

    1. 左側メニューで、[Identities] > [Roles] を選択します。

    2. [Roles] ページで、ConfigCustomRemediationRole を検索し、ロール名をクリックしてロールの詳細ページに移動します。

    3. 信頼ポリシーの管理 タブで 信頼ポリシーの編集 をクリックし、既存のポリシーを次の内容に置き換えます。

      // Function Compute サービスがロールを引き受けることを許可します。
      { 
        "Statement": [
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
              "RAM": [
                "acs:ram::100931896542****:root"
              ]
            }
          },
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
              "Service": [
                "fc.aliyuncs.com"
              ]
            }
          }
        ],
        "Version": "1"
      }
    4. 確認 をクリックします。

ステップ 2:メンバーアカウントのロール作成とポリシーのアタッチ

  1. RAM ロールを作成し、ロールに権限を付与します。

    詳細については、ステップ 1 の手順 1~4 をご参照ください。

  2. ロールに信頼ポリシーをアタッチします。

    詳細については、ステップ 1 の手順 5 をご参照ください。ポリシースクリプトを次のサンプルスクリプトに置き換えます。

    // アカウント A (ID: 100931896542****) がロールを引き受けることを許可します。
    {
      "Statement": [
        {
          "Action": "sts:AssumeRole",
          "Effect": "Allow",
          "Principal": {
            "RAM": [
              "acs:ram::178366182654****:root"
            ]
          }
        },
        {
          "Action": "sts:AssumeRole",
          "Effect": "Allow",
          "Principal": {
            "RAM": [
              "acs:ram::100931896542****:role/ConfigCustomRemediationRole"
            ]
          }
        }
      ],
      "Version": "1"
    }

ステップ 3:カスタム修復関数の作成

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

  2. 左側メニューで、関数 をクリックします。

    1. 関数の作成 をクリックします。関数の作成 パネルが表示されます。

    2. [Event Function] を選択します。

      1. 基本設定 セクションで、関数名ConfigRemediationService などの関数名を入力します。

      2. [Specifications][Instance Concurrency] はデフォルト値のままにします。

  3. 弾力性設定で、[Elastic Mode][Default mode: On-demand + Cold start] に設定します。

  4. 関数コード セクションで、[Runtime][Python 3.9] を、[Code Upload Method][Use Sample Code] を選択します。

  5. 作成 をクリックして、関数の詳細ページに移動します。

    1. 関数の詳細 タブで、リソース修復関数として次のコードを入力します。

      #!/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.request import CommonRequest
      from aliyunsdkcore.auth.credentials import StsTokenCredential
      from aliyunsdksts.request.v20150401.AssumeRoleRequest import AssumeRoleRequest
      import logging
      
      logger = logging.getLogger()
      
      # このサンプルコードは、ecs-instance-monitor-enabled ルールに基づいて非準拠のリソースを修復するために使用されます。ビジネス要件に応じて修復ロジックを変更できます。
      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('コンテンツ {} のJSONへのパースでエラーが発生しました: {}'.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':
              logger.info("処理中 account_id: {}, resource_id: {}, config_rule_id: {}".format(
                  account_id, resource_id, config_rule_id))
              install_monitoring_agent(context, account_id, region_id, resource_id)
      
      def install_monitoring_agent(context, account_id, resource_region_id, resource_id):
          logger.info("エージェントのインストールを開始 {}: {}".format(resource_region_id, resource_id))
      
          token = assume_role_and_get_token(context, account_id, resource_region_id)
          client = AcsClient(token['Credentials']['AccessKeyId'], token['Credentials']['AccessKeySecret'],
                             region_id=resource_region_id)
          request = CommonRequest()
          request.set_accept_format('json')
          request.set_domain(f'metrics.{resource_region_id}.aliyuncs.com')
          request.set_method('POST')
          request.set_protocol_type('https') # https | http
          request.set_version('2019-01-01')
          request.set_action_name('InstallMonitoringAgent')
          request.add_query_param('InstanceIds.1', resource_id)
          request.add_query_param('Force', "true")
          request.add_query_param('SecurityToken', token['Credentials']['SecurityToken'])
      
          response = client.do_action_with_exception(request)
          logger.info(response)
      
      # ロールを引き受けて、一時的な Security Token Service (STS) トークンを取得します。サンプルコードのロール名を、実際に使用するロールに置き換えてください。
      def assume_role_and_get_token(context, account_id, region_id):
          creds = context.credentials
          logger.info('assume_role_and_get_tokenを開始します。')
          credentials = StsTokenCredential(creds.access_key_id, creds.access_key_secret, creds.security_token)
          client = AcsClient(credential=credentials)
      
          request = AssumeRoleRequest()
          request.set_domain(f'sts-vpc.{region_id}.aliyuncs.com')
          request.set_accept_format('json')
      
          request.set_RoleArn(f'acs:ram::{account_id}:role/ConfigCustomRemediationRole')
          request.set_RoleSessionName("ConfigCustomRemediationRole")
          response = client.do_action_with_exception(request)
          logger.info('assume_role_and_get_tokenのレスポンス: {}.'.format(response))
      
          token = json.loads(response)
          logger.info('assume_role_and_get_token: {}、引き受けたロール: {}.'.format(context.credentials, token))
          return token
  6. [Deploy Code] をクリックします。

ステップ 4:ルールの作成とカスタム修復の設定

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

  2. アカウントグループを作成し、アカウント A とアカウント B をアカウントグループに追加します。

    詳細については、「アカウントグループの作成」をご参照ください。

  3. Cloud Config コンソールの左上隅で、前の手順で作成したアカウントグループに切り替えます。

  4. ルールを作成します。詳細については、「マネージドルールに基づくルールの作成」をご参照ください。

    1. 作成方法の選択 ページで、テンプレートに基づく を選択します。実行中の ECS インスタンスに CloudMonitor エージェントがインストールされているかどうかをチェックするルールを検索して選択し、次へ をクリックします。

    2. 基本プロパティの設定 ページで、ルール名脅威レベルトリガーメカニズム、および 説明 を指定します。その後、次へ をクリックします。

    3. リソース範囲の設定 ページで、デフォルト設定のまま 次へ をクリックします。

    4. 修正の設定 ページで、修正の設定 スイッチをオンにします。カスタム修正 を選択します。トリガモード自動トリガ に設定し、ステップ 3 で作成した関数の [関数ですARN] を選択して、コミット をクリックします。

      説明

      カスタム修復関数がまだテスト中の場合は、デバッグのために トリガモード手動トリガ に設定できます。テストが完了したら、トリガモード自動トリガ に切り替えることができます。

ステップ 5:自動修復の実装と修復結果の検証

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

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

    実行結果リスト セクションには、修復結果と失敗の理由が表示されます。

    説明

    修正の詳細 タブで、 テンプレートの修正 の横にある関数 ARN をクリックすると、Function Compute コンソールの 関数コード タブが開きます。

関連ドキュメント