问题描述
我有一个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>
]
}