当您选择从模板创建规则或自定义创建规则时,均可以设置自定义修正,通过函数计算FC修正不合规资源。当该条规则绑定的资源被判定为不合规时,可以执行修正,快速修正不合规资源。
前提条件
请确保您已开通函数计算FC。具体操作,请参见开通服务。
背景信息
本文以从模板选择规则模板运行中的ECS实例未绑定公网地址创建规则为例,为您介绍设置自定义修正和执行修正的方法。
规则模板运行中的ECS实例未绑定公网地址用于检测运行中的ECS实例是否直接绑定IPv4公网地址。如果ECS实例检测结果为“不合规”(即绑定公网IP地址),则批量停止有公网IP的ECS实例。
操作步骤
登录配置审计控制台。
(可选)在左上角选择目标账号组。
仅资源目录下的管理账号需要执行该操作。单个阿里云账号不涉及。
在左侧导航栏,选择
。在规则页面,单击新建规则。
在选择创建方式页面,先选择基于模板创建,再从模板中选择规则运行中的ECS实例未绑定公网地址,然后单击下一步。
在设置基本属性页面,各参数均保持默认值,单击下一步。
在设置生效范围页面,各参数均保持默认值,单击下一步。
在修正设置页面,打开设置修正开关,先选择自定义修正,再选择触发方式为手动触发,然后选择函数ARN,最后单击提交。
重要由于自动修正会根据您的预设参数自动修改不合规资源的配置信息,可能会影响业务的连续性,因此系统默认触发方式为手动触发,推荐您使用默认设置。
当您确保本次修正不会对业务造成影响时,可以选择触发方式为自动触发,当配置审计检测到不合规资源时,会自动执行修正。
单击前往创建新的函数,在函数计算控制台上创建服务和函数。具体操作,请参见快速创建函数。
创建函数时,函数类型选择事件函数,运行环境选择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 aliyunsdkcore.auth.credentials import AccessKeyCredential from aliyunsdkcore.auth.credentials import StsTokenCredential 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): """ Parse string to json object :param content: json string content :return: Json object """ 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("注意:开始停机操作{}{}".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:为配置审计触发的默认函数入口,即自定义修正触发时调用的函数。
handler
在新建函数时进行设置。get_resources_non_compliant
:解析不合规资源。remediation
:为自定义修正入口,可以根据您的检测需求设置。例如:规则模板“运行中的ECS实例未绑定公网地址”,如果检测结果为“不合规”(即绑定公网IP地址),则修正为停机操作。
手动执行修正。
在规则页面,单击目标规则对应修正模板列的修正详情。
在修正详情页签,单击修正详情正后方的执行手动修正。
在执行结果列表区域,您可以查看修正执行结果。对于修正失败的资源,您还可以查看失败原因。
说明在修正详情页签,单击修正模板正后方的函数ARN,进入函数计算控制台的目标函数的函数代码页签。
相关文档
在多账号场景下,函数代码及授权配置,请参见企业多账号场景下实现不合规资源自动修正。