
# 修正配置示例
本章节提供基于RFS私有模板和FunctionGraph函数执行修正的配置示例，帮助您快速了解合规规则修正配置功能的整体流程，以及如何使用此功能修正不合规资源，包含如下内容：
- [基于RFS私有模板执行修正]
- [基于FunctionGraph函数执行修正]
 #### 基于RFS私有模板执行修正
1. 使用预设策略"创建并启用CTS追踪器（cts-tracker-exists）"[添加预定义合规规则](https://support.huaweicloud.com/usermanual-rms/rms_05_0100.html)。
   
   由于当前账号的CTS追踪器已停用，该合规规则的合规评估结果为"不合规"。
   图1CTS追踪器已停用   
   ![](https://support.huaweicloud.com/usermanual-rms/zh-cn_image_0000002007818944.png "点击放大")
   图2合规评估结果   
   ![](https://support.huaweicloud.com/usermanual-rms/zh-cn_image_0000002043442457.png "点击放大")
   
   
2. [创建RFS私有模板](https://support.huaweicloud.com/usermanual-rms/rms_05_1002.html#rms_05_1002__section7698191410581)，并填入以下模板内容。
   
   该模板内容表示开启已关闭的CTS追踪器。
   ```
   {
    "resource": {
     "huaweicloud_cts_tracker": {
      "tracker": {
       "bucket_name": "${var.bucket_name}",
       "file_prefix": "${var.file_prefix}",
       "lts_enabled": "true"
      }
     }
    },
    "variable": {
     "bucket_name": {
      "description": "Specifies the OBS bucket to which traces will be transferred.",
      "type": "string",
      "default": ""
     },
     "file_prefix": {
      "description": "Specifies the file name prefix to mark trace files that need to be stored in an OBS bucket. The value contains 0 to 64 characters. Only letters, numbers, hyphens (-), underscores (_), and periods (.) are allowed.",
      "type": "string",
      "default": ""
     }
    },
    "terraform": {
     "required_providers": {
      "huaweicloud": {
       "source": "huawei.com/provider/huaweicloud",
       "version": "1.58.0"
      }
     }
    }
   }
   ```
   
   
3. [创建该合规规则的修正配置](https://support.huaweicloud.com/usermanual-rms/rms_05_1002.html#rms_05_1002__section0519161525811)，具体如下图所示。
   
   部分示例参数的说明：
   - 修正方法选择"自动修正"。
   
   - 修正模板选择上一步中创建的RFS私有模板，当修正方法选择"自动修正"时还需指定IAM权限委托，例如当前场景下RFS私有模板将创建CTS追踪器，则该委托的授权云服务为RFS，委托权限为创建CTS追踪器的权限（例如CTS FullAccess）。如何创建委托请参见[委托其他云服务管理资源](https://support.huaweicloud.com/usermanual-iam/iam_06_0004.html)。
   
   - 配置资源ID参数，Config会将该参数赋值为不合规资源的ID。在当前场景下"file_prefix"将会被赋值为账号ID，该值会传递给RFS服务用于创建资源栈执行RF语句。
   
   - 参数，指定您期望由Config传递给RFS私有模板的静态参数，Config会将这些参数原样传递给RFS服务用于创建资源栈执行RF语句。
   
   
   图3创建修正配置   
   ![](https://support.huaweicloud.com/usermanual-rms/zh-cn_image_0000002043887757.png "点击放大")
   
   
4. 修正配置创建完成后，重新[触发规则评估](https://support.huaweicloud.com/usermanual-rms/rms_05_0200.html)。
   
   当该合规规则评估完成且合规评估结果仍然为不合规时，Config将自动执行修正，调用RFS私有模板为当前账号开启CTS追踪器。
   如下图所示，不合规资源自动修正成功，当前账号的CTS追踪器已启用。
   图4CTS追踪器已启用   
   ![](https://support.huaweicloud.com/usermanual-rms/zh-cn_image_0000002044098217.png "点击放大")
   
   
 
 #### 基于FunctionGraph函数执行修正
1. 使用预设策略"VPC启用流日志（vpc-flow-logs-enabled）"[添加预定义合规规则](https://support.huaweicloud.com/usermanual-rms/rms_05_0100.html)。
   
   由于当前账号存在未开启流日志的VPC资源，该合规规则的合规评估结果为"不合规"。
   图5合规评估结果   
   ![](https://support.huaweicloud.com/usermanual-rms/zh-cn_image_0000002008306056.png "点击放大")
   
   
2. [创建FunctionGraph函数](https://support.huaweicloud.com/usermanual-rms/rms_05_1002.html#rms_05_1002__section194751215473)，并填入以下函数代码。
   
   该函数代码表示为指定的VPC资源开启流日志。
   使用以下函数示例时，您需要手动添加依赖包**huaweicloudsdkvpc** ，该依赖包并非在所有区域都可选，如果依赖包缺失，则需要手动导入依赖包，详见[配置依赖包](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_2119.html)。
   ```
   # -*- coding:utf-8 -*-
   import time
   import requests
   import random, string
   import http.client
   from huaweicloudsdkcore.exceptions.exceptions import ConnectionException
   from huaweicloudsdkcore.exceptions.exceptions import RequestTimeoutException
   from huaweicloudsdkcore.exceptions.exceptions import ServiceResponseException
   from huaweicloudsdkvpc.v2.region.vpc_region import VpcRegion
   from huaweicloudsdkvpc.v2.vpc_client import VpcClient
   from huaweicloudsdkvpc.v2.model import CreateFlowLogReq
   from huaweicloudsdkvpc.v2.model import CreateFlowLogReqBody
   from huaweicloudsdkvpc.v2.model import CreateFlowLogRequest
   from huaweicloudsdkcore.auth.credentials import BasicCredentials
   requests.packages.urllib3.disable_warnings()
   def get_random_string(length=6):
     letters_and_digits = string.ascii_letters + string.digits
     return ''.join(random.choice(letters_and_digits) for _ in range(length))
   def createFlowLog(context, project_id, request):
     auth = BasicCredentials(ak=context.getAccessKey(), sk=context.getSecretKey())\
       .with_project_id(project_id)
     client = VpcClient.new_builder() \
       .with_credentials(credentials=auth) \
       .with_region(region=VpcRegion.value_of(region_id="cn-north-4")) \
       .build()
     try:
       response = client.create_flow_log(request)
       return 200
     except ConnectionException as e:
       print("A connect timeout exception occurs while the vpc performs some operations, exception: ", e.error_msg)
       return e.status_code
     except RequestTimeoutException as e:
       print("A request timeout exception occurs while the vpc performs some operations, exception: ", e.error_msg)
       return e.status_code
     except ServiceResponseException as e:
       print("There is service error, exception: ", e.status_code, e.error_msg)
       return e.status_code
   def handler(event, context):
     project_id = event.get("project_id")
     request_body = CreateFlowLogRequest(CreateFlowLogReqBody(
         CreateFlowLogReq(
           name="auto" + get_random_string(4),
           description="to remediate vpc",
           resource_type="vpc",
           resource_id=event.get("noncompliant_resource_id", {}),
           traffic_type="all",
           log_group_id=event.get("log_group_id", {}),
           log_topic_id=event.get("log_topic_id", {}),
           index_enabled=False
         )
       ))
     for retry in range(5):
       status_code = createFlowLog(context, project_id, request_body)
       if status_code == http.client.TOO_MANY_REQUESTS:
         time.sleep(1)
       else:
         break
   ```
   
   
3. [创建该合规规则的修正配置](https://support.huaweicloud.com/usermanual-rms/rms_05_1002.html#rms_05_1002__section0519161525811)，具体如下图所示。
   
   部分示例参数的说明：
   - 修正方法选择"自动修正"。
   
   - 修正模板选择上一步中创建的FunctionGraph函数。
   
   - 配置资源ID参数，Config会将该参数赋值为不合规资源的ID。在当前场景下"noncompliant_resource_id"将会被赋值为不合规资源的ID，FunctionGraph函数中使用**resource_id=event.get("noncompliant_resource_id", {})**语句获取不合规资源ID，每个不合规资源均会传递一次资源ID。
   
   - 参数，指定您期望由Config传递给FunctionGraph函数的静态参数，该参数为不合规资源修正的具体规则参数值。例如在当前场景下此处配置日志组的ID（键：log_group_id；值：具体日志组ID值），在FGS函数中使用**log_group_id=event.get("log_group_id", {})** 语句获取日志组ID，执行修正时为不合规的VPC资源创建的流日志均将在此日志组内。
     当前示例中的参数说明如下：
     - **project_id：** 项目ID，如何获取请参见[获取项目ID](https://support.huaweicloud.com/api-iam/iam_17_0002.html)。
     
     - **log_group_id：** 日志组ID，如何获取请参见[管理日志组](https://support.huaweicloud.com/usermanual-lts/lts_04_0003.html#section5)。
     
     - **log_topic_id：** 日志流ID，如何获取请参见[管理日志流](https://support.huaweicloud.com/usermanual-lts/lts_04_0004.html#section5)。
      
   
   
   图6创建修正配置   
   ![](https://support.huaweicloud.com/usermanual-rms/zh-cn_image_0000002044266765.png "点击放大")
   
   
4. 修正配置创建完成后，重新[触发规则评估](https://support.huaweicloud.com/usermanual-rms/rms_05_0200.html)。
   
   当该合规规则评估完成且合规评估结果仍然为不合规时，Config将自动执行修正，调用FunctionGraph函数为每个不合规的VPC资源创建流日志。
   如下图所示，不合规的VPC资源在修正成功后已全部创建流日志。
   图7VPC资源已创建流日志   
   ![](https://support.huaweicloud.com/usermanual-rms/zh-cn_image_0000002008147768.png "点击放大")
   
   
 
