为应用创建 PostgreSQL 数据库

AWSBeginner
立即练习

简介

订单应用需要关系型数据库才能保存客户订单。本实验将使用 Amazon RDS 创建私有 PostgreSQL 数据库,通过标准 SQL 客户端连接,并配置应用使用新的端点。

你应已了解前面 VPC 和 EC2 课程中的 VPC 子网、安全组和应用连接。环境提供网络、应用和配置好的 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 子网组指定可供 RDS 放置实例的 VPC 子网。本组包含两个可用区中的私有数据库子网。组中有两个子网本身并不代表启用了 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 输出普通文本值,Shell 的 $(...) 将其保存到 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 的订单列表仍不可用;下一实验将创建该表。 AWS View 中的主 PostgreSQL 数据库连接

示例展示应用连接到主库中的 orders 数据库及其原生 RDS 端点。目前尚未创建订单表。你的资源标识符可能不同。

AWS Console: RDS

官方 Console 示例:Connectivity & security 中的 Endpoint 和 Port 对应 CLI 响应的 Endpoint.Address 与 Endpoint.Port。官方示例显示 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 保存和查询客户订单。