AWS Config Configuration Recorderエラーの解決方法

AWS Config Configuration Recorderエラーの解決方法

AWS ConfigでDelivery Channelを作成しようとした際に「Configuration recorder is not available」エラーが発生する問題の解決策について

AWS #AWS#terraform

AWS Config Configuration Recorderエラーの解決方法

サムネイル

AWS ConfigでDelivery Channelを作成しようとした際に「Configuration recorder is not available」エラーが発生する問題の解決策について

更新日: 8/27/2025

ハンズオン執筆時に出会した内容

ISSUE - 課題
Error: putting ConfigService Delivery Channel: NoAvailableConfigurationRecorderException: Configuration recorder is not available to put delivery channel.

このエラーはAWS ConfigのDelivery Channelを作成する際、Configuration Recorderが適切に設定される前に実行されることで発生します。

SOLUTION - 解決策

Configuration Recorderの優先作成

単純にリソース作成の順序がおかしかったみたい。

順序 リソース 役割
1 Configuration Recorder AWS リソースの設定変更を記録
2 Delivery Channel 記録データをS3に配信
3 Configuration Recorder Status 記録機能の開始
# 1. Configuration Recorderを最初に作成
resource "aws_config_configuration_recorder" "main" {
  count = var.enable_config ? 1 : 0

  name     = "${var.project_name}-${var.environment}-recorder"
  role_arn = aws_iam_role.config[0].arn

  recording_group {
    all_supported                 = true
    include_global_resource_types = true
  }

  depends_on = [aws_s3_bucket_policy.config]
}

# 2. Delivery Channelの明示的な依存関係設定
resource "aws_config_delivery_channel" "main" {
  count = var.enable_config ? 1 : 0

  name           = "${var.project_name}-${var.environment}-channel"
  s3_bucket_name = aws_s3_bucket.config[0].bucket

  depends_on = [
    aws_config_configuration_recorder.main,
    aws_s3_bucket_policy.config
  ]
}

# 3. Configuration Recorderの開始(最後に実行)
resource "aws_config_configuration_recorder_status" "main" {
  count = var.enable_config ? 1 : 0

  name       = aws_config_configuration_recorder.main[0].name
  is_enabled = true

  depends_on = [
    aws_config_configuration_recorder.main,
    aws_config_delivery_channel.main
  ]
}

必要なIAMロール設定

Configuration RecorderがS3バケットにアクセスできるよう、適切な権限を設定。

resource "aws_iam_role" "config" {
  count = var.enable_config ? 1 : 0

  name = "${var.project_name}-${var.environment}-config-role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Principal = {
          Service = "config.amazonaws.com"
        }
      }
    ]
  })
}

S3バケットポリシー設定

ちなみにS3バケットにアクセスできるよう、以下の権限を設定しています。

権限 用途 必要な理由
s3:GetBucketAcl バケットACL確認 Config サービスがバケットへの書き込み権限を確認
s3:ListBucket バケット存在確認 配信先バケットが存在することを確認
s3:PutObject 設定データ配信 実際の設定変更データをバケットに配信
resource "aws_s3_bucket_policy" "config" {
  count = var.enable_config ? 1 : 0

  bucket = aws_s3_bucket.config[0].id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Sid    = "AWSConfigBucketPermissionsCheck"
        Effect = "Allow"
        Principal = {
          Service = "config.amazonaws.com"
        }
        Action   = "s3:GetBucketAcl"
        Resource = aws_s3_bucket.config[0].arn
        Condition = {
          StringEquals = {
            "AWS:SourceAccount" = data.aws_caller_identity.current.account_id
          }
        }
      },
      {
        Sid    = "AWSConfigBucketDelivery"
        Effect = "Allow"
        Principal = {
          Service = "config.amazonaws.com"
        }
        Action   = "s3:PutObject"
        Resource = "${aws_s3_bucket.config[0].arn}/*"
        Condition = {
          StringEquals = {
            "s3:x-amz-acl" = "bucket-owner-full-control"
            "AWS:SourceAccount" = data.aws_caller_identity.current.account_id
          }
        }
      }
    ]
  })
}

検索

検索条件に一致する記事が見つかりませんでした