メインコンテンツまでスキップ

AWS Config とは?リソースの設定変更を記録・評価するサービス

タグ:

AWS を運用していると「いつ・誰が・どのリソースの設定を変更したか」を把握したい場面が出てきます。AWS Config はそのニーズに応えるサービスで、リソースの設定スナップショットを自動的に記録し、変更履歴の確認やコンプライアンスルールへの準拠評価を行えます。監査対応やセキュリティ強化のための基礎として活用できるサービスです。

AWS Config の主要な概念

AWS Config を理解するうえで押さえておきたい概念をまとめます。

概念説明
設定項目 (Configuration Item)特定の時点におけるリソースの設定スナップショット
設定履歴リソースに対する設定項目の時系列の記録
設定スナップショットアカウント内のすべてのリソースの設定項目をまとめたもの
設定レコーダー設定項目を記録するコンポーネント。リージョンごとに 1 つ有効化する
配信チャネル設定項目や設定スナップショットを S3・SNS に送る仕組み
AWS Config ルールリソースの設定が満たすべき条件を定義したもの

設定レコーダーを有効にすると、対象リソースの設定変更が自動的に記録されます。記録されたデータは S3 バケットに保存でき、SNS でリアルタイム通知を受け取ることもできます。

AWS Config ルール

AWS Config ルールを使うと、リソースの設定が組織のポリシーや基準を満たしているかどうかを自動的に評価できます。評価結果は「準拠 (Compliant)」または「非準拠 (Non-compliant)」として表示されます。ルールは変更のたびに評価するトリガー型と、定期的に評価する定期型を選べます。

マネージドルール

AWS が提供する既定のルールです。数百種類が用意されており、選んで有効化するだけですぐ使えます。よく使われるルールの例を示します。

ルール名評価内容
s3-bucket-public-access-prohibitedS3 バケットへのパブリックアクセスが禁止されているか
ec2-instance-no-public-ipEC2 インスタンスにパブリック IP が割り当てられていないか
iam-user-mfa-enabledIAM ユーザーに MFA が有効化されているか
root-account-mfa-enabledルートアカウントに MFA が設定されているか
encrypted-volumesEBS ボリュームが暗号化されているか

カスタムルール

独自のロジックでルールを定義したい場合はカスタムルールを使います。実装方法は 2 種類あります。

種類説明
Lambda ベースLambda 関数を使って独自のロジックでルールを定義する
Guard ベースAWS CloudFormation Guard を使ってポリシーをコードで記述する

コンフォーマンスパック

コンフォーマンスパックは複数の Config ルールをひとまとめにしたパッケージです。業界標準のセキュリティベンチマークに対応したサンプルテンプレートが AWS から提供されており、PCI DSS や CIS AWS Foundations Benchmark といった標準をすぐに適用できます。

コンフォーマンスパックは CloudFormation テンプレートとして定義されるため、ルールのセットをコードで管理でき、Organizations と組み合わせると複数アカウントへの一括適用もできます。

料金

AWS Config の料金は主に 2 つの要素で決まります。設定レコーダーを有効にすると、記録対象のリソース数と変更頻度に応じて設定項目が積み上がります。コスト最適化のためには、記録対象リソースの種類を絞る設定も検討しましょう。

課金対象料金(東京リージョン)
設定項目の記録件数0.003 USD / 設定項目
ルール評価の回数0.001 USD / ルール評価

AWS CLI で AWS Config を使ってみる

AWS CLI を使って、設定レコーダーの有効化から変更履歴の確認、無効化までの流れを実行してみましょう。

有効化

設定レコーダーを有効にするには、サービスリンクロールの作成・設定レコーダーの作成・配信チャネルの設定・レコーダーの開始の手順が必要です。

まず Config が使用するサービスリンクロールを作成します。すでに存在する場合はスキップして進めます。

❯ aws iam create-service-linked-role --aws-service-name config.amazonaws.com

次に設定レコーダーを作成します。--recording-group で全リソースタイプを記録対象に指定します。

❯ aws configservice put-configuration-recorder \
--configuration-recorder name=default,roleARN=arn:aws:iam::123456789012:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig \
--recording-group allSupported=true,includeGlobalResourceTypes=true

続いて配信チャネルを設定します。S3 バケットへの書き込み権限が必要なため、先にバケットポリシーを設定します。以下の内容でポリシーファイルを作成します。

