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

Kit*_*nde 10 amazon-web-services amazon-sns aws-lambda apex-framework

我有一个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类型,端点是:arn:aws:lambda:ap-southeast-1:178284945954:function:wowauctions_get_auction_data

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

SNS图片

我手动触发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"}'
Run Code Online (Sandbox Code Playgroud)

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

Phi*_*ßen 12

SNS 主题需要具有调用 Lambda 的权限。

以下是如何在 Terraform 中表达的示例:

# Assumption: both SNS topic and Lambda are deployed in the same region
# resource "aws_sns_topic" "instance" { ... }
# resource "aws_lambda_function" "instance" {... }

# Step 1: Allow the SNS topic to invoke the Lambda
resource "aws_lambda_permission" "allow_invocation_from_sns" {
  statement_id  = "AllowExecutionFromSNS"
  action        = "lambda:InvokeFunction"
  function_name = "${aws_lambda_function.instance.function_name}"
  principal     = "sns.amazonaws.com"
  source_arn    = "${aws_sns_topic.instance.arn}"
}

# Step 2: Subscribe the Lambda to the SNS topic
resource "aws_sns_topic_subscription" "instance" {
  topic_arn = "${aws_sns_topic.instance.arn}"
  protocol  = "lambda"
  endpoint  = "${aws_lambda_function.instance.arn}"
}
Run Code Online (Sandbox Code Playgroud)

解决此问题的一些一般提示(未触发 Lambda):

  1. 我的消息是否到达 Lambda?-- 将您的电子邮件地址订阅到 SNS 主题。如果您收到电子邮件,您就会知道消息何时到达该主题。
  2. Lambda 是否订阅了主题?-- 在AWS控制台(在SNS->Topic下)检查订阅是否正确(endpoint必须与Lambda的ARN完全匹配)

一旦您确认了这些基本检查并且您仍然看不到调用,则必须是权限错误。当您在 AWS 控制台中打开 Lambda 时,您应该看到 SNS 列为触发器:

在此处输入图片说明

为了比较,如果权限缺失,您将看不到SNS:

在此处输入图片说明

如果您没有使用自动化部署(例如,使用 CloudFormation 或 Terraform),您还可以手动添加缺少的权限:

  1. 选择SNSAdd triggers(您需要在列表中向下滚动才能看到它)
  2. 在 中Configure triggers,选择 SNS 主题
  3. 单击Add并保存 Lambda


Kit*_*nde 10

我添加了一个内联策略来允许调用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"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

它现在正在运作.

  • 我花了一点时间来解决这个内联策略应该应用于_SNS topic_的问题。 (4认同)

dmi*_*ryb 5

对我来说,问题是我在 cloudformation 模板中指定了SourceAccount参数,文档说明如下:AWS::Lambda::Permission

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

当我删除后SourceAccount,一切都正常。