Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Aws lambda 连接到同一VPC中的Redis Elasticache时AWS Lambda超时_Aws Lambda_Redis_Amazon Vpc_Amazon Elasticache - Fatal编程技术网

Aws lambda 连接到同一VPC中的Redis Elasticache时AWS 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

试图从Lambda函数发布到Redis Elasticache,但我只是在Lambda函数超时的情况下继续得到
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,
    };
  }
};