在Google App Engine项目中尝试创建备份时出现404错误

8

安装

我在遵循问题AppEngine datastore - backup programatically未被接受答案后遇到了404问题。

如问题提供者所建议的那样,我已经启用了Datastore Admin。我可以在Google App Engine控制台中手动触发数据存储备份,备份运行没有任何故障。

此问题中的代码位于名为“app”的模块中,而非“default”模块。

404问题

这是cron.yaml中的计划任务。

cron:
- description: Regular backup
  url: /_backup/fullbackup
  schedule: every 24 hours

URL处理程序会将备份任务放入队列中,并随后调用。
_ah/datastore_admin/backup.create?
gs_bucket_name=%2Fgs%2Ftest.appspot.com%2F21-06-2015&kind=Test&kind=TestContent
&kind=TestDocument&filesystem=gs

我在这里将我的应用程序ID替换为“test”。

日志中显示了404错误。

enter image description here

如果我在浏览器中使用上述URL及我的应用程序主机名(即https://test.appspot.com/_ah/datastore_admin/backup.create?gs_bucket_name=%2Fgs%2Ftest.appspot.com%2F21-06-2015&kind=Test&kind=TestContent&kind=TestDocument&filesystem=gs),我也会得到404错误。

enter image description here

这是路由处理程序中与/_backup/fullbackup相关的代码:

    task = taskqueue.add(
        url='/_ah/datastore_admin/backup.create',
        method='GET',
        target='ah-builtin-python-bundle',
        params={
            'filesystem': 'gs',
            'gs_bucket_name': self.get_bucket_name(),
            'kind': (
                'Test',
                'TestContent',
                'TestDocument'
            )
        }
    )

问题:

  • 这个问题的原因是什么?
  • 在python代码的taskqueue.add部分,我需要一个队列名吗?
  • 在我的cron.yaml中,我需要将目标设置为ah-builtin-python-bundle吗?

编辑

数据存储管理员内置已启用,如此屏幕截图所示。

没有dispatch.yaml文件

enter image description here


可能是[AppEngine数据存储-编程备份]的重复问题(https://dev59.com/2XDYa4cB1Zd3GeqPBIR2)。 - Nick
@Nick 这个问题没有被接受的答案,而且它并不是特别关于404错误。 - Anthony Kong
2
缺少被接受的答案并不重要。如果您阅读问题和答案,并意识到一个可行的示例仅在14天前发布,那么这就足够了。我刚刚测试过它,它可以工作。我认为问题可能出在您将请求形成为test.example.com而不是your-app-id.appspot.com。 - Nick
@Nick 我已经澄清了我的问题并添加了额外的信息。我使用了 xxx.appspot.com 主机名,但仍然是相同的 404。 - Anthony Kong
2个回答

6
您是否已经启用了Datastore Admin?必须先执行此步骤才能允许模块ah-builtin-python-bundle存在,这是一种特殊模块,当您激活Datastore admin时,它会被“部署”到您的应用程序中,实际上负责响应/_ah/datastore_admin请求并生成读取Datastore并在云存储中(或其他位置)生成备份文件的MapReduce作业。
另外,可能的原因之一是您在应用程序中硬编码了test.appspot.com。您是否拥有“test”应用程序ID?根据您在浏览器中看到的错误截图,似乎您正在尝试备份到桶“test.appspot.com”,这将是具有应用程序ID“test”的默认桶。但是,在您展示的日志截图中,它还尝试将备份保存到“example.appspot.com”存储桶中。确保您的应用程序拥有这些存储桶。
另一个可能性是处理请求的模块不是ah-builtin-python-bundle,而是其他模块。即使您在任务添加方法中指定了不同的目标,如果您有调度规则重新路由请求,这也可能发生。

2

这与队列配置问题有关。

在实施常规备份之前,'app.yaml'中存在一个“默认”队列定义。因此,备份任务未达到目标“ah-builtin-python-bundle”。

如果我定义一个新队列

- name: data-backup
  rate: 1/s
  target: ah-builtin-python-bundle

然后使用以下代码插入任务:

    task = taskqueue.add(
        url='/_ah/datastore_admin/backup.create',
        method='GET',
        queue_name="data-backup",
        params={
            'filesystem': 'gs',
            'gs_bucket_name': self.get_bucket_name(),
            'kind': kinds_list  # A list of ndb model classes I want to backup
        }
    )

谷歌应用引擎可以创建备份集。

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