【问题标题】:Heroku: importing from S3 failingHeroku:从 S3 导入失败
【发布时间】:2021-01-20 02:40:47
【问题描述】:

我正在尝试将本地 Postgresql 数据库导入 Heroku,我正在按照以下步骤操作 https://devcenter.heroku.com/articles/heroku-postgres-import-export#import-to-heroku-postgres

我成功了:

  • 创建了一个转储
  • 已将其上传到 S3 存储桶
  • 从 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

我试过了:

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

不知道从这里去哪里,但希望能提供任何帮助。 (我正在制定业余爱好计划,因此我无法向 Heroku 寻求帮助)

编辑:我也试过了:

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

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

【问题讨论】:

  • 请说明您如何使用pg_dump 命令
  • 来自powershell:cmd /c "pg_dump -Fc --no-acl --no-owner -h localhost -U myuser mydb > mydb.dump"
  • Could not initialize transfer 表示heroku无法下载。您是否为heroku设置了s3凭据? devcenter.heroku.com/articles/s3
  • 是的,我有文章中显示的相同名称,我需要在其他地方使用它们吗?另外:我的印象是在创建它的过程中给出了预签名的链接授权,并且它不依赖于接收者拥有凭据,这是错误的吗?
  • 可能有误,默认策略是“拒绝”所有静态访问。您可以只允许静态请求并打开您的存储桶以进行测试吗?创建一个开放的政策,再试一次,学习,不要忘记关闭政策。

标签: postgresql amazon-web-services heroku amazon-s3 heroku-postgres


【解决方案1】:

确保您计算机上存储在 ~/.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

【讨论】:

  • 这对我来说是关键。我的默认区域设置在~/.aws/config,但带有转储文件的存储桶位于不同的区域。当我将两者排成一行时,预签名的 URL 开始工作。谢谢!
【解决方案2】:

有完全相同的错误并进行了这 2 次调整。在 S3 控制台中,单击要用于备份的文件。您应该会看到文件的名称,后跟 4 个选项卡。在 常规信息 选项卡中,执行以下操作:

  1. 单击公开 使文件可供下载。

  2. 获取该对象的 URL,其中显示 对象的 URL

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

上一次检查正常后,您可以继续

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

【讨论】:

  • 但是这样你就可以公开供所有人使用,我正在寻找一个可以传递预签名 URL 的解决方案
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    相关资源
    最近更新 更多