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

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

Введение

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

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

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

Эта работа даёт вводную практику по следующим темам экзаменов.

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

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

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

AWS Management Console удобна для изучения сервисов и просмотра ресурсов. CLI подходит для точных запросов, повторяемых операций и автоматизации, хотя её синтаксис требует практики. Курс использует подготовленные Terminal и 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-клиент и приложение

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

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

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

Концептуальная схема: Приватное подключение 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)

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

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

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

Source: AWS RDS guide.

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

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

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

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 для сохранения и чтения заказов клиентов.