如何使用Golang编写的AWS Lambda函数连接Redis ElastiCache
问题解答
- 不使用EC2实例的连接可行性:AWS ElastiCache Redis默认仅分配VPC内网私有地址,无公网访问入口。如果你使用的Linux环境已经通过VPN、专线、VPC对等连接等方式和Redis所在的VPC网络打通,无需EC2即可直接连接;如果是公网环境下的Linux主机,没有打通VPC网络的话无法直接连接。RDM(Redis Desktop Manager)的连接逻辑一致,只要运行RDM的设备网络能直达Redis私有端点,就可以正常测试连接,否则无法访问。
- Golang代码中配置Redis端点,需要结合你的ElastiCache配置调整参数:如果你的Redis未开启传输加密(TLS)、未开启AUTH,仅需要填写端点+默认端口6379即可;如果开启了传输加密,需要额外加TLS配置,否则会出现连接超时的问题。
- 未开启AUTH的情况下,也需要满足两个前提才能仅通过端点连接:一是运行代码的环境和Redis网络互通,二是Redis没有开启传输加密。如果开启了传输加密哪怕没有设置AUTH,也需要在代码中配置TLS参数才能成功连接,否则会出现连接超时/失败的问题。
Golang连接示例
以常用的github.com/go-redis/redis/v8库为例,Lambda处理函数参考实现如下:
未开启TLS、未开启AUTH场景
package main import ( "context" "github.com/aws/aws-lambda-go/lambda" "github.com/go-redis/redis/v8" ) var redisClient *redis.Client var ctx = context.Background() func init() { // 替换为你的Redis主节点端点,默认端口为6379 redisAddr := "xxxxxx:6379" redisClient = redis.NewClient(&redis.Options{ Addr: redisAddr, DB: 0, // 使用默认DB }) } func handler() (string, error) { // 测试连通性 pong, err := redisClient.Ping(ctx).Result() if err != nil { return "", err } return "Redis连接成功:" + pong, nil } func main() { lambda.Start(handler) }
开启传输加密、未开启AUTH场景(超时问题高发场景)
package main import ( "context" "crypto/tls" "github.com/aws/aws-lambda-go/lambda" "github.com/go-redis/redis/v8" ) var redisClient *redis.Client var ctx = context.Background() func init() { // 替换为你的Redis主节点端点,开启TLS时默认仍使用6379端口,部分特殊配置使用6380 redisAddr := "xxxxxx:6379" redisClient = redis.NewClient(&redis.Options{ Addr: redisAddr, DB: 0, TLSConfig: &tls.Config{ InsecureSkipVerify: false, // 生产环境请勿修改为true,AWS官方证书默认可信 }, }) } func handler() (string, error) { pong, err := redisClient.Ping(ctx).Result() if err != nil { return "", err } return "Redis连接成功:" + pong, nil } func main() { lambda.Start(handler) }
超时问题快速排查
- 确认Lambda的超时时间设置大于3秒,避免连接还未建立就被Lambda强制终止
- 确认Redis所在安全组的入站规则,允许Lambda关联的安全组访问6379端口
- 确认ElastiCache控制台的传输加密配置,和代码中的TLS参数保持一致
内容的提问来源于stack exchange,提问作者rulisastra
相关产品推荐
相关产品推荐

