このトピックでは、企業内のアカウント全体で非準拠のリソースを自動的に修復する方法について説明します。 このトピックでは、リソースディレクトリのクロスアカウントリソース管理機能と 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: 管理アカウントのロールを作成し、ロールにポリシーをアタッチする
RAM ロールを作成します。
左側のナビゲーションウィンドウで、[IDとアクセス管理 > ロール] を選択します。
[ロール] ページで、[ロールの作成] をクリックします。 [ロールの作成] ページで、パラメータを構成します。
[信頼できるエンティティの選択] パラメータを [alibaba Cloud アカウント] に設定し、[次へ] をクリックします。
[RAM ロールの名前] フィールドに RAM ロールの名前を入力します。 この例では、
ConfigCustomRemediationRole
と入力します。 [信頼できる Alibaba Cloud アカウントの選択] パラメータを [現在の Alibaba Cloud アカウント] に設定します。[OK] をクリックします。
[閉じる] をクリックします。
権限ポリシーを作成します。
左側のナビゲーションウィンドウで、[権限 > ポリシー] を選択します。
[ポリシーの作成] をクリックします。 [ポリシーの作成] ページが表示されます。
[JSON] タブで、次のポリシースクリプトを入力します。
// このロールを引き受けるエンティティは、CloudMonitor エージェントをインストールする権限を持ちます。 { "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "cms:InstallMonitoringAgent", "Resource": "*" }, { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "*" } ] }
[ポリシー情報の編集に進む] をクリックします。 表示されるページで、ポリシー名を入力します。 この例では、
ConfigCustomRemediationPolicy
と入力します。[保存] をクリックします。
ロールに権限を付与します。
左側のナビゲーションウィンドウで、[権限 > 権限の付与] を選択します。
[権限] ページで、[権限の付与] をクリックします。 [権限の付与] パネルで、作成したロールに権限を付与します。
[リソーススコープ] パラメータを [アカウント] に設定します。
[プリンシパル] セクションで、検索ボックスに
ConfigCustomRemediationRole
と入力し、表示されたロールをクリックして選択します。[ポリシー] セクションのドロップリストから [カスタムポリシー] を選択します。 検索ボックスに
ConfigCustomRemediationPolicy
と入力し、表示されたポリシーをクリックして選択します。[権限の付与] をクリックします。
信頼ポリシーをロールにアタッチします。
左側のナビゲーションウィンドウで、[IDとアクセス管理 > ロール] を選択します。
[ロール] ページで、
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 コンソールにログインします。
サービスを作成します。
左側のナビゲーションウィンドウで、[サービスと関数] をクリックします。
[サービス] ページで、[サービスの作成] をクリックします。 [サービスの作成] パネルが表示されます。
[名前] フィールドにサービス名を入力します。 この例では、
ConfigRemediationService
と入力します。[詳細オプションを表示] をクリックし、[サービスロール] パラメータを
ConfigCustomRemediationRole
に設定します。[OK] をクリックします。
カスタム修復関数を作成します。
サービス詳細ページの左側のナビゲーションウィンドウで、[関数] をクリックします。
[関数の作成] をクリックします。 [関数の作成] ページが表示されます。
[組み込みランタイムを使用] を選択します。
[基本設定] セクションで、関数名を入力します。 この例では、[関数名] パラメータを
ConfigRemediationFunction
に設定します。 [ハンドラタイプ] パラメータを [イベントハンドラ] に設定します。[コード] セクションで、[ランタイム] パラメータを [python 3.9] に、[コードのアップロード方法] パラメータを [サンプルコードを使用] に設定します。
[作成] をクリックして、関数詳細ページに移動します。
[コード] タブで、リソース修復関数の次のサンプルコードを入力します。
#!/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: ルールを作成し、カスタム修復を構成する
Cloud Config コンソールにログインします。
アカウントグループを作成し、アカウント A とアカウント B をアカウントグループに追加します。
詳細については、「アカウントグループを作成する」をご参照ください。
Cloud Config コンソールの左上隅で、前のステップで作成したアカウントグループに切り替えます。
ルールを作成します。 詳細については、「マネージドルールに基づいてルールを作成する」をご参照ください。
[作成方法の選択] ステップで、[マネージドルールに基づく] を選択し、ecs-instance-monitor-enabled ルールを検索して選択し、[次へ] をクリックします。
[基本プロパティの設定] ステップで、[ルール名]、[リスクレベル]、[トリガー]、[説明] パラメータを構成し、[次へ] をクリックします。
[有効範囲の設定] ステップで、デフォルト設定を保持し、[次へ] をクリックします。
[修復の設定] ステップで、[修復の設定] をオンにし、[呼び出しタイプ] パラメータを [自動修復] に設定し、[関数 ARN] セクションでステップ 3 で作成した Function Compute 関数を選択します。 [送信] をクリックします。
説明カスタム修復関数をテストしている場合は、[呼び出しタイプ] パラメータを [手動修復] に設定して、関数を監視およびデバッグできます。 関数がテストに合格したら、[呼び出しタイプ] パラメータを [自動修復] に設定できます。
ステップ 5: 自動修復を実装し、修復結果を確認する
[ルール] ページで、管理するルールを見つけ、[修復テンプレート] 列の [修復の詳細] をクリックします。
[修復の詳細] タブで、[修復の詳細] の横にある [手動修復の実行] をクリックします。
[実行結果リスト] セクションで、修復結果を確認できます。 リソースが修復に失敗した理由も表示できます。
説明[修復の詳細] タブで、[修復テンプレート] の横にある関数 ARN をクリックすると、Function Compute コンソールの修復関数の [コード] タブに移動します。