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

Posted

技术标签:

【中文标题】尝试在 Google App Engine 项目中创建备份时出现 404【英文标题】:404 when trying to create backup in a Google App Engine project 【发布时间】:2015-09-07 08:39:16 【问题描述】:

设置

我在关注问题AppEngine datastore - backup programatically的unaccepted答案后遇到了404问题

我已启用数据存储区管理员,正如其中一位回答提供者所建议的那样。我可以在 Google App Engine 控制台中手动触发数据存储备份,并且备份运行没有任何故障。

此问题中的代码位于名为“app”的模块中。不是“默认”。

404 问题

这是 cron.yaml 中的 cron 作业。

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

(我在这里用'test'替换了我的应用程序ID)

这在日志中显示 404 错误。

如果我在浏览器中使用上面的 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。

这里是路由/_backup/fullbackup的handler中的相关代码

    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

编辑

已启用内置的 datastore-admin,如此屏幕截图所示。

而且没有dispatch.yaml

【问题讨论】:

AppEngine datastore - backup programatically的可能重复 @Nick 这个问题没有被接受的答案,并且不是具体是关于 404 错误。 缺乏公认的答案并不重要,真的。如果您阅读问题和答案并意识到一个工作示例仅在 14 天前发布。我刚刚自己测试过它并且它有效。我认为问题可能在于您对 test.example.com 而不是 your-app-id.appspot.com 提出请求 @Nick 我已经澄清了我的问题并添加了额外的信息。我使用了xxx.appspot.com 主机名,但仍然是相同的 404。 【参考方案1】:

你有enabled the Datastore Admin吗?您需要这样做以允许模块 ah-builtin-python-bundle 存在,这是一个特殊模块,当您激活 Datastore 管理员时“部署”到您的应用程序,它真正负责响应对 /_ah/datastore_admin 的请求并生成从 Datastore 读取并在 Cloud Storage(或您将它们发送到的任何其他位置)中生成备份文件的 MapReduce 作业。

另外,另一种可能性是您在应用程序中使用了硬编码test.appspot.com。您是否拥有那个应用程序 ID,“测试”?从您在浏览器中看到的错误屏幕截图中,您似乎正在尝试备份到存储桶“test.appspot.com”,这将是应用程序 ID 为“test”的应用程序的默认存储桶。但是,在您显示的日志屏幕截图中,它还尝试备份到“example.appspot.com”存储桶。确保您的应用拥有这些存储桶。

另一种可能是处理请求的模块不是ah-builtin-python-bundle,而是另一个。即使您在任务添加方法中指定了不同的目标,如果您有一个正在重新路由请求的dispatch rule,也可能会发生这种情况。

【讨论】:

【参考方案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
        
    )

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

【讨论】:

以上是关于尝试在 Google App Engine 项目中创建备份时出现 404的主要内容,如果未能解决你的问题,请参考以下文章

Google App Engine + Django,项目中有多个应用程序 = ImportError

Google App Engine 不提供静态文件

Google App Engine 渲染和 Django 表单

如何减少 Google App Engine 部署的 ktor App 文件大小

在单个 Google App Engine 项目中同时使用 Java 和 Python

在 Google App Engine 上部署 Django 项目