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