1

我有一个带有两个隔离子网的 VPC,一个用于我的 RDS Serverless 集群,一个用于我的 Lambda 函数。

但是当我的 Lambda 函数调用我的 RDS 时,它们都会超时。

我的问题是;这个 VPC + 隔离子网是 API Gateway -> 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 具有具有管理员权限的角色(也不理想),但仍然只是超时。

4

2 回答 2

4

您正在使用 Aurora Serverless Data API。您的 VPC 中不存在 API。您已选择隔离子网,这些子网无法访​​问您的 VPC 之外的任何内容。您将需要切换到私有子网,或者将 RDS 终端节点添加到您的 VPC。

于 2020-10-16T12:08:12.367 回答
3

重要的是要调用 RDS API != RDS Data API; 两者是不同的。您将 RDS API 用于标准 RDS 实例;对于 Aurora Serverless 之类的东西,您可以使用 RDS数据API。

对于将来遇到此问题的任何人,现在有一些有用的文档描述了如何创建 Amazon VPC 终端节点以允许访问 RDS 数据 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>
  ]
}
于 2021-04-23T02:32:46.600 回答