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

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

的组成部分Amazon Config规则

Amazon Config规则将评估您的配置设置Amazon资源。有两种类型的规则:Amazon Config托管策略Amazon Config自定义规则。托管规则是由创建的预定义的、可自定义的规则Amazon Config. 有关托管式规则的列表,请参阅名单Amazon Config托管式规则.

自定义规则是您可以使用 Guard 或 Guard 创建的规则Amazon Lambda函数。警卫 (警卫 GitHub存储库) 是一个 policy-as-code 允许您编写由以下机构强制执行的策略的语言Amazon Config自定义策略规则。Amazon Lambda使用您上传的自定义代码来评估自定义规则。它由事件源向其发布的事件调用,Amazon Config在启动自定义规则时调用。

本页讨论了规则定义的结构以及如何使用 Python 编写规则的最佳实践Amazon Config规则开发套件 (RDK) 和Amazon Config规则开发套件库 (rdkLib)。查看演示如何创建的演练Amazon Config自定义策略规则,请参阅创建Amazon Config自定义策略规则. 查看演示如何创建的演练Amazon Config自定义 Lambda 规则,请参阅创建Amazon Config自定义 Lambda 规则.

规则定义

Amazon Config规则定义包含以下字段:

  • 标识符

  • 默认名称

  • description

  • 范围

  • Source

  • compulsoryInputParameter详细信息

  • optionalInputParameter详细信息

  • 标签

以下 JSON 示例显示了的规则定义codeploy-ec2-minimum-healthy-hosts-configured托管规则。

{ "identifier": "CODEDEPLOY_EC2_MINIMUM_HEALTHY_HOSTS_CONFIGURED", "defaultName": "codedeploy-ec2-minimum-healthy-hosts-configured", "description": "Checks if the deployment group for EC2/On-Premises Compute Platform is configured with a minimum healthy hosts fleet percentage or host count greater than or equal to the input threshold. The rule is NON_COMPLIANT if either is below the threshold.", "scope": { "resourceTypes": [ "AWS::CodeDeploy::DeploymentGroup" ] }, "sourceDetails": [ { "eventSource": "AWS_CONFIG", "messageType": "ConfigurationItemChangeNotification" }, { "eventSource": "AWS_CONFIG", "messageType": "OversizedConfigurationItemChangeNotification" } ], "compulsoryInputParameterDetails": {}, "optionalInputParameterDetails": { "minimumHealthyHostsFleetPercent": { "type": "int", "description": "Minimum percentage of healthy hosts fleet during deployment. Default value is set to 66 percent.", "defaultValue": "66" }, "minimumHealthyHostsHostCount": { "type": "int", "description": "Minimum number of healthy hosts in fleet during deployment. Default value is set to 1.", "defaultValue": "1" } }, "labels": [ "CodeDeploy" ] }

规则元数据

标识符

规则标识符充当 IDAmazon Config托管规则。规则标识符以 ALL_CAPS_WITH_UTHRESTLASTS 例如,CODEDEPLOY_EC2_MINIMUM_HEALTHY_HOSTS_CONFIGURED是规则标识符,codedeploy-ec2-minimum-healthy-hosts-configured是规则名称。规则标识符用于在以下情况下标识规则创建Amazon Config托管式规则 WithAmazon CloudFormation模板或者在打电话时PutConfigRuleAPI。

注意

对于某些规则,规则标识符与规则名称不同。例如,的规则标识符restricted-sshINCOMING_SSH_DISABLED.

默认名称

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

description

规则描述为规则评估的内容提供了上下文。这些区域有:Amazon Config控制台最多可包含 256 个字符。作为最佳实践,规则描述应带有 “Checks if”,并包括对 NON_COMPLIANT 场景的描述。服务名称应以完整开头编写Amazon或者在规则描述中首次提及的亚马逊。例如,Amazon CloudTrail或Amazon CloudWatch 而不是 CloudTrail 要么 CloudWatch 供首次使用。服务名称可以在后续引用后缩写。

范围

范围决定了规则所针对的资源类型。如果规则是变更触发的,或者既是变更触发的,又是周期性的,则这是必需的。对于定期规则,它是可选的。有关支持的资源类型列表,请参阅支持的资源类型

Source

SourceDetails 决定规则的触发器类型。ConfigurationItemChangeNotificationOversizedConfigurationItemChangeNotification用于变更触发的规则。当 Amazon Config 检测到资源的配置项变更时,会发送配置项通知。如果通知超过了亚马逊简单通知服务 (Amazon SNS) 允许的最大大小,则通知将包含配置项目的简短摘要。您可以在 s3 中指定的 S3 存储桶位置中查看完整的通知BucketLocation 字段中返回的子位置类型。

ScheduleNotification用于定期规则。如果定期评估规则和通过配置更改来评估规则,则可以使用所有三种类型的通知。有关更多信息,请参阅为指定触发器Amazon ConfigRule

compulsoryInputParameter详细信息

这些区域有: compulsoryInputParameter详细信息用于评估规则所需的参数。例如,access-keys-rotated托管规则包括maxAccessKeyAge作为必填参数。如果参数为必填参数,则不会将其标记为(可选)。对于每个参数,必须指定一个类型。类型可以是 “字符串”、“int”、“double”、“CSV”、“boolean” 和” 中的一种StringMap“。

