使用Terraform+AWS Firelens将ECS日志路由到S3失败求助
解决AWS Firelens无法向S3推送日志的凭证与配置问题
从错误日志能明确看到核心问题:Firelens日志路由容器无法获取AWS凭证,导致调用S3的PutObject接口失败。以下是具体修复步骤:
1. 给ECS任务执行角色添加S3访问权限
当前ecs_task_execution_role缺少向目标S3桶写入日志的权限,需要附加IAM策略:
resource "aws_iam_policy" "firelens_s3_access" { name = "firelens-s3-log-access" description = "授权Firelens向S3桶写入日志" policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = ["s3:PutObject"] Effect = "Allow" Resource = "arn:aws:s3:::xxx-logs-bucket/*" } ] }) } resource "aws_iam_role_policy_attachment" "firelens_s3_attach" { role = aws_iam_role.ecs_task_execution_role.name policy_arn = aws_iam_policy.firelens_s3_access.arn }
2. 修正Firelens配置文件加载方式
Fargate环境无法直接读取本地./firelens.config文件,改用inline嵌入配置的方式:
修改log_router容器的firelensConfiguration:
firelensConfiguration = { "type" : "fluentbit", "config-file-type" : "inline", "config-file-value" : <<EOC [OUTPUT] Name s3 Match * bucket xxx-logs-bucket region ${var.aws_region} total_file_size 50M use_put_object on compression gzip s3_key_format /$TAG/%Y/%m/%d/%H_%M_%S/$UUID.gz s3_key_format_tag_delimiters .- EOC }
3. 移除重复的S3输出配置
你同时在app容器的日志驱动和Firelens全局配置里定义了S3输出,导致冲突。保留Firelens全局配置,修改app容器的日志配置:
logConfiguration = { "logDriver" : "awsfirelens", "options" : { "Name" : "firelens" } }
4. 确认Fargate任务IMDS状态
错误中提到unable to evaluate IMDS version,确保Fargate任务未禁用IMDS(默认开启),保证容器能通过IMDS获取凭证。
内容的提问来源于stack exchange,提问作者Juzzn
相关产品推荐
相关产品推荐

