将Heroku应用程序指向AWS RDS数据库

15

我需要将我的Heroku应用程序指向我的AWS RDS数据库。我的RDS数据库正在运行,并具有0.0.0.0/0访问的安全组。

目前,我已删除了我的Heroku PostgreSQL数据库,并尝试将我的Heroku应用程序指向我的RDS数据库。但是,我的应用程序由于某些原因崩溃了。我认为我现在所处的步骤是在Heroku端设置我的DATABASE_URL。

假设我的数据库凭据是:

db instance: mydb
dbname:mydb
user:wcronyn
pass:password

我已经尝试过:

heroku config:set DATABASE_URL = postgres://wcronyn:password@mydb.XXXXXXX.us-east-1.rds.amazonaws.com:5432/mydb

我还尝试通过下载.pem文件到我的config文件夹中,并引用它来设置权限:

DATABASE_URL = postgres://wcronyn:password@mydb.XXXXXXX.us-east-1.rds.amazonaws.com:5432/mydb?sslca = config/amazon-rds-ca-cert.pem&sslmode = require& encrypt = true

我已经尝试过这两种数据库URL,但我的应用程序仍然崩溃。

可以有人概述一下我需要执行的步骤,以成功托管我的RDS数据库并将我的应用程序指向它吗?


2
你最终解决了这里的问题吗?我感到非常痛苦 :( - pseudopeach
@pseudopeach 是的,我做了!我可以指导你完成,但我今天很忙。明天我会发布。 - B Cronyn
太棒了。谢谢! - pseudopeach
已在@pseudopeach下面发布了答案。抱歉耽搁了! - B Cronyn
2020年8月-不需要任何证书管理。只需将RDS上的公共可访问性设置为Yes,修改安全组并设置DATABASE_URL。 - David Aldridge
3个回答

36
以下步骤对我有效(2017年2月),步骤如下:
  • AWS RDS区域 eu-west-2(使用VPC安全组,而不是DB安全组)
  • Postgres 9.6
  • Heroku,托管Flask应用程序(例如应用程序名称:heroku-app-stage
  • 具有远程添加到Heroku应用程序的Git(例如远程:stage
  • DATABASE_URL 值为 postgresql://username:password@awsrdshost:5432/dbname

此操作大致分为四个步骤:

  1. 下载并安装Amazon RDS SSL根证书到您的Heroku应用程序中
  2. 配置Heroku应用程序以引用该根证书
  3. 在您的RDS实例上启用SSL
  4. 配置您的RDS安全组以允许所有IP地址范围的输入流量

下载并安装Amazon RDS SSL根证书

  1. 从以下Amazon RDS链接下载.pem证书文件。
  2. 将该文件放入应用程序文件夹中(记下位置,我已将其放在我的根文件夹与.py文件一起)
  3. 提交该文件到您的git存储库,并将该提交推送到Heroku远程 (git push stage master)
  4. 验证证书已上传到预期路径(您可以执行heroku run bash --app heroku-app-stage,查看dyno中的文件)

配置Heroku以引用根证书

  1. 通过Heroku仪表板,导航到heroku-app-stage,转到设置选项卡,并单击显示Config Vars
  2. 通过添加?sslrootcert=rds-combined-ca-bundle.pem&sslmode=require来更新DATABASE_URL变量。新值应该是postgresql://username:password@awsrdshost:5432/dbname?sslrootcert=rds-combined-ca-bundle.pem&sslmode=require

请注意,此答案使用了根证书;可能有其他选项更适合您,如果是这样,请参考以下SO:

如何使用Python连接到远程PostgreSQL数据库

启用RDS实例上的SSL

  1. 通过RDS控制台导航到实例详细信息并记录其使用的参数组
  2. 转到仪表板上的参数组屏幕
  3. 如果使用默认参数组,则需要创建另一个参数组,因为您将无法编辑默认参数组。
  4. 将force_ssl参数修改为值1并保存。
  5. 验证SSL现在是否已在RDS实例上启用。 如果运行psql postgres -h awsrdshost -p 5432 -U username,则应在连接详细信息中看到SSL

配置RDS安全组以允许所有传入IP范围

  1. 通过RDS控制台,检查实例的活动安全组
  2. 导航到EC2控制台(在Compute > EC2下),并选择安全组
  3. 选择相关的安全组(来自步骤1),然后转到底部的Inbound选项卡。您应该会看到一个名为PostgreSQL的项目。如果单击编辑,您应该有更改源为任何地方的选项。

注意:仅当使用使用VPC安全组的RDS设置时,才适用此说明

就是这样!

参考页面的链接:

亚马逊关于Postgres SSL的指南

Amazon RDS 的 PostgreSQL 简介

Heroku 对 Amazon RDS 的(非常简短的)指南


2
现在使用 rds.force_ssl 代替 force_ssl - Sam Chats
这是允许所有传入IP范围的唯一方法吗?我看到有未经授权的用户尝试连接到数据库。 - Matt Kim
@MattKim 如果你能够修复Heroku应用程序的源IP地址,那么你可以仅限制IP地址范围。这不是他们开箱即用的功能(例如AWS上的弹性IP),但肯定可以通过像Fixie这样的附加组件进行配置。 - Andy G
2
我这样做是为了更新我的RDS证书(2020年3月截止日期)。请注意,当您更新DATABASE_URL以强制使用SSL并使用新证书时,直到RDS已更新为使用2019 CA之前,您的Heroku应用程序将无法与RDS通信。 - Jack

4

我已经找到了如何将 Heroku 应用指向 AWS RDS 数据库的方法。这使我能够拥有一个巨大的数据库,测试 Amazon 的免费套餐一年,并对我的数据库实例进行更多自定义。此答案是针对 @pseudopeach 的问题作出的回应(请原谅延迟)。

所以这是一个相当简单的设置。要为 Heroku 配置 RDS,您需要非常熟悉 Heroku 和 AWS。

  1. AWS 部分

a) 设置您的区域。选择最靠近您的地区,例如美国东部(俄亥俄州)

b) 然后点击服务选项卡并选择 RDS

c) 我有一个 db ts micro(我想那是免费套餐选项)

