Возможность подключения к Redis, но установка/получение тайм-аута

Я пытаюсь выполнить get() из моей AWS Lambda (NodeJS) на ElastiCache Redis, используя клиент node_redis. Я считаю, что могу подключиться к Redis, но у меня истекает время ожидания (тайм-аут Lambda 60 секунд), когда я пытаюсь выполнить операцию get().

Я также предоставил доступ администратора AWS lambda, чтобы быть уверенным, что это не проблема с разрешениями. Я нажимаю лямбду, заходя в консоль AWS и нажимая кнопку «Тест».

Вот мой redisClient.js:

const util = require('util');
const redis = require('redis');

console.info('Start to connect to Redis Server');
const client = redis.createClient({
    host: process.env.ElastiCacheEndpoint,
    port: process.env.ElastiCachePort
});

client.get = util.promisify(client.get);
client.set = util.promisify(client.set);

client.on('ready',function() {
    console.log(" subs Redis is ready");  //Can see this output in logs
});

client.on('connect',function(){
    console.log('subs connected to redis'); //Can see this output in logs
})

exports.set = async function(key, value) {
    console.log("called set!");
    return await client.set(key, value);
}

exports.get = async function(key) {
    console.log("called get!"); //Can see this output in logs
    return await client.get(key);
}

Вот мой index.js, который вызывает redisClient.js:

const redisclient = require("./redisClient");

exports.handler = async (event) => {
    const params = event.params
    const operation = event.operation;
    try {

        console.log("Checking RedisCache by calling client get") // Can see this output in logs
        const cachedVal = await redisclient.get('mykey');
        console.log("Checked RedisCache by calling client get") // This doesn't show up in logs.
        console.log(cachedVal);
        if (cachedVal) {
            return {
                statusCode: 200,
                body: JSON.stringify(cachedVal)
            }
        } else {
            const setCache = await redisclient.set('myKey','myVal');
            console.log(setCache);
            console.log("*******")
            let response = await makeCERequest(operation, params, event.account);
            console.log("CE Request returned");
            return response;

        }
    }
    catch (err) {
        return {
            statusCode: 500,
            body: err,
        };
    }
}        

Это вывод (сообщение об ошибке тайм-аута), который я получаю:

{
  "errorMessage": "2020-07-05T19:04:28.695Z 9951942c-f54a-4b18-9cc2-119eed65e9f1 Task timed out after 60.06 seconds"
}

Я пытался использовать Bluebird (изменив getAsync()) на это: https://github.com/UtkarshYeolekar/promisify-redis-client/blob/master/redis.js, но все равно ведет себя так же.

Я также изменил порт, чтобы использовать случайное значение (например, 8088), которое я использую для создания клиента (чтобы увидеть поведение события подключения для неудачного подключения) - в этом случае я все еще вижу ответ об ошибке Timed Out, но я не не вижу subs Redis is ready и subs connected to redis в моих журналах.

Может ли кто-нибудь указать мне в правильном направлении? Кажется, я не понимаю, почему я могу подключиться к Redis, но время ожидания запроса get() истекло.


person Vimanyu    schedule 05.07.2020    source источник
comment
Ваша лямбда в VPC? Вы пробовали этот код в своей локальной среде с локальным сервером Redis?   -  person Ersoy    schedule 05.07.2020
comment
Да, лямбда находится в VPC. Я попробовал этот код в своем локальном компьютере, используя локальный Redis, но без имитации локальной лямбды (просто запустил часть кода, которая делает запросы на получение/установку и обрабатывает события connect и ready).   -  person Vimanyu    schedule 06.07.2020


Ответы (1)


Я понял проблему и разместил здесь сообщение на случай, если это поможет кому-то в будущем, поскольку поведение было не очень интуитивным для меня.

Я включил параметр AuthToken при настройке Redis. Я передавал параметр лямбда с переменными среды, но не использовал его при отправке запросов get()/set(). Когда я отключил требование AuthToken в конфигурации Redis, Lambda смогла поразить Redis запросами на получение/установку. Дополнительные сведения об AuthToken можно найти здесь: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-authtoken

person Vimanyu    schedule 05.07.2020