В июне 2020 года AWS объявила, что прокси-сервер RDS в целом доступен для совместимости с MySQL и PostgreSQL. Это важная веха для бессерверной экосистемы AWS, потому что для многих бессерверных архитектур сделать БД бессерверной задачей не из легких, а теперь с RDS Proxy эта задача уже не такая сложная, как раньше.
Я предполагаю, что любой, кто читает этот пост, является пионером без сервера и знает плюсы и минусы RDS Proxy, поэтому я не собираюсь писать список плюсов, вместо этого я углублюсь в код и покажу вам, как с ним работать. .
Создать прокси
Создать прокси-сервер RDS довольно просто. Вот несколько вещей, которые нужно помнить при создании прокси.
›Группы безопасности VPC. Группа безопасности, назначенная прокси-серверу, должна разрешать трафик из сред ваших приложений, например Lambda или EC2, на прокси и трафик от прокси к RDS. Если группы безопасности настроены неправильно,
›Проверка подлинности IAM. Если вы решите использовать аутентификацию IAM, вы должны использовать TLS для подключения к прокси-серверу. И когда требуется аутентификация IAM, собственные учетные данные, то есть аутентификация по имени пользователя и паролю, не будут приняты для подключения.
Если прокси-сервер не настроен должным образом, вы обычно увидите, что цель становится недоступной, это означает, что соединение с RDS не готово, в большинстве случаев причиной является либо группа безопасности, либо учетные данные для RDS.
К счастью, с помощью интерфейса командной строки AWS мы можем легко отладить его.
aws rds describe-db-proxy-targets --db-proxy-name dev-rds-proxy-test
Например, я намеренно установил не тот диспетчер секретов. Цель становится недоступной из-за неправильного секрета.
Самой проблемной проблемой может быть настройка группы безопасности. Если группа безопасности неверна, это обычно означает, что трафик запрещен, поэтому вы увидите следующую ошибку.
Вы должны набраться терпения и выяснить, какой SG не правильный.
Обратите внимание, что между изменениями конфигурации и изменениями состояния есть задержка в несколько секунд.
Подключитесь к RDS через прокси
Существуют разные способы подключения к RDS через прокси, с TLS или без него, использовать IAM-аутентификацию или нет, я покажу вам, как это сделать. В примерах я буду использовать Postgres и TypeScript.
›psql
Перед написанием кода мы должны сначала протестировать соединение с помощью psql
, чтобы убедиться, что все время горит зеленый свет.
# With TLS required psql "host=dev-rds-proxy-test.xxxxxxxxxxx.ap-southeast-2.rds.amazonaws.com dbname=rds user=rds_user sslmode=require"
Если требуется аутентификация IAM, вам нужно будет сгенерировать токен IAM.
aws rds generate-db-auth-token --hostname dev-rds-proxy-test.xxxxxxxxxxx.rds.amazonaws.com --port 5432 --region ap-southeast-2 --username dev_rds_user
Перед подключением к RDS с помощью токена необходимо убедиться, что к вашему EC2 или Lamda прикреплена следующая политика IAM.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "rds-db:connect" ], "Resource": [ "arn:aws:rds-db:ap-southeast-2:xxxxxxxxx:dbuser:prx-0f9d9414be09b1c57/dev_rds_user" ] } ] }
Очень важное замечание, которое не задокументировано в AWS (по крайней мере, я не смог найти), - это указать идентификатор ресурса прокси вместо идентификатора ресурса БД, потому что мы используем аутентификацию IAM для подключения к прокси, не RDS. Прокси-сервер по-прежнему подключается к RDS с использованием собственной аутентификации, настроенной в секретном диспетчере.
Вам также необходимо получить корневой центр сертификации Amazon по адресу https://www.amazontrust.com/repository/AmazonRootCA1.pem.
Наконец, мы можем подключить
psql "host=dev-rds-proxy-test.proxy-xxxxx.ap-southeast-2.rds.amazonaws.com port=5432 sslmode=verify-full sslrootcert=cert.pem dbname=rds user=dev_rds_user password=the-token-gernated-before"
›Код
После того, как мы проверили соединение с помощью psql
, мы можем писать код!
Подключение с использованием TLS
Подключение с использованием IAM Auth
Знайте, как мы получаем учетные данные для EC2 или Lambda.
new aws.EC2MetadataCredentials()
Поскольку разрешение контролируется через роль IAM, функция должна быть асинхронной.
Как указано в документе AWS:
Вы должны убедиться, что у вас есть статические или ранее разрешенные учетные данные, если вы вызываете этот метод синхронно (без обратного вызова), в противном случае он может неправильно подписать запрос. Если вы не можете этого гарантировать (вы используете асинхронный поставщик учетных данных, то есть роли EC2 IAM), вам всегда следует вызывать этот метод с помощью асинхронного обратного вызова.
Это означает, что если у вас есть учетные данные, хранящиеся локально, например ~ / .aws / credentials, вы можете вызвать getAuthToken
в режиме синхронизации с получением учетных данных другим способом.
new AWS.SharedIniFileCredentials({profile: 'default'})
AWS RDS Proxy - очень интересная и полезная функция, добавленная в бессерверную армию. Его легко настроить и адаптировать с очень небольшим изменением кода. Надеюсь, эта демонстрация придаст вам больше уверенности в рассмотрении возможности управления подключением RDS с помощью прокси.