如何在AWS Lambda中访问Memcache?连接超时无报错问题排查
故障排查方向
- VPC网络配置问题
AWS ElastiCache Memcached 是部署在私有VPC内的服务,默认不允许公网访问。如果Lambda函数没有配置和Memcached实例相同的VPC,无法建立网络连接,客户端会一直尝试握手最终导致函数超时,memcache-plus默认未设置连接超时时间,所以不会抛出可捕获的错误,会直接卡住到函数触发超时。
检查点:- 确认Lambda执行角色附加了
AWSLambdaVPCAccessExecutionRole权限策略 - 确认Lambda配置的VPC、子网、安全组和Memcached实例完全一致
- 确认Lambda执行角色附加了
- 安全组规则配置问题
确认Memcached实例关联的安全组入站规则放开了Lambda对应的安全组的11211端口访问,不要配置公网IP作为源,直接引用Lambda的安全组ID作为入站源即可。 - 客户端初始化配置问题
当前代码在Lambda冷启动全局作用域初始化Memcached客户端,且没有配置超时参数,一旦首次连接失败,后续复用执行环境的客户端也会一直处于未就绪状态,建议修改客户端初始化代码增加超时配置:const MemcachePlus = require("memcache-plus"); const client = new MemcachePlus({ hosts: ["test_memcached.cfg.use1.cache.amazonaws.com:11211"], // 连接超时时间设置为1.5秒,避免长时间等待导致函数超时 connectTimeout: 1500, // 关闭自动重连,避免错误时无限重试 autoreconnect: false }); exports.index = async (event) => { try { await client.set("firstName", "Victor", 10000); console.log("Successfully set the key firstName"); const firstName = await client.get("firstName"); console.log(`Successfully got the key firstName: ${firstName}`); } catch (e) { console.log("error", e); // 出错后销毁客户端,下次执行重新初始化 client.disconnect(); } } - 函数超时时间设置过短
确认Lambda函数的超时时间设置大于3秒,首次冷启动连接Memcached需要额外的握手时间,如果超时设置低于3秒会直接在首次连接时触发超时。
内容的提问来源于stack exchange,提问作者Pat Cummins
相关产品推荐
相关产品推荐

