node.js - 独立部署 AWS Lambda 与在应用程序堆栈中部署的不同行为
问题描述
大家好,感谢您花时间查看我的问题/问题。
在独立部署 AWS Lambda 与在应用程序堆栈中部署时,我得到了不同的结果。
我正在尝试从我的 Lambda 中连接到 AWS Elasticache Redis。我有可以连接的 .Net Core 3.1 Lambdas(使用 StackExchange.Redis)。但我还需要能够从我的 Node.js Lambda 进行连接。
对于 Node.js Lambda,我使用的是“node-redis”和“async-redis”。我有两个基本相同的 Lambda,除了一个部署在应用程序堆栈中,另一个部署为独立 Lambda。两个 Lambda 引用相同的 Lambda 层(即相同的“node_modules”),具有相同的 VPC 设置、相同的执行角色和基本相同的代码。所以他们把它推到了另一个小组。
独立的 Lambda 连接到 Redis 没有问题。应用程序堆栈 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 资源时遇到问题?
谢谢
解决方案
我通过大量的反复试验偶然发现了答案。这对 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);
}
推荐阅读
- asp.net-core - asp.net 核心中的相关性失败
- android - 我在 Eclipse 中找不到我保存的 android sdk
- ethereum - 是否可以在不消耗 Gas 的情况下从另一个合约调用合约函数?
- angular - 当我们在订阅函数中设置变量时更新Angular6中的视图
- ios - 如何在滚动视图中添加所有(标签、按钮、子视图)?
- javascript - 使用 cors-anywhere.herokuapp 下载图片
- java - 不兼容的类型:类
不能转换为类 - >
- javascript - 空文本框的Javascript ScrollToView不起作用-Chrome
- solr - Solr-Lucene 支持同一字段中的多种语言标记
- python - OpenCV中的渐变方向