本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
AWS Config规则的组成部分
AWS Config规则会评估您的AWS资源的配置设置。有两种类型的规则:AWS Config托管规则和AWS Config自定义规则。
AWS Config 托管规则是由 AWS Config 创建的预定义、可自定义的规则。有关托管规则的列表,请参阅AWS Config托管规则列表。
AWS Config 自定义规则是您从头开始创建的规则。有两种创建AWS Config自定义规则的方法:使用 Lambda 函数(AWS Lambda开发者指南)和使用 Guard(Gu ard GitHub 存储库
本页讨论了规则定义的结构以及如何使用规则开发套件 (RDK) 和AWS Config规则开发套件库 (RDKlib) 使用 Python 编写AWS Config规则的最佳实践。有关显示如何创建AWS Config自定义策略规则的演练,请参阅创建AWS Config自定义策略规则。有关演示如何创建AWS Config自定义 Lambda 规则的演练,请参阅创建AWS Config自定义 Lambda 规则。
规则定义
AWS Config规则定义包含以下字段:
-
标识符
-
默认名称
-
description
-
范围
-
来源详情
-
compulsoryInputParameter细节
-
optionalInputParameter细节
-
标签
-
supportedEvaluationModes
以下 JSON 示例显示了elasticsearch-logs-to-cloudwatch托管规则的规则定义。
{ "identifier": "ELASTICSEARCH_LOGS_TO_CLOUDWATCH", "defaultName": "elasticsearch-logs-to-cloudwatch", "description": "Checks if Amazon OpenSearch Service domains are configured to send logs to Amazon CloudWatch Logs. The rule is COMPLIANT if a log is enabled for an Amazon ES domain. This rule is NON_COMPLIANT if logging is not configured." "scope": { "resourceTypes": [ "AWS::Elasticsearch::Domain" ] }, "sourceDetails": [ { "eventSource": "AWS_CONFIG", "messageType": "ConfigurationItemChangeNotification" }, { "eventSource": "AWS_CONFIG", "messageType": "OversizedConfigurationItemChangeNotification" } ], "compulsoryInputParameterDetails": {}, "optionalInputParameterDetails": { "logTypes": { "type": "CSV", "description": "Comma-separated list of logs that are enabled. Valid values are 'search', 'index', 'error'." } }, "labels": [ "Elasticsearch", "CloudWatch", "Logs" ], "supportedEvaluationModes": [ { "evaluationMode": "DETECTIVE" }, { "evaluationMode": "PROACTIVE" } ] }
规则元数据
- 标识符
-
规则标识符用作AWS Config托管规则的 ID。规则标识符以 ALL_CAPS_WITH_下划线编写。例如,
ELASTICSEARCH_LOGS_TO_CLOUDWATCH
是规则标识符,elasticsearch-logs-to-cloudwatch
是规则名称。规则标识符用于在使用AWS CloudFormation模板创建AWS Config托管规则或调用 PutConfigRuleAPI 时标识规则。注意
对于某些规则,规则标识符不同于规则名称。例如,的规则标识符
restricted-ssh
是INCOMING_SSH_DISABLED
。 - 默认名称
-
defaultName 是规则实例在默认情况下将获得的名称。
- description
-
规则描述提供了规则评估内容的上下文。AWS Config控制台的限制为 256 个字符。作为最佳实践,规则描述应以 “Checks if” 开头,并包括对 NON_COMPLANITE 场景的描述。在规则描述中首次提及时,服务名称应以AWS或 Amazon 开头的完整书写。例如,AWS CloudTrail或者用亚马逊 CloudWatch 代替 CloudTrail 或 CloudWatch 用于首次使用。在后续引用后,可以缩写服务名称。
- 范围
-
范围决定了规则的目标资源类型。有关支持的资源类型列表,请参阅支持的资源类型。
- 来源详情
-
SourceDetails 决定规则的触发器类型。有两种触发器类型:更改触发规则的配置更改和定期规则的定期更改。您还可以将规则配置为在所谓的混合规则中同时使用这两种触发类型。有关更多信息,请参阅触发器类型
ConfigurationItemChangeNotification
并OversizedConfigurationItemChangeNotification
用于变更触发的规则。当 AWS Config 检测到资源的配置项变更时,会发送配置项通知。如果通知超过亚马逊Simple Notification Service (Amazon SNS) 允许的最大大小,则通知将包含配置项目的简短摘要。您可以在 s3BucketLocation 字段中指定的 S3 存储桶位置中查看完整的通知。ScheduleNotification
用于定期规则。如果有既定期评估又通过配置更改进行评估的混合规则,则可以使用所有三种类型的通知。
- compulsoryInputParameter细节
-
compulsoryInputParameter详细信息用于规则进行评估所需的参数。例如,
access-keys-rotated
托管规则包含maxAccessKeyAge
为必填参数。如果参数为必填参数,则不会将其标记为(可选)。对于每个参数,必须指定类型。类型可以是 “字符串”、“整数”、“双精度”、“CSV”、“布尔值” 和 “StringMap” 中的一个。 - optionalInputParameter细节
-
optionalInputParameter详细信息用于规则进行评估的可选参数。例如,
elasticsearch-logs-to-cloudwatch
托管规则包括logTypes
作为可选参数。对于每个参数,必须指定类型。类型可以是 “字符串”、“整数”、“双精度”、“CSV”、“布尔值” 和 “StringMap” 中的一个。 - 标签
-
标签可用于标记规则。例如,
codedeploy-auto-rollback-monitor-enabled
codedeploy-ec2-minimum-healthy-hosts-configured
、和codedeploy-lambda-allatonce-traffic-shift-disabled
托管规则都包含标签CodeDeploy
。您可以使用标签来帮助管理、搜索和筛选规则。 - supportedEvaluationModes
-
supportedEvaluationModes 决定何时对资源进行评估,可以在部署资源之前或部署资源之后。
DETECTIVE
用于评估已经部署的资源。这允许您评估现有资源的配置设置。PROACTIVE
用于在部署资源之前对其进行评估。鉴于您所在地区的账户中有一组主动规则,这使您可以评估一组AWS资源属性(如果用于定义资源)是 “合规” 还是 “不合规”。
您可以指定 supportedEvaluationModes 到
DETECTIVE
PROACTIVE
、或同时指定DETECTIVE
和PROACTIVE
。必须指定评估模式,并且此字段不能保持为空。有关更多信息,请参阅评估模式。有关支持主动评估的托管规则列表,请参阅按评估模式划分的AWS Config托管规则列表。
注意
主动规则不会修复标记为 NON_COMPLANIE 的资源,也不会阻止其部署。
规则结构
本节包含有关使用AWS Config规则开发套件 (RDK) 和AWS Config规则开发套件库 (RDKlib) 的信息。有关 RDK 或 RDKlib 的更多信息,请参阅aws-config-rdk
写作规则
-
按照安装中的步骤进行操作AWS CLI。
-
按照 “使用控制台AWS Config进行设置” 或 “使用进行设置” 中的步骤AWS Config进行操作AWS CLI。有关支持AWS区域的信息,请从AWS区域服务列表
中选择您的区域。AWS Config -
使用 pip 推荐的方法安装 RDK:
pip install rdk
注意
在使用 pip 之前,请确保它已安装在您的计算机上。
-
使用 pip 推荐的方法安装 rdKlib:
pip install rdklib
注意
在使用 pip 之前,请确保它已安装在您的计算机上。
-
要创建由指定资源类型的更改触发的规则,请运行以下命令:
rdk create
YOUR_RULE_NAME
--runtime python3.6-lib --resource-typesAWS::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-parametersREQUIRED_PARAMETERS
// Parameters that are required for a rule to do its evaluation --optional-parametersOPTIONAL_PARAMETERS
// Parameters that are optional for a rule to do its evaluation --resource-typesAWS::Resource::Type
// Resource type(s) that the rule targets注意
要使用 rdKlib,必须将规则的运行时设置为
python3.6-lib
。运行后
rdk create
,你应该会看到一个包含规则名称的新目录,里面有 3 个文件:-
-存储规则逻辑的 Python 文件RULE_NAME
.py -
-存储规则单元测试的 Python 文件RULE_NAME
_test.py -
parameters.json
-用于 RDK 部署设置的 JSON 文件
-
-
下一步是编写规则逻辑。您只需要编辑
.py 文件。如果您打开RULE_NAME
.py 文件,您将看到一个可以在其中添加规则逻辑的模板。以下是为 MFA_ENABLED_RULE 生成的模板:RULE_NAME
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)
-
下一步是AWS使用AWS控制台或安装 rdKlib 层AWS CLI。rdKlib 专为用作AWS Lambda图层而设计。它允许您使用该库,而不必将库包含在部署程序包中。
-
要使用AWS控制台安装 rdKlib 层,请执行以下步骤:
打开 AWS Lambda 控制台,地址:https://console.aws.amazon.com/lambda/
。 -
选择创建函数。
-
在创建函数页面上,选择浏览无服务器应用程序存储库,然后在搜索字段中输入 rdklib。
-
查看函数的详细信息,然后进行部署。你不必进行任何更改。
-
在左侧导航窗格中,选择 Layers(层)。然后选择您刚刚创建的 Lambda 层并复制 LLambda 层的 Amazon 资源名称(ARN)。部署规则时,您将需要 Lambda 层的 ARN。
-
要使用 RdKlib 层安装 RdKlib 层AWS CLI,请运行以下命令:
-
为 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" }
-
执行变更集。您可以复制/粘贴完整的变更集 ARN(ChangeSetId 来自上一步中生成的输出)以自定义以下命令:
aws cloudformation execute-change-set --change-set-name
NAME_OF_THE_CHANGE_SET
-
返回作为已部署堆栈一部分的所有相关资源。
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" } } ] }
-
从上一步骤中生成的输出中复制 Lambda 层的 ARN。Lambda 层的 ARN 是
PhysicalResourceId
。"PhysicalResourceId": "arn:aws:lambda:us-east-1:123456789012:layer:rdklib-layer:1"
-
-
-
下一步是为 Lambda 函数提供一个要代入的角色。默认情况下,Lambda 函数尝试代入该
AWSServiceRoleForConfig
角色,这是不允许的。您需要使用AWS_ConfigRole
托管策略创建角色。该角色必须与角色建立信任关系,AWS 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-parametersREQUIRED_PARAMETERS
// Parameters that are required for a rule to do its evaluation --optional-parametersOPTIONAL_PARAMETERS
// Parameters that are optional for a rule to do its evaluation --resource-typesAWS::Resource::Type
// Resource type(s) that the rule targets -
最后一步是部署您的规则。要部署您的规则,请使用步骤 3 中的 Lambda 层的 ARN 运行以下命令:
rdk deploy
YOUR_RULE_NAME
--rdklib-layer-arnYOUR_RDKLIB_LAYER_ARN
-
该规则现已部署。您可以使用AWS Config控制台检查规则是否按预期运行。
-
要为指定资源类型创建定期触发的规则,请运行以下命令:
rdk create
YOUR_RULE_NAME
--runtime python3.6-lib --resource-typesAWS::Resource::Type
--maximum-frequencyEXECUTION_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-parametersREQUIRED_PARAMETERS
// Parameters that are required for a rule to do its evaluation --optional-parametersOPTIONAL_PARAMETERS
// Parameters that are optional for a rule to do its evaluation --resource-typesAWS::Resource::Type
// Resource type(s) that the rule targets --maximum-frequencyEXECUTION_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 个文件:-
-存储规则逻辑的 Python 文件RULE_NAME
.py -
-存储规则单元测试的 Python 文件RULE_NAME
_test.py -
parameters.json
-用于 RDK 部署设置的 JSON 文件
-
-
下一步是编写规则逻辑。您只需要编辑
.py 文件。如果您打开RULE_NAME
.py 文件,您将看到一个可以在其中添加规则逻辑的模板。以下是为 MFA_ENABLED_RULE 生成的模板:RULE_NAME
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)
-
下一步是AWS使用AWS控制台或安装 rdKlib 层AWS CLI。rdKlib 专为用作AWS Lambda图层而设计。它允许您使用该库,而不必将库包含在部署程序包中。
-
要使用AWS控制台安装 rdKlib 层,请执行以下步骤:
打开 AWS Lambda 控制台,地址:https://console.aws.amazon.com/lambda/
。 -
选择创建函数。
-
在创建函数页面上,选择浏览无服务器应用程序存储库,然后在搜索字段中输入 rdklib。
-
查看函数的详细信息,然后进行部署。你不必进行任何更改。
-
在左侧导航窗格中,选择 Layers(层)。然后选择您刚刚创建的 Lambda 层并复制 LLambda 层的 Amazon 资源名称(ARN)。部署规则时,您将需要 Lambda 层的 ARN。
-
要使用 RdKlib 层安装 RdKlib 层AWS CLI,请运行以下命令:
-
为 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" }
-
执行变更集。您可以复制/粘贴完整的变更集 ARN(ChangeSetId 来自上一步中生成的输出)以自定义以下命令:
aws cloudformation execute-change-set --change-set-name
NAME_OF_THE_CHANGE_SET
-
返回作为已部署堆栈一部分的所有相关资源。
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" } } ] }
-
从上一步骤中生成的输出中复制 Lambda 层的 ARN。Lambda 层的 ARN 是
PhysicalResourceId
。"PhysicalResourceId": "arn:aws:lambda:us-east-1:123456789012:layer:rdklib-layer:1"
-
-
-
下一步是为 Lambda 函数提供一个要代入的角色。默认情况下,Lambda 函数尝试代入该
AWSServiceRoleForConfig
角色,这是不允许的。您需要使用AWS_ConfigRole
托管策略创建角色。该角色必须与角色建立信任关系,AWS 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-parametersREQUIRED_PARAMETERS
// Parameters that are required for a rule to do its evaluation --optional-parametersOPTIONAL_PARAMETERS
// Parameters that are optional for a rule to do its evaluation --resource-typesAWS::Resource::Type
// Resource type(s) that the rule targets --maximum-frequencyEXECUTION_FREQUENCY
// How often the rule should be run on a periodic trigger. One of ['One_Hour','Three_Hours','Six_Hours','Twelve_Hours','TwentyFour_Hours'] -
最后一步是部署您的规则。要部署您的规则,请使用步骤 3 中的 Lambda 层的 ARN 运行以下命令:
rdk deploy
YOUR_RULE_NAME
--rdklib-layer-arnYOUR_RDKLIB_LAYER_ARN
-
该规则现已部署。您可以使用AWS 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)
- 适用资源
-
APPLICABLE_RESOURCES
是规则所针对的资源类型。如果使用,则应为设置为规则目标资源类型的全局变量。有关支持的资源类型列表,请参阅支持的资源类型。 - 评估_参数
-
描述
此方法用于检查规则的输入参数是否有效。以下是最佳实践:
-
检查列出的参数数量是否正确。
-
检查参数名称是否正确。
-
检查参数值的类型是否正确。
-
如果参数是整数,请检查该参数是否在合理的范围之间。
-
如果参数的可能选项数量有限,请检查该参数是否是这些选项之一。
-
如果参数是字符串,请检查其长度是否合理,并修剪该值之前或之后的任何空格。
-
检查是否正确处理了任何区分大小写。
-
尽可能限制参数输入。例如,如果您收到的是以逗号分隔的 ARN 列表,请确保仅允许使用逗号和 ARN 支持的字符。
参数
rule_parameters
是规则的输入参数字典。返回语法
如果其中一个参数无效,则可能会引发
InvalidParametersError
错误:from rdklib import InvalidParametersError raise InvalidParametersError("Error message to display")
如果参数全部有效,则该方法应返回字典:
return valid_rule_parameters
-
- 评估_更改
-
描述
此方法用于评估变更触发规则的逻辑。
参数
event
是由提供AWS Lambda的事件AWS Config。它是 JSON 格式的文档,其中包含要操作的 Lambda 函数的数据。有关示例,请参阅AWS Config规则的示例事件。client_factory
是用于规则的 ClientFactory 对象。该 ClientFactory 类创建或重复使用 boto3 客户端,该客户端为AWS服务提供低级接口。boto3 客户端方法与AWS服务 API 映射,这意味着服务操作映射到同名的客户端方法并提供对相同操作参数的访问权限。有关可用服务的列表,请参阅 Boto3 Docs 文档中的可用服务。 的请求语法
client_factory
如下:response = client_factory.build_client( service='string')
例如:
iam_client = client_factory.build_client("iam")
注意
AWS服务的 boto3 名称是必填的。
configuration_item
是完整配置项的字典,即使过大也是如此。配置项表示所支持AWS资源的各种属性的 point-in-time 视图。有关内容的信息ConfigurationItem
,请参阅 ConfigurationItemAWS 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
是由提供AWS Lambda的事件AWS Config。它是 JSON 格式的文档,其中包含要操作的 Lambda 函数的数据。有关示例,请参阅AWS Config规则的示例事件。client_factory
是用于规则的 ClientFactory 对象。该 ClientFactory 类创建或重复使用 boto3 客户端,该客户端为AWS服务提供低级接口。boto3 客户端方法与AWS服务 API 映射,这意味着服务操作映射到同名的客户端方法并提供对相同操作参数的访问权限。有关可用服务的列表,请参阅 Boto3 Docs 文档中的可用服务。 的请求语法
client_factory
如下:response = client_factory.build_client( service='string')
例如:
iam_client = client_factory.build_client("iam")
注意
AWS服务的 boto3 名称是必填的。
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_handler
-
描述
您无需修改此方法。lambda 处理程序用于处理事件。该函数在将
event
对象AWS Lambda传递给handler
方法时运行。有关更多信息,请参阅 Python 中的 Lambda 函数处理程序中的。参数
event
是由提供AWS Lambda的事件AWS Config。它是 JSON 格式的文档,其中包含要操作的 Lambda 函数的数据。有关示例,请参阅AWS Config规则的示例事件。context
是 Lambda 在运行时将对象传递给函数。此对象提供的方法和属性包含函数在运行时可以使用的信息和方法。请注意,在较新版本的 Lambda 中,不再使用上下文。