AWS CloudWatch未显示ECS容器日志,Terraform配置问题求助
问题分析与修正方案
你遇到的日志关联失败问题,主要由以下3个配置遗漏/错误导致:
1. 容器定义的日志配置字段名不符合ECS规范
在HCL的容器定义Map中,你使用了log_configuration(下划线命名),但ECS容器定义的JSON规范要求该字段为logConfiguration(驼峰命名)。jsonencode后会保留下划线格式,导致ECS无法识别该配置,日志驱动完全不生效。
修正后的容器定义片段:
container_definitions = jsonencode([ { name = "simat" image = "app_1" cpu = 512 memory = 1024 essential = true logConfiguration = { # 改为驼峰命名的字段 logDriver = "awslogs" options = { "awslogs-group" = aws_cloudwatch_log_group.ecs_log.name "awslogs-region" = var.region "awslogs-stream-prefix" = "ecs" } }, portMappings = [ { containerPort = 80 hostPort = 80 } ] } ])
2. ECS执行角色缺少信任策略
你仅配置了角色的权限策略,但未创建aws_iam_role资源并设置信任关系——ECS服务需要被允许扮演该角色,才能调用CloudWatch日志服务。
新增ECS执行角色的创建配置:
resource "aws_iam_role" "ecs_task_execution_role" { name = "ecs-task-execution-role-${terraform.workspace}" # 允许ECS任务执行服务扮演该角色 assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "sts:AssumeRole" Effect = "Allow" Principal = { Service = "ecs-tasks.amazonaws.com" } } ] }) }
3. IAM角色策略的变量引用语法错误
你在策略名称中使用了$var.application的错误语法,Terraform无法识别,会导致策略创建失败(若未失败也会生成不符合预期的名称)。
修正后的IAM角色策略片段:
resource "aws_iam_role_policy" "ecs_task_execution_role" { # 修正变量引用为${var.application}格式 name = "policy-${var.application}-ecstask-exe-${terraform.workspace}-${var.region}-1" role = aws_iam_role.ecs_task_execution_role.id policy = jsonencode({ "Version" : "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Action" : [ "ecr:GetAuthorizationToken", "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "logs:DescribeLogGroups", "logs:DescribeLogStreams", "logs:CreateLogStream", "logs:PutLogEvents", "kms:Decrypt", "secretsmanager:GetSecretValue", "ssm:GetParameters", "sns:*", "cloudwatch:*", "events:PutEvents" ], "Resource" : "*" } ] }) }
验证步骤
- 执行
terraform apply重新部署配置 - 重启ECS任务(旧任务不会自动加载新的任务定义)
- 检查CloudWatch日志组是否生成新的日志流
内容的提问来源于stack exchange,提问作者Sosh
相关产品推荐
相关产品推荐

