我有一个 AWS Lambda 函数,它已通过对 API 网关的 HTTP 请求成功运行。它返回一个 JSON 响应,我可以在本地 Web 浏览器中看到它。
现在我希望它从我设置的 Aurora Serverless MySQL 数据库收集数据。我可以从 Cloud 9 环境访问此数据库。我可以将我的 Lambda 函数导入 Cloud 9 并选择“本地运行”,然后它成功连接到数据库并运行 SQL 查询。
但是,当我从 API 网关运行 Lambda 函数时,pymysql.connect 失败,抛出一个 OperationalError,消息为“无法连接到‘testdb.cluster-xxxxx.us-east-1.rds.amazonaws.com’上的 MySQL 服务器”。
我已经关注教程:配置 Lambda 函数以访问 Amazon VPC 中的 Amazon RDS并执行以下步骤:
- 在 IAM 控制台中,创建一个名为 lambda-vpc-role 并具有权限 AWSLambdaVPCAccessExecutionRole 的角色。
- 在该函数的 Lambda 控制台中,将执行角色/现有角色设置为 lambda-vpc-role
我读过了使用 Amazon Aurora Serverless其中指出“您可以从 AWS Lambda 访问 Aurora Serverless DB 集群”,并将我引导至配置 Lambda 函数以访问 Amazon VPC 中的资源。接下来,我执行了以下步骤:
- 在该函数的 Lambda 控制台中的网络框中,将 VPC 设置为 Aurora Serverless 集群正在运行的 VPC。
该文档还指出,“当您将 VPC 配置添加到 Lambda 函数时,它只能访问该 VPC 中的资源。如果 Lambda 函数需要同时访问 VPC 资源和公共互联网,则 VPC 需要在 VPC 内部有一个网络地址转换 (NAT) 实例。”因此我读到如何授予我的 VPC Lambda 函数互联网访问权限?并执行以下步骤:
- 在 VPC 控制台/NAT 网关中,在现有公共子网上创建一个新的 NAT 网关,即具有指向 igw-* 的默认路由的路由表
- 在 VPC 控制台/路由表中,创建一个新的路由表,其中默认路由指向我的新 NAT 网关 nat-*
- 在 VPC 控制台/子网中,创建一个与新路由表关联的新私有子网,其默认路由指向 NAT 网关。
- 在该函数的 Lambda 控制台中的网络框中,将子网设置为仅包含新的私有子网。
我现在相信我的 Lambda 函数正在 VPC 中运行,我可以使用 API 网关成功运行它并查看其 JSON 响应。但它仍然无法连接到 MySQL 数据库。
要让 Lambda 函数连接到数据库,还需要哪些步骤?
答案1
缺少的步骤是:
- 在 VPC 控制台/安全组中,选择 rds-launch-wizard 组(创建 Aurora Serverless 集群时创建的安全组),选择入站规则选项卡,然后单击编辑。添加规则。对于类型,选择 MYSQL/Aurora(选择 TCP 端口 3306)。对于源,输入在步骤 6 中创建的私有子网的 CIDR,以及 Lambda 函数配置为使用的 CIDR。
由于 Lambda 函数在与数据库集群不同的子网中的机器上运行,尽管它位于同一个 VPC 中,但仍需要配置安全组以允许从该源到数据库的入站连接。
我认为这个问题和这个答案现在提供了设置面向公众的 Lambda 函数并访问 Aurora Serverless 数据库集群的完整步骤,但也许其他答案可以改进这些说明。可能有更简洁的方式来描述配置或更容易重现的方法,例如使用命令行工具而不是 Web 控制台。