Jak połączyć się z instancją Redis za pomocą funkcji AWS Lambda?
Próbuję utworzyć interfejs API dla pojedynczej strony aplikacji internetowej przy użyciu
AWS Lambda
https://aws.amazon.com/lambda/
i
framework bezserwerowy
https://github.com/serverless/serverless... Chcę użyć
Redis Cloud
https://redislabs.com/redis-cloud
do przechowywania, głównie ze względu na połączenie szybkości i trwałości danych. W przyszłości mogę korzystać z większej liczby funkcji Redis Cloud, więc wolałbym nie używać do tego ElastiCache. Moja instancja Redis Cloud działa w tym samym regionie AWS, co moja funkcja.
Mam funkcję
related, która pobiera hashtag z żądania GET do punktu końcowego API i sprawdza, czy istnieje odpowiedni wpis w bazie danych. Jeśli tak, powinien natychmiast zwrócić wyniki. Jeśli nie, powinien poprosić
RiteTag
https://ritetag.com/, zapisz wyniki w Redis, a następnie zwróć je użytkownikowi.
Jestem całkiem nowy w tej dziedzinie, więc prawdopodobnie robię coś uroczo naiwnego. Oto program obsługi zdarzeń:
'use strict'const lib = require('../lib/related')module.exports.handler = function (event, context) {
lib.respond(event, (err, res) => {
if (err) {
return context.fail(err)
} else {
return context.succeed(res)
}
})
}
Oto plik
../lib/related.js:
var redis = require('redis')
var jsonify = require('redis-jsonify')
var rt = require('./ritetag')
var redisOptions = {
host: process.env.REDIS_URL,
port: process.env.REDIS_PORT,
password: process.env.REDIS_PASS
}
var client = jsonify(redis.createClient(redisOptions))module.exports.respond = function (event, callback) {
var tag = event.hashtag.replace(/^#/, '')
var key = 'related:' + tag client.on('connect', () => {
console.log('Connected:', client.connected)
}) client.on('end', () => {
console.log('Connection closed.')
}) client.on('ready', function () {
client.get(key, (err, res) => {
if (err) {
client.quit()
callback(err)
} else {
if (res) {
// Tag is found in Redis, so send results directly.
client.quit()
callback(null, res)
} else {
// Tag is not yet in Redis, so query Ritetag.
rt.hashtagDirectory(tag, (err, res) => {
if (err) {
client.quit()
callback(err)
} else {
client.set(key, res, (err) => {
if (err) {
callback(err)
} else {
client.quit()
callback(null, res)
}
})
}
})
}
}
})
})
}
To wszystko działa do pewnego stopnia zgodnie z oczekiwaniami. Jeśli uruchomię funkcję lokalnie (używając
sls function run related) nie mam problemu - tagi są odczytywane i zapisywane w bazie danych Redis tak, jak powinny. Jednak po wdrożeniu (przy użyciu
sls dash deploy) działa w
pierwszy raz uruchamia się po wdrożeniu
a następnie przestaje działać. Wszystkie kolejne próby uruchomienia go po prostu zwracają
nulldo przeglądarki (lub Postman, curl lub aplikacji internetowej). To prawda, niezależnie od tego, czy tag, którego używam do testowania, jest już w bazie danych, czy nie. Jeśli następnie wdrożę ponownie bez wprowadzania zmian w samej funkcji, będzie ona działać ponownie - raz.
Na moim komputerze lokalnym funkcja najpierw rejestruje
Connected: truew konsoli, następnie wyniki zapytania, a następnie
Connection closed.na AWS loguje
Connected: true, następnie wyniki zapytania i to wszystko. Przy drugim uruchomieniu rejestruje
Połączenie zamknięte.i nic więcej. Przy trzecim i wszystkich kolejnych uruchomieniach w ogóle nic nie rejestruje. Żadne środowisko nie zgłasza żadnych błędów.
Wydaje się całkiem jasne, że problem dotyczy połączenia Redis. Jeśli nie zamknę go w callbackach, kolejne próby wywołania funkcji po prostu wygasną. Próbowałem też użyć
redis.unrefzamiast
redis.quit, ale nie miało to żadnego znaczenia.
Każda pomoc byłaby bardzo mile widziana.
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
1 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Podczas łączenia się z bazą danych należy wziąć pod uwagę dwie główne kwestie, tak jak to zrobiłem w powyższym kodzie z funkcji Lambda:
Oto mój zaktualizowany kod. Zauważ, że umieściłem również moją konfigurację Redis w osobnym pliku, aby móc zaimportować ją do innych funkcji Lambda bez powielania kodu.
Obsługa zdarzeń
>
Konfiguracja Redis
>
Funkcjonować
>
Działa dokładnie tak, jak powinno - i bardzo szybko.