为ECS任务执行角色添加权限时Terraform应用报错:存在禁止字段Resource
错误原因及解决方案
错误原因
你当前修改的aws_iam_policy_document是用来定义**IAM角色的信任策略(Assume Role Policy)**的,而IAM信任策略有严格的语法规则:
- 信任策略仅用于指定哪些实体可以扮演该角色,不能包含权限类的语句
sts:AssumeRole类型的信任语句,不允许出现Resource字段- 你把访问Secrets Manager的权限语句直接写入了信任策略文档,混淆了「信任策略」和「权限策略」的边界,触发了IAM的语法校验错误。
正确实现方式
需要将信任策略和权限策略完全分离:
- 信任策略仅保留允许ECS任务服务扮演角色的逻辑
- 单独创建权限策略,定义访问Secrets Manager的权限,再将其附加到ECS执行角色上
完整Terraform代码示例
# 1. 定义角色的信任策略(仅负责信任关系) data "aws_iam_policy_document" "ecs_task_execution_role_trust" { version = "2012-10-17" statement { effect = "Allow" actions = ["sts:AssumeRole"] principals { type = "Service" identifiers = ["ecs-tasks.amazonaws.com"] } } } # 2. 定义访问Secrets Manager的权限策略文档 data "aws_iam_policy_document" "ecs_task_execution_permissions" { version = "2012-10-17" statement { effect = "Allow" actions = ["secretsmanager:GetSecretValue"] resources = [aws_secretsmanager_secret.secret.arn] } } # 3. 创建权限策略资源 resource "aws_iam_policy" "ecs_task_execution_permissions" { name = "ecs-task-execution-secrets-access" description = "允许ECS任务执行角色访问指定Secrets Manager密钥" policy = data.aws_iam_policy_document.ecs_task_execution_permissions.json } # 4. 创建ECS任务执行角色 resource "aws_iam_role" "ecs_task_execution_role" { name = "dev-fidc-identity-gateway-ecs-role" assume_role_policy = data.aws_iam_policy_document.ecs_task_execution_role_trust.json } # 5. 将权限策略附加到角色上 resource "aws_iam_role_policy_attachment" "ecs_task_execution_secrets_attach" { role = aws_iam_role.ecs_task_execution_role.name policy_arn = aws_iam_policy.ecs_task_execution_permissions.arn }
内容的提问来源于stack exchange,提问作者darren25
相关产品推荐
相关产品推荐

