当前位置: 首页 > 知识库问答 >
问题:

AWS SNS应该触发我的lambda,但没有

姜楷
2023-03-14

我有一个通过顶点创建的 AWS lambda 函数。我还通过地球形态创建了一个SNS主题和订阅。

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

我有一个订阅:<code>arn:aws:sns:ap-southeast-1:178284945954:fetch_realm_auctions:2da1d182-946d-4afd-91cb-1ed3453c5d86

我已经确认这是正确的函数ARN。一切似乎都连接正确:

我手动触发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,但是没有调用发生。为什么?

共有3个答案

齐财
2023-03-14

对我来说,问题是我在AWS中指定了源帐户参数::Lambda::P在我的云信息模板和文档中声明如下:

添加策略时,不要使用--source account参数将源帐户添加到Lambda策略。Amazon SNS事件源不支持源帐户,这将导致访问被拒绝。由于源帐户包含在源ARN中,因此这对安全性没有影响。

一旦我删除了SourceUser,一切都正常。

孔棋
2023-03-14

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}"
}

解决此问题的一些一般提示(Lambda未被启动):

  1. 我的消息是否到达 Lambda? -- 将您的电子邮件地址订阅到 SNS 主题。如果您收到电子邮件,您将知道消息何时到达该主题。
  2. Lambda 是否已订阅该主题? -- 在 AWS 控制台中签到(在 SNS 下 -

一旦您确认了这些基本检查,并且您仍然没有看到任何调用,那一定是权限错误。当您在 AWS 控制台中打开 Lambda 时,您应该会看到 SNS 被列为触发器:

相比之下,如果缺少权限,您将看不到SNS:

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

  1. 添加触发器下选择SNS(您需要在列表中向下滚动才能看到它)
  2. 配置触发器中,选择SNS主题
  3. 单击添加并保存Lambda
司空修贤
2023-03-14

我添加了一个内联策略以允许调用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"
            ]
        }
    ]
}

它现在正在工作。

 类似资料:
  • 我有一个名为的类,它扩展了接口和。但是,当我使用该类并且不调用它的方法时,不会触发存在资源泄漏的警告。我还有一个名为的类,它有一个名为的方法,返回一个对象。当我以以下方式创建一个新的对象时,不会触发任何资源泄漏警告:

  • 在非gui模式下使用Jmeter 3.3进行分布式测试的过程中,我得到的错误是,如何修复此问题: 我在主机器和从机器上使用相同版本的JMeter和JDK。 JVM应该已经退出,但没有退出。以下非守护进程线程仍在运行(DestroyJavaVM正常):线程[main,5,main],

  • 我目前有一个AWS Lambda函数正在更新DynamoDB表,我需要另一个Lambda函数,该函数需要在数据更新后运行。在这种情况下,使用DynamoDB触发器而不是使用第一个Lambda调用第二个Lambda有什么好处吗? 看起来编程调用会让我更好地控制何时调用Lambda(即。我可以在调用之前等待几个更新发生),并且从DynamoDB Stream读取会花钱,而简单地调用Lambda不会。

  • 背景: 我正在通过Terraform开发一个自定义AWS github webhook。我使用AWS API网关触发一个AWS Lambda函数,该函数从请求头验证GitHub webhook的sha256签名。如果lambda函数成功验证了请求,我希望通过lambda提供的异步调用目标特性调用子lambda函数。 问题: 即使我已经使用目标子Lambda函数配置了异步调用,但当父Lambda函数

  • 我正在试验Dynamo db和lambda,并且在以下流程中遇到问题: Lambda A由put to S3事件触发。它获取对象(一个音频文件),计算其持续时间,并在dynamoDB中为每30秒的段写入一条记录。 Lambda B由DynamoDB触发,从S3下载文件并对Dynamo行中定义的30秒记录进行操作。 我的问题是,当我运行这个流时,函数A通过函数B写入Dynamo所需的所有行 似乎没有

  • 假设: 让我们假设数据插入DynamoDB的速率是巨大的。 上下文: 在DynamoDB表上启用流,这将触发lambda。lambda读取流记录,并在弹性搜索中对记录进行索引。 问题陈述: 在将记录插入DynamoDB的时间和通过流式记录触发lambda的时间之间存在延迟。这种延迟或滞后不断增加,并且与插入DynamoDB的数据量成正比。 如何找到滞后的位置?是流没有立即触发lambda吗?还是因