从 AWS Lambda 发布到 SNS 时超时

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

我尝试通过 Lambda 函数调用将一些数据发布到 SNS,但它似乎不起作用。我的功能代码是 -

public class Handler implements RequestHandler<DynamodbEvent, Void> {

    private static final String SNS_TOPIC_ARN = "arn:aws:sns:us-west-2:account_number:function_name";

    @Override
    public Void handleRequest(DynamodbEvent dynamodbEvent, Context context) {

        LambdaLogger logger = context.getLogger();

        AmazonSNSClient snsClient = new AmazonSNSClient(new DefaultAWSCredentialsProviderChain());
        snsClient.setRegion(Region.getRegion(Regions.US_WEST_2));

        for (DynamodbStreamRecord record : dynamodbEvent.getRecords()) {
            Map<String, AttributeValue> newImage = record.getDynamodb().getNewImage();

            if (newImage == null) {
                continue;
            }

            String sensorId = newImage.get("sensorID").getS();
            long timestamp = Long.parseLong(newImage.get("timestamp").getS());
            double temperature = Double.parseDouble(newImage.get("payload").getM().get("temp").getN());

            String data = sensorId + " " + timestamp + " " + temperature;

            logger.log(data);

            PublishRequest publishRequest = new PublishRequest(SNS_TOPIC_ARN, data);

            PublishResult publishResult = snsClient.publish(publishRequest);

            logger.log("Publish Successful " + publishResult.getMessageId());
        }

        snsClient.shutdown();

        return null;
    }
}

此调用会导致超时(10 秒)并且 lambda 调用失败。如果我注释掉 SNS 发布部分,即如果我只记录从 DynamoDB 收到的数据,它就可以正常工作。一旦添加SNS发布代码,就会超时。

CloudWatch 中记录的超时消息是 -

START RequestId: 8db74187-459b-42c5-8a06-b3a74873b236 Version: $LATEST
END RequestId: 8db74187-459b-42c5-8a06-b3a74873b236
REPORT RequestId: 8db74187-459b-42c5-8a06-b3a74873b236  Duration: 10001.66 ms   Billed Duration: 10000 ms   Memory Size: 128 MB Max Memory Used: 37 MB
Task timed out after 10.00 seconds

我拥有所有适当的权限,并且我可以使用在我的 PC 上运行的以下代码发布到 SNS -

PublishRequest publishRequest = new PublishRequest(SNS_TOPIC_ARN, data);
PublishResult publishResult = snsClient.publish(publishRequest);
System.out.println("Publish Successful " + publishResult.getMessageId());

我也尝试过使用

AmazonSNSAsyncClient
而不是
AmazonSNSClient
,它给出了相同的结果。

我在这里缺少什么?

java amazon-web-services amazon-sns aws-lambda aws-java-sdk
4个回答
10
投票

好吧,既然评论我问题的人都没有回答,那我自己来回答吧。

将内存使用量增加到 256 MB,并将超时时间增加到 30 秒似乎已经解决了问题。


2
投票

增加为 Lambda 操作分配的内存量。


0
投票

增加分配给 lambda 函数的内存也对我有用(此设置位于 lambda 控制台的基本设置下)。

这让我抓狂 - 我对 2 个具有相同配置的不同 lambda 函数使用相同的 JAR 文件,并且 SNS 调用对其中一个有效,但对另一个超时。令人抓狂!


0
投票

就我而言,问题是网络问题。如果 VPC 缺少 NAT 网关,VPC 中的 lambda 通常无法访问网络。这阻止了 SNS 的触发。

您可以通过为 Amazon SNS 创建 Amazon VPC 终端节点来解决此问题:

  • 在 Amazon VPC 控制台中,创建一个新终端节点
  • 选择 AWS 服务 com.amazonaws..sns
  • 选择您的 lambda vpc、所有子网、安全组

建立此 AWS PrivateLink 后,来自我的 Lambda 函数的 SNS 通知立即生效,无需对 SNS 或 Lambda 本身进行进一步更改。

© www.soinside.com 2019 - 2024. All rights reserved.