You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)、Effectaws_iam_role.assume_role_policy
权限策略(Permission)控制角色能执行哪些操作Action、Resource、Effect、Conditionaws_iam_role_policy 或 aws_iam_policy + aws_iam_role_policy_attachment

内容的提问来源于stack exchange,提问作者BillRobertson42

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 18:42:41