调用 RDS Serverless 时 AWS Lambda 超时

AWS Lambda times out when calling RDS Serverless

我有一个包含两个 ISOLATED 子网的 VPC,一个用于我的 RDS Serverless 集群,一个用于我的 Lambda 函数。

但是当他们调用我的 RDS 时,我的 Lambda 功能全部超时。

我的问题是;这个 VPC + 隔离子网是 API 网关 -> Lambda -> RDS 的工作结构,还是我在尝试一些不可能的事情?

拉姆达:


import * as AWS from 'aws-sdk';

const rdsDataService = new AWS.RDSDataService();

const query = `SELECT * FROM information_schema.tables;`;

export const handler = async (event) => {
  const params = {
    secretArn: `secret arn`,
    resourceArn: "rds arn",
    sql: query,
    database: 'db name'
  };
  const res = await rdsDataService.executeStatement(params).promise();
  return { statusCode: 200, body: {
    message: 'ok',
    result: res
  }};
};

我的 RDS 和 Lambda 共享一个安全组,我在其中为所有流量打开(我知道这不理想)并且我的 Lambda 具有管理员权限(也不理想)但仍然只是超时.

您正在使用 Aurora Serverless 数据 API。 API 在您的 VPC 中不存在。您选择了隔离子网,这些子网无法访​​问您的 VPC 外部存在的任何内容。您需要切换到私有子网,或者 add an RDS endpoint 切换到您的 VPC。

重要的是要调出RDS API != RDS Data API;两者是不同的。您将 RDS API 用于标准 RDS 实例;对于像 Aurora Serverless 这样的东西,你可以使用 RDS Data API.

对于将来 运行 的任何人来说,现在有一些 helpful documentation describing how to create an Amazon VPC endpoint to allow access to the RDS Data API

如果您使用 Terraform 创建 VPC 端点,这里有一个片段,它基本上复制了上面教程中的说明:

resource "aws_vpc_endpoint" "rds-data" {
  vpc_id              = <your-vpc-id-here>
  service_name        = "com.amazonaws.<your-region-here>.rds-data"
  vpc_endpoint_type   = "Interface"
  private_dns_enabled = true

  security_group_ids = [
    <your-security-group-ids-here>
  ]
  subnet_ids = [
    <your-subnet-ids-here>
  ]
}