AWS::Config::ConfigRule
AWS リソースが目的の設定に準拠しているかどうかを評価する AWS Config ルールを指定します。
このアクションは、カスタム 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
を指定します。ConfigRuleArn
または ConfigRuleId
を指定しないでください。これらの値は AWS Config によって新しいルール用に生成されます。
以前に追加したルールを更新している場合は、このリクエストで使用する ConfigRule
データ型に ConfigRuleName
、ConfigRuleId
、または ConfigRuleArn
でルールを指定できます。
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 をルール名として使用します。詳細については、「Name タイプ」を参照してください。
必須: いいえ
タイプ: 文字列
最小:
1
最大:
128
パターン:
.*\S.*
Update requires: Replacement
Description
-
AWS Config ルールに入力した説明。
必須: いいえ
タイプ: 文字列
最小:
0
最大:
256
Update requires: No interruption
InputParameters
-
AWS Config ルールの Lambda 関数に渡される JSON 形式の文字列。
必須: いいえ
タイプ: 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
-
どのリソースがルールの評価をトリガーできるかを定義します。範囲には、1 つ以上のリソースタイプ、1 つのリソースタイプと 1 つのリソース ID の組み合わせ、またはタグキーと値の組み合わせを含めることができます。ルールの評価をトリガーできるリソースを制限するための範囲を指定します。範囲を指定しないと、レコーディンググループ内のリソースが変更されたときに評価がトリガーされます。
注記 スコープは空でもかまいません。
必須: いいえ
タイプ: スコープ
Update requires: No interruption
Source
-
ルール所有者 (AWS またはお客様)、ルール ID、および関数に AWS リソースを評価させる通知を提供します。
必須: はい
タイプ: ソース
Update requires: No interruption
戻り値
参照番号
mystack-MyConfigRule-12ABCFPXHV4OV
などの ルール名このリソースの論理 ID を組み込みの Ref
関数に渡すと、Ref
は次を返します: 。
For more information about using the Ref
function, see Ref.
Fn::GetAtt
Fn::GetAtt
組み込み関数は、このタイプの指定された属性の値を返します。以下には、利用可能な属性とサンプル戻り値のリストが示されます。
Fn::GetAtt
組み込み関数の使用方法の詳細については、「Fn::GetAtt」を参照してください。
例
Config ルール
次の例では、EC2 ボリュームリソースタイプに CostCenter タグがあるかどうか確認する、AWS によって管理されるルールを使用します。
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": "nodejs12.x", "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: nodejs12.x 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