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

Cloud Config:リソースディレクトリを使用して、企業内のアカウント全体で非準拠のリソースを自動的に修復する

最終更新日:Jan 18, 2025

このトピックでは、企業内のアカウント全体で非準拠のリソースを自動的に修復する方法について説明します。 このトピックでは、リソースディレクトリのクロスアカウントリソース管理機能と Cloud Config のアカウントグループ機能を使用します。

前提条件

  • リソースディレクトリが有効になっていること。 詳細については、「リソースディレクトリを有効にする」をご参照ください。

  • Function Compute がアクティブになっていること。 詳細については、「ステップ 1: Function Compute をアクティブにする」をご参照ください。

    重要

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

背景情報

Cloud Config は、ルールに基づいて非準拠のリソースを検出できます。 非準拠のリソースに対してカスタム修復を構成できます。 企業がアカウント全体で非準拠のリソースを修復する必要がある場合、企業はリソースディレクトリの組織構造を使用してアカウントとリソースを管理できます。 リソースディレクトリの詳細については、「リソースディレクトリの概要」をご参照ください。 この例では、[ecs-instance-monitor-enabled] ルールを使用して、アカウント全体で非準拠のリソースを検出し、自動的に修復します。 アカウント A(ID: 100931896542****)は、管理アカウントまたはリソースディレクトリの委任された管理者アカウントです。 アカウント B(ID: 178366182654****)とアカウント A は、同じリソースディレクトリのメンバーです。 アカウント B には、非準拠のリソースがあります。 次のセクションでは、アカウント A として Cloud Config にログインし、アカウント B の非準拠のリソースを検出して修復する方法について説明します。

ステップ 1: 管理アカウントのロールを作成し、ロールにポリシーをアタッチする

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

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

    1. 左側のナビゲーションウィンドウで、[IDとアクセス管理 > ロール] を選択します。

    2. [ロール] ページで、[ロールの作成] をクリックします。 [ロールの作成] ページで、パラメータを構成します。

      1. [信頼できるエンティティの選択] パラメータを [alibaba Cloud アカウント] に設定し、[次へ] をクリックします。

      2. [RAM ロールの名前] フィールドに RAM ロールの名前を入力します。 この例では、ConfigCustomRemediationRole と入力します。 [信頼できる Alibaba Cloud アカウントの選択] パラメータを [現在の Alibaba Cloud アカウント] に設定します。

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

      4. [閉じる] をクリックします。

  3. 権限ポリシーを作成します。

    1. 左側のナビゲーションウィンドウで、[権限 > ポリシー] を選択します。

    2. [ポリシーの作成] をクリックします。 [ポリシーの作成] ページが表示されます。

      1. [JSON] タブで、次のポリシースクリプトを入力します。

        // このロールを引き受けるエンティティは、CloudMonitor エージェントをインストールする権限を持ちます。
        {
          "Version": "1",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": "cms:InstallMonitoringAgent",
              "Resource": "*"
            },
            {
              "Action": "sts:AssumeRole",
              "Effect": "Allow",
              "Resource": "*"
            }
          ]
        }
      2. [ポリシー情報の編集に進む] をクリックします。 表示されるページで、ポリシー名を入力します。 この例では、ConfigCustomRemediationPolicy と入力します。

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

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

    1. 左側のナビゲーションウィンドウで、[権限 > 権限の付与] を選択します。

    2. [権限] ページで、[権限の付与] をクリックします。 [権限の付与] パネルで、作成したロールに権限を付与します。

      1. [リソーススコープ] パラメータを [アカウント] に設定します。

      2. [プリンシパル] セクションで、検索ボックスに ConfigCustomRemediationRole と入力し、表示されたロールをクリックして選択します。

      3. [ポリシー] セクションのドロップリストから [カスタムポリシー] を選択します。 検索ボックスに ConfigCustomRemediationPolicy と入力し、表示されたポリシーをクリックして選択します。

      4. [権限の付与] をクリックします。

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

    1. 左側のナビゲーションウィンドウで、[IDとアクセス管理 > ロール] を選択します。

    2. [ロール] ページで、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. [サービス] ページで、[サービスの作成] をクリックします。 [サービスの作成] パネルが表示されます。

      1. [名前] フィールドにサービス名を入力します。 この例では、ConfigRemediationService と入力します。

      2. [詳細オプションを表示] をクリックし、[サービスロール] パラメータを ConfigCustomRemediationRole に設定します。

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

  3. カスタム修復関数を作成します。

    1. サービス詳細ページの左側のナビゲーションウィンドウで、[関数] をクリックします。

    2. [関数の作成] をクリックします。 [関数の作成] ページが表示されます。

      1. [組み込みランタイムを使用] を選択します。

      2. [基本設定] セクションで、関数名を入力します。 この例では、[関数名] パラメータを ConfigRemediationFunction に設定します。 [ハンドラタイプ] パラメータを [イベントハンドラ] に設定します。

      3. [コード] セクションで、[ランタイム] パラメータを [python 3.9] に、[コードのアップロード方法] パラメータを [サンプルコードを使用] に設定します。

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

      5. [コード] タブで、リソース修復関数の次のサンプルコードを入力します。

        #!/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("アカウント ID:{}、リソース ID:{}、設定ルール 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)
        
        # ロールを引き受けて一時的なセキュリティトークンサービス (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

ステップ 4: ルールを作成し、カスタム修復を構成する

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

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

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

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

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

    1. [作成方法の選択] ステップで、[マネージドルールに基づく] を選択し、ecs-instance-monitor-enabled ルールを検索して選択し、[次へ] をクリックします。

    2. [基本プロパティの設定] ステップで、[ルール名][リスクレベル][トリガー][説明] パラメータを構成し、[次へ] をクリックします。

    3. [有効範囲の設定] ステップで、デフォルト設定を保持し、[次へ] をクリックします。

    4. [修復の設定] ステップで、[修復の設定] をオンにし、[呼び出しタイプ] パラメータを [自動修復] に設定し、[関数 ARN] セクションでステップ 3 で作成した Function Compute 関数を選択します。 [送信] をクリックします。

      説明

      カスタム修復関数をテストしている場合は、[呼び出しタイプ] パラメータを [手動修復] に設定して、関数を監視およびデバッグできます。 関数がテストに合格したら、[呼び出しタイプ] パラメータを [自動修復] に設定できます。

ステップ 5: 自動修復を実装し、修復結果を確認する

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

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

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

    説明

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

参考資料