以编程方式向 AWS 中的 Lambda 函数添​​加(和启用)SNS 触发器

Programmatically adding (and enabling) SNS Trigger to Lambda Function in AWS

有没有人以编程方式将 SNS 主题添加为 AWS 中的 Lambda 函数的触发器并以编程方式启用它?我正在尝试使用 Powershell AWS SDK 执行以下操作,并且可以执行所有操作,但要启用它。

首先,我找到我的主题之一 (myTopic):

$snsTopicArn = (Get-SNSTopic | {$_.TopicArn -match "myTopic"}).TopicArn

准备订阅 lambda 端点 ($lambdaARN)

Connect-SNSNotification -TopicArn $snsTopicArn -Protocol lambda -Endpoint $lambdaArn `
                        -Confirm:$FALSE | Out-Null

因为这个函数 returns 是订阅 arn 而不是令牌,文档告诉我假设订阅已经自动确认并且不需要 "ConfirmSubscription" (Confirm-SNSSubscription) 调用.

接下来,我将此主题的 Lambda 资源策略权限添加到 运行 Lambda。

Add-LMPermission -FunctionName $lambdaName -Action "lambda:Invoke" `
                 -Principal sns.amazonaws.com -SourceArn $snsTopicArn `
                 -StatementId (Get-Random) | Out-Null

此时该主题出现在该主题的触发器列表中,但未启用。

有什么想法吗?

对于任何感兴趣的人,我找到了答案。事实证明输入有效的 lambda 操作很重要。 :)

在与 AWS 支持人员交谈了大约一个小时后,我发现我没有在 "add permission" 调用中指定有效的 lambda 操作:

lambda:Invoke

实际上应该是这样的:

lambda:InvokeFunction

或这个通配符表达式:

lambda:Invoke*

"Invoke" 是函数名,不是动作(权限)名。他们的关系在这里提到: http://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html

如有疑问,AWS 有一个策略模拟器,列出了针对其服务的所有 AWS 操作: https://policysim.aws.amazon.com/