IAM 权限怎么配?terraform-aws-ecs 中 Task Exec Role 与 Tasks Role 的终极解读
2026/8/16 15:35:48 网站建设 项目流程

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 服务本身,而不是你的业务代码。

它负责哪些事?

  1. 从 ECR 拉取容器镜像
  2. 向 CloudWatch Logs 写入容器日志
  3. 从 Secrets Manager / SSM Parameter Store 读取密钥和参数(注入为环境变量)
  4. 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_arnstask_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.comecs-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_roletask_exec_ssm_param_arnstask_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 条安全准则

  1. 坚持最小权限:Task Exec Role 只开放必需的 ECR/Logs 权限,密钥访问精确到 ARN,别图省事直接给"*"
  2. 分清两个角色的边界:业务资源访问一律走 Tasks Role,系统级操作留在 Task Exec Role,两者职责永不混用
  3. 利用模块输出做审计:模块提供task_exec_iam_role_arntasks_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/fargateexamples/ec2-autoscaling等实战示例,照着跑一遍,理解会更扎实。

【免费下载链接】terraform-aws-ecsTerraform module to create AWS ECS resources 🇺🇦项目地址: https://gitcode.com/gh_mirrors/te/terraform-aws-ecs

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询