[アップデート]AWS Configで特定のリソースタイプだけを記録から除外できるようになりました!

AWS Configで特定のリソースタイプだけを限定して、Configの記録から除外することができるようになりました!
2023.06.10

概要

AWS Configで特定のリソースタイプだけを限定して、Configの記録から除外することができるようになりました!今までAWS WAFなどでは、特定のルールのみ除外する設定はありましたが、AWS Configではサポートされていませんでした。今回のアップデートで除外設定が捗りそうです。

細かい設定方法は、以下のCLIの設定やドキュメントを確認することをおすすめします。従来のallSupportedオプションなどとは併用できないですが、recordingStrategyuseOnlyEXCLUSION_BY_RESOURCE_TYPESを指定することで、除外設定したリソースタイプ以外の全てを記録対象にできます。

なぜこの機能が嬉しいのか

AWS Configはリソースの構成変更を継続的に記録、評価できるサービスです。ただ、あまり好ましくない設計をしている場合特定のリソースタイプの記録が頻発してConfigのコストがシステム全体のコスト割合に比べて高めになってしまうことがありました。例えばVPC上でかなり頻繁にリソースを起動/削除を繰り返すような設計をしている場合、NetworkInterfaceが大量に記録されて想定より割高になる可能性があります。

記録が頻発しているリソースタイプは以下のアップデートで出たAWS ConfigのCloudWatch Metricsを見ることで確認することができます。Metricsで見たときに数値が高いものは、コスト高の原因の可能性があります。

上記でコスト高となっているリソースタイプを特定できた場合、原因となる設計を修正できれば一番正しい形で直すことができます。ただ設計変更ができない場合は運用面で1つ課題がありました。

特定のリソースタイプだけ除外する設定が従来はなかったので、除外したいリソースタイプ以外を全て PutConfigurationRecorder APIresourceTypesに記載する必要がありました。以下のリンク先を見て貰えばわかりますが、リソースタイプは2023年6月10日時点で297個あり、今後もサービス増加などに応じて増えていくのに追従していくことを考えると運用時の負荷も増え、アップデート漏れが発生する可能性も増えるため断念していました。

上記の面倒な運用が不要で、設計変更なしでもコスト削減には繋げることができます。注意点としては、SecruityHubで使われているリソースタイプを除外してしまうとおそらくSecurityHubのルール自体も動かなくなるので、注意して設定してください。また監査対応などがある場合、重要なリソースタイプの記録を消してしまうと確認ができなくなってしまうことも注意が必要です。

やってみた

実際にAWS Configの記録を除外してみます。今回はus-east-1で実行してみます。AWS CLIも最新版(aws-cli/2.11.27)にバージョンアップしました。

検証1:EC2を作ってリソースタイプの記録を確認

最初に以下のコマンドとファイルでAWS::EC2::NetworkInterfaceリソースタイプを除外してみます。

config-recorder-setting.json

{
  "allSupported": false,
  "includeGlobalResourceTypes": false,
  "exclusionByResourceTypes": {
    "resourceTypes": ["AWS::EC2::InternetGateway"]
  },
  "recordingStrategy": {
    "useOnly": "EXCLUSION_BY_RESOURCE_TYPES"
  }
}
aws configservice put-configuration-recorder \
  --configuration-recorder name=default,roleARN=arn:aws:iam::123456789012:role/hoge-role \
  --recording-group file://config-recorder-setting.json \    
  --profile hoge --region us-east-1

次にEC2を起動して、CLoudWatch Metricsでリソースの記録状況を確認します。するとAWS::EC2::NetworkInterfaceが記録されていないことが確認できます。

次に以下のファイルとコマンドで、リソースの記録を有効化してみます。

before-config-recorder-setting.json

{
  "allSupported": false,
  "includeGlobalResourceTypes": false,
  "resourceTypes": [
    "AWS::EC2::CustomerGateway",
    "AWS::EC2::EIP",
    "AWS::EC2::Host",
    "AWS::EC2::InternetGateway",
    "AWS::EC2::NetworkAcl",
    "AWS::EC2::RouteTable",
    "AWS::EC2::SecurityGroup",
    "AWS::EC2::Subnet",
    "AWS::CloudTrail::Trail",
    "AWS::EC2::VPC",
    "AWS::EC2::VPNConnection",
    "AWS::EC2::VPNGateway",
    "AWS::IAM::Group",
    "AWS::IAM::Policy",
    "AWS::IAM::Role",
    "AWS::IAM::User",
    "AWS::ACM::Certificate",
    "AWS::RDS::DBInstance",
    "AWS::RDS::DBSubnetGroup",
    "AWS::RDS::DBSecurityGroup",
    "AWS::RDS::EventSubscription",
    "AWS::ElasticLoadBalancingV2::LoadBalancer",
    "AWS::S3::Bucket",
    "AWS::Redshift::Cluster",
    "AWS::Redshift::ClusterParameterGroup",
    "AWS::Redshift::ClusterSecurityGroup",
    "AWS::Redshift::ClusterSubnetGroup",
    "AWS::Redshift::EventSubscription",
    "AWS::CloudWatch::Alarm",
    "AWS::CloudFormation::Stack"
  ]
}
aws configservice put-configuration-recorder \
  --configuration-recorder name=default,roleARN=arn:aws:iam::123456789012:role/hoge-role \
  --recording-group file://before-config-recorder-setting.json \    
  --profile hoge --region us-east-1

