В июне 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 с помощью прокси.