Aws lambda 连接到同一VPC中的Redis Elasticache时AWS Lambda超时
试图从Lambda函数发布到Redis Elasticache,但我只是在Lambda函数超时的情况下继续得到Aws lambda 连接到同一VPC中的Redis Elasticache时AWS Lambda超时,aws-lambda,redis,amazon-vpc,amazon-elasticache,Aws Lambda,Redis,Amazon Vpc,Amazon Elasticache,试图从Lambda函数发布到Redis Elasticache,但我只是在Lambda函数超时的情况下继续得到502坏网关响应 我使用同一VPC中的ECS成功连接到Elasticache实例,这让我觉得我的Lambda的VPC设置不正确。我试着遵循本教程()并查看了几个StackOverflow线程,但没有效果 Lambda函数: export const publisher=redis.createClient({ url:XXXXXX,//env var包含在ECS服务器中用于成功连接的ur
502坏网关
响应
我使用同一VPC中的ECS成功连接到Elasticache实例,这让我觉得我的Lambda的VPC设置不正确。我试着遵循本教程()并查看了几个StackOverflow线程,但没有效果
Lambda函数:
export const publisher=redis.createClient({
url:XXXXXX,//env var包含在ECS服务器中用于成功连接的url
});
导出常量处理程序=异步(
事件:AWSLambda.APIGatewayProxyWithCognitoAuthorizerEvent
):承诺
和我的Elasticache子网组:
以及我的Lambda VPC设置:
我的Lambda有权访问:
更新2:
试图逐字逐句地遵循教程()的内容,但遇到了相同的问题。没有日志,只是30秒后超时。以下是测试代码:
const crypto = require('crypto');
const redis = require('redis');
const util = require('util');
const client = redis.createClient({
url: 'rediss://clusterforlambdatest.9nxhfd.0001.use1.cache.amazonaws.com',
});
client.on('error', (e) => {
console.log(e);
});
exports.handler = async (event) => {
try {
const len = 24;
const randomString = crypto
.randomBytes(Math.ceil(len / 2))
.toString('hex') // convert to hexadecimal format
.slice(0, len)
.toUpperCase();
const setAsync = util.promisify(client.set).bind(client);
const getAsync = util.promisify(client.get).bind(client);
await setAsync(randomString, 'We set this string bruh!');
const doc = await getAsync(randomString);
console.log(`Successfully receieved document ${randomString} with contents: ${doc}`);
return;
} catch (e) {
console.log(e);
return {
statusCode: 500,
};
}
};
如果有超时,假设lambda网络配置良好,则应检查以下各项:
- redis SSL配置:检查redisS连接url和群集配置之间的差异(使用
tls:{}
进行传输加密和客户端配置)
- 使用特定的重试策略配置客户端,以避免lambda超时和捕获连接问题
- 检查VPC acl和安全组
您是否尝试将('error',cb)
侦听器添加到redis客户端以获取真正的错误?提示:您应该将publishAsync声明保留在处理程序之外,因为它是redisClient.publishUpdated原始帖子的异步版本。从不记录任何东西…我会检查几件事:redis ssl配置(检查redis连接url和群集配置之间的差异=>传输中加密+客户端配置tls:{}
),使用特定的重试策略配置客户端,检查VPC ACL。你能回答这个问题吗?我假设AWS在默认情况下会使用redis://
,但由于它只能在VPC中访问,所以默认使用redis://
。好的,我添加了一个答案
const crypto = require('crypto');
const redis = require('redis');
const util = require('util');
const client = redis.createClient({
url: 'rediss://clusterforlambdatest.9nxhfd.0001.use1.cache.amazonaws.com',
});
client.on('error', (e) => {
console.log(e);
});
exports.handler = async (event) => {
try {
const len = 24;
const randomString = crypto
.randomBytes(Math.ceil(len / 2))
.toString('hex') // convert to hexadecimal format
.slice(0, len)
.toUpperCase();
const setAsync = util.promisify(client.set).bind(client);
const getAsync = util.promisify(client.get).bind(client);
await setAsync(randomString, 'We set this string bruh!');
const doc = await getAsync(randomString);
console.log(`Successfully receieved document ${randomString} with contents: ${doc}`);
return;
} catch (e) {
console.log(e);
return {
statusCode: 500,
};
}
};