调用RDS Serverless

问题描述

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

但是当他们调用我的RDS时,我的Lambda会一直超时。

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

Lambda:


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拥有“管理权限”角色(也不理想),但仍然只是超时。 / p>

解决方法

您正在使用Aurora无服务器数据API。您的VPC内部不存在该API。您选择了隔离的子网,这些子网无法访​​问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>
  ]
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...