【发布时间】:2020-02-07 08:52:07
【问题描述】:
我试图在 Lambda 中使用 boto3 将消息发布到 SNS 主题,如下所示:
def publish_msg(msg, bar):
response = SNS.publish(
TopicArn='blah_blah_arn',
Message=msg,
MessageAttributes={
'foo': {
'DataType': 'String',
'StringValue': bar
}
}
)
这不起作用,因为它一直给我一个类似这样的身份验证错误:
Error publishing message because lambda_fn_role doesn't have the permissions to invoke SNS:Publish on resource blah_blah_arn
但我确信我对该函数的策略是正确的,所以我将 TopicARN 更改为 TargetARN,它起作用了!
所以我的问题是:主题和目标 ARN 有什么区别?什么时候应该使用一个而不是另一个?
AWS docs for boto3 根本不回答这个问题。
非常感谢!
【问题讨论】:
-
这确实很有趣!我同意文档在两者之间没有太大区别,除了说
TopicARN是“您要发布到的主题”。我可以理解在向非主题(例如移动应用程序)发布消息时应该使用TargetARN,但奇怪的是它也适用于发送到 SNS 主题!我刚刚进行了一些测试并验证了它对我使用TopicARN和TargetARN都有效。据推测,我对这两种情况都有足够的权限。 -
我建议您现在尝试将其改回,并且我怀疑无论您提供哪种选项,它都会按预期工作。我认为问题与执行角色的临时凭据的缓存有关,而不是与您的代码中的任何内容有关。要进行您所做的更改,您必须重新部署 Lambda 函数,该函数会自动将该函数部署到一个新容器中,并为执行角色提供一组新的临时凭证,这将解决该问题。如果您在之前部署之前不久或之后的任何时间编辑角色权限,这似乎特别有可能。
-
传奇@迈克尔!做到了,感谢您解释为什么这也有效,非常有帮助!
标签: boto3 amazon-sns