Terraform配置ECS Fargate挂载EFS时任务卡在pending状态
问题排查与修复方案
你的ECS Fargate任务卡在Pending状态无法挂载EFS,是配置中4处明确错误导致的,按影响优先级逐一修复即可:
1. EFS文件系统策略逻辑反向
你当前配置的EFS策略条件为"aws:SecureTransport": "false",规则含义是仅允许未加密的连接访问EFS,但你在任务定义的EFS卷配置中明确开启了传输加密transit_encryption = "ENABLED",所有来自Fargate的加密连接都会被EFS直接拒绝,根本无法完成挂载。
修复方法
将Condition块内的参数值改为"true",仅允许加密连接,和任务侧配置匹配:
"Condition": { "Bool": { "aws:SecureTransport": "true" } }
如果不需要强制传输加密,直接删除整个Condition块即可。
2. IAM角色配置错误
- 你当前任务定义中只配置了
task_role_arn,但Fargate挂载EFS的权限需要配置在任务执行角色上,即需要在aws_ecs_task_definition资源中补充execution_role_arn字段,指向你的ecsTaskExecutionRoleARN。 - 默认的
ecsTaskExecutionRole不包含EFS操作权限,需要给该角色附加以下最小权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "elasticfilesystem:ClientMount", "elasticfilesystem:ClientWrite", "elasticfilesystem:ClientRootAccess" ], "Resource": "*" } ] }
3. 传输加密端口与安全组规则不匹配
你在EFS卷配置中自定义了transit_encryption_port = 2999,但EFS挂载点的安全组仅放通了2049端口的入站流量,端口不匹配会导致连接被安全组拦截。
修复方法
直接删除transit_encryption_port = 2999这行配置,使用默认的2049端口即可,和现有安全组规则匹配。
4. Terraform资源块语法错误
你贴出的代码中aws_security_group "grafana"资源块缺少闭合的右花括号,在tags块结束后、EFS安全组资源定义前补充}即可,否则执行terraform plan时会直接报语法错误。
可选优化
你已经创建了EFS访问点aws_efs_access_point.test,但任务定义中没有引用该资源,如果需要通过访问点实现目录自动创建、访问权限隔离,可以在efs_volume_configuration块中补充access_point_id = aws_efs_access_point.test.id字段,不添加也不影响基础挂载功能。
所有修改完成后执行terraform apply重新部署服务,任务即可正常启动并挂载EFS卷。
内容的提问来源于stack exchange,提问作者Christine M
相关产品推荐
相关产品推荐

