Я пытаюсь опубликовать некоторые данные в SNS из вызова функции Lambda, но похоже, что это не работает. Мой код функции -
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
У меня есть все необходимые разрешения, и я могу публиковать в SNS, используя только следующий код, работающий на моем ПК:
PublishRequest publishRequest = new PublishRequest(SNS_TOPIC_ARN, data);
PublishResult publishResult = snsClient.publish(publishRequest);
System.out.println("Publish Successful " + publishResult.getMessageId());
Я также пробовал использовать AmazonSNSAsyncClient
вместо AmazonSNSClient
, результат тот же.
Что мне здесь не хватает?
logger.log()
(тот, который регистрирует полученные данные) не выполняется. - person Rohan   schedule 28.12.2015