如何连接到实例 Redis 来自功能 AWS Lambda?
我正在努力创造 API 对于单页Web应用程序使用
https://aws.amazon.com/lambda/
和
https://github.com/serverless/serverless
. 我想使用
https://redislabs.com/redis-cloud
用于存储,主要用于其速度和数据的组合。 在未来,我可以使用更多功能 Redis Cloud, 所以我不想用它 ElastiCache. 我的实例 Redis Cloud 在同一地区工作 AWS, 什么是我的功能。
我有一个功能
, 从请求中占用Hashteg GET 在终点 API 并检查数据库中是否存在条目。 如果他是,他必须立即返回结果。 如果不 , 他必须要求
https://ritetag.com/
, 记录结果B. Redis, 然后将结果返回给用户。
在这件事上,我是新手,所以,可能,我做了惊人的天真。 这是一个事件处理程序:
这是一个文件
:
所有这一切都在一定程度上。 如果我在本地启动函数 /使用
/, 我没有在数据库中读取和录制标签的问题 Redis, 应该是。 但是,当我部署它时 /使用
/, 它起作用B.
他第一次开始后 deployment
, 然后停止工作。 所有后续尝试运行它只是返回
在浏览器中 /或者 Postman, 或者 curl, 或Web应用程序/. 无论标签是否所在,都是如此,我在数据库中使用它用于测试。 如果我然后重新启动,在不对函数本身进行任何更改,它将获得一次。
在我的本地机器上,功能首页寄存器
在控制台中,然后查询结果,然后
在 AWS, 它注册
, 然后查询结果,就是这样。 通过第二个发布,IT注册
而不是别的。 在第三个和所有后续启动,他根本没有注册任何东西。 没有环境报告任何错误。
它似乎很明显这个问题已连接到 Redis. 如果我在反馈中没有关闭它,那么随后的导致该功能的尝试将简单地离开。 我也试图使用
反而
, 但似乎没有意义。
任何帮助都会非常感激。
https://aws.amazon.com/lambda/
和
https://github.com/serverless/serverless
. 我想使用
https://redislabs.com/redis-cloud
用于存储,主要用于其速度和数据的组合。 在未来,我可以使用更多功能 Redis Cloud, 所以我不想用它 ElastiCache. 我的实例 Redis Cloud 在同一地区工作 AWS, 什么是我的功能。
我有一个功能
related
, 从请求中占用Hashteg GET 在终点 API 并检查数据库中是否存在条目。 如果他是,他必须立即返回结果。 如果不 , 他必须要求
https://ritetag.com/
, 记录结果B. Redis, 然后将结果返回给用户。
在这件事上,我是新手,所以,可能,我做了惊人的天真。 这是一个事件处理程序:
'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/
}
}/
}
这是一个文件
../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/
}
}/
}
}/
}
}
}/
}/
}
所有这一切都在一定程度上。 如果我在本地启动函数 /使用
sls function run related
/, 我没有在数据库中读取和录制标签的问题 Redis, 应该是。 但是,当我部署它时 /使用
sls dash deploy
/, 它起作用B.
他第一次开始后 deployment
, 然后停止工作。 所有后续尝试运行它只是返回
null
在浏览器中 /或者 Postman, 或者 curl, 或Web应用程序/. 无论标签是否所在,都是如此,我在数据库中使用它用于测试。 如果我然后重新启动,在不对函数本身进行任何更改,它将获得一次。
在我的本地机器上,功能首页寄存器
Connected: true
在控制台中,然后查询结果,然后
Connection closed.
在 AWS, 它注册
Connected: true
, 然后查询结果,就是这样。 通过第二个发布,IT注册
Connection closed.
而不是别的。 在第三个和所有后续启动,他根本没有注册任何东西。 没有环境报告任何错误。
它似乎很明显这个问题已连接到 Redis. 如果我在反馈中没有关闭它,那么随后的导致该功能的尝试将简单地离开。 我也试图使用
redis.unref
反而
redis.quit
, 但似乎没有意义。
任何帮助都会非常感激。
没有找到相关结果
已邀请:
1 个回复
诸葛浮云
赞同来自:
连接到数据库时有两个基本注意事项,因为我在函数中的上面代码中所做的。 Lambda:
挑战后
,
或者
AWS 可能会冻结任何流程 , 哪个尚未完成。 这就是所做的 AWS 登记
通过第二个呼叫我的终点,API过程就在之前冻结了 Redis 他毕业于关闭,然后在下次召开时拒绝,之后他继续在他停止的地方继续,报告联系已关闭。 如果要关闭与数据库的连接,请确保完全关闭,
前
如何调用其中一种方法。 你能行的 , 通过将回调放置到在连接关闭时运行的事件处理程序 / 在我的情况下
/.
如果将代码划分为单独的文件和
他们在每个文件的顶部,就像我一样, Amazon 它将在内存中尽可能多的这些模块缓存。 如果导致问题,请尝试移动呼叫
在函数内,而不是在文件的顶部,然后导出此功能。 然后每次启动功能时都会重新导入这些模块。
这是我的更新代码。 请注意,我也放置了我的配置 Redis 在单独的文件中,以便我可以将其导入其他函数 Lambda 没有重复的代码。
事件处理程序
Redis 配置
功能
它完全相同,除此之外。