有効化後に新しいEC2を起動すると、以下のようにNetworkInterfaceが記録されるように戻ってることがわかります。

検証2:グローバルリソースが記録されないか確認

検証の2つ目としてincludeGlobalResourceTypesと今回の設定が併用できるのか確認します。recordingStrategyの部分のドキュメントを読んだだけだと、全てのリソースが記録されると書いてあるので念の為確認しました。

2023/6/16追記:追加で検証したところ検証に誤りがありました。グローバルリソースタイプに記録されない操作だったので、メトリクスに残っていませんでした。詳しくは後半をご確認ください。

If you set the useOnly field of RecordingStrategy to EXCLUSION_BY_RESOURCE_TYPES , Config records configuration changes for all supported resource types except the resource types that you specify as exemptions to exclude from being recorded in the resourceTypes field of ExclusionByResourceTypes .

put-configuration-recorder

以下のように検証1と同じように設定を行い、グローバルリソースとしてIAM Policyを作成してAWS::IAM::Policyが記録されないことを確認します。

config-recorder-setting.json

{
  "allSupported": false,
  "includeGlobalResourceTypes": false,
  "exclusionByResourceTypes": {
    "resourceTypes": ["AWS::EC2::InternetGateway"]
  },
  "recordingStrategy": {
    "useOnly": "EXCLUSION_BY_RESOURCE_TYPES"
  }
}

2023-06-10 00:10 UTC 頃に変更を加えて確認したところ、以下のようにリソースタイプの記録が残らなかったので問題なくグローバルリソースも除外できそうです。

1点注意なのは、includeGlobalResourceTypestrueとは併用できないので、グローバルリソースの記録は併用できません。なので、あまり使用しないリージョンなどでグローバルリソースの記録を別途有効化する方が良さそうです。

2023/6/16追加検証(グローバルリソースの記録について)

社内から以下の記述と検証結果が異なるのではという指摘があったので、追加で調査を実施します。

If you choose EXCLUSION_BY_RESOURCE_TYPES for the recording strategy, the exclusionByResourceTypes field will override other properties in the request.

For example, even if you set includeGlobalResourceTypes to false, global resource types will still be automatically recorded in this option unless those resource types are specifically listed as exemptions in the resourceTypes field of exclusionByResourceTypes.

By default, if you choose the EXCLUSION_BY_RESOURCE_TYPES recording strategy, when AWS Config adds support for a new resource type in the Region where you set up the configuration recorder, including global resource types, AWS Config starts recording resources of that type automatically.

AWS Config API Reference RecordingGroup

グローバルリソースを記録する状態でメトリクスに反映されるか

以下の設定でどのような操作がグローバルリソースタイプに記録されるか確認します。具体的には以下の設定でグローバルリソースタイプを記録してみます。

{
  "allSupported": true,
  "includeGlobalResourceTypes": true
}

前回はAWS::IAM::Policyの作成だけ行ったので、今回はIAM Userを作成してIAM Policyにアタッチして確認してみます。すると以下のように記録されました。

再度リソース除外を有効化し、他のグローバルリソースも除外されるのか

再度今回増えた設定でConfigを設定します。

config-recorder-setting.json

{
  "allSupported": false,
  "includeGlobalResourceTypes": false,
  "exclusionByResourceTypes": {
    "resourceTypes": ["AWS::EC2::InternetGateway"]
  },
  "recordingStrategy": {
    "useOnly": "EXCLUSION_BY_RESOURCE_TYPES"
  }
}

同じようにIAM Userを作成してIAM Policyにアタッチして確認してみます。すると以下のように記録されました。

念の為、exclusionByResourceTypes.resourceTypesにグローバルリソースタイプを設定すると除外できるのか確認します。

{
  "allSupported": false,
  "includeGlobalResourceTypes": false,
  "exclusionByResourceTypes": {
    "resourceTypes": ["AWS::EC2::InternetGateway", "AWS::IAM::Policy"]
  },
  "recordingStrategy": {
    "useOnly": "EXCLUSION_BY_RESOURCE_TYPES"
  }
}

同じようにIAM UserにIAM Policyをアタッチすると、IAM Policyだけ記録されずIAM Userのみ記録されました。

前回の検証ではグローバルリソースタイプに記録されない操作だったので気付けませんでしが、グローバルリソースは除外しないと記録されることがわかりました。なので、使い方としてはConfigのメトリクスを確認し記録数の多いリソースタイプはグローバルリソースも含めて除外していく必要があるかと考えます。

所感

待望の機能でリージョン内のリソース記録も除外できて、かなり便利になったかと思います。Configの料金がちょっと高いかもと思った時は、ぜひ試してみてください!!