ラムダ関数呼び出しから一部のデータを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
を使ってみましたが、同じ結果が得られました。
私はここで何が欠けていますか?
割り当てられたメモリ設定をmax。これにより、SNS APIコールの実行に必要な処理が高速化されます。あなたは現在、最も遅い設定でそれを持っています。その後、タイムアウト秒を長くしてみてください。タイムアウトする各AWSラムダ関数の呼び出しで何個のDynamoDBイベントを受信していますか? –
@EricHammondラムダコールごとに1つのイベントしか受信していません。私はそれがより多くの記憶と時間を必要とするのか疑問だ。ペイロードも非常に小さいです。また、SNS部分を追加すると、 'logger.log()'(受信したデータをログに記録する)への最初の呼び出しにも到達しません。 – Rohan
Java関数は、NodeJSまたはPython関数よりもはるかに遅く、ラムダでより多くのメモリを必要とします。間違いなくタイムアウトと利用可能なメモリを増やすことから始めます。 –