Создать базу PostgreSQL для приложения

AWSBeginner
Практиковаться сейчас

Введение

Приложению заказов нужна реляционная база, чтобы сохранять заказы клиентов. В этой работе вы создадите частную базу PostgreSQL через Amazon RDS, подключитесь стандартным SQL-клиентом и настроите приложение на новую конечную точку.

Реляционная база хранит записи в таблицах. PostgreSQL — это движок базы; Amazon RDS управляет экземпляром, а его конечная точка — адрес для подключения клиентов. Работа начинается в новой VM с уже настроенным подключением AWS.

Вы должны знать подсети VPC, группы безопасности и подключения приложений из предыдущих курсов VPC и EC2. Сеть, приложение и настроенная AWS CLI предоставлены. Личный аккаунт AWS не нужен. В конце вы удалите базу.

Связь с сертификацией

Сертификация Задача экзамена Практика
Cloud Practitioner (CLF-C02) Задача 3.4 Определять Amazon RDS как управляемый сервис реляционных баз.
Solutions Architect – Associate (SAA-C03) Задача 3.3 Понимать движки баз и подключения приложений к ним.

Обзор лабораторной работы

Концептуальная схема: подготовленное приложение заказов и psql подключаются к новому частному экземпляру RDS PostgreSQL; таблица заказов ещё не создана.

Создать базу приложения

На этом шаге вы создадите частный экземпляр PostgreSQL в подготовленной сети баз данных.

Amazon RDS управляет экземплярами реляционных баз. PostgreSQL — движок, который хранит таблицы и выполняет SQL. AWS CLI управляет ресурсом RDS, а SQL-клиент подключается к движку для работы с данными. Создание экземпляра RDS и запрос таблицы — разные операции.

Курс использует подготовленный Terminal для команд AWS CLI и SQL, а AWS View — для просмотра базы и результатов приложения. AWS View — отдельный от AWS Management Console интерфейс.

Перейдите в рабочую папку и загрузите предоставленные параметры подключения:

cd /home/labex/project
source database.env

DB_SECURITY_GROUP_ID обозначает подготовленные правила сетевого доступа к базе. PGSERVICEFILE и PGPASSFILE сообщают клиенту PostgreSQL расположение обычных файлов подключения и паролей. Сохраняйте файлы паролей закрытыми; выводить их содержимое не нужно.

Проверьте подготовленную группу подсетей DB:

aws rds \
  describe-db-subnet-groups \
  --db-subnet-group-name orders-subnets \
  --query 'DBSubnetGroups[].{Name:DBSubnetGroupName,VPC:VpcId,Subnets:Subnets[].SubnetIdentifier}'

Группа подсетей DB определяет подсети VPC, доступные для размещения RDS. Эта группа содержит частные подсети баз в двух зонах доступности. Наличие двух подсетей само по себе не включает развёртывание Multi-AZ.

Создайте экземпляр:

aws rds \
  create-db-instance \
  --db-instance-identifier orders-db \
  --db-instance-class db.t3.micro \
  --engine postgres \
  --engine-version 16.15 \
  --allocated-storage 20 \
  --master-username orders_admin \
  --master-user-password "$(cat db-password.txt)" \
  --db-name orders \
  --db-subnet-group-name orders-subnets \
  --vpc-security-group-ids "$DB_SECURITY_GROUP_ID" \
  --no-publicly-accessible \
  --backup-retention-period 0 \
  --query 'DBInstance.{Identifier:DBInstanceIdentifier,Status:DBInstanceStatus,Engine:Engine}'

Идентификатор экземпляра orders-db называет ресурс RDS; имя базы orders называет базу PostgreSQL внутри него. db.t3.micro выбирает класс экземпляра, а 20 задаёт запрошенный объём хранения в GiB. Частный доступ оставляет подключения приложения внутри подготовленной сети. Хранение автоматических резервных копий отключено для этого короткого упражнения; отдельная работа научит создавать ручной снимок.

$(cat db-password.txt) передаёт подготовленный пароль без вывода на экран. Не вставляйте пароли в заметки или снимки экрана.

Дождитесь доступности и проверьте конечную точку подключения:

aws rds \
  wait db-instance-available \
  --db-instance-identifier orders-db
aws rds \
  describe-db-instances \
  --db-instance-identifier orders-db \
  --query 'DBInstances[0].{Identifier:DBInstanceIdentifier,Database:DBName,Status:DBInstanceStatus,Endpoint:Endpoint}'

Ожидаются база orders, состояние available и порт PostgreSQL 5432. Конечная точка — адрес, по которому клиенты выбирают этот экземпляр. AWS View должна показать orders-db как основную базу. Таблица заказов ещё не создана.

