Доработать с помощью AWS RDS Proxy

#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. Когда-нибудь был достигнут какой-либо прогресс в этом?

5. sequelize.org/docs/v7/other-topics/aws-lambda

Ответ №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, с чего можно начать.