AWS Lambda 与 Elasticache 的连接超时

问题描述 投票:0回答:4

我正在尝试让 Serverless 与 Elasticache 配合使用。我基于 serverless-examples/serverless-infrastructure 存储库编写了一个自定义 CloudFormation 文件。我设法将 Elasticache 和 Lambda 放在一个子网中(使用 cli 检查)。我从输出中检索主机和端口,但每当我尝试与 node-redis 连接时,连接都会超时。以下是相关部分:

amazon-web-services aws-lambda amazon-elasticache serverless-framework
4个回答
14
投票

我也遇到了这个问题,但是是用Python。对我来说,有一些问题需要解决

  • lambda 需要VPC 权限
  • ElastiCache 安全组需要来自 Lambda 安全组的入站规则,以允许在 Redis 端口上进行通信。我以为他们可能只是在同一个安全组中。
  • 真正的亮点是:我打开了传输过程中的加密。这意味着我需要通过
    redis.RedisClient(... ssl=True)
    redis-py 页面提到
    ssl_cert_reqs
    需要设置为
    None
    才能与 ElastiCache 一起使用,但在我的情况下似乎并非如此。不过我确实需要通过
    ssl=True

需要设置

ssl=True
是有道理的,但连接只是超时,所以我一遍又一遍地试图找出权限/VPC/SG设置的问题是什么。


1
投票

就我而言,我的 Redis 集群有

TransitEncryptionEnabled: "true"
AuthToken: xxxxx

我确保我的 lambda 和 redis 集群都属于同一个“私有子网”。 我还确保我的“securityGroup”允许流量在所需端口上流动。

我面临的主要问题是我的 lambda 无法从我的 redis 集群获取数据。每当它尝试获取数据时,它都会抛出超时错误。

我使用 Node.Js 和“Node-Redis”客户端。

设置选项

tls: true
对我有用。如果您启用了传输加密,则这是强制设置。

这是我的配置:

import { createClient } from 'redis';
import config from "../config";

let options: any = {
 url: `redis://${config.REDIS_HOST}:${config.REDIS_PORT}`,
 password: config.REDIS_PASSWORD,
 socket: { tls: true }
};

const redisClient = createClient(options);

希望这个答案对那些在 lambda 中使用具有“Node-Redis”依赖项的 Node.Js 的人有所帮助。


0
投票

正如 Tolbahady 指出的,唯一的解决方案是在 VPC 内创建 NAT。


0
投票

@feus4177 是💯 对的。启用加密后,您需要设置

tls: true

const Redis = require('ioredis');
const AWS = require('aws-sdk');



const TIME_WINDOW = 60; // seconds

exports.handler = async (event) => {

    const redis = new Redis({
        host: process.env.REDIS_HOST,
        port: process.env.REDIS_PORT,
        tls: true
    });
© www.soinside.com 2019 - 2024. All rights reserved.