Подключить SQL-клиент и приложение

На этом шаге вы проверите движок и направите приложение на его конечную точку.

Следующие проверки отвечают на два вопроса: достигает ли SQL-клиент нужного движка и использует ли приложение тот же движок? Сам по себе статус RDS available не отвечает ни на один из них. Сравните возвращённые базу и пользователя с ожидаемыми значениями, прежде чем считать подключение готовым.

psql — стандартный клиент командной строки PostgreSQL. Подготовленный сервис orders-db хранит параметры подключения созданного экземпляра. Имя сервиса — удобная запись конфигурации клиента, а не ресурс AWS.

Приватное подключение PostgreSQL требует доступной конечной точки и разрешённого порта

Выполните запрос к движку:

psql \
  "service=orders-db" \
  --command 'SELECT current_database(), current_user;'

Ожидаются база orders и пользователь orders_admin. Результат получен через подключение к базе, а не из метаданных ресурса RDS. RDS управляет хостом базы; приложения используют протокол базы данных, а не SSH-доступ к хосту.

Получите конечную точку из RDS. --query выбирает поле, --output text выдаёт простое значение, а конструкция оболочки $(...) сохраняет его в DB_ENDPOINT:

DB_ENDPOINT=$(aws rds \
  describe-db-instances \
  --db-instance-identifier orders-db \
  --query 'DBInstances[0].Endpoint.Address' \
  --output text)
echo "$DB_ENDPOINT"

Просмотрите предоставленную конфигурацию приложения:

cat app-config.json

read_host выбирает базу для запросов, а write_host — для изменений. Пока оба должны использовать основной экземпляр. password_file ссылается на закрытый файл вместо размещения пароля в JSON-документе.

Используйте редактор JSON jq, чтобы задать оба поля хоста. Запишите новый файл, а после успешного изменения замените конфигурацию:

jq \
  --arg host "$DB_ENDPOINT" \
  '.read_host = $host | .write_host = $host' \
  app-config.json > app-config.new
mv app-config.new app-config.json

Проверьте соединение приложения:

curl \
  --silent \
  --show-error \
  --fail \
  http://127.0.0.1:8080/application/connection

Ожидаются database со значением orders, user со значением orders_admin и read_only со значением false. Основной экземпляр принимает запись, но эта работа только устанавливает соединение. Список заказов AWS View останется недоступным до создания таблицы в следующей работе. Подключение к основному PostgreSQL в AWS View. Пример показывает приложение, подключённое к основной базе orders, и нативную конечную точку RDS. Таблица заказов ещё не создана. Ваши идентификаторы ресурсов могут отличаться.

AWS Console: RDS — Endpoint, Port, Connectivity & security; AWS RDS guide: https://docs.aws.amazon.com/AmazonRDS/latest/gettingstartedguide/connecting-console.html

Пример официальной Console: Endpoint и Port в Connectivity & security соответствуют Endpoint.Address и Endpoint.Port из CLI. Пример показывает MySQL и 3306; лаборатория использует PostgreSQL и 5432 с адресом из вашей команды. Не копируйте имя хоста и порт примера. Продолжайте в Terminal и AWS View без входа в AWS.

Удалить экземпляр базы

На этом шаге вы удалите временную базу, сохранив подготовленные приложение и сеть.

Удалите экземпляр без сохранения финального снимка:

aws rds \
  delete-db-instance \
  --db-instance-identifier orders-db \
  --skip-final-snapshot \
  --query 'DBInstance.DBInstanceIdentifier'

--skip-final-snapshot удаляет учебную базу без сохранения копии для восстановления. Для важных данных заранее решите, как сохранить резервную копию перед удалением экземпляра.

Дождитесь удаления и проверьте список ресурсов:

aws rds \
  wait db-instance-deleted \
  --db-instance-identifier orders-db
aws rds \
  describe-db-instances \
  --query 'DBInstances[].DBInstanceIdentifier'

Ожидается []. AWS View не должна показывать базу. За старой конечной точкой приложения больше нет базы, поэтому после удаления ожидается ошибка подключения. Сохраните предоставленные группу подсетей, группы безопасности и файлы приложения.

Резюме

Вы создали частный экземпляр RDS PostgreSQL, отличили идентификатор ресурса от имени базы и проверили конечную точку. Вы выполнили запрос к движку через psql и подключили приложение к тому же основному экземпляру. Затем удалили экземпляр, сохранив подготовленную сеть.

Следующая работа создаёт таблицу заказов и использует SQL для сохранения и чтения заказов клиентов.

Подробнее см. в документации AWS: Конечные точки баз данных и клиентские соединения.