Eu tenho uma função lambda usando o Nó 12.
Eu preciso adicionar uma nova conexão para um Redis banco de dados hospedado no AWS ElastiCache.
Ambos estão na privada de um VPC e os grupos de segurança/sub-redes estão configuradas corretamente.
Solução:
globals.js:
const redis = require('redis');
const redisClient = redis.createClient(
`redis://${process.env.REDIS_HOST}:${process.env.REDIS_PORT}/${process.env.REDIS_DB}`,
);
redisClient.on('error', (err) => {
console.log('REDIS CLIENT ERROR:' + err);
});
module.exports.globals = {
REDIS: require('../helpers/redis')(redisClient),
};
index.js (fora da rotina de tratamento):
const { globals } = require('./config/globals');
global.app = globals;
const lambda_handler = (event, context, callback) => { ... }
exports.handler = lambda_handler;
helpers/redis/index.js:
const get = require('./get');
module.exports = (redisClient) => {
return {
get: get(redisClient)
};
};
helpers/redis/get.js:
module.exports = (redisClient) => {
return (key, cb) => {
redisClient.get(key, (err, reply) => {
if (err) {
cb(err);
} else {
cb(null, reply);
}
});
};
};
Chamada da função:
app.REDIS.get(redisKey, (err, reply) => {
console.log(`REDIS GET: ${err} ${reply}`);
});
Problema: Quando o aumento do lambda de tempo limite para um valor maior do que o Redis tempo de espera, recebo este erro:
REDIS CLIENTE de ERRO:Erro: Redis conexão para ... falha - ligar ETIMEDOUT ...
Adição:
Eu tentei quiting/fechar a conexão após cada transação:
module.exports = (redisClient) => {
return (cb) => {
redisClient.quit((err, reply) => {
if (err) {
cb(err);
} else {
cb(null, reply);
}
});
};
};
app.REDIS.get(redisKey, (err, reply) => {
console.log(`REDIS GET: ${err} ${reply}`);
if (err) {
cb(err);
} else {
if (reply) {
app.REDIS.quit(() => {
cb()
});
}
}
})
Erro:
REDIS OBTER: AbortError: GET pode não ser processadas. A conexão já está fechado.
Notas Extras:
- Eu tenho para utilizar chamadas de retorno, é por isso que eu passar uns nos exemplos acima
- Eu estou usando
"redis": "^3.0.2"
- Não é um problema de configuração como o cache foi acessado mais de uma centena de vezes em um pequeno período de tempo, mas, em seguida, começou a dar os erros de tempo limite.
- Tudo funciona normalmente localmente