Terraform创建Lambda的IAM角色遇格式错误,求正确实现方式
解决Terraform创建Lambda IAM角色的MalformedPolicyDocument错误
你之前犯的核心错误是混淆了IAM角色的信任策略和权限策略:
aws_iam_role的assume_role_policy字段只能填写信任策略,用来定义哪些实体(比如Lambda服务)可以扮演这个角色,这个策略里不允许出现Resource字段。- AWS官方文档提供的完整策略是权限策略,用来定义角色拥有的操作权限,必须单独创建并关联到角色,不能直接塞到
assume_role_policy里。
正确配置步骤
1. 创建Lambda执行角色(带信任策略)
先定义允许Lambda服务扮演该角色的信任策略:
resource "aws_iam_role" "lambda_exec_role" { name = "lambda-execution-role" # 信任策略:仅允许Lambda服务调用该角色 assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "sts:AssumeRole" Effect = "Allow" Principal = { Service = "lambda.amazonaws.com" } } ] }) }
2. 关联权限策略
把官方文档里的权限策略通过以下两种方式之一绑定到角色:
方式一:内嵌角色策略(适合单角色使用)
resource "aws_iam_role_policy" "lambda_permissions" { name = "lambda-function-permissions" role = aws_iam_role.lambda_exec_role.id policy = jsonencode({ # 这里填入AWS官方文档提供的完整权限策略内容 Version = "2012-10-17" Statement = [ { Effect = "Allow" Action = [ "s3:GetObject", "logs:CreateLogStream", "logs:PutLogEvents" # 其他你需要的权限操作 ] Resource = [ "arn:aws:s3:::your-target-bucket/*", "arn:aws:logs:${var.aws_region}:${data.aws_caller_identity.current.account_id}:log-group:/aws/lambda/*:*" ] } ] }) }
方式二:独立策略+附加(适合多角色复用)
如果这个权限策略需要给多个Lambda角色使用,推荐先创建独立的IAM策略再附加:
# 创建独立的权限策略 resource "aws_iam_policy" "lambda_common_permissions" { name = "lambda-common-permission-policy" description = "Shared permissions for Lambda functions" policy = jsonencode({ # 填入官方文档的权限策略内容 Version = "2012-10-17" Statement = [ { Effect = "Allow" Action = "logs:CreateLogGroup" Resource = "arn:aws:logs:${var.aws_region}:${data.aws_caller_identity.current.account_id}:*" }, # 其他权限语句 ] }) } # 将策略附加到Lambda执行角色 resource "aws_iam_role_policy_attachment" "lambda_policy_attach" { role = aws_iam_role.lambda_exec_role.name policy_arn = aws_iam_policy.lambda_common_permissions.arn }
核心规则区分
| 类型 | 作用 | 允许字段 | Terraform配置位置 |
|---|---|---|---|
| 信任策略(Trust) | 控制谁能扮演该角色 | Principal、Action(sts:AssumeRole)、Effect | aws_iam_role.assume_role_policy |
| 权限策略(Permission) | 控制角色能执行哪些操作 | Action、Resource、Effect、Condition | aws_iam_role_policy 或 aws_iam_policy + aws_iam_role_policy_attachment |
内容的提问来源于stack exchange,提问作者BillRobertson42
相关产品推荐
相关产品推荐

