连接到 Django 后端的 AWS Postgres 实例

Posted

技术标签:

【中文标题】连接到 Django 后端的 AWS Postgres 实例【英文标题】:Connecting to AWS Postgres Instance For Django Backend 【发布时间】:2018-06-27 01:25:12 【问题描述】:

我在 AWS 上创建了一个 PostgreSQL 数据库,我想将其用于 Django 项目。

我修改了 settings.py 使其具有

DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': <db name>,
        'USER': <user>,
        'PASSWORD': <password>,
        'HOST': 'projectdevelopment.foobar.us-east-1.rds.amazonaws.com',
        'PORT': '5432',
    

我认为这似乎很简单。除了当我尝试进行迁移时,我得到了这个错误:

django.db.utils.OperationalError: could not translate host name "projectdevelopment.foobar.us-east-1.rds.amazonaws.com" to address: nodename nor servname provided, or not known

projectdevelopment.foobar.us-east-1.rds.amazonaws.com 已直接从 RDS 控制台中端点下的值复制。

我是否缺少设置或配置错误?还是两者兼有?

【问题讨论】:

您是从 EC2 或 Lambda 等其他 AWS 资源还是从 AWS 外部连接?您是否已将 RDS 实例配置为可从 AWS 外部访问?如果我没记错的话,默认情况下只有通过 VPC 连接才能访问。如果它是一个非常的新实例,它可能需要一两个小时才能传播到您的 DNS 提供商。首先,确保您可以将主机名解析为 IP 地址,例如通过执行 nslookup 或类似的 DNS 查询。例如...nslookup my.rdsinstance.us-east-1.rds.amazonaws.com 8.8.8.8 查询 Google 的公共 DNS。 是的,它可以公开访问。该实例已经存在了将近 24 小时。 您可以使用 pgadmin 工具连接到实例吗? pgadmin.org 如果您已将实例设为可公开访问,是否可以使用公共 IP 而不是主机名进行连接?该错误表明无法解析主机名。 嘿@Batman,我想知道,任何答案有帮助吗? 【参考方案1】:

确保服务器已启动并运行 亚马逊的终结。

检查这个issue,他们有同样的问题。


尝试使用'ENGINE' = 'django.db.backends.postgresql_psycopg2',查看SO answer

阅读: How To Use PostgreSQL with your Django Application on Ubuntu 14.04


尝试分配 DATABASE_URL 以将 RDS postgres 连接到您的 django 应用。

DATABASE_URL=postgis://<user>:<password>@<host>:<port>/<db-name>

注意:声明DATABASE_URL的语法相同,请检查上述url中的这些特殊字符。

: 在用户和密码之间, @ 在密码和主机之间, : 在主机和端口之间, / 在端口和数据库名称之间

并将其分配给 settings.py

中的 DATABASES
DATABASES['default'] = DATABASE_URL

在您的情况下,DATABASE_URL 将是。

postgis://&lt;user&gt;:&lt;password&gt;@projectdevelopment.foobar.us-east-1.rds.amazonaws.com:5432/&lt;db name&gt;

5432 是 postgres 服务器使用的默认端口

【讨论】:

【参考方案2】:

您的主机字符串错误。

(venv) duddits@dev:~/movina$ host projectdevelopment.foobar.us-east-1.rds.amazonaws.com
Host projectdevelopment.foobar.us-east-1.rds.amazonaws.com not found: 3(NXDOMAIN)


(venv) duddits@dev:~/movina$ dig  projectdevelopment.foobar.us-east-1.rds.amazonaws.com

; <<>> DiG 9.10.3-P4-Ubuntu <<>> projectdevelopment.foobar.us-east-1.rds.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 30254
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;projectdevelopment.foobar.us-east-1.rds.amazonaws.com. IN A

;; AUTHORITY SECTION:
us-east-1.rds.amazonaws.com. 55 IN      SOA     ns-1420.awsdns-49.org. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400

;; Query time: 0 msec
;; SERVER: 109.197.120.67#53(109.197.120.67)
;; WHEN: Thu Jan 25 04:43:44 +07 2018
;; MSG SIZE  rcvd: 164

这意味着没有名称为projectdevelopment.foobar.us-east-1.rds.amazonaws.com 的主机,您将无法连接到它,因为无法区分它的IP 地址。所以你应该找到正确的主机名。

【讨论】:

【参考方案3】:

您似乎使用了错误的引擎。除此之外,如果您的应用程序没有使用 Elastic Beanstalk 之类的托管服务,请确保将 RDS 实例的安全组添加到应用程序环境中,以便应用程序能够访问 RDS 实例。

如果您使用的是 Elastic Beanstalk:Click here 或 here

如果您没有使用弹性 beantalk,则问题很可能出在 VPC 上。请参考this 讨论,直接使用 RDS 配置 EC2。 这个场景在官方文档here中有很好的解释。

【讨论】:

以上是关于连接到 Django 后端的 AWS Postgres 实例的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy 和 PyMySQL 在连接到 AWS RDS 后拒绝连接到“localhost”

MQTT 无法连接到后端 AWS IoT 核心

将 AWS Lambda 连接到 Redshift - 60 秒后超时

连接到 AWS 上设置的 ActiveMQ 时连接会在几秒钟后关闭

加入 *** 后 AWS RDP 断开连接 [关闭]

使用 DataGrip 连接到 AWS MySQL 时遇到问题