You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Lambda Node.js(v16)无法访问Aurora MySQL问题求助

问题分析与排查建议

问题概述

部署在AWS Lambda的Node.js 16应用连接Aurora MySQL时出现权限拒绝错误:

{
  "errorType": "Error",
  "errorMessage": "ER_ACCESS_DENIED_ERROR: Access denied for user 'mailQueue'@'172.31.40.76' (using password: YES)",
  "trace": [
    "Error: ER_ACCESS_DENIED_ERROR: Access denied for user 'mailQueue'@'172.31.40.76' (using password: YES)",
    "    at Handshake.Sequence._packetToError (/var/task/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)",
    "    at Handshake.ErrorPacket (/var/task/node_modules/mysql/lib/protocol/sequences/Handshake.js:123:18)",
    "    at Protocol._parsePacket (/var/task/node_modules/mysql/lib/protocol/Protocol.js:291:23)",
    "    at Parser._parsePacket (/var/task/node_modules/mysql/lib/protocol/Parser.js:433:10)",
    "    at Parser.write (/var/task/node_modules/mysql/lib/protocol/Parser.js:43:10)",
    "    at Protocol.write (/var/task/node_modules/mysql/lib/protocol/Protocol.js:38:16)",
    "    at Socket.<anonymous> (/var/task/node_modules/mysql/lib/Connection.js:88:28)",
    "    at Socket.<anonymous> (/var/task/node_modules/mysql/lib/Connection.js:526:10)",
    "    at Socket.emit (node:events:527:28)",
    "    at Socket.emit (node:domain:475:12)",
    "    --------------------",
    "    at Protocol._enqueue (/var/task/node_modules/mysql/lib/protocol/Protocol.js:144:48)",
    "    at Protocol.handshake (/var/task/node_modules/mysql/lib/protocol/Protocol.js:51:23)",
    "    at PoolConnection.connect (/var/task/node_modules/mysql/lib/Connection.js:116:18)",
    "    at Pool.getConnection (/var/task/node_modules/mysql/lib/Pool.js:48:16)",
    "    at Runtime.exports.handler (/var/task/index.js:15:10)",
    "    at Runtime.handleOnceNonStreaming (file:///var/runtime/index.mjs:1028:29)"
  ]
}

已确认Aurora安全组允许172.31.0.0/16网段连接,用户mailQueue配置了@%的访问权限且拥有emailTransactions库的全部权限。

排查步骤

1. 核对Lambda的数据库密码配置

  • Lambda环境变量可能与本地不一致,检查密码是否正确设置:
    • 若用环境变量存密码,确认无拼写错误、特殊字符未被意外转义(比如$、!等在环境变量中需特殊处理)。
    • 若用AWS Secrets Manager,确认Lambda的IAM权限允许读取Secret,且Secret内密码与本地测试用的一致。
  • 可临时在Lambda代码中打印连接配置(屏蔽敏感密码),验证是否正确读取到预期的用户名和密码。

2. 检查MySQL用户的主机条目冲突

MySQL会优先匹配最具体的主机规则,若存在多个mailQueue用户条目(比如mailQueue@localhost、mailQueue@172.31.%),可能导致认证时使用了非@%的条目:

  • 执行SQL查看所有相关用户:
    SELECT user, host FROM mysql.user WHERE user = 'mailQueue';
    
  • 若存在多余的主机条目,删除后刷新权限:
    DROP USER 'mailQueue'@'localhost'; -- 替换为实际多余的主机值
    FLUSH PRIVILEGES;
    

3. 重置用户密码并刷新权限

即使权限显示正确,密码哈希可能存在不匹配的情况:

  • 执行SQL重置密码并刷新权限:
    ALTER USER 'mailQueue'@'%' IDENTIFIED BY 'your-secure-password';
    FLUSH PRIVILEGES;
    
  • 更新Lambda的密码配置后重新测试连接。

4. 验证Lambda的VPC网络配置

  • 确认Lambda部署在允许访问Aurora的VPC子网中,且Lambda的安全组允许出站访问Aurora的3306端口(或自定义MySQL端口)。
  • 可通过Lambda执行简单的端口测试(比如用Node.js的net模块)确认是否能连接到Aurora的端口。

5. 检查MySQL的连接认证插件

部分Aurora版本默认使用caching_sha2_password插件,而旧版Node.js的mysql库可能不兼容:

  • 查看用户的认证插件:
    SELECT user, host, plugin FROM mysql.user WHERE user = 'mailQueue';
    
  • 若插件为caching_sha2_password,修改为兼容的mysql_native_password:
    ALTER USER 'mailQueue'@'%' IDENTIFIED WITH mysql_native_password BY 'your-password';
    FLUSH PRIVILEGES;
    

内容的提问来源于stack exchange,提问作者AtWrkTech

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:35:41