【问题标题】:Point Heroku application to AWS RDS database将 Heroku 应用程序指向 AWS RDS 数据库
【发布时间】:2018-11-07 00:13:45
【问题描述】:

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

目前,我已删除 Heroku postgreSQL 数据库,并尝试将 Heroku 应用程序指向我的 RDS 数据库。出于某种原因,我的应用程序崩溃了。我相信我正在采取的步骤是在 Heroku 端设置我的 DATABASE_URL。

假设我的数据库凭据是:

数据库实例:mydb
数据库名称:mydb
用户:wcronyn
密码:密码

我试过了:

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

我尝试通过将 .pem 文件下载到我的配置文件夹中然后引用它来设置权限:

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 数据库并将我的应用程序指向它需要采取的步骤吗?

【问题讨论】:

  • 你有没有想过在这里做什么?我在一个痛苦的世界:(
  • @pseudopeach 是的,我做到了!我可以引导你完成它,但我今天很忙。我明天发帖。
  • 太棒了。谢谢!!
  • 在@pseudopeach 下面发布了答案,请原谅延迟!
  • 2020 年 8 月 - 不需要任何证书管理。只需在 RDS 上将公共可访问性设置为是,修改安全组并设置 DATABASE_URL

标签: database postgresql amazon-web-services heroku amazon-rds


【解决方案1】:

在以下设置下,以下步骤对我有用(2017 年 2 月):

  • AWS RDS 区域 eu-west-2(使用 VPC 安全组,而不是数据库 安全组)
  • Postgres 9.6
  • Heroku,托管 Flask 应用程序(例如 appname: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 在测功机中查看您的文件)

配置 Heroku 以引用根证书

  1. 通过 Heroku 仪表板,导航到 heroku-app-stage,转到“设置”选项卡,然后单击“显示配置变量”
  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:

How to connect to a remote PostgreSQL database with Python

在您的 RDS 实例上启用 SSL

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

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

  1. 通过您的 RDS 控制台,检查您的实例的活动安全组
  2. 导航到 EC2 控制台(在 Compute > EC2 下),然后选择 Security Groups
  3. 选择相关的安全组(从步骤 1 开始)并转到底部的入站选项卡。您应该会在此处看到一个 PostgreSQL 项目。如果您点击 Edit,您应该可以选择将 Source 更改为 Anywhere。

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

就是这样!

所用参考页面的链接:

Amazon 在 Postgres 上的 SSL 指南 http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html#PostgreSQL.Concepts.General.SSL

Heroku 的(非常简短的)Amazon RDS 指南 https://devcenter.heroku.com/articles/amazon-rds

【讨论】:

  • 现在是rds.force_ssl,而不是force_ssl
  • 是允许所有传入 ip 范围的唯一方法吗?我看到有人试图通过未经授权的用户连接到数据库
  • @MattKim 您只有在能够修复 Heroku 应用程序的源 IP 地址时才能限制 IP 地址范围。这不是他们开箱即用的东西(例如,与 AWS 上的弹性 IP 不同),但您可以通过像 Fixie 这样的附加组件进行配置。
  • 我这样做是为了更新我在 RDS 上的证书(2020 年 3 月截止日期)。请注意,当您更新 DATABASE_URL 以强制使用 SSL 并使用新证书时,您的 Heroku 应用将无法与 RDS 通信,直到 RDS 更新为使用 2019 CA。
【解决方案2】:

我想出了如何将 heroku 应用程序指向 AWS RDS 数据库。这使我可以拥有一个巨大的数据库,测试亚马逊的免费套餐一年,并对我的数据库实例进行更多自定义。此答案是对@pseudopeach 问题的回应(请原谅延迟)。

所以这是一个非常简单的设置。要为 Herky 配置 RDS,您需要非常了解 heroku,并且您需要非常了解 AWS。

  1. AWS 方面

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

b) 然后单击服务选项卡并选择 rds

c) 我有一个 db ts micro(我认为这是免费套餐选项)

d) 设置 rds 并在它启动并运行后单击“实例操作”并查看详细信息

e) 在这里,您将能够查看您的 db-username、dbname、endpoint(对我来说这是一个类似于 [dbname].[randomstring].us-east-1.rds.amazon.com 的 url)和端口号。您需要这些东西以及 heroku 方面的数据库密码。

  1. Heroku 方面

a) 转到 heroku.com 上的 heroku 应用,然后设置 b) 点击revealconfig变量

典型的 heroku 变量如下所示:

DATABASE_URL xxxxxx

HEROKU_POSTGRESQL_VIOLET_URL xxxxxx

朗xxxxxx

RACK_ENV 制作

RAILS_ENV 生产

SECRET_KEY_BASE xxxxxx

你需要彻底改变这些

DATABASE_URL [注意:这将更改为一个不同的长 url - 我的看起来像这样分解以便于理解]

postgres://

[数据库用户名]:

[你的数据库密码]

@[端点]:

[你的数据库端口号]/

[数据库名称]

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

&sslmode=要求

&加密=真

示例数据库网址:
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

朗(相同)

RACK_ENV(相同)

RAILS_ENV(相同)

RDS_DB_PASS [你的数据库密码]

RDS_DB_PORT [您的数据库端口号,即 5432]

RDS_READS_DB_NAME [数据库名称]

RDS_HOST [端点网址]

RDS_USER [数据库用户名]

这对我有用,并且我获得了超过 10,000 行的数据库的免费 RDS 年(我相信这是 heroku 的免费层限制)。我使用 postgreSQL 作为我的数据库,所以这些配置可能偏向于 postgres。

【讨论】:

【解决方案3】:

我做的和安迪 G 回答说的完全一样。

但是我遇到了以下错误:

主机“XX.XX.XX.XX”、用户“用户名”、数据库“dbname”、SSL 关闭

配置 Heroku 以引用根证书上解决此问题,步骤 2:

而不是添加?sslrootcert=rds-combined-ca-bundle.pem&sslmode=require

添加?ssl=true&sslrootcert=rds-combined-ca-bundle.pem&sslmode=require

【讨论】:

    猜你喜欢
    • 2015-09-25
    • 1970-01-01
    • 2018-03-23
    • 2012-10-31
    • 2013-10-18
    • 1970-01-01
    • 2012-11-22
    • 2018-01-10
    • 1970-01-01
    相关资源
    最近更新 更多