# CloudWatch Logs ============================================================ resource "aws_cloudwatch_log_group" "this" { name = local.log_group_name retention_in_days = var.cloudwatch_logs_retention_days kms_key_id = var.kms_key_id tags = local.tags } # IAM role for CloudTrail → CloudWatch Logs delivery ------------------------- data "aws_iam_policy_document" "cloudtrail_assume" { statement { effect = "Allow" actions = ["sts:AssumeRole"] principals { type = "Service" identifiers = ["cloudtrail.amazonaws.com"] } } } resource "aws_iam_role" "cloudtrail_cw" { name = local.role_name assume_role_policy = data.aws_iam_policy_document.cloudtrail_assume.json tags = local.tags } data "aws_iam_policy_document" "cloudtrail_cw_logs" { statement { effect = "Allow" actions = [ "logs:CreateLogStream", "logs:PutLogEvents", ] resources = ["${aws_cloudwatch_log_group.this.arn}:*"] } } resource "aws_iam_role_policy" "cloudtrail_cw" { name = "cloudtrail-cw-logs" role = aws_iam_role.cloudtrail_cw.id policy = data.aws_iam_policy_document.cloudtrail_cw_logs.json } # Trail ====================================================================== resource "aws_cloudtrail" "this" { name = var.trail_name s3_bucket_name = var.s3_bucket_name s3_key_prefix = var.s3_key_prefix is_organization_trail = var.is_organization_trail is_multi_region_trail = var.is_multi_region_trail include_global_service_events = var.include_global_service_events enable_log_file_validation = var.enable_log_file_validation kms_key_id = var.kms_key_id cloud_watch_logs_group_arn = "${aws_cloudwatch_log_group.this.arn}:*" cloud_watch_logs_role_arn = aws_iam_role.cloudtrail_cw.arn event_selector { read_write_type = var.management_events_rw_type include_management_events = true dynamic "data_resource" { for_each = var.data_resources content { type = data_resource.value.type values = data_resource.value.values } } } tags = local.tags }