AWS::Config::ConfigRule - AWS CloudFormation

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 データ型に ConfigRuleNameConfigRuleId、または 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」を参照してください。

Arn

arn:aws:config:us-east-1:123456789012:config-rule/config-rule-a1bzhi などの AWS Config の Amazon リソースネーム (ARN)。

Compliance.Type

COMPLIANTNON_COMPLIANT などの AWS Config の準拠ステータス。

ConfigRuleId

config-rule-a1bzhi などの AWS Config ルールの ID

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