尝试将 AWS S3 数据库备份到 heroku postgres 时出现 403 错误

Posted

技术标签:

【中文标题】尝试将 AWS S3 数据库备份到 heroku postgres 时出现 403 错误【英文标题】:403 error when trying to backup AWS S3 database to heroku postgres 【发布时间】:2015-10-01 21:12:06 【问题描述】:

我正在尝试在 Heroku 上部署我的 Django 应用程序。我创建了一个 Heroku Postgres 数据库,我想从 AWS S3 将一个现有的 PostgreSQL 数据库导入其中。我跟着tutorial in the Heroku docs 到了这封信。我创建了一个 Heroku Postgres 数据库并将其提升到主数据库。我按照Heroku's AWS S3 tutorial 设置所有配置变量,以便heroku 可以访问我的S3 存储桶。但是当我运行 heroku pg:backups restore 'https://s3.amazonaws.com/<bucket name>/<database name>' DATABASE_URL 时,我收到一条错误消息,提示“发生错误,您的备份未完成。”

这是heroku pg:backups info的完整输出:

=== Backup info: r012
Database:    BACKUP
Started:     2015-07-13 13:43:30 +0000
Finished:    2015-07-13 13:43:30 +0000
Status:      Failed
Type:        Manual
Backup Size: 0.00B
=== Backup Logs
2015-07-13 13:43:30 +0000: 2015/07/13 13:43:30 aborting: could not write to output stream: Expected HTTP Status 200, received: "403 Forbidden"
2015-07-13 13:43:30 +0000: pg_restore: [custom archiver] could not read from input file: end of file
2015-07-13 13:43:30 +0000: waiting for restore to complete
2015-07-13 13:43:30 +0000: restore done
2015-07-13 13:43:30 +0000: waiting for download to complete
2015-07-13 13:43:30 +0000: download done

当然,由于这是一个 403 错误,我认为我的身份验证有问题。我已经运行heroku config 并三重检查了我所有的配置变量。 AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY 和 DATABASE_URL 环境变量都是正确的,并且与我在 AWS 和 Heroku Postgres GUI 中看到的一致。

为什么我会看到此错误消息?

【问题讨论】:

【参考方案1】:

windows用户;heroku pg:backups:restore "https://s3.amazonaws.com/me/items/3H0q/mydb.dump" DATABASE_URL

根据官方文档,如果您使用的是 Windows,请务必在远程 url 周围使用双引号。 see official docs

【讨论】:

【参考方案2】:

从 AWS 拉入 Heroku 时出现同样的错误

如果在 AWS 存储桶内的转储文件上未正确设置权限,Heroku 有时会拒绝导入备份/转储文件。 (如果 Heroku 无法访问该文件,则无法上传。)

您可以在“操作”>“属性”按钮下找到权限设置,或者单击文件,然后单击右侧的“属性”按钮。

一个简单的解决方法是暂时公开转储文件,进行 heroku 恢复,然后锁定或删除转储文件。

【讨论】:

【参考方案3】:

好吧,我觉得自己很笨,但问题的原因是我忘记在我的 AWS url 中的文件名末尾添加“.dump”。

【讨论】:

别难过,你的评论对我有帮助。我只能通过散列 url 访问我的数据库转储,因此没有 .dump 扩展名,导致同样的问题。谢谢!

以上是关于尝试将 AWS S3 数据库备份到 heroku postgres 时出现 403 错误的主要内容,如果未能解决你的问题,请参考以下文章

sh 将AWS RDS二进制文件备份到AWS S3

从 heroku 访问 s3 内容时,AWS 访问密钥显示在浏览器 url 中

允许用户访问特定 S3 存储桶进行备份的 AWS IAM 策略

使用 AWS S3 for django 在 heroku 上提供静态文件?

Django + Heroku + S3

在 Heroku 上使用 Django 将大文件上传到 AWS S3 存储桶而没有 30 秒的请求超时