【发布时间】:2021-01-24 22:08:24
【问题描述】:
大家好,感谢您花时间查看我的问题。
在独立部署 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 资源时遇到问题?
谢谢
【问题讨论】:
-
我不知道您所说的“独立”与“应用程序堆栈”是什么意思,但这几乎可以肯定是网络配置问题。 Redis 服务器是否与 Lambda 函数位于同一 VPC 中? ElastiCache 集群的安全组是否允许从分配给 Lambda 函数的安全组进行入站访问?
-
马克,感谢您的回复。在 AWS Lambda 控制台的顶部左侧,您可以查看仪表板、应用程序或函数。应用程序只是 AWS 资源的集合,您可以将它们作为一个单元进行管理。因此,如果您有许多相关联的函数,您可以将它们放在一个堆栈中,以便更轻松地管理它们。这两个函数在同一个 VPC 中并作为同一个执行角色运行(因此它们的入站访问权限是相同的)。
-
执行角色是 IAM 权限的东西,它不是网络配置设置。如果缺少 IAM 权限,您将收到权限被拒绝错误,而不是网络连接挂起。您需要验证 Redis 集群的安全组的入站规则。
-
谢谢马克。我重新检查了两个 Lambda 上的 VPC 设置,它们是相同的。但我同意你的观点,这一定是连接问题……所以我向 ASW 开了一张票。经过一番反复,支持代表确认配置是相同的。他说这对他来说没有意义,所以他将其提高到下一个支持水平。如果/当我收到回复时,我会更新。
标签: node.js amazon-web-services aws-lambda amazon-elasticache