我正在尝试从Lambda函数调用向SNS发布一些数据,但它似乎不起作用.我的功能代码是 -
public class Handler implements RequestHandler{ 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 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
我已经拥有所有适当的权限,并且我只能使用在我的PC上运行的以下代码发布到SNS -
PublishRequest publishRequest = new PublishRequest(SNS_TOPIC_ARN, data); PublishResult publishResult = snsClient.publish(publishRequest); System.out.println("Publish Successful " + publishResult.getMessageId());
我也尝试使用AmazonSNSAsyncClient
而不是AmazonSNSClient
,它给出了相同的结果.
我在这里错过了什么?
好吧,既然没有评论我的问题的人回答,我会自己回答.
将内存使用量增加到256 MB并将超时时间增加到30秒似乎已经解决了这个问题.