AWS::Config::ConfigRule - AWS CloudFormation
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

AWS::Config::ConfigRule

指定一个 AWS Config 规则,该规则用于评估您的 AWS 资源是否符合所需配置。

您可以将此操作用于自定义 AWS Config 规则和 AWS 托管 Config 规则。自定义 AWS Config 规则是您制定并维护的规则。AWS 托管 Config 规则是由 AWS Config 提供的可自定义的预定义规则。

如果要添加新的自定义 AWS Config 规则,您必须先创建由该规则调用以评估资源的 AWS Lambda 函数。在使用 PutConfigRule 操作将规则添加到 AWS Config 时,您必须指定 AWS Lambda 向函数分配的 Amazon 资源名称 (ARN)。指定 SourceIdentifier 键的 ARN。此键是 Source 对象的一部分,而该对象是 ConfigRule 对象的一部分。

如果要添加 AWS 托管 Config 规则,请为 SourceIdentifier 键指定规则的标识符。要引用 AWS 托管 Config 规则标识符,请参阅关于 AWS 托管 Config 规则

对于您添加的任何新规则,请指定 ConfigRule 对象中的 ConfigRuleName。请勿指定 ConfigRuleArnConfigRuleId。AWS Config 为新规则生成这些值。

如果要更新之前添加的规则,请在此请求中使用的 ConfigRule 数据类型中按 ConfigRuleNameConfigRuleIdConfigRuleArn 指定规则。

AWS Config 支持的规则的最大数量为 150。

有关请求提高规则限制的信息,请参阅 AWS 一般参考指南 中的 AWS Config 限制

有关开发和使用 AWS Config 规则的更多信息,请参阅 AWS Config 开发人员指南中的使用 AWS Config 评估 AWS 资源配置

语法

要在 AWS CloudFormation 模板中声明此实体,请使用以下语法:

JSON

{ "Type" : "AWS::Config::ConfigRule", "Properties" : { "ConfigRuleName" : String, "Description" : String, "InputParameters" : Json, "MaximumExecutionFrequency" : String, "Scope" : Scope, "Source" : Source } }

YAML

Type: AWS::Config::ConfigRule Properties: ConfigRuleName: String Description: String InputParameters: Json MaximumExecutionFrequency: String Scope: Scope Source: Source

属性

ConfigRuleName

AWS Config 规则的名称。如果不指定名称,则 AWS CloudFormation 会生成一个唯一的物理 ID 并将该 ID 用于规则名称。有关更多信息,请参阅名称类型

必需:否

类型:字符串

最低1

最高128

模式.*\S.*

Update requires: Replacement

Description

您为 AWS Config 规则提供的描述。

必需:否

类型:字符串

最低0

最高256

Update requires: No interruption

InputParameters

一个采用 JSON 格式的字符串,此字符串将传递到 AWS Config 规则 Lambda 函数。

必需:否

类型:Json

最低1

最高1024

Update requires: No interruption

MaximumExecutionFrequency

AWS Config 运行规则评估的最大频率。在以下情况下,您可以为 MaximumExecutionFrequency 指定一个值:

  • 您使用的是按定期频率触发的 AWS 托管规则。

  • 您的自定义规则在 AWS Config 提供配置快照时触发。有关更多信息,请参阅 ConfigSnapshotDeliveryProperties

注意

默认情况下,每 24 小时评估一次具有周期性触发器的规则。要更改频率,请为 MaximumExecutionFrequency 参数指定有效值。

必需:否

类型:字符串

允许的值One_Hour | Six_Hours | Three_Hours | Twelve_Hours | TwentyFour_Hours

Update requires: No interruption

Scope

定义哪些资源可以触发规则的评估。范围可以包含一种或多种资源类型、一种资源类型和一个资源 ID 的组合或标签键和值的组合。指定一个范围以限制可触发规则评估的资源。如果不指定范围,则在记录组中的任何资源发生更改时将触发评估。

