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
          }
        }
      }
    ]
  })
}