当前位置:  开发笔记 > 编程语言 > 正文

从AWS Lambda发布到SNS时超时

如何解决《从AWSLambda发布到SNS时超时》经验,为你挑选了1个好方法。

我正在尝试从Lambda函数调用向SNS发布一些数据,但它似乎不起作用.我的功能代码是 -

public class Handler implements RequestHandler {

    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 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,它给出了相同的结果.

我在这里错过了什么?



1> Rohan..:

好吧,既然没有评论我的问题的人回答,我会自己回答.

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


对于未来的读者:如果您的Lambda的VPC缺少NAT网关,那很可能是网络问题。参见例如/sf/ask/17360801/
推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有