🔧 AWS Config S3配信エラー解決ガイド

「Insufficient delivery policy」エラーを完全理解して解決しよう!

📛 エラーメッセージ:
"Insufficient delivery policy to S3 bucket: DOC-EXAMPLE-BUCKET, unable to write to bucket, provided s3 key prefix is 'null'."

🎯 まず結論!このエラーの原因と解決策

このエラーは「AWS ConfigがS3バケットにログを配信できない」という権限の問題です

📋
原因①
S3バケットポリシーにAWS Configへの書き込み許可がない
🔑
原因②
IAMロールに必要な権限(s3:PutObject等)が不足
⚙️
原因③
設定ミス(バケット名にARNを使用等)

📬 たとえ話で理解しよう!「郵便配達と郵便受け」

👮‍♂️

AWS Config

= 郵便配達員
AWSリソースの設定変更を
記録して配達する

➡️
📮

S3バケット

= 郵便受け
設定履歴やスナップショットを
保管する場所

😱

今起きていること

「郵便配達員(AWS Config)が郵便受け(S3バケット)に
手紙を入れようとしたけど、鍵がかかっていて入れられない!

郵便受けの持ち主(バケットポリシー)が「この配達員は入れてOK」と許可していないのです

🔗 AWS Configの仕組みを理解しよう

🖥️

AWSリソース

EC2、S3、RDSなど
監視対象のリソース

🔍

AWS Config

リソースの設定変更を
監視・記録するサービス

🪣

S3バケット

設定履歴の保存先
(ここへの配信が失敗中)

📝 配信チャネル(Delivery Channel)
AWS ConfigからS3への「配送ルート」を定義する設定

📊 正常な流れ vs 今のエラー状態

✅ 正常な流れ

🔍
AWS Config
設定を記録
権限チェック
許可されている
🪣
S3に配信
成功!

❌ 今のエラー状態

🔍
AWS Config
設定を記録
🚫
権限チェック
拒否された!
💥
配信失敗
エラー発生

❓ エラーの原因を詳しく理解しよう

📋
原因①:S3バケットポリシーの不備
S3バケットのポリシーに、AWS Configサービス(config.amazonaws.com)への書き込み許可がありません。
📬 たとえ:郵便受けに「この配達員は入れてOK」という名札がない状態
🔑
原因②:IAMロールの権限不足
AWS Configに割り当てたIAMロールに、s3:GetBucketAcl や s3:PutObject* の権限が不足しています。
📬 たとえ:配達員が持っている身分証(IAMロール)に「配達OK」の記載がない
📝
原因③:バケット名の設定ミス
S3バケット名にARN(arn:aws:s3:::bucket-name)を指定している。正しくはバケット名のみ(bucket-name)。
📬 たとえ:住所に「日本国東京都」まで書いたけど、番地を書き忘れた
🔐
原因④:KMS暗号化の設定問題
S3バケットがKMS暗号化されている場合、KMSキーポリシーにもAWS Configへの許可が必要です。
📬 たとえ:郵便受けに暗号ロックがあるのに、配達員に暗証番号を教えていない

🛠️ 解決手順(ステップバイステップ)

1

📋 S3バケットポリシーを確認・修正する

S3コンソールでバケットを選択 → 「アクセス許可」タブ → 「バケットポリシー」を編集。 config.amazonaws.com サービスプリンシパルに書き込み権限を付与します。

📬 郵便受けに「AWS Config配達員はOK」という名札を貼る
2

🔑 IAMロールの権限を確認する

AWS Configに割り当てられているIAMロールに、S3への書き込み権限(s3:PutObject*、s3:GetBucketAcl)があることを確認します。

📬 配達員の身分証に「S3への配達権限あり」と記載されているか確認
3

⚙️ 設定値を確認する

Delivery Channelの設定で、S3バケット名がARNではなく「バケット名のみ」になっているか確認します。

📬 配送先住所が正しい形式で書かれているか確認
4

🔐 KMS設定を確認する(暗号化使用時)

S3バケットがKMS暗号化されている場合、KMSキーポリシーにもconfig.amazonaws.comへのアクセス許可を追加します。

📬 暗号ロック付きの郵便受けなら、配達員にも暗証番号を教える

📝 必要なポリシー設定(コピペOK!)

