首页 文章

为什么SNS不会触发我的lambda?

提问于
浏览
5

我有一个AWS lambda函数,我通过apex创建 . 我还通过terraform创建了一个SNS主题和一个订阅 .

我的主题是: arn:aws:sns:ap-southeast-1:178284945954:fetch_realm_auctions

我有一个订阅: arn:aws:sns:ap-southeast-1:178284945954:fetch_realm_auctions:2da1d182-946d-4afd-91cb-1ed3453c5d86 ,类型为 lambda , endpoints 为: arn:aws:lambda:ap-southeast-1:178284945954:function:wowauctions_get_auction_data

我已经确认这是ARN的正确功能 . 一切似乎正确连线:

SNS picture

我手动触发SNS:

aws sns publish 
  --topic-arn arn:aws:sns:ap-southeast-1:178284945954:fetch_realm_auctions 
  --message '{"endpoint": "https://us.api.battle.net", "realm": "spinebreaker"}'

它返回消息ID但不会发生调用 . 为什么?

4 回答

  • 5

    我添加了一个内联策略来允许调用lambda:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "Stmt1474873816000",
                "Effect": "Allow",
                "Action": [
                    "lambda:InvokeFunction"
                ],
                "Resource": [
                    "arn:aws:lambda:ap-southeast-1:178284945954:function:wowauctions_get_auction_data"
                ]
            }
        ]
    }
    

    它现在正在运作 .

  • 0

    正如Robo在评论中提到的,添加基于 Principal 的权限是最简单的方法:

    "FooFunctionPermission" : {
        "Type" : "AWS::Lambda::Permission",
        "Properties" : {
            "Action" : "lambda:InvokeFunction",
            "FunctionName" : { "Ref" : "FooFunction" },
            "Principal" : "sns.amazonaws.com"
        }
    }
    
  • 0

    对我来说,问题是我在我的cloudformation模板中的 AWS::Lambda::Permission 中指定了 SourceAccount 参数,documentation表示以下内容:

    添加策略时,请勿使用--source-account参数将源帐户添加到Lambda策略 . Amazon SNS事件源不支持源帐户,并将导致访问被拒绝 . 这不会对安全性产生影响,因为源帐户包含在源ARN中 .

    我一删除 SourceAccount ,一切正常 .

  • 1

    有相同的问题:1)创建和部署简单的lambda 2)从java sdk手动创建aws sns主题3)从java sdk创建sns订阅(sns主题和lambda之间的订阅)

    然后我遇到了一个问题,当从控制台向主题推送一些消息时 - 它没有被lambda拦截 . 而且,sns触发器甚至没有在lambda中注册 .

    所以我只使用这个命令解决了这个问题:https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html

    运行 aws lambda add-permission ...... 后,一切都被拿起并正常工作 .

相关问题