我试图从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
,它给出了相同的结果尝试。
我在这里错过了什么?
尝试将分配的内存设置增加到最大值。这将加快执行SNS API调用所需的处理。你目前的速度最慢。然后尝试增加超时秒数。在每个AWS Lambda函数调用中超时收到多少个DynamoDB事件? –
@EricHammond每个lambda调用我只收到1个事件。我怀疑这需要更多的记忆和时间。有效载荷也非常小。另外,当我添加SNS部分时,即使是第一次调用logger.log()(记录接收到的数据的日志)也没有达到。 – Rohan
Java函数启动速度肯定比较慢,需要比NodeJS或Python函数更多的Lambda内存。我肯定会开始增加超时和可用内存。 –