d) 进行 RDS 设置,运行后点击“实例操作”并查看详细信息

e) 在此处,您将能够查看您的 db-username、dbname、端点(对我来说,它类似于这个 url [dbname].[randomstring].us-east-1.rds.amazon.com)和端口号。您需要这些内容加上您的 db 密码,以供 Heroku 使用。

  1. Heroku 部分

a) 转到 heroku.com 上的您的 Heroku 应用程序,然后点击设置

b) 点击 revealconfig variables

典型的 Heroku 变量看起来像这样:

DATABASE_URL xxxxxx

HEROKU_POSTGRESQL_VIOLET_URL xxxxxx

LANG xxxxxx

RACK_ENV 生产

RAILS_ENV 生产

SECRET_KEY_BASE xxxxxx

您需要相当大程度地更改这些内容

DATABASE_URL [注意:此处要更改为不同且较长的 url —— 我的看起来像这样分解了一下,以便易于理解]

postgres://

[db-username]:

[您的 db 密码]

@[端点]:

[您的 db 端口号]/

[db 名称]

?sslca=config/amazon-rds-ca-cert.pem

&sslmode=require

&encrypt=true

数据库 url 示例:
postgres://jdoe:supersecretpassword@mydb.coua7574xvna.us-east-1.rds.amazonaws.com:5432/mydb?sslca=config/amazon-rds-ca-cert.pem&sslmode=require&encrypt=true

EXTERNAL_DATABASE amazon-rds-ca-cert.pem

EXTERNAL_DATABASE_CA amazon-rds-ca-cert.pem

LANG (相同)

RACK_ENV (相同)

RAILS_ENV (相同)

RDS_DB_PASS [您的 db 密码]

RDS_DB_PORT [您的 db 端口号,即 5432]

RDS_READS_DB_NAME [db 名称]

RDS_HOST [端点 url]

RDS_USER [数据库用户名]

这对我很有用,我得到了一年免费使用 RDS 的机会,我使用的是 postgreSQL 数据库,它的行数超过了 10,000 行(我相信这是 heroku 上的免费套餐限制)。因此这些配置可能更适用于 postgres。


1
请查看此帖子,了解在Heroku应用程序中使用RDS数据库的最佳实践:https://vel-lesikov.medium.com/migrating-from-heroku-postgres-to-amazon-rds-2e738e7730e5 - VelLes

1
我完全按照Andy G的回答所说做了。
然而,我遇到了以下错误:
没有适用于主机“XX.XX.XX.XX”,用户“username”,数据库“dbname”的pg_hba.conf条目,SSL关闭
在“配置Heroku引用根证书”第2步中解决此问题:
不要添加?sslrootcert=rds-combined-ca-bundle.pem&sslmode=require,而是添加?ssl=true&sslrootcert=rds-combined-ca-bundle.pem&sslmode=require

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接