optionalInputParameter详细信息

这些区域有: optionalInputParameter详细信息用于规则评估的可选参数。例如,codedeploy-ec2-minimum-healthy-hosts-configured托管规则包括minimumHealthyHostsFleetPercentminimumHealthyHostsHostCount作为可选参数。对于每个参数,必须指定一个类型。类型可以是 “字符串”、“int”、“double”、“CSV”、“boolean” 和” 中的一种StringMap“。

标签

标签可用于标记规则。例如,codedeploy-auto-rollback-monitor-enabled,codedeploy-ec2-minimum-healthy-hosts-configured,以及codedeploy-lambda-allatonce-traffic-shift-disabled托管规则都包含标签CodeDeploy.

规则结构

本部分包含有关使用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 Config支持,请从中选择您所在的地区Amazon区域服务清单.

  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,则该规则不合规。有关规则逻辑和模板中提供的方法的更多信息,请参阅规则逻辑.

    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. 下一步是在中安装 RDKLib 层Amazon要么用Amazon控制台或Amazon CLI. rdkLib 旨在作为Amazon Lambda层消息。它允许您使用库,而不必将库包含在部署程序包中。

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

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

      2. Select创建函数.

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

      4. 查看函数详情,然后进行部署。您不必进行任何更改。

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

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

      1. 为 RDKLIB-Layer 创建更改集。

        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. 执行变更集。您可以复制/粘贴完整的变更集 ARN (ChangeSetId 从上一步生成的输出中)自定义以下命令:

        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

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

    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,则该规则不合规。有关规则逻辑和模板中提供的方法的更多信息,请参阅规则逻辑.

    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. 下一步是在中安装 RDKLib 层Amazon要么用Amazon控制台或Amazon CLI. rdkLib 旨在作为Amazon Lambda层消息。它允许您使用库,而不必将库包含在部署程序包中。

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

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

      2. Select创建函数.

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

      4. 查看函数详情,然后进行部署。您不必进行任何更改。

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

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

      1. 为 RDKLIB-Layer 创建更改集。

        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. 执行变更集。您可以复制/粘贴完整的变更集 ARN (ChangeSetId 从上一步生成的输出中)自定义以下命令:

        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 和 rkdLib 编写规则的模板。你应该只在里面做修改evaluate_parameters,evaluate_change,以及evaluate_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)
APPLIABLE_RESOU

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

评估参数

描述

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

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

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

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

  • 如果参数是整数,请检查该参数是否在合理的界限之间。

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

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

  • 检查是否正确处理了区分大小写的问题。

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

参数

rule_parameters是规则的输入参数字典。

返回语法

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

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

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

return valid_rule_parameters
评估_更改

描述

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

参数

event是Amazon Lambda事件提供方Amazon Config. 它是 JSON 格式的文档,其中包含要运行的 Lambda 函数的数据。有关示例,请参阅示例事件Amazon ConfigRule.

client_factory是 ClientFactory 要用于规则的对象。这些区域有: ClientFactory 类创建或重用 boto3 客户端,它为Amazon服务。boto3 客户端方法映射为Amazon服务 API,这意味着服务操作映射到同名的客户端方法,并提供对相同操作参数的访问。有关可用服务的列表,请参阅可用服务在 Boto3 文档中。

的请求语法client_factory如下所示:

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

例如:

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

的 boto3 的名字Amazon服务是必需的。

configuration_item是完整配置物品的字典,即使超大也是如此。配置项目代表 point-in-time 受支持者的各种属性的视图Amazon资源。有关内容的信息ConfigurationItem,请参阅ConfigurationItem在里面Amazon ConfigAPI 参考。

valid_rule_parameters是输出evaluate_parameters()方法。

返回语法

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

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

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

[return [Evaluation(ComplianceType.NON_COMPLIANT, annotation="Explanation for why the rule is NON_COMPLIANT")]]
评估_定期

描述

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

参数

event是Amazon Lambda事件提供方Amazon Config. 它是 JSON 格式的文档,其中包含要运行的 Lambda 函数的数据。有关示例,请参阅示例事件Amazon ConfigRule.

client_factory是 ClientFactory 要用于规则的对象。这些区域有: ClientFactory 类创建或重用 boto3 客户端,它为Amazon服务。boto3 客户端方法映射为Amazon服务 API,这意味着服务操作映射到同名的客户端方法,并提供对相同操作参数的访问。有关可用服务的列表,请参阅可用服务在 Boto3 文档中。

的请求语法client_factory如下所示:

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

例如:

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

的 boto3 的名字Amazon服务是必需的。

valid_rule_parameters是输出evaluate_parameters()方法。

返回语法

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

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

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

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

描述

你应该不需要修改这个方法。lambda 处理程序用于处理事件。该函数在以下情况下运行Amazon Lambda通过event反对handler方法。有关更多信息,请参阅 Python 中的 Lambda 函数处理程序中的

参数

event是Amazon Lambda事件提供方Amazon Config. 它是 JSON 格式的文档,其中包含要运行的 Lambda 函数的数据。有关示例,请参阅示例事件Amazon ConfigRule.

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