Amazon Config 规则的组成部分 - Amazon Config
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon Config 规则的组成部分

Amazon Config 规则会评估您的 Amazon 资源的配置设置。有两种类型的规则:Amazon Config 托管规则 Amazon Config 自定义规则

Amazon Config 托管规则是由创建的预定义的、可自定义的规则 Amazon Config。有关托管规则的列表,请参阅 Amazon Config 托管规则列表。

Amazon Config 自定义规则是您从头开始创建的规则。有两种方法可以创建 Amazon Config 自定义规则:使用 Lambda 函数(Amazon Lambda 开发者指南)和使用 Guard(Guard GitHub存储库)(一种 policy-as-code 语言)。 Amazon Config 使用创建的 Amazon Lambda 自定义规则称为Amazon Config 自定义 Lambda 规则,使用 Guard 创建的 Amazon Config 自定义规则称为Amazon Config 自定义策略规则。

本页讨论 Amazon Config 托管规则的元数据以及如何使用规则开发套件 (RDK) 和 Amazon Config 规则开发工具包库 (RDKLib) 使用 Python 编写 Amazon Config 自定义 Amazon Config 规则的最佳实践。有关如何创建 Amazon Config 自定义策略规则的演练,请参阅创建 Amazon Config 自定义策略规则。有关如何创建自定义 Lambda 规则的演练,请参阅 Amazon Config 创建 Amazon Config 自定义 Lamb da 规则。

Amazon Config 托管规则元数据

Amazon Config 托管规则可以包含以下可变元数据:

默认名称

defaultName 是规则实例在默认情况下将获得的名称。

描述

规则描述提供了规则评估内容的上下文。 Amazon Config 控制台具有 256 个字符的限制。作为最佳实践,规则描述应以“检查是否”开头,并包括对 NON_COMPLIANT 场景的描述。在规则描述中首次提及时,服务名称应以 Amazon 或 Amazon 开头。例如, Amazon CloudTrail 或者用 Amazon CloudWatch 代替 CloudTrail 或 CloudWatch 首次使用。服务名称可以在后续引用后使用缩写。

范围

范围决定了规则所针对的资源类型。有关支持的资源类型列表,请参阅支持的资源类型

compulsoryInputParameter详情

compulsoryInputParameter详细信息用于规则进行评估所需的参数。例如,access-keys-rotated 托管规则包含 maxAccessKeyAge 作为必要参数。如果为必要参数,则不会被标记为(可选)。必须指定每个参数的类型。类型可以是 “字符串”、“整数”、“双精度”、“CSV”、“布尔值” 和 “StringMap” 之一。

optionalInputParameter详情

optionalInputParameter详细信息用于规则评估时可选的参数。例如,elasticsearch-logs-to-cloudwatch 托管规则包含 logTypes 作为可选参数。必须指定每个参数的类型。类型可以是 “字符串”、“整数”、“双精度”、“CSV”、“布尔值” 和 “StringMap” 之一。

supportedEvaluationModes

supportedEvaluationModes 决定何时对资源进行评估,无论是在部署资源之前,还是在部署资源之后。

DETECTIVE 用于评估已经部署的资源。这允许您评估现有资源的配置设置。PROACTIVE 用于在资源部署之前对其进行评估。

这使您可以评估一组资源属性(如果用于定义 Amazon 资源)是合规还是不合规,因为您所在地区的账户中有一组主动规则。

您可以指定 to supportedEvaluationModes DETECTIVE PROACTIVE、或两者兼DETECTIVE而有之PROACTIVE。必须指定评估模式,且此字段不能为空。

有关更多信息,请参阅评估模式。有关支持主动评估的托管规则列表,请参阅按评估模式列出的 Amazon Config 托管规则列表。

注意

主动规则不会修复标记为 NON_COMPLIANT 的资源,也不会阻止部署这些资源。

Amazon Config 自定义规则结构

本节包含有关使用 Amazon Config 规则开发套件 (RDK) 和 Amazon Config 规则开发套件库 (rdkLib) 的信息。有关 RDK 或 RDKLib 的更多信息,请参阅和存储库。aws-config-rdk aws-config-rdklib GitHub

