ルールを作成する際、Function Compute を使用して、[Non-compliant] として識別されたリソースを修正するためのカスタム修復を設定します。
前提条件
背景情報
このトピックでは、[ecs-running-instance-no-public-ip] マネージドルールを例として、カスタム修復の設定と実行方法を説明します。
[ecs-running-instance-no-public-ip] マネージドルールは、パブリック IPv4 アドレスを持つ実行中の Elastic Compute Service (ECS) インスタンスを非準拠として識別します。 修復では、これらのインスタンスを停止します。
操作手順
Cloud Configコンソールにログインします。
オプションです。 左上隅で、アカウントグループを選択します。
この操作は、リソースディレクトリの管理アカウントを使用している場合にのみ必要です。 それ以外の場合は、操作を実行する必要はありません。
左側のナビゲーションウィンドウで、 を選択します。
-
ルール ページで、 Create Rule をクリックします。
-
作成方法の選択 ページで、 テンプレートに基づく を選択し、テンプレートから [ecs-running-instance-no-public-ip] ルールを選択し、 Next をクリックします。
-
基本プロパティの設定 ページで、デフォルトのパラメーター設定のまま、 Next をクリックします。
-
リソース範囲の設定 ページで、デフォルトのパラメーター設定のまま、 Next をクリックします。
-
修正を設定 ページで、 修正を設定 スイッチをオンにし、 カスタム修正 を選択し、 トリガモード を 手動トリガ に設定し、 関数ですARN を選択してから、 Submit をクリックします。
重要[呼び出しタイプ] を [自動修復] に設定すると、Cloud Config は設定に基づいて不適合リソースの構成を自動的に修復します。 これは業務継続性に影響を与える可能性があります。 そのため、[呼び出しタイプ] はデフォルトで [手動修復] に設定されています。 デフォルト設定を保持することをお勧めします。
修復がビジネスに影響を与えない場合は、[呼び出しタイプ] を [自動修復] に設定できます。 この場合、Cloud Config は設定に基づいて不適合リソースの構成を自動的に修復します。
Create New Function をクリックして、Function Compute コンソールでサービスと関数を作成します。 関数のクイック作成をご参照ください。
関数を作成する際、[関数タイプ] を [イベント関数] に、[ランタイム] を [python 3] に設定します。 必要に応じて他のパラメーターを設定します。 コード例:
#!/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.auth.credentials import AccessKeyCredential from aliyunsdkcore.auth.credentials import StsTokenCredential from aliyunsdkecs.request.v20140526.StopInstanceRequest import StopInstanceRequest from aliyunsdkkms.request.v20160120.DecryptRequest import DecryptRequest # -*- coding: utf-8 -*- import logging import json logger = logging.getLogger() 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('Parse content:{} to json error:{}.'.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' and config_rule_id == 'cr-f8a1626622af005d****': print(region_id, account_id, resource_id, resource_type, config_rule_id) stop_ecs_instance(context, region_id, resource_id) def stop_ecs_instance(context, resource_region_id, resource_id): logger.info("Stopping instance {}{}".format(resource_region_id, resource_id)) creds = context.credentials client = AcsClient(creds.access_key_id, creds.access_key_secret, region_id=resource_region_id) request = StopInstanceRequest() request.set_accept_format('json') request.set_InstanceId("i-hp3f6lofgrnml5mt****") request.set_StoppedMode("KeepCharging") request.add_query_param('SecurityToken', creds.security_token) response = client.do_action_with_exception(request) logger.info(response)説明最新のサンプルコード: aliyun-config-remediation.py
主要な関数:
-
handler :Cloud Config が修復をトリガーしたときに呼び出されるデフォルトのエントリポイントです。
handlerは、関数の作成時に設定されます。 -
get_resources_non_compliant:非準拠リソースをパースします。 -
remediation:カスタム修復ロジックのエントリポイントです。 コンプライアンス要件に基づいて設定します。 「ecs-running-instance-no-public-ip」ルールの場合、この関数はパブリック IP アドレスを持つインスタンスを停止します。
-
手動で修復を実行します。
-
ルール ページで、ターゲットルールを見つけ、 テンプレートの修正 列の 修正の詳細 をクリックします。
-
修正の詳細 タブで、 修正の詳細 の横にある Perform Manual Correction をクリックします。
実行結果リスト セクションには、修復結果と失敗の理由が表示されます。
説明修正の詳細 タブで、 テンプレートの修正 の横にある関数 ARN をクリックすると、Function Compute コンソールの 関数コード タブが開きます。
-
関連ドキュメント
マルチアカウント環境での関数コードと権限設定については、「Resource Directory を使用した、マルチアカウント環境での非準拠リソースのカスタム修復の実装」をご参照ください。