Heroku:从S3导入失败

8
我正在尝试将本地Postgresql数据库导入到Heroku,我正在按照这些步骤进行操作。
我已经成功完成以下步骤:
  • 创建了一个数据库备份
  • 将其上传到S3 Bucket
  • 使用AWS CLI创建了签名链接
  • 运行命令heroku pg:backups:restore '<SIGNED URL>' DATABASE_URL(加上我的应用程序名称的-a选项)。
恢复备份的过程开始正确无误,但最终以此代码退出。
 !    An error occurred and the backup did not finish.
 !
 !    Could not initialize transfer
 !
 !    Run heroku pg:backups:info r011 for more details.

打开日志会显示:

Database:         BACKUP
Finished at:      2020-01-09 18:49:30 +0000
Status:           Failed
Type:             Manual
Backup Size:      0.00B (0% compression)

=== Backup Logs
2020-01-09 18:49:30 +0000 Could not initialize transfer

我已经尝试过以下操作:

  • 重新上传文件到存储桶中,
  • 生成新的签名链接,
  • 将应用程序设置为维护模式,
  • 我在我的 IAM 管理服务中创建了一个具有完全 S3 访问权限的用户,并将凭据保存在应用环境中,来自于 https://devcenter.heroku.com/articles/s3

不确定该如何继续下去,但会感激任何帮助。(我使用的是免费套餐,因此无法向 Heroku 的支持寻求帮助)

编辑:我还尝试了以下操作:

  • 删除并重新创建 S3 存储桶
  • 安装 AWS CLI 1 版本,以查看预先签名链接的结构是否发生了变化

编辑2:由于找不到解决方案,我选择暂时将托管全部迁移到 AWS 上


请展示您如何使用 pg_dump 命令。 - panchicore
从PowerShell:cmd /c "pg_dump -Fc --no-acl --no-owner -h localhost -U myuser mydb > mydb.dump" - Simone baglivi
"Could not initialize transfer" 表示 Heroku 无法下载。你是否为 Heroku 设置了 S3 凭据?请查看 https://devcenter.heroku.com/articles/s3。 - panchicore
是的,我有与文章中显示的相同名称,我需要在其他地方使用它们吗?另外:我认为使用预签名链接时授权是在创建期间给出的,而不依赖于接收者是否具有凭据,这是错误的吗? - Simone baglivi
可能会出现错误,默认策略是“拒绝”所有的静态访问。你能否允许静态请求并打开你的存储桶做测试?创建一个公开策略,再试一次,学习,并不要忘记关闭策略。 - panchicore
3个回答

7
请确保您在本地机器上存储在 ~/.aws/ 中的凭据默认设置为您为 heroku 配置创建的凭据。然后,还要确保使用这些凭据和配置创建了签名 URL。我不得不将默认凭据设置为我放在 heroku 配置中的凭据。然后,我还必须将默认区域设置为与桶位置对应的 ~/.aws/config。之后应该可以工作了。
如果您使用的是 mac 或 linux,请按照以下说明操作。 很抱歉,Windows 用户可能需要类似的步骤。
  1. 在 AWS 的 IAM 中创建新的访问 ID 和密钥
  2. 将 heroku 配置设置为使用这些凭据:heroku config:set AWS_ACCESS_KEY_ID=xxx AWS_SECRET_ACCESS_KEY=yyy
    • 可选(您可能还需要在 heroku 配置中设置存储桶名称)
  3. 在您的机器上将刚刚创建的凭据设置为 ~/.aws/credentials 中的默认值
  4. 在您的机器上将与您的存储桶对应的默认区域设置为 ~/.aws/config
  5. 创建签名 URL:aws s3 presign s3://your-bucket-address/your-object
  6. 运行还原命令:heroku pg:backups:restore '<SIGNED URL>' DATABASE_URL

4
对我来说,这是关键。我的默认区域设置位于~/.aws/config中,但是装载文件的存储桶位于另一个区域。当我将两者对齐后,预签名URL开始正常工作。谢谢! - Nick K9

2
我遇到了完全相同的错误,并做了以下两个调整。在S3控制台上,单击要用于备份的文件。您应该看到您的文件名称后跟4个选项卡。在“常规信息”选项卡中,请执行以下操作:
  1. 单击“使公开”,使文件可供下载。

  2. 获取该对象的URL,在对象的URL

    (应该类似于https://mybucket.s3.amazonaws.com/my.file,您可以通过将该URL粘贴到新的Chrome选项卡中并点击该URL来测试它是否有效。这应该会触发文件的下载)

一旦前面的检查工作正常,您就可以继续进行。

heroku pg:backups restore 'https://mybucket.s3.amazonaws.com/my.file' DATABASE_URL

1
但是如果您这样做,就会使其对所有人公开可用。我正在寻找一种解决方案,可以传递预签名的URL。 - That Guy Kev
您可以使用预签名 URL 使文件保持私有,但必须设置正确的 AWS 凭证,包括区域和正确的存储桶设置。如果之前设置不正确,则必须创建新的预签名 URL 并使用该新 URL 上传文件。 - BleddP

1
我遇到了同样的问题,发现原因是我把存储桶的区域设置为了us-east而不是us-east-1

1
完美,我也是这样认为的。只是要补充一下,您还需要使用新的AWS配置重新创建预签名URL。 - BleddP

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