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

如何为Lambda配置IAM策略实现SNS发布权限?Terraform报错排查

问题分析与解决

错误原因

你当前的核心问题是混淆了IAM角色的「信任策略」和「权限策略」:

  • assume_role_policy 是角色的信任策略,作用是指定谁能扮演这个角色,它的结构里不能包含Resource字段,且只能定义Principal(信任的实体)和允许的sts:AssumeRole动作。
  • 你把原本应该是权限策略的内容(允许sns:Publish)放到了信任策略里,导致Terraform报错「Has prohibited field Resource」。

修正后的代码实现

1. 定义Lambda的信任策略

首先创建正确的信任策略,允许AWS Lambda服务扮演这个角色:

data "aws_iam_policy_document" "lambda_assume_role_policy" {
  statement {
    effect = "Allow"
    principals {
      type        = "Service"
      identifiers = ["lambda.amazonaws.com"]
    }
    actions = ["sts:AssumeRole"]
  }
}

2. 创建IAM角色

将上面的信任策略关联到IAM角色:

resource "aws_iam_role" "lambda_iam_role" {
  name               = "sns_lambda_iam_role"
  assume_role_policy = data.aws_iam_policy_document.lambda_assume_role_policy.json
}

3. 配置SNS发布权限

通过内联策略给角色添加发布SNS消息的权限(比托管策略更精准):

resource "aws_iam_role_policy" "lambda_sns_publish" {
  name   = "Lambda-SNS-Publish-Permissions"
  role   = aws_iam_role.lambda_iam_role.id
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect   = "Allow"
        Action   = "sns:Publish"
        Resource = var.order_update_sns_topic_arn
      }
    ]
  })
}

4. 保留原Lambda函数配置(无需修改)

resource "aws_lambda_function" "DynamoDB_SNS_Lambda" {
  s3_bucket     = var.bucket_id
  s3_key        = "s3key.zip"
  handler       = "index.handler"
  runtime       = "nodejs16.x"
  role          = aws_iam_role.lambda_iam_role.arn
  function_name = "lambda_name"
}

关于你的疑问

  1. 你的aws_iam_policy_document不正确:它被错误用作信任策略,结构不符合信任策略的要求,且用途错误。
  2. 需要附加权限策略到角色,但要选对策略:你之前用的AmazonSNSRole是AWS给SNS服务用的托管策略,不是给Lambda用来发布SNS的,所以不能用。上面的内联策略是最适合的方式,也可以创建自定义托管策略再通过aws_iam_role_policy_attachment附加,但内联更简单直接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:10:33