IAM 权限怎么配?terraform-aws-ecs 中 Task Exec Role 与 Tasks Role 的终极解读
【免费下载链接】terraform-aws-ecsTerraform module to create AWS ECS resources 🇺🇦项目地址: https://gitcode.com/gh_mirrors/te/terraform-aws-ecs
很多刚接触 AWS ECS 的开发者,第一次用terraform-aws-ecs这个 Terraform 模块部署服务时,都会被两个名字极其相似的 IAM 角色绕晕:Task Exec Role(任务执行角色)和Tasks Role(任务角色)。它们都叫 "Task",信任主体都是ecs-tasks.amazonaws.com,甚至都能挂自定义策略——那到底有什么区别?权限该怎么配?这篇文章就带你一次看懂,从此不再为 IAM 权限配置发愁。
terraform-aws-ecs 是一个用于创建 AWS ECS 资源(集群、服务、任务、容器定义)的 Terraform 模块,它开箱即用地帮你管理好这些角色。下面我们先从整体架构入手。
为什么要搞清楚这两个角色?先看它们在架构中的位置
在 ECS 中,一个完整体系由集群(Cluster)→ 服务(Service)→ 任务(Task)→ 容器(Container)四级构成。集群是你的资源池,服务负责维持任务数量,任务里跑着真正干活的容器。而 IAM 权限就分布在这些层级中:
- 集群层:可以创建共享的 Task Exec Role
- 服务层:需要 Service Role(服务角色,用于负载均衡器注册/注销)
- 任务层:同时出现 Task Exec Role 与 Tasks Role
Task Exec Role 是什么?任务执行角色的职责与信任策略
Task Exec Role(任务执行角色)是 AWS ECS 平台替你干活时使用的角色,它的服务对象是ECS 服务本身,而不是你的业务代码。
它负责哪些事?
- 从 ECR 拉取容器镜像
- 向 CloudWatch Logs 写入容器日志
- 从 Secrets Manager / SSM Parameter Store 读取密钥和参数(注入为环境变量)
- Fargate 模式下挂载 EBS 卷等系统级操作
关键点:它只在任务创建/启动时被使用,任务运行期间,容器内的代码根本"看不到"这个角色。所以就算它权限再大,也不会泄露给业务代码。
模块默认给了什么权限?
在 terraform-aws-ecs 的modules/service/main.tf(L1126-L1211)中,模块默认创建的 Task Exec 策略包含:
| 权限 | 用途 |
|---|---|
logs:CreateLogStream/logs:PutLogEvents | 写 CloudWatch 日志 |
ecr:GetAuthorizationToken等 | 从 ECR 拉取镜像 |
ssm:GetParameters(需配置) | 读取 SSM 参数 |
secretsmanager:GetSecretValue(需配置) | 读取 Secrets Manager 密钥 |
SSM 和 Secrets 的权限默认不开启,需要你显式传入task_exec_ssm_param_arns和task_exec_secret_arns才能生效,这正是最小权限原则的体现。
Tasks Role 是什么?任务角色的职责与信任策略
Tasks Role(任务角色)才是你业务代码的"身份证"。容器里的应用如果要访问 AWS 资源——比如从 S3 下载文件、往 DynamoDB 写数据、用 IAM Auth 连接 RDS——靠的就是它。
你可以把它理解成EC2 的 Instance Profile,或者 EKS 里 Pod 的 Service Account:容器内进程通过它临时获取 AWS 凭证,任务运行期间全程可用。
模块默认给了什么权限?
和直觉相反,terraform-aws-ecs 对 Tasks Role 的默认策略几乎是"空白"的。在modules/service/main.tf(L1284-L1360)中,只有当enable_execute_command = true时才会自动添加ssmmessages系列权限(用于 ECS Exec 进入容器)。其他业务权限全靠你通过以下方式注入:
tasks_iam_role_policies:附加现成的 AWS 托管策略(如ReadOnlyAccess)tasks_iam_role_statements:自定义内联策略语句
Task Exec Role 与 Tasks Role:一张表看懂核心区别
| 对比维度 | Task Exec Role(任务执行角色) | Tasks Role(任务角色) |
|---|---|---|
| 服务对象 | ECS 平台本身 | 容器内的业务代码 |
| 生效时机 | 任务创建/启动时 | 任务运行期间 |
| 典型用途 | 拉镜像、写日志、读密钥 | 访问 S3、DynamoDB、RDS |
| 容器内可见性 | 不可见 | 可见(通过临时凭证) |
| 信任主体 | ecs-tasks.amazonaws.com | ecs-tasks.amazonaws.com |
| 类似物 | 无直接对应 | EC2 Instance Profile / EKS IRSA |
记住一句话就够了:Task Exec Role 是"让任务跑起来"用的,Tasks Role 是"让业务跑起来"用的。
在 terraform-aws-ecs 中最快配置 Task Exec Role 的方法
方式一:集群级共享(适合单团队)
如果你一个集群只有一个团队使用,推荐在modules/cluster里创建一次 Task Exec Role 全集群共享,服务侧直接引用。modules/cluster/main.tf(L358 起)提供了完整的create_task_exec_iam_role、task_exec_ssm_param_arns、task_exec_secret_arns参数。
方式二:服务级独立(适合多团队)
多团队共用集群时,为了让每个服务只能访问自己的密钥,建议在modules/service中按服务创建独立角色:
module "ecs_service" { source = "terraform-aws-modules/ecs/aws//modules/service" # ... 其他配置 task_exec_ssm_param_arns = ["arn:aws:ssm:ap-southeast-1:123456789012:parameter/my-app/*"] task_exec_secret_arns = ["arn:aws:secretsmanager:ap-southeast-1:123456789012:secret:my-app-*"] task_exec_iam_role_policies = {} }在 terraform-aws-ecs 中最快配置 Tasks Role 的方法
业务权限全部从这里进入,examples/complete/main.tf(L235-L247)给出了标准示范:
module "ecs_service" { # ... 其他配置 tasks_iam_role_name = "my-app-tasks" tasks_iam_role_max_session_duration = 7200 # 方式一:挂 AWS 托管策略 tasks_iam_role_policies = { ReadOnlyAccess = "arn:aws:iam::aws:policy/ReadOnlyAccess" } # 方式二:自定义内联策略 tasks_iam_role_statements = [ { actions = ["s3:List*"] resources = ["arn:aws:s3:::*"] } ] }如果你已经有现成的角色,也可以用tasks_iam_role_arn/task_exec_iam_role_arn直接传入 ARN,并配合create_tasks_iam_role = false/create_task_exec_iam_role = false关闭自动创建。
常见权限报错排查清单 🔧
遇到以下报错,先对照排查:
AccessDeniedException拉取镜像失败→ Task Exec Role 缺少 ECR 权限,检查ecr:GetAuthorizationToken等是否被移除Unable to retrieve secret→ Task Exec Role 没加task_exec_secret_arns,或 ARN 不匹配- 容器内访问 S3 报错→ Tasks Role 缺 S3 权限,在
tasks_iam_role_statements中补充 - ECS Exec 无法进入容器→ 确认
enable_execute_command = true,且 Tasks Role 有ssmmessages权限 Inaccessible encryption credentials→ 使用 KMS 加密的密钥时,Task Exec Role 还需kms:Decrypt权限
最佳实践:3 条安全准则
- 坚持最小权限:Task Exec Role 只开放必需的 ECR/Logs 权限,密钥访问精确到 ARN,别图省事直接给
"*" - 分清两个角色的边界:业务资源访问一律走 Tasks Role,系统级操作留在 Task Exec Role,两者职责永不混用
- 利用模块输出做审计:模块提供
task_exec_iam_role_arn、tasks_iam_role_name等输出(见modules/service/outputs.tf),方便你在其他 Terraform 资源中引用或审计
小结
搞懂了Task Exec Role 管"启动"、Tasks Role 管"运行"这个核心区别,terraform-aws-ecs 中的 IAM 权限配置就变得非常简单。无论是集群级共享还是服务级隔离,模块都通过task_exec_*和tasks_iam_role_*两套清晰的参数体系帮你搞定。想深入研究的同学,可以翻一翻项目里的 docs/README.md 设计文档,以及examples/fargate、examples/ec2-autoscaling等实战示例,照着跑一遍,理解会更扎实。
【免费下载链接】terraform-aws-ecsTerraform module to create AWS ECS resources 🇺🇦项目地址: https://gitcode.com/gh_mirrors/te/terraform-aws-ecs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考