创建并连接到 Amazon RDS
按照逐步说明,将数据库从本地服务器迁移至亚马逊关系型数据库服务。
在本章中,我们将把本地的 PostgreSQL 数据库迁移至由亚马逊提供的在线服务器。
首先,你需要一个 AWS 账户。如果你还没有账户,请访问 https://aws.amazon.com 并创建一个。虽然需要绑定信用卡,但使用本课程中讨论的免费套餐服务不会产生任何费用。
使用 AWS CLI 执行命令
请使用下方终端执行用于创建和管理 Amazon RDS 实例的 AWS CLI 命令。要使用 AWS CLI,需先配置 AWS 凭证。
你必须已将 AWS 访问密钥 ID 和 AWS 秘密访问密钥保存在某个位置。如果尚未拥有或希望生成新的密钥,请按以下步骤操作:
- 登录你的 AWS 账户
- 点击左上角的 Services 下拉菜单
- 在 Security, Identity, & Compliance 下选择 IAM
- 在左侧边栏点击 Users
- 选择(或创建)你想要获取密钥的用户
- 打开 Security credentials 标签页
- 选择 Create access key
每次连接到以下终端时,都需要配置你的 AWS 凭证。我们已为你自动完成此步骤。每次连接终端时,你的 AWS 凭证将已配置好。请在下方终端中以环境变量形式提供你的 AWS 访问密钥 ID 和秘密访问密钥:
注意: 如果在执行命令过程中终端断开连接,请重新连接后从断点处继续操作。
创建数据库实例
在上方终端中执行以下命令,创建一个 RDS PostgreSQL 数据库实例:
1aws rds create-db-instance --db-name example_1 --db-instance-identifier database-1 --db-instance-class db.t3.micro --engine postgres --master-username educative --master-user-password password123 --backup-retention-period 7 --port 5432 --publicly-accessible --allocated-storage 10
上述 create-db-instance 命令包含多个参数,部分说明如下:
db-name定义数据库名称,在本例中为example_1。master-username定义数据库用户名,在本例中为educative。master-user-password定义数据库密码,在本例中为password123。
我们需要将这些值添加到 settings.py 文件中的 DATABASES 字段。此外,还需将这些值保存下来,以便在最后一章部署项目到 Heroku 时使用。为此,我们将使用平台提供的 API 密钥功能,该功能集成在代码组件中,外观如以下图片所示:
要将这些值设置为 API 密钥,请进入下方“测试功能”部分的组件。点击 编辑 按钮,并按以下顺序输入:
example_1填入 RDS_DB_NAME 字段。educative填入 RDS_DB_USERNAME 字段。password123填入 RDS_DB_PASSWORD 字段。
RDS_DB_HOST 将稍后添加。
一旦保存这些值,它们将自动填入 settings.py 文件的第 94 至 96 行。同时,这些值也将被保存以供最后一章使用。
创建数据库实例需要几分钟时间(大约 5 到 10 分钟)。你可以等待实例 database-1 变为可用状态:
1aws rds wait db-instance-available --db-instance-identifier database-1
配置安全组入站规则
接下来需要配置安全组的入站规则。第一步是获取数据库实例的安全组 ID。由于后续会用到该 ID,我们将它保存在一个名为 SGID 的变量中:
1export SGID=`aws rds describe-db-instances --query "*[].VpcSecurityGroups[].[VpcSecurityGroupId]"`
你可以通过执行 echo $SGID 命令查看 SGID 变量的内容。
此处假设系统中仅有一个 RDS 实例。若存在多个实例,则 describe-db-instances 命令的输出将是一个数组,查询语句需相应调整。如果你熟悉 JSON,这应该不难处理。
SGID 变量包含方括号和引号。我们将其清理掉:
1SGID=`echo $SGID | cut -d'"' -f 2`
执行 echo $SGID 命令以打印数据库实例的安全组 ID。将该值保存为下方组件中的 RDS_DB_SGID API 密钥。
最后,配置安全组以允许端口 5432 的入站连接:
1aws ec2 authorize-security-group-ingress --group-id $SGID --protocol tcp --port 5432 --cidr 0.0.0.0/0
获取 RDS 实例的主机名
使用以下命令获取 RDS 实例的主机名:
1aws rds describe-db-instances --query "*[].[Endpoint.Address][0][0]"
你将得到类似 database-1.**********.rds.amazonaws.com 的结果。将该值保存为下方组件中的 RDS_DB_HOST API 密钥。它将在 settings.py 文件的第 97 行替换 HOST 属性的值。
请注意,上述查询假设我们只有一个 RDS 实例,因此使用索引 0 获取第一个(也是唯一一个)实例的主机名。如果你有多个 RDS 实例,则需修改查询。例如,若有五个实例,最后一个(第五个)实例的索引应为 4,查询应改为 "*[].[Endpoint.Address][4][0]"。
测试功能
No configuration found for ID: 0936e2a5ae92b111c11955442c33d8f64b0b94fa0914918c908d17f48e986506
运行应用程序并访问 Listings 页面。由于我们使用的是一个全新的、无数据的数据库,页面中应无任何列表项。
测试数据库的第一步是使用注册表单创建一个账户。账户创建成功后,使用新账号登录。登录成功即表示你已成功连接到 Amazon RDS。尝试通过 New Listing 页面创建新的房源,并前往 Listings 页面查看这些房源。
注意: 使用完 RDS 后,建议删除数据库实例。你可以通过 AWS 控制台或 CLI 删除该实例以释放 RDS 资源。但请注意,我们在最后一章仍需使用 RDS 数据库实例来部署项目到 Heroku。因此,建议在完成课程后再释放 RDS 资源。