✅ S3バケットポリシー(これを追加!)
{
  "Version": "2012-10-17",
  "Statement": [
    // ① バケットのACL確認権限
    {
      "Sid": "AWSConfigBucketPermissionsCheck",
      "Effect": "Allow",
      "Principal": {
        "Service": "config.amazonaws.com"
      },
      "Action": "s3:GetBucketAcl",
      "Resource": "arn:aws:s3:::YOUR-BUCKET-NAME",
      "Condition": {
        "StringEquals": {
          "AWS:SourceAccount": "YOUR-ACCOUNT-ID"
        }
      }
    },
    // ② バケットの存在確認権限
    {
      "Sid": "AWSConfigBucketExistenceCheck",
      "Effect": "Allow",
      "Principal": {
        "Service": "config.amazonaws.com"
      },
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::YOUR-BUCKET-NAME",
      "Condition": {
        "StringEquals": {
          "AWS:SourceAccount": "YOUR-ACCOUNT-ID"
        }
      }
    },
    // ③ オブジェクトの書き込み権限(これが最重要!)
    {
      "Sid": "AWSConfigBucketDelivery",
      "Effect": "Allow",
      "Principal": {
        "Service": "config.amazonaws.com"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::YOUR-BUCKET-NAME/AWSLogs/YOUR-ACCOUNT-ID/Config/*",
      "Condition": {
        "StringEquals": {
          "s3:x-amz-acl": "bucket-owner-full-control",
          "AWS:SourceAccount": "YOUR-ACCOUNT-ID"
        }
      }
    }
  ]
}
💡 置き換えが必要な箇所
YOUR-BUCKET-NAME → 実際のS3バケット名(例:my-config-bucket)
YOUR-ACCOUNT-ID → 12桁のAWSアカウントID(例:123456789012)
🔐 KMS暗号化使用時のキーポリシー(追加)
{
  "Sid": "AWSConfigKMSPolicy",
  "Effect": "Allow",
  "Principal": {
    "Service": "config.amazonaws.com"
  },
  "Action": [
    "kms:Decrypt",
    "kms:GenerateDataKey"
  ],
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "AWS:SourceAccount": "YOUR-ACCOUNT-ID"
    }
  }
}

✅ 解決確認チェックリスト

S3バケットポリシーに config.amazonaws.com への s3:GetBucketAcl 権限がある
S3バケットポリシーに config.amazonaws.com への s3:ListBucket 権限がある
S3バケットポリシーに config.amazonaws.com への s3:PutObject 権限がある
Delivery Channelのバケット名がARNではなくバケット名のみになっている
AWS:SourceAccount 条件で正しいアカウントIDを指定している
(KMS使用時)KMSキーポリシーにもconfig.amazonaws.comへの権限がある
⚠️ よくある間違い
❌ 間違い①:S3バケット名にARNを使う
s3_bucket_name = "arn:aws:s3:::my-bucket" → NG!
s3_bucket_name = "my-bucket" → OK!

❌ 間違い②:depends_on を設定し忘れる
Terraformなどでは、Delivery ChannelがConfiguration Recorderに依存していることを明示する必要があります。

❌ 間違い③:リージョン固有の問題を見落とす
一部のリージョン(香港など)では追加の設定が必要な場合があります。

❓ よくある質問(FAQ)

Q
「provided s3 key prefix is 'null'」って何?
S3キープレフィックス(保存先のフォルダパス)が設定されていないことを示しています。これ自体は問題ではなく、プレフィックスなしでバケット直下に保存される設定です。エラーの本質的な原因は権限不足です。
Q
Service-Linked RoleとIAMロール、どっちを使うべき?
Service-Linked Role(推奨):AWSが自動管理するため楽ですが、S3バケットポリシーでの権限設定は必須です。config.amazonaws.comサービスプリンシパルを使用します。

カスタムIAMロール:より細かい制御が可能ですが、手動でS3やSNSへの権限を設定する必要があります。
Q
クロスアカウント(別アカウントのS3)に配信したい場合は?
クロスアカウント配信の場合は、送信元アカウントのIAMロールと、宛先アカウントのS3バケットポリシーの両方に適切な権限設定が必要です。AWS:SourceAccountやAWS:SourceArn条件を使って、許可するアカウントを明示的に指定してください。
Q
Control Towerでこのエラーが出る場合は?
Control Towerが管理するConfigDeliveryChannelでエラーが発生する場合、ログバケット(aws-controltower-logs-xxx)のバケットポリシーを確認してください。KMS暗号化を使用する場合は、Control Towerが作成したKMSキーのポリシーも確認が必要です。

🎉 これで解決!

S3バケットポリシーを正しく設定すれば、AWS Configは正常に動作します

📋
バケットポリシー設定
🔄
AWS Config再設定
正常に配信開始!

Created by SSuzuki1063

AWS SAP Learning Resources