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操作的內存量。