Время ожидания AWS Lambda истекает при вызове RDS Serverless
У меня есть VPC с двумя ИЗОЛИРОВАННЫМИ подсетями, одна для моего кластера без сервера RDS, а другая для моих функций 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 имеет роль с правами администратора (также не идеальна), но все же только время ожидания.
2 ответа
Вы используете API Aurora Serverless Data. API не существует внутри вашего VPC. Вы выбрали изолированные подсети, которые не имеют доступа ни к чему, что существует за пределами вашего VPC. Вам нужно будет либо переключиться на частные подсети, либо добавить конечную точку RDS в свой VPC.
Важно отметить, что RDS API!= RDS Data API; эти два разные. Вы используете RDS API для стандартных экземпляров RDS; для чего-то вроде Aurora Serverless вы используете API данных RDS .
Для тех, кто столкнется с этим в будущем, теперь есть полезная документация, описывающая, как создать конечную точку Amazon VPC, чтобы разрешить доступ к API данных RDS .
Если вы используете 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>
]
}