注意

范围可以为空。

必需:否

类型Scope

Update requires: No interruption

Source

提供规则拥有者(AWS 或客户)、规则标识符以及导致函数对您的 AWS 资源进行评估的通知。

必需:是

类型Source

Update requires: No interruption

返回值

Ref

在将此资源的逻辑 ID 传递给内部 Ref 函数时,Ref 返回规则名称,例如 mystack-MyConfigRule-12ABCFPXHV4OV

For more information about using the Ref function, see Ref.

Fn::GetAtt

Fn::GetAtt 内部函数返回此类型的一个指定属性的值。以下为可用属性和示例返回值。

有关使用 Fn::GetAtt 内部函数的更多信息,请参阅 Fn::GetAtt

Arn

AWS Config 规则的 Amazon 资源名称 (ARN),例如 arn:aws:config:us-east-1:123456789012:config-rule/config-rule-a1bzhi

Compliance.Type

AWS Config 规则的合规性状态,例如 COMPLIANTNON_COMPLIANT

ConfigRuleId

AWS Config 规则的 ID,例如 config-rule-a1bzhi

示例

Config 规则

以下示例使用一个 AWS 托管规则来检查 EC2 卷资源类型是否拥有 CostCenter 标签。

JSON

"ConfigRuleForVolumeTags": { "Type": "AWS::Config::ConfigRule", "Properties": { "InputParameters": {"tag1Key": "CostCenter"}, "Scope": { "ComplianceResourceTypes": ["AWS::EC2::Volume"] }, "Source": { "Owner": "AWS", "SourceIdentifier": "REQUIRED_TAGS" } } }

YAML

ConfigRuleForVolumeTags: Type: AWS::Config::ConfigRule Properties: InputParameters: tag1Key: CostCenter Scope: ComplianceResourceTypes: - "AWS::EC2::Volume" Source: Owner: AWS SourceIdentifier: "REQUIRED_TAGS"

使用 Lambda 函数的规则

以下示例创建了一个使用 Lambda 函数的自定义配置规则。此函数检查 EC2 卷是否将 AutoEnableIO 属性设为 true。请注意,配置规则依赖于 Lambda 策略,因此,规则仅在获得许可后才能调用函数。

JSON

"ConfigPermissionToCallLambda": { "Type": "AWS::Lambda::Permission", "Properties": { "FunctionName": {"Fn::GetAtt": ["VolumeAutoEnableIOComplianceCheck", "Arn"]}, "Action": "lambda:InvokeFunction", "Principal": "config.amazonaws.com" } }, "VolumeAutoEnableIOComplianceCheck": { "Type": "AWS::Lambda::Function", "Properties": { "Code": { "ZipFile": {"Fn::Join": ["\n", [ "var aws = require('aws-sdk');", "var config = new aws.ConfigService();", "var ec2 = new aws.EC2();", "exports.handler = function(event, context) {", " compliance = evaluateCompliance(event, function(compliance, event) {", " var configurationItem = JSON.parse(event.invokingEvent).configurationItem;", " var putEvaluationsRequest = {", " Evaluations: [{", " ComplianceResourceType: configurationItem.resourceType,", " ComplianceResourceId: configurationItem.resourceId,", " ComplianceType: compliance,", " OrderingTimestamp: configurationItem.configurationItemCaptureTime", " }],", " ResultToken: event.resultToken", " };", " config.putEvaluations(putEvaluationsRequest, function(err, data) {", " if (err) context.fail(err);", " else context.succeed(data);", " });", " });", "};", "function evaluateCompliance(event, doReturn) {", " var configurationItem = JSON.parse(event.invokingEvent).configurationItem;", " var status = configurationItem.configurationItemStatus;", " if (configurationItem.resourceType !== 'AWS::EC2::Volume' || event.eventLeftScope || (status !== 'OK' && status !== 'ResourceDiscovered'))", " doReturn('NOT_APPLICABLE', event);", " else ec2.describeVolumeAttribute({VolumeId: configurationItem.resourceId, Attribute: 'autoEnableIO'}, function(err, data) {", " if (err) context.fail(err);", " else if (data.AutoEnableIO.Value) doReturn('COMPLIANT', event);", " else doReturn('NON_COMPLIANT', event);", " });", "}" ]]} }, "Handler": "index.handler", "Runtime": "nodejs8.10", "Timeout": "30", "Role": {"Fn::GetAtt": ["LambdaExecutionRole", "Arn"]} } }, "ConfigRuleForVolumeAutoEnableIO": { "Type": "AWS::Config::ConfigRule", "Properties": { "ConfigRuleName": "ConfigRuleForVolumeAutoEnableIO", "Scope": { "ComplianceResourceId": {"Ref": "Ec2Volume"}, "ComplianceResourceTypes": ["AWS::EC2::Volume"] }, "Source": { "Owner": "CUSTOM_LAMBDA", "SourceDetails": [{ "EventSource": "aws.config", "MessageType": "ConfigurationItemChangeNotification" }], "SourceIdentifier": {"Fn::GetAtt": ["VolumeAutoEnableIOComplianceCheck", "Arn"]} } }, "DependsOn": "ConfigPermissionToCallLambda" }