cat > config-bucket-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AWSConfigBucketPermissionsCheck",
"Effect": "Allow",
"Principal": { "Service": "config.amazonaws.com" },
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::exrecord-test-bucket"
},
{
"Sid": "AWSConfigBucketDelivery",
"Effect": "Allow",
"Principal": { "Service": "config.amazonaws.com" },
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::exrecord-test-bucket/AWSLogs/123456789012/Config/*",
"Condition": {
"StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" }
}
}
]
}
EOF

ポリシーをバケットに適用します。

❯ aws s3api put-bucket-policy \
--bucket exrecord-test-bucket \
--policy file://config-bucket-policy.json

ポリシーの適用後、配信チャネルを設定します。

❯ aws configservice put-delivery-channel \
--delivery-channel name=default,s3BucketName=exrecord-test-bucket

配信チャネルの設定が完了したら、設定レコーダーを開始します。

❯ aws configservice start-configuration-recorder \
--configuration-recorder-name default

状態確認

設定レコーダーが正常に動作しているかを確認します。recordingtruelastStatusSUCCESS になっていれば、リソースの設定変更が正常に記録されています。

❯ aws configservice describe-configuration-recorder-status
{
"ConfigurationRecordersStatus": [
{
"arn": "arn:aws:config:ap-northeast-1:123456789012:configuration-recorder/default/0a1b2c3d4e5f67890",
"name": "default",
"lastStartTime": "2026-05-01T20:37:49.863000+09:00",
"lastStopTime": "2026-05-01T20:37:43.408000+09:00",
"recording": true,
"lastStatus": "SUCCESS",
"lastStatusChangeTime": "2026-05-01T22:14:00.343000+09:00"
}
]
}

Config ルールの追加

設定レコーダーはリソースの設定変更を記録しますが、準拠状況の評価にはルールを別途追加する必要があります。put-config-rule でマネージドルールを追加します。

❯ aws configservice put-config-rule \
--config-rule '{"ConfigRuleName":"s3-bucket-public-access-prohibited","Source":{"Owner":"AWS","SourceIdentifier":"S3_BUCKET_LEVEL_PUBLIC_ACCESS_PROHIBITED"}}'

追加されたルールを確認します。

❯ aws configservice describe-config-rules
{
"ConfigRules": [
{
"ConfigRuleName": "s3-bucket-public-access-prohibited",
"ConfigRuleArn": "arn:aws:config:ap-northeast-1:123456789012:config-rule/config-rule-0a1b2c3d4e5f67890",
"ConfigRuleId": "config-rule-0a1b2c3d4e5f67890",
"Source": {
"Owner": "AWS",
"SourceIdentifier": "S3_BUCKET_LEVEL_PUBLIC_ACCESS_PROHIBITED"
},
"ConfigRuleState": "ACTIVE",
"EvaluationModes": [
{
"Mode": "DETECTIVE"
}
]
}
]
}

特定ルールへの準拠状況をリソース単位で確認するには get-compliance-details-by-config-rule を使います。

❯ aws configservice get-compliance-details-by-config-rule \
--config-rule-name s3-bucket-public-access-prohibited
{
"EvaluationResults": [
{
"EvaluationResultIdentifier": {
"EvaluationResultQualifier": {
"ConfigRuleName": "s3-bucket-public-access-prohibited",
"ResourceType": "AWS::S3::Bucket",
"ResourceId": "exrecord-test-bucket",
"EvaluationMode": "DETECTIVE"
},
"OrderingTimestamp": "2026-05-01T22:14:00.665000+09:00"
},
"ComplianceType": "COMPLIANT",
"ResultRecordedTime": "2026-05-02T00:30:13.147000+09:00",
"ConfigRuleInvokedTime": "2026-05-02T00:30:12.340000+09:00"
}
]
}

変更履歴取得

まず list-discovered-resources で Config が記録しているリソースの一覧を確認し、リソース ID を取得します。

❯ aws configservice list-discovered-resources --resource-type AWS::S3::Bucket
{
"resourceIdentifiers": [
{
"resourceType": "AWS::S3::Bucket",
"resourceId": "exrecord-test-bucket",
"resourceName": "exrecord-test-bucket"
}
]
}

取得したリソース ID を get-resource-config-history に渡して変更履歴を確認します。

❯ aws configservice get-resource-config-history \
--resource-type AWS::S3::Bucket \
--resource-id exrecord-test-bucket
実行結果
{
"configurationItems": [
{
"version": "1.3",
"accountId": "123456789012",
"configurationItemCaptureTime": "2026-05-01T22:14:00.665000+09:00",
"configurationItemStatus": "ResourceDiscovered",
"configurationStateId": "1777641240665",
"configurationItemMD5Hash": "",
"arn": "arn:aws:s3:::exrecord-test-bucket",
"resourceType": "AWS::S3::Bucket",
"resourceId": "exrecord-test-bucket",
"resourceName": "exrecord-test-bucket",
"awsRegion": "ap-northeast-1",
"availabilityZone": "Regional",
"resourceCreationTime": "2026-05-01T19:42:16+09:00",
"tags": {},
"relatedEvents": [],
"relationships": [],
"configuration": "{\"name\":\"exrecord-test-bucket\",\"owner\":{\"displayName\":null,\"id\":\"0a1b2c3d4e5f67890\"},\"creationDate\":\"2026-05-01T10:42:16.000Z\",\"region\":\"ap-northeast-1\"}",
"supplementaryConfiguration": {
"AbacStatus": "{\"status\":\"Disabled\"}",
"AccessControlList": "\"{\\\"grantSet\\\":null,\\\"grantList\\\":[{\\\"grantee\\\":{\\\"id\\\":\\\"0a1b2c3d4e5f67890\\\",\\\"displayName\\\":null},\\\"permission\\\":\\\"FullControl\\\"}],\\\"owner\\\":{\\\"displayName\\\":null,\\\"id\\\":\\\"0a1b2c3d4e5f67890\\\"},\\\"isRequesterCharged\\\":false}\"",
"BucketAccelerateConfiguration": "{\"status\":null,\"isRequesterCharged\":false}",
"BucketLoggingConfiguration": "{\"destinationBucketName\":null,\"logFilePrefix\":null,\"targetObjectKeyFormat\":null}",
"BucketNotificationConfiguration": "{\"configurations\":{},\"eventBridgeConfiguration\":null}",
"BucketPolicy": "{\"policyText\":\"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":[{\\\"Sid\\\":\\\"AWSConfigBucketPermissionsCheck\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Principal\\\":{\\\"Service\\\":\\\"config.amazonaws.com\\\"},\\\"Action\\\":\\\"s3:GetBucketAcl\\\",\\\"Resource\\\":\\\"arn:aws:s3:::exrecord-test-bucket\\\"},{\\\"Sid\\\":\\\"AWSConfigBucketDelivery\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Principal\\\":{\\\"Service\\\":\\\"config.amazonaws.com\\\"},\\\"Action\\\":\\\"s3:PutObject\\\",\\\"Resource\\\":\\\"arn:aws:s3:::exrecord-test-bucket/AWSLogs/123456789012/Config/*\\\",\\\"Condition\\\":{\\\"StringEquals\\\":{\\\"s3:x-amz-acl\\\":\\\"bucket-owner-full-control\\\"}}}]}\"}",
"BucketVersioningConfiguration": "{\"status\":\"Off\",\"isMfaDeleteEnabled\":null}
",
"IsRequesterPaysEnabled": "false",
"PublicAccessBlockConfiguration": "{\"blockPublicAcls\":true,\"ignorePublicAcls\":true,\"blockPublicPolicy\":true,\"restrictPublicBuckets\":true}",
"ServerSideEncryptionConfiguration": "{\"rules\":[{\"applyServerSideEncryptionByDefault\":{\"sseAlgorithm\":\"AES256\",\"kmsMasterKeyID\":null},\"bucketKeyEnabled\":false}]}"
}
}
]
}

無効化

設定レコーダーを停止するには stop-configuration-recorder を使います。停止後は新しい設定項目が記録されなくなりますが、既存の履歴は S3 バケットに保持されます。

❯ aws configservice stop-configuration-recorder \
--configuration-recorder-name default

レコーダーを停止しても、Config ルールが残っている場合は定期評価型のルールが引き続き実行され課金が続きます。課金を完全に止めるにはルールも削除します。

❯ aws configservice delete-config-rule \
--config-rule-name s3-bucket-public-access-prohibited

まとめ

  • AWS Config はリソースの設定変更を自動記録し、変更履歴の確認や準拠評価を行うサービス
  • Config ルールを使うとリソースが条件を満たしているか自動評価でき、マネージドルールとカスタムルール(Lambda・Guard)を使い分けられる
  • コンフォーマンスパックで複数ルールをまとめて管理でき、業界標準への準拠を効率よく確認できる
  • 料金は設定項目の記録件数とルール評価の回数に基づいて課金される