7

ラムダ関数呼び出しから一部のデータを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秒)になり、ラムダ呼び出しは失敗します。 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()); 

AmazonSNSClientの代わりにAmazonSNSAsyncClientを使ってみましたが、同じ結果が得られました。

私はここで何が欠けていますか?

+0

割り当てられたメモリ設定をmax。これにより、SNS APIコールの実行に必要な処理が高速化されます。あなたは現在、最も遅い設定でそれを持っています。その後、タイムアウト秒を長くしてみてください。タイムアウトする各AWSラムダ関数の呼び出しで何個のDynamoDBイベントを受信して​​いますか? –

+0

@EricHammondラムダコールごとに1つのイベントしか受信していません。私はそれがより多くの記憶と時間を必要とするのか疑問だ。ペイロードも非常に小さいです。また、SNS部分を追加すると、 'logger.log()'(受信したデータをログに記録する)への最初の呼び出しにも到達しません。 – Rohan

+0

Java関数は、NodeJSまたはPython関数よりもはるかに遅く、ラムダでより多くのメモリを必要とします。間違いなくタイムアウトと利用可能なメモリを増やすことから始めます。 –

答えて

5

私の質問にコメントした人は誰も答えていないので、私は自分自身でそれに答えます。

メモリ使用量を256 MBに増やし、タイムアウトを30秒に設定すると問題が解決したようです。

+0

どこが特にメモリ使用量を増やしタイムアウトしましたか? – TheQ

+0

今後の読者に:ラムダのVPCにNATゲートウェイがない場合、ネットワーク上の問題となる可能性があります。例えば、 https://stackoverflow.com/a/43234476/2442804 – luk2302

2

ラムダ操作に割り当てられるメモリ量を増やします。

関連する問題