#aws-lambda #sequelize.js #amazon-rds #amazon-rds-proxy
#aws-lambda #sequelize.js #amazon-rds #amazon-rds-proxy
Вопрос:
Я пытаюсь использовать прокси AWS RDS на моем lambda для прокси нашей базы данных (Aurora MySQL). Я не смог найти никаких конкретных инструкций для Sequelize, но, похоже, все, что мне нужно для работы RDS proxy, — это создать подписывающего, использовать его для получения моего токена, а затем передать токен в качестве моего пароля конструктору Sequelize:
const signer = new RDS.Signer({
region: process.env.REGION,
hostname: process.env.DB_PROXY_ENDPOINT,
port: 3306,
username: process.env.DB_PROXY_USERNAME,
});
const token = signer.getAuthToken({
username: process.env.DB_PROXY_USERNAME,
});
const connection = new Sequelize(process.env.DB_DATABASE, process.env.DB_PROXY_USERNAME, token, {
dialect: 'mysql',
host: process.env.DB_HOSTNAME,
port: process.env.DB_PORT,
pool: {
acquire: 15000,
idle: 9000,
max: 10
},
});
Прокси RDS подключен к моему lambda, и я могу зарегистрировать токен, но как только я делаю запрос к базе данных, время ожидания моего соединения истекает. Кто-нибудь знает, может быть, я чего-то не хватает в этой настройке?
Комментарии:
1. Привет @Tyson Cadenhead — тебе удалось устранить эту проблему?
2. @tyson-cadenhead также интересно, разработали ли вы наилучший способ для Sequelize использовать RDS Proxy?
3. кто-нибудь нашел решение для этого?
4. Когда-нибудь был достигнут какой-либо прогресс в этом?
Ответ №1:
Вот как я подключился из AWS Lambda к прокси RDS с помощью MySQL (в typescript)
import { APIGatewayProxyEvent, APIGatewayProxyResult } from "aws-lambda";
import { Signer } from "@aws-sdk/rds-signer";
import { Sequelize } from "sequelize";
//other code
const signer = new Signer({
hostname: host
port: port,
region: region,
username: username,
});
const sequelize = new Sequelize({
username,
host,
port,
dialect: "mysql",
dialectOptions: {
ssl: "Amazon RDS",
authPlugins: {
mysql_clear_password: () => () => signer.getAuthToken(),
},
},
});
// some more code
Задержка вашего подключения может быть вызвана какой-либо ошибкой аутентификации, возможно, в том, как вы передаете токен. Я бы дважды проверил, что ваша роль IAM прокси-сервера RDS имеет secretsmanager:GetSecretValue
разрешение на ресурс Secrets Manager учетных данных пользователя db, а также kms:Decrypt
на ключ, используемый для шифрования секрета. И ваш lambda (или любой другой контекст, в котором выполняется ваш код) имеет rds-db:connect
разрешение.
ПРИМЕЧАНИЕ: Это не включает параметры пула соединений, я все еще пытаюсь выяснить, как это оптимизировать. Ознакомьтесь с использованием sequelize в документах AWS Lambda, с чего можно начать.