写入规则

  1. 按照安装 Amazon CLI 中的步骤进行操作。

  2. 按照 “使用控制台Amazon Config 进行设置” 或 “使用控制台 Amazon Config进行设置” 中的步骤进行操作 Amazon CLI。有关支持 Amazon 区域的信息,请从Amazon 区域服务列表中选择您的区域。 Amazon Config

  3. 使用推荐的 pip 方法安装 RDK:

    pip install rdk
    注意

    在使用之前,请确保 pip 已安装在您的计算机上。

  4. 使用推荐的 pip 方法安装 RDKLib:

    pip install rdklib
    注意

    在使用之前,请确保 pip 已安装在您的计算机上。

  1. 要创建通过更改指定资源类型触发的规则,请运行以下命令:

    rdk create YOUR_RULE_NAME --runtime python3.6-lib --resource-types AWS::Resource::Type

    以下示例将创建一个通过更改 AWS::IAM::User 资源类型触发的规则:

    rdk create MFA_ENABLED_RULE --runtime python3.6-lib --resource-types AWS::IAM::User

    您可将以下标记与 rdk create 命令一起用于变更触发的规则:

    rdk create RULE_NAME --runtime pythonX.X-lib // Python runtime version --input-parameters REQUIRED_PARAMETERS // Parameters that are required for a rule to do its evaluation --optional-parameters OPTIONAL_PARAMETERS // Parameters that are optional for a rule to do its evaluation --resource-types AWS::Resource::Type // Resource type(s) that the rule targets
    注意

    要使用 RDKLib,必须将规则的运行时设置为 python3.6-lib

    运行 rdk create 后,您应该会看到一个带有规则名称的新目录,里面有 3 个文件:

    • RULE_NAME.py - 存储规则逻辑的 Python 文件


    • RULE_NAME_test.py - 存储规则的单元测试的 Python 文件

    • parameters.json - RDK 部署设置的 JSON 文件

  2. 下一步是编写规则逻辑。您只需编辑 RULE_NAME.py 文件即可。如果打开 RULE_NAME.py 文件,会看到一个模板,可以在其中添加规则逻辑。以下是为 MFA_ENABLED_RULE 生成的模板:

    from rdklib import Evaluator, Evaluation, ConfigRule, ComplianceType APPLICABLE_RESOURCES = ['AWS::IAM::User'] class MFA_ENABLED_RULE(ConfigRule): def evaluate_change(self, event, client_factory, configuration_item, valid_rule_parameters): ############################### # Add your custom logic here. # ############################### return [Evaluation(ComplianceType.NOT_APPLICABLE)] #def evaluate_periodic(self, event, client_factory, valid_rule_parameters): # pass def evaluate_parameters(self, rule_parameters): valid_rule_parameters = rule_parameters return valid_rule_parameters ################################ # DO NOT MODIFY ANYTHING BELOW # ################################ def lambda_handler(event, context): my_rule = MFA_ENABLED_RULE() evaluator = Evaluator(my_rule, APPLICABLE_RESOURCES) return evaluator.handle(event, context)

    以下示例是具有规则逻辑的 MFA_ENABLED_RULE 模板的编辑后版本。此规则检查 IAM 用户是否已启用多重身份验证 (MFA)。如果 IAM 用户未启用 MFA,则该规则 NON_COMPLIANT。有关模板中提供的规则逻辑和方法的更多信息,请参阅规则逻辑

    from rdklib import ComplianceType, ConfigRule, Evaluation, Evaluator APPLICABLE_RESOURCES = ["AWS::IAM::User"] class MFA_ENABLED_RULE(ConfigRule): def evaluate_change(self, event, client_factory, configuration_item, valid_rule_parameters): username = configuration_item.get("resourceName") iam_client = client_factory.build_client("iam") response = iam_client.list_mfa_devices(UserName=username) # Scenario:1 IAM user has MFA enabled. if response["MFADevices"]: return [Evaluation(ComplianceType.COMPLIANT)] # Scenario:2 IAM user has MFA not enabled. annotation = "MFA needs to be enabled for user." return [Evaluation(ComplianceType.NON_COMPLIANT, annotation=annotation)] def evaluate_parameters(self, rule_parameters): valid_rule_parameters = rule_parameters return valid_rule_parameters ################################ # DO NOT MODIFY ANYTHING BELOW # ################################ def lambda_handler(event, context): my_rule = MFA_ENABLED_RULE() evaluator = Evaluator(my_rule, APPLICABLE_RESOURCES) return evaluator.handle(event, context)
  3. 下一步是使用控制台或在 Amazon 其中安装 RDKLib 层。 Amazon Amazon CLIRDKLib 设计为作为一个 Amazon Lambda 层工作。它允许您使用库,而无需将库包含在部署包中。

    • 要使用 Amazon 控制台安装 RDKLib 层,请执行以下步骤:

      1. 打开 Amazon Lambda 控制台,网址为 https://console.aws.amazon.com/lambda/

      2. 选择创建函数

      3. 创建函数页面上,选择浏览无服务器应用程序存储库,然后在搜索字段中输入 rdklib

      4. 查看函数详细信息,然后进行部署。您无需进行任何更改。

      5. 在左侧导航窗格中,选择页面。然后选择您刚创建的 Lambda 层,并复制 Lambda 层的 Amazon 资源名称 (ARN)。部署规则时,需要 Lambda 层的 ARN。

    • 要使用安装 RDKLib 层 Amazon CLI,请运行以下命令:

      1. 为 RDKlib 层创建更改集。

        aws serverlessrepo create-cloud-formation-change-set --application-id arn:aws:serverlessrepo:ap-southeast-1:711761543063:applications/rdklib --stack-name RDKlib-Layer

        返回以下输出:

        { "ApplicationId": "arn:aws:serverlessrepo:ap-southeast-1:711761543063:applications/rdklib", "ChangeSetId": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/a3d536322-585e-4ffd-9e2f-552c8b887d6f/ffe7ff5c-ab38-4ab9-b746-9c1617ca95c1", "SemanticVersion": "0.1.0", "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/serverlessrepo-RDKlib-Layer/365436a0-a58a-11ea-9b04-12ae8fb95b53" }
      2. 执行此更改集。您可以复制/粘贴完整的变更集 ARNChangeSetId (来自上一步中生成的输出),以自定义以下命令:

        aws cloudformation execute-change-set --change-set-name NAME_OF_THE_CHANGE_SET
      3. 返回作为已部署堆栈一部分的所有关联资源。

        aws cloudformation describe-stack-resources --stack-name serverlessrepo-RDKlib-Layer

        返回以下输出:

        { "StackResources": [ { "StackName": "serverlessrepo-RDKlib-Layer", "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/serverlessrepo-RDKlib-Layer/365436a0-a58a-11ea-9b04-12ae8fb95b53", "LogicalResourceId": "RdklibLayercf22317faf", "PhysicalResourceId": "arn:aws:lambda:us-east-1:123456789012:layer:rdklib-layer:1", "ResourceType": "AWS::Lambda::LayerVersion", "Timestamp": "2020-06-03T11:26:30.501Z", "ResourceStatus": "CREATE_COMPLETE", "DriftInformation": { "StackResourceDriftStatus": "NOT_CHECKED" } } ] }
      4. 复制上一步中生成的输出中 Lambda 层的 ARN。此 Lambda 层的 ARN 是 PhysicalResourceId

        "PhysicalResourceId": "arn:aws:lambda:us-east-1:123456789012:layer:rdklib-layer:1"
  4. 下一步是为 Lambda 函数提供一个要代入的角色。默认情况下,Lambda 函数会尝试代入 AWSServiceRoleForConfig 角色,但这是不允许的。您需要使用 AWS_ConfigRole 托管策略创建角色。该角色必须与 Amazon Config 具有信任关系,并且 /rdk/ 路径下的所有角色都应代入该角色。以下是信任策略的示例:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "config.amazonaws.com" }, "Action": "sts:AssumeRole" }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::account-ID:root" }, "Action": "sts:AssumeRole", "Condition": { "StringLike": { "aws:PrincipalArn": "arn:aws:iam::account-ID:role/rdk/*" } } } ] }

    使用此信任策略运行以下命令:

    aws iam create-role --role-name your-role-name --assume-role-policy-document file://trust-policy.json

    现在,运行以下命令来更新 ExecutionRoleName 的输入参数并提供角色名称:

    rdk modify YOUR_RULE_NAME --input-parameters '{"ExecutionRoleName":"your-role-name"}'

    您还可以使用 rdk modify 通过以下标记来更新变更触发的规则详细信息:

    rdk modify RULE_NAME --input-parameters REQUIRED_PARAMETERS // Parameters that are required for a rule to do its evaluation --optional-parameters OPTIONAL_PARAMETERS // Parameters that are optional for a rule to do its evaluation --resource-types AWS::Resource::Type // Resource type(s) that the rule targets
  5. 最后一步是部署规则。要部署规则,请使用步骤 3 中的 Lambda 层的 ARN 运行以下命令:

    rdk deploy YOUR_RULE_NAME --rdklib-layer-arn YOUR_RDKLIB_LAYER_ARN
  6. 现已部署此规则。您可以使用 Amazon Config 控制台检查规则是否按预期运行。

  1. 要为指定的资源类型创建定期触发的规则,请运行以下命令:

    rdk create YOUR_RULE_NAME --runtime python3.6-lib --resource-types AWS::Resource::Type --maximum-frequency EXECUTION_FREQUENCY

    以下示例将为 AWS::IAM::User 资源类型创建每 24 小时触发一次的规则:

    rdk create MFA_ENABLED_RULE --runtime python3.6-lib --resource-types AWS::IAM::User --maximum-frequency TwentyFour_Hours

    您可将以下标记与 rdk create 命令一起用于定期规则:

    rdk create RULE_NAME --runtime pythonX.X-lib // Python runtime version --input-parameters REQUIRED_PARAMETERS // Parameters that are required for a rule to do its evaluation --optional-parameters OPTIONAL_PARAMETERS // Parameters that are optional for a rule to do its evaluation --resource-types AWS::Resource::Type // Resource type(s) that the rule targets --maximum-frequency EXECUTION_FREQUENCY // How often the rule should be run on a periodic trigger.
 One of ['One_Hour','Three_Hours','Six_Hours','Twelve_Hours','TwentyFour_Hours']
    注意

    要使用 RDKLib,必须将规则的运行时设置为 python3.6-lib

    运行 rdk create 后,您应该会看到一个带有规则名称的新目录,里面有 3 个文件:

    • RULE_NAME.py - 存储规则逻辑的 Python 文件


    • RULE_NAME_test.py - 存储规则的单元测试的 Python 文件

    • parameters.json - RDK 部署设置的 JSON 文件

  2. 下一步是编写规则逻辑。您只需编辑 RULE_NAME.py 文件即可。如果打开 RULE_NAME.py 文件,会看到一个模板,可以在其中添加规则逻辑。以下是为 MFA_ENABLED_RULE 生成的模板:

    from rdklib import Evaluator, Evaluation, ConfigRule, ComplianceType APPLICABLE_RESOURCES = ['AWS::IAM::User'] class MFA_ENABLED_RULE(ConfigRule): def evaluate_change(self, event, client_factory, configuration_item, valid_rule_parameters): ############################### # Add your custom logic here. # ############################### return [Evaluation(ComplianceType.NOT_APPLICABLE)] #def evaluate_periodic(self, event, client_factory, valid_rule_parameters): # pass def evaluate_parameters(self, rule_parameters): valid_rule_parameters = rule_parameters return valid_rule_parameters ################################ # DO NOT MODIFY ANYTHING BELOW # ################################ def lambda_handler(event, context): my_rule = MFA_ENABLED_RULE() evaluator = Evaluator(my_rule, APPLICABLE_RESOURCES) return evaluator.handle(event, context)

    此模板默认为变更触发的规则。但需要在 evaluate_periodic 方法中添加您的逻辑。以下示例是具有规则逻辑的 MFA_ENABLED_RULE 模板的编辑后版本。此规则检查 IAM 用户是否已启用多重身份验证 (MFA)。如果 IAM 用户未启用 MFA,则该规则 NON_COMPLIANT。有关模板中提供的规则逻辑和方法的更多信息,请参阅规则逻辑

    from rdklib import ComplianceType, ConfigRule, Evaluation, Evaluator APPLICABLE_RESOURCES = ["AWS::IAM::User"] class MFA_ENABLED_RULE(ConfigRule):l def evaluate_periodic(self, event, client_factory, valid_rule_parameters): evaluations = [] iam_client = client_factory.build_client("iam") paginator = iam_client.get_paginator("list_users") response_iterator = paginator.paginate() for response in response_iterator: for user in response["Users"]: username = user["UserName"] response = iam_client.list_mfa_devices(UserName=username) # Scenario:1 IAM user has MFA enabled. if response["MFADevices"]: evaluations.append(Evaluation(ComplianceType.COMPLIANT, username, "AWS::IAM::User")) # Scenario:2 IAM user has MFA not enabled. if not response["MFADevices"]: annotation = "MFA needs to be enabled for user." evaluations.append( Evaluation(ComplianceType.NON_COMPLIANT, username, "AWS::IAM::User", annotation=annotation) ) return evaluations def evaluate_parameters(self, rule_parameters): valid_rule_parameters = rule_parameters return valid_rule_parameters ################################ # DO NOT MODIFY ANYTHING BELOW # ################################ def lambda_handler(event, context): my_rule = MFA_ENABLED_RULE() evaluator = Evaluator(my_rule, APPLICABLE_RESOURCES) return evaluator.handle(event, context)
  3. 下一步是使用控制台或在 Amazon 其中安装 RDKLib 层。 Amazon Amazon CLIRDKLib 设计为作为一个 Amazon Lambda 层工作。它允许您使用库,而无需将库包含在部署包中。

    • 要使用 Amazon 控制台安装 RDKLib 层,请执行以下步骤:

      1. 打开 Amazon Lambda 控制台,网址为 https://console.aws.amazon.com/lambda/

      2. 选择创建函数

      3. 创建函数页面上,选择浏览无服务器应用程序存储库,然后在搜索字段中输入 rdklib

      4. 查看函数详细信息,然后进行部署。您无需进行任何更改。

      5. 在左侧导航窗格中,选择页面。然后选择您刚创建的 Lambda 层,并复制 Lambda 层的 Amazon 资源名称 (ARN)。部署规则时,需要 Lambda 层的 ARN。

    • 要使用安装 RDKLib 层 Amazon CLI,请运行以下命令:

      1. 为 RDKlib 层创建更改集。

        aws serverlessrepo create-cloud-formation-change-set --application-id arn:aws:serverlessrepo:ap-southeast-1:711761543063:applications/rdklib --stack-name RDKlib-Layer

        返回以下输出:

        { "ApplicationId": "arn:aws:serverlessrepo:ap-southeast-1:711761543063:applications/rdklib", "ChangeSetId": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/a3d536322-585e-4ffd-9e2f-552c8b887d6f/ffe7ff5c-ab38-4ab9-b746-9c1617ca95c1", "SemanticVersion": "0.1.0", "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/serverlessrepo-RDKlib-Layer/365436a0-a58a-11ea-9b04-12ae8fb95b53" }
      2. 执行此更改集。您可以复制/粘贴完整的变更集 ARNChangeSetId (来自上一步中生成的输出),以自定义以下命令:

        aws cloudformation execute-change-set --change-set-name NAME_OF_THE_CHANGE_SET
      3. 返回作为已部署堆栈一部分的所有关联资源。

        aws cloudformation describe-stack-resources --stack-name serverlessrepo-RDKlib-Layer

        返回以下输出:

        { "StackResources": [ { "StackName": "serverlessrepo-RDKlib-Layer", "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/serverlessrepo-RDKlib-Layer/365436a0-a58a-11ea-9b04-12ae8fb95b53", "LogicalResourceId": "RdklibLayercf22317faf", "PhysicalResourceId": "arn:aws:lambda:us-east-1:123456789012:layer:rdklib-layer:1", "ResourceType": "AWS::Lambda::LayerVersion", "Timestamp": "2020-06-03T11:26:30.501Z", "ResourceStatus": "CREATE_COMPLETE", "DriftInformation": { "StackResourceDriftStatus": "NOT_CHECKED" } } ] }
      4. 复制上一步中生成的输出中 Lambda 层的 ARN。此 Lambda 层的 ARN 是 PhysicalResourceId

        "PhysicalResourceId": "arn:aws:lambda:us-east-1:123456789012:layer:rdklib-layer:1"
  4. 下一步是为 Lambda 函数提供一个要代入的角色。默认情况下,Lambda 函数会尝试代入 AWSServiceRoleForConfig 角色,但这是不允许的。您需要使用 AWS_ConfigRole 托管策略创建角色。该角色必须与 Amazon Config 具有信任关系,并且 /rdk/ 路径下的所有角色都应代入该角色。以下是信任策略的示例:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "config.amazonaws.com" }, "Action": "sts:AssumeRole" }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::account-ID:root" }, "Action": "sts:AssumeRole", "Condition": { "StringLike": { "aws:PrincipalArn": "arn:aws:iam::account-ID:role/rdk/*" } } } ] }

    使用此信任策略运行以下命令:

    aws iam create-role --role-name your-role-name --assume-role-policy-document file://trust-policy.json

    现在,运行以下命令来更新 ExecutionRoleName 的输入参数并提供角色名称:

    rdk modify YOUR_RULE_NAME --input-parameters '{"ExecutionRoleName":"your-role-name"}'

    您还可以使用 rdk modify 通过以下标记来更新定期规则详细信息:

    rdk modify RULE_NAME --input-parameters REQUIRED_PARAMETERS // Parameters that are required for a rule to do its evaluation --optional-parameters OPTIONAL_PARAMETERS // Parameters that are optional for a rule to do its evaluation --resource-types AWS::Resource::Type // Resource type(s) that the rule targets --maximum-frequency EXECUTION_FREQUENCY // How often the rule should be run on a periodic trigger.
 One of ['One_Hour','Three_Hours','Six_Hours','Twelve_Hours','TwentyFour_Hours']
  5. 最后一步是部署规则。要部署规则,请使用步骤 3 中的 Lambda 层的 ARN 运行以下命令:

    rdk deploy YOUR_RULE_NAME --rdklib-layer-arn YOUR_RDKLIB_LAYER_ARN
  6. 现已部署此规则。您可以使用 Amazon Config 控制台检查规则是否按预期运行。

规则逻辑

以下 Python 代码示例是使用 RDK 和 RDKLib 编写规则的模板。只应在 evaluate_parametersevaluate_changeevaluate_periodic 方法中进行更改,或者在需要时编写全新的函数来为逻辑提供帮助。有关使用 RDK 和 RDKlib 编写规则的先决条件,请参阅先决条件

from rdklib import Evaluator, Evaluation, ConfigRule, ComplianceType APPLICABLE_RESOURCES = ["AWS::Resource::Type"] # When you create a rule, the class name will be the name you give the rule when you create it instead of ConfigRule class ConfigRule (ConfigRule): def evaluate_parameters(self, rule_parameters): return rule_parameters def evaluate_change(self, event, client_factory, configuration_item, valid_rule_parameters): ############################### # Add your custom logic here. # ############################### def evaluate_periodic(self, event, client_factory, valid_rule_parameters): ############################### # Add your custom logic here. # ############################### ################################ # DO NOT MODIFY ANYTHING BELOW # ################################ def lambda_handler(event, context): my_rule = ConfigRule() evaluator = Evaluator(my_rule, APPLICABLE_RESOURCES) return evaluator.handle(event, context)
APPLICABLE_RESOURCES

APPLICABLE_RESOURCES 是规则所针对的资源类型。如果使用,它应该是一个全局变量,设置为规则所针对的资源类型。有关支持的资源类型列表,请参阅支持的资源类型

evaluate_parameters

描述

此方法用于检查规则的输入参数是否有效。以下是最佳实践:

  • 检查是否列出了正确数量的参数。

  • 检查参数名称是否正确。

  • 检查参数值的类型是否正确。

  • 如果参数是整数,请检查该参数是否在合理的范围内。

  • 如果该参数的可能选项数量有限,请检查该参数是否是这些选项之一。

  • 如果参数是字符串,请检查其长度是否合理,并删除该值前后的空格。

  • 检查是否正确处理了大小写。

  • 尽可能限制参数输入。例如,如果收到以逗号分隔的 ARN 列表,请确保唯一允许的字符是逗号和 ARN 支持的字符。

参数

rule_parameters 是规则输入参数字典。

返回语法

如果其中一个参数无效,可能会引发 InvalidParametersError 错误:

from rdklib import InvalidParametersError raise InvalidParametersError("Error message to display")

如果参数全部有效,则该方法应返回一个字典:

return valid_rule_parameters
evaluate_change

描述

此方法用于评估变更触发的规则的逻辑。

参数

event是由提供的 Amazon Lambda 事件 Amazon Config。此事件是一个 JSON 格式的文档,其中包含 Lambda 函数要操作的数据。有关示例,请参阅Amazon Config 规则的示例事件

client_factory是要用于规则的 ClientFactory 对象。该 ClientFactory 类创建或重复使用 boto3 客户端,该客户端为服务提供低级接口。 Amazon boto3 客户端方法与 Amazon 服务 API 映射,这意味着服务操作映射到同名的客户端方法并提供对相同操作参数的访问权限。有关可用服务的列表,请参阅 Boto3 Docs 文档中的可用服务

client_factory 的请求语法如下:

response = client_factory.build_client( service='string')

例如:

iam_client = client_factory.build_client("iam")
注意

必须输入 Amazon 服务的 boto3 名称。

configuration_item 是完整配置项的字典,即使超大。配置项目表示所支持 Amazon 资源的各种属性的 point-in-time 视图。有关内容的信息ConfigurationItem,请参阅 Amazon Config API 参考ConfigurationItem中的。

valid_rule_parametersevaluate_parameters() 方法的输出。

返回语法

此方法应返回以下一项或多项:

[Evaluation(ComplianceType.COMPLIANT)]
[Evaluation(ComplianceType.NON_COMPLIANT)]
[Evaluation(ComplianceType.NOT_APPLICABLE)]
注意

报告已删除资源的规则应返回 NOT_APPLICABLE 的评估结果,以避免不必要的规则评估。

对于所有不合规的评估,都应使用注释。例如:

[return [Evaluation(ComplianceType.NON_COMPLIANT, annotation="Explanation for why the rule is NON_COMPLIANT")]]
evaluate_periodic

描述

此方法用于评估定期规则。

参数

event是由提供的 Amazon Lambda 事件 Amazon Config。此事件是一个 JSON 格式的文档,其中包含 Lambda 函数要操作的数据。有关示例,请参阅Amazon Config 规则的示例事件

client_factory是要用于规则的 ClientFactory 对象。该 ClientFactory 类创建或重复使用 boto3 客户端,该客户端为服务提供低级接口。 Amazon boto3 客户端方法与 Amazon 服务 API 映射,这意味着服务操作映射到同名的客户端方法并提供对相同操作参数的访问权限。有关可用服务的列表,请参阅 Boto3 Docs 文档中的可用服务

client_factory 的请求语法如下:

response = client_factory.build_client( service='string')

例如:

iam_client = client_factory.build_client("iam")
注意

必须输入 Amazon 服务的 boto3 名称。

valid_rule_parametersevaluate_parameters() 方法的输出。

返回语法

此方法应返回以下一项或多项:

[Evaluation(ComplianceType.COMPLIANT)]
[Evaluation(ComplianceType.NON_COMPLIANT)]
[Evaluation(ComplianceType.NOT_APPLICABLE)]
注意

报告已删除资源的规则应返回 NOT_APPLICABLE 的评估结果,以避免不必要的规则评估。

对于所有不合规的评估,都应使用注释。例如:

[return [Evaluation(ComplianceType.NON_COMPLIANT, annotation="Explanation for why the rule is NON_COMPLIANT")]]
lambda_handler

描述

无需修改此方法。Lambda 处理程序用于处理事件。该函数在将event对象 Amazon Lambda 传递给handler方法时运行。有关更多信息,请参阅 Python 中的 Lambda 函数处理程序中的

参数

event是由提供的 Amazon Lambda 事件 Amazon Config。此事件是一个 JSON 格式的文档,其中包含 Lambda 函数要操作的数据。有关示例,请参阅Amazon Config 规则的示例事件

context 是在运行时由 Lambda 传递给函数的对象。此对象提供方法和属性,这些方法和属性提供函数运行时可以使用的信息和方法。请注意,在新版本的 Lambda 中,不再使用上下文。