从 AWS Lambda 发布到 SNS 时超时
Timeout when publishing from AWS Lambda to SNS
我正在尝试通过 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
,它给出了相同的结果。
我在这里错过了什么?
增加分配给 Lambda 操作的内存量。
嗯,因为 none 的评论我的问题的人正在回答,我会自己回答。
将内存使用量增加到 256 MB 并将超时增加到 30 秒似乎已经解决了这个问题。
增加分配给 lambda 函数的内存对我也有效(此设置在基本设置下的 lambda 控制台中)。
这让我很抓狂 - 我对具有相同配置的 2 个不同的 lambda 函数使用了相同的 JAR 文件,SNS 调用对一个有效,但对另一个超时。气死人了!
我正在尝试通过 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
,它给出了相同的结果。
我在这里错过了什么?
增加分配给 Lambda 操作的内存量。
嗯,因为 none 的评论我的问题的人正在回答,我会自己回答。
将内存使用量增加到 256 MB 并将超时增加到 30 秒似乎已经解决了这个问题。
增加分配给 lambda 函数的内存对我也有效(此设置在基本设置下的 lambda 控制台中)。
这让我很抓狂 - 我对具有相同配置的 2 个不同的 lambda 函数使用了相同的 JAR 文件,SNS 调用对一个有效,但对另一个超时。气死人了!