大家好,感谢您抽出宝贵时间来查看我的问题。
独立部署AWS Lambda与在应用程序堆栈中部署时,我得到不同的结果。
我正在尝试从Lambda内部连接到AWS Elasticache Redis。我有可以连接的.Net Core 3.1 Lambda(使用StackExchange.Redis)。但是我还需要能够从Node.js Lambdas连接。
对于Node.js Lambda,我使用的是“ node-redis”和“ async-redis”。我有两个Lambda,它们基本相同,除了一个Lambda部署在应用程序堆栈中,另一个部署为独立Lambda。两个Lambda引用相同的Lambda层(即,相同的“ node_modules”),具有相同的VPC设置,相同的执行角色以及实质上相同的代码。因此,他们将其推到另一个小组。
独立的Lambda可以毫无问题地连接到Redis。 Application Stack Lambda不会,并且在完成之前退出处理,但不会引发任何错误。
起初我以为我可能只需要配置应用程序堆栈,但是找不到任何信息表明我们甚至可以配置应用程序堆栈。所以我很茫然。
独立的Lambda:
exports.handler = async (event) => {
const asyncRedis = require("async-redis");
const redisOptions =
{
host: "XXXXXXXXX.XXXXX.XXXX.use2.cache.amazonaws.com",
port: 6379
}
console.log('A');
const client = asyncRedis.createClient(redisOptions);
console.log(client);
console.log('B');
const value = await client.get("Key");
console.log('C');
console.log(value);
console.log('D');
console.log(client);
};
此函数的输出本质上是:
A
{RedisClient} --> the "client" object --> Shows connected = false
B
C
{ Correct Data From Redis }
D
{RedisClient} --> the "client" object --> Shows connected = true
应用程序堆栈Lambda:
async function testRedis2(event, context) {
console.log('In TestRedis2');
const asyncRedis = require("async-redis");
const redisOptions =
{
host: "XXXXXXXXX.XXXXX.XXXX.use2.cache.amazonaws.com",
port: 6379
}
console.log('A');
const client = asyncRedis.createClient(redisOptions);
console.log(client);
console.log('B');
var value = await client.get("Key");
console.log('C');
console.log(value);
console.log('D');
console.log(client);
}
module.exports = {
testRedis2
};
此函数的输出本质上是:
In TestRedis2
A
{RedisClient} --> the "client" object --> Shows connected = false
B
我不明白为什么它们的表现不一样。而且我不明白为什么我在输出中看不到更多条目。
是否有其他人遇到过从应用程序堆栈连接到VPC资源的问题?
谢谢
答案 0 :(得分:0)
我通过广泛的反复试验偶然发现了答案。对于Node / js开发人员来说,这可能是显而易见的,但是,以防万一其他Javascript / Node新手有同样的问题,我将在此处发布答案。
客户端的导入/请求和创建必须在模块的顶部。不在函数本身中。
因此,以下内容在我的应用程序堆栈中确实有效:
const asyncRedis = require("async-redis");
const redisOptions = {
host: "XXXXXXXXX.XXXXX.XXXX.use2.cache.amazonaws.com",
port: 6379
};
const client = asyncRedis.createClient(redisOptions);
async function redisGet(key: string){
// console.log('In redisGet');
return await client.get(key);
}