如何解决尝试从连接到 VPC 的 Lambda 函数发布 SNS 消息失败的原因

问题描述 投票:0回答:1

我有一个非常简单的 Lambda 函数:

import boto3

def lambda_handler(event, context):
    snsTopicArn="arn:aws:sns:us-west-2:REDACTED:keiths-test-topic"
    snsClient = boto3.client('sns')
    message="This is a test"
    print("before snsClient.publish")
    response = snsClient.publish(TopicArn=snsTopicArn, Message=message, Subject="This is a test")
    print(response)
    return(response)

当我运行它时,它会挂在 snsClient.publish() 语句处,直到函数超时。我已将超时设置为一分钟多,但没有帮助。 Lambda 函数连接到我的 VPC,该 VPC 确实有一个 Internet 网关,因此我认为它在访问适当的 AWS API 端点时不会有任何问题。如果我运行相同的函数,但没有将其连接到我的 VPC,它确实会按预期运行。所以,这个问题似乎确实与从我的 VPC 运行它有关。

请注意,如果我从在同一 VPC、同一子网中运行的 EC2 实例运行完全相同的代码,它运行得很好。

当然,这只是一段较大代码的代码段,该代码也从 S3 存储桶中读取,但由于某种原因,如果它尝试读取不存在的对象,它就会挂起。不知道这两次挂是否有关联

我创建了一个附加到我的 VPC 和子网的 SNS VPC 终端节点。与其关联的 SG 具有允许来自 VPC CIDR 的所有流量的入站规则,并具有不受限制的出站规则。

我尝试增加 Lambda 函数超时。没有改变任何东西。

我尝试为 Lambda 函数提供所有 SNS 权限,认为这可能是权限问题,但这并没有改变任何东西。

如果有人有任何想法可能导致此问题,和/或应该注意什么来尝试诊断它,我将非常感谢您的来信。谢谢!

aws-lambda boto3 amazon-sns
1个回答
0
投票

首先,SNS 就像 S3 一样是一项全球服务,因此您不需要将其附加到 lambda 函数上的自定义 VPC 来推送到 SNS 主题来澄清:)

我不知道您的 VPC 设置,可能有很多问题,但当您说它在 EC2 实例上运行但不适用于您的 Lambda 函数时,这听起来像是 VPC 问题。

因此,如果您因任何原因不需要 Lambda 上的自定义 VPC,我将尝试在没有该 VPC 的情况下尝试一下,看看会发生什么。

您的语法看起来不错,所以根据您的信息,我会尝试一下,通常我从 AWS CDK 代码创建 Lambda 和 SNS 主题,因为如果我遇到困难,它可以让我更快地获得帮助,因为我可以共享我的基础设施代码,这样给你的小建议:)

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.