YAML

ConfigPermissionToCallLambda: Type: AWS::Lambda::Permission Properties: FunctionName: Fn::GetAtt: - VolumeAutoEnableIOComplianceCheck - Arn Action: "lambda:InvokeFunction" Principal: "config.amazonaws.com" VolumeAutoEnableIOComplianceCheck: Type: AWS::Lambda::Function Properties: Code: ZipFile: !Sub | var aws = require('aws-sdk'); var config = new aws.ConfigService(); var ec2 = new aws.EC2(); exports.handler = function(event, context) { compliance = evaluateCompliance(event, function(compliance, event) { var configurationItem = JSON.parse(event.invokingEvent).configurationItem; var putEvaluationsRequest = { Evaluations: [{ ComplianceResourceType: configurationItem.resourceType, ComplianceResourceId: configurationItem.resourceId, ComplianceType: compliance, OrderingTimestamp: configurationItem.configurationItemCaptureTime }], ResultToken: event.resultToken }; config.putEvaluations(putEvaluationsRequest, function(err, data) { if (err) context.fail(err); else context.succeed(data); }); }); }; function evaluateCompliance(event, doReturn) { var configurationItem = JSON.parse(event.invokingEvent).configurationItem; var status = configurationItem.configurationItemStatus; if (configurationItem.resourceType !== 'AWS::EC2::Volume' || event.eventLeftScope || (status !== 'OK' && status !== 'ResourceDiscovered')) doReturn('NOT_APPLICABLE', event); else ec2.describeVolumeAttribute({VolumeId: configurationItem.resourceId, Attribute: 'autoEnableIO'}, function(err, data) { if (err) context.fail(err); else if (data.AutoEnableIO.Value) doReturn('COMPLIANT', event); else doReturn('NON_COMPLIANT', event); }); } Handler: "index.handler" Runtime: nodejs8.10 Timeout: 30 Role: Fn::GetAtt: - LambdaExecutionRole - Arn ConfigRuleForVolumeAutoEnableIO: Type: AWS::Config::ConfigRule Properties: ConfigRuleName: ConfigRuleForVolumeAutoEnableIO Scope: ComplianceResourceId: Ref: Ec2Volume ComplianceResourceTypes: - "AWS::EC2::Volume" Source: Owner: "CUSTOM_LAMBDA" SourceDetails: - EventSource: "aws.config" MessageType: "ConfigurationItemChangeNotification" SourceIdentifier: Fn::GetAtt: - VolumeAutoEnableIOComplianceCheck - Arn DependsOn: ConfigPermissionToCallLambda