7

我试图从Lambda函数调用向SNS发布一些数据,但似乎并没有工作。我的功能代码是 -从AWS 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

我拥有所有正确的权限在地方,我能够发布只用下面的代码在我的电脑上运行的SNS来 -

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

我也用AmazonSNSAsyncClient,而不是AmazonSNSClient,它给出了相同的结果尝试。

我在这里错过了什么?

+0

尝试将分配的内存设置增加到最大值。这将加快执行SNS API调用所需的处理。你目前的速度最慢。然后尝试增加超时秒数。在每个AWS Lambda函数调用中超时收到多少个DynamoDB事件? –

+0

@EricHammond每个lambda调用我只收到1个事件。我怀疑这需要更多的记忆和时间。有效载荷也非常小。另外,当我添加SNS部分时,即使是第一次调用logger.log()(记录接收到的数据的日志)也没有达到。 – Rohan

+0

Java函数启动速度肯定比较慢,需要比NodeJS或Python函数更多的Lambda内存。我肯定会开始增加超时和可用内存。 –

回答

5

好吧,因为没有人对我的问题发表评论,所以我会自己回答。

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

+0

哪里明确增加了内存使用量和超时? – TheQ

+0

对于未来的读者:如果您的lambda的VPC缺少NAT网关,它可能是一个网络问题。见例如https://stackoverflow.com/a/43234476/2442804 – luk2302

2

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