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:管理アカウントのロール作成とポリシーのアタッチ
-
Resource Access Management (RAM) コンソールにログインします。
-
RAM ロールを作成します。
-
左側メニューで、[Identities] > [Roles] を選択します。
-
ロールの作成 をクリックします。ロールの作成 パネルで、ロールのパラメーターを設定します。
-
信頼できるエンティティタイプの選択 で Alibaba Cloud アカウント を選択し、次へ をクリックします。
-
ロール名 に、
ConfigCustomRemediationRoleなどのロール名を入力します。信頼できる Alibaba Cloud アカウントを選択 で 現在の Alibaba Cloud アカウント を選択します。 -
OK をクリックします。
-
シャットダウン をクリックします。
-
-
-
許可ポリシーを作成します。
-
左側メニューで、[Permissions] > [Policies] を選択します。
-
ポリシーの作成 をクリックして、ポリシーの作成 ページに移動します。
-
[JSON] タブで、次のポリシードキュメントを入力します。
// このロールを引き受けたエンティティは、CloudMonitor エージェントをインストールできます。 { "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "cms:InstallMonitoringAgent", "Resource": "*" }, { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "*" } ] } -
確認 をクリックし、
ConfigCustomRemediationPolicyなどのポリシー名を入力します。 -
保存 をクリックします。
-
-
-
ロールに権限を付与します。
-
左側メニューで、[Permissions] > [Grants] を選択します。
-
権限の付与 をクリックします。表示されるパネルで、ロールに新しい権限を付与します。
-
権限付与の対象 で [Account] を選択します。
-
権限付与の対象 フィールドに
ConfigCustomRemediationRoleと入力し、結果からロールを選択します。 -
ポリシーの選択 セクションで、カスタムポリシー タブをクリックします。検索ボックスに
ConfigCustomRemediationPolicyと入力し、結果からポリシーを選択します。 -
を選択して、 をクリックします。
-
-
-
ロールに信頼ポリシーをアタッチします。
-
左側メニューで、[Identities] > [Roles] を選択します。
-
[Roles] ページで、
ConfigCustomRemediationRoleを検索し、ロール名をクリックしてロールの詳細ページに移動します。 -
信頼ポリシーの管理 タブで 信頼ポリシーの編集 をクリックし、既存のポリシーを次の内容に置き換えます。
// 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" } -
確認 をクリックします。
-
ステップ 2:メンバーアカウントのロール作成とポリシーのアタッチ
-
RAM ロールを作成し、ロールに権限を付与します。
詳細については、ステップ 1 の手順 1~4 をご参照ください。
-
ロールに信頼ポリシーをアタッチします。
詳細については、ステップ 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:カスタム修復関数の作成
-
Function Compute コンソールにログインします。
-
左側メニューで、関数 をクリックします。
-
関数の作成 をクリックします。関数の作成 パネルが表示されます。
-
[Event Function] を選択します。
-
基本設定 セクションで、関数名 に
ConfigRemediationServiceなどの関数名を入力します。 -
[Specifications] と [Instance Concurrency] はデフォルト値のままにします。
-
-
-
弾力性設定で、[Elastic Mode] を [Default mode: On-demand + Cold start] に設定します。
-
関数コード セクションで、[Runtime] に [Python 3.9] を、[Code Upload Method] に [Use Sample Code] を選択します。
-
作成 をクリックして、関数の詳細ページに移動します。
-
関数の詳細 タブで、リソース修復関数として次のコードを入力します。
#!/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
-
-
[Deploy Code] をクリックします。
ステップ 4:ルールの作成とカスタム修復の設定
-
Cloud Config コンソールにログインします。
-
アカウントグループを作成し、アカウント A とアカウント B をアカウントグループに追加します。
詳細については、「アカウントグループの作成」をご参照ください。
-
Cloud Config コンソールの左上隅で、前の手順で作成したアカウントグループに切り替えます。
-
ルールを作成します。詳細については、「マネージドルールに基づくルールの作成」をご参照ください。
-
作成方法の選択 ページで、テンプレートに基づく を選択します。実行中の ECS インスタンスに CloudMonitor エージェントがインストールされているかどうかをチェックするルールを検索して選択し、次へ をクリックします。
-
基本プロパティの設定 ページで、ルール名、脅威レベル、トリガーメカニズム、および 説明 を指定します。その後、次へ をクリックします。
-
リソース範囲の設定 ページで、デフォルト設定のまま 次へ をクリックします。
-
修正の設定 ページで、修正の設定 スイッチをオンにします。カスタム修正 を選択します。トリガモード を 自動トリガ に設定し、ステップ 3 で作成した関数の [関数ですARN] を選択して、コミット をクリックします。
説明カスタム修復関数がまだテスト中の場合は、デバッグのために トリガモード を 手動トリガ に設定できます。テストが完了したら、トリガモード を 自動トリガ に切り替えることができます。
-
ステップ 5:自動修復の実装と修復結果の検証
-
ルール ページで、ターゲットルールを見つけ、 テンプレートの修正 列の 修正の詳細 をクリックします。
-
修正の詳細 タブで、 修正の詳細 の横にある 手動修正の実行 をクリックします。
実行結果リスト セクションには、修復結果と失敗の理由が表示されます。
説明修正の詳細 タブで、 テンプレートの修正 の横にある関数 ARN をクリックすると、Function Compute コンソールの 関数コード タブが開きます。