如何为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" }
关于你的疑问
- 你的
aws_iam_policy_document不正确:它被错误用作信任策略,结构不符合信任策略的要求,且用途错误。 - 需要附加权限策略到角色,但要选对策略:你之前用的
AmazonSNSRole是AWS给SNS服务用的托管策略,不是给Lambda用来发布SNS的,所以不能用。上面的内联策略是最适合的方式,也可以创建自定义托管策略再通过aws_iam_role_policy_attachment附加,但内联更简单直接。
内容的提问来源于stack exchange,提问作者Stretch0
相关产品推荐
相关产品推荐

