Тайм-аут при публикации из AWS Lambda в SNS

Я пытаюсь опубликовать некоторые данные в 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, результат тот же.

Что мне здесь не хватает?


person Rohan    schedule 28.12.2015    source источник
comment
Попробуйте увеличить выделенную память до максимума. Это ускорит обработку, необходимую для выполнения вызовов API SNS. Сейчас у вас самая медленная настройка. Затем попробуйте увеличить время ожидания в секундах. Сколько событий DynamoDB вы получаете при каждом вызове функции AWS Lambda с истекшим временем ожидания?   -  person Eric Hammond    schedule 28.12.2015
comment
@EricHammond Я получаю только одно событие за один лямбда-вызов. Сомневаюсь, что для этого потребуется больше памяти и времени. Полезная нагрузка тоже очень маленькая. Кроме того, когда я добавляю часть SNS, даже первый вызов logger.log() (тот, который регистрирует полученные данные) не выполняется.   -  person Rohan    schedule 28.12.2015
comment
Функции Java определенно запускаются медленнее и требуют больше памяти в Lambda, чем функции NodeJS или Python. Я бы определенно начал с увеличения таймаута и доступной памяти.   -  person Mark B    schedule 28.12.2015
comment
Тайм-аут также может быть вызван тем, что запросы с использованием AWS SDK терпят неудачу, они автоматически повторяются с использованием экспоненциальной задержки. Это могло произойти, если ресурс не существует, есть проблема с разрешением или служба действительно не работает. Установите таймаут лямбда-функции более минуты или измените логику повтора SDK, чтобы полностью избежать этого типа тайм-аута.   -  person JaredHatfield    schedule 29.12.2015
comment
Похоже, это все-таки проблема с памятью. Спасибо ребята. Может ли кто-нибудь из вас опубликовать это в качестве ответа?   -  person Rohan    schedule 29.12.2015


Ответы (3)


Ну, так как никто из людей, прокомментировавших мой вопрос, не отвечает, я отвечу на него сам.

Увеличение использования памяти до 256 МБ и тайм-аута до 30 секунд, похоже, решило проблему.

person Rohan    schedule 31.12.2015
comment
где конкретно увеличили использование памяти и тайм-аут? - person TheQ; 24.01.2017
comment
Для будущих читателей: вполне может возникнуть проблема с сетью, если в VPC лямбды отсутствует шлюз NAT. См., Например, stackoverflow.com/a/43234476/2442804 - person luk2302; 24.07.2017

Увеличьте объем памяти, выделенной для операции Lambda.

person Josh Wulf    schedule 29.12.2015

У меня тоже сработало увеличение памяти, выделенной для лямбда-функции (этот параметр находится в консоли лямбда в основных настройках).

Это приводило меня в безумие - я использовал один и тот же файл JAR для двух разных лямбда-функций с идентичными конфигурациями, и вызов SNS работал для одной, а для другой истек время ожидания. Сводит с ума!

person ProductGuy1234    schedule 25.12.2018