如何修复 GCP CommandException 中的错误:不允许跨越提供程序的“生命周期”命令

Posted

技术标签:

【中文标题】如何修复 GCP CommandException 中的错误:不允许跨越提供程序的“生命周期”命令【英文标题】:How to fix the error in GCP CommandException: "lifecycle" command spanning providers not allowed 【发布时间】:2020-04-19 17:05:24 【问题描述】:

我现在正在学习 GCP。我有一个名为 welynx-test1_copy 的存储桶 我想为其设置生命周期策略,以便在 23 天后删除存储桶,按照我在 CLI 中执行以下命令的命令帮助:

xenonxie@cloudshell:~ (rock-perception-263016)$ gsutil ls
gs://rock-perception-263016.appspot.com/
gs://staging.rock-perception-263016.appspot.com/
gs://welynx-test1/
gs://welynx-test1_copy/

所以你可以看到存储桶存在。

在下面设置政策让我出错:

xenonxie@cloudshell:~ (rock-perception-263016)$ gsutil lifecycle set "rule": ["action": "type": "Delete", "condition": "age": 23] gs://welynx-test1_copy

CommandException:不允许跨越提供程序的“生命周期”命令。

我尝试遵循help 中的语法,如下所示:

xenonxie@cloudshell:~ (rock-perception-263016)$ gsutil 生命周期 --help NAME 生命周期 - 获取或设置存储桶的生命周期配置

概要 gsutil 生命周期获取 url gsutil 生命周期集 config-json-file url...

DESCRIPTION 生命周期命令可用于获取或设置 给定存储桶的生命周期管理策略。这个命令 仅支持存储桶,不支持对象。有关更多信息 对象生命周期管理,请看Google Cloud Storage docs <https://cloud.google.com/storage/docs/lifecycle>_。

生命周期命令有两个子命令: GET 获取生命周期 给定存储桶的配置。您可以获得生命周期 一次只能配置一个桶。输出可以是 重定向到一个文件,编辑然后通过集合更新 子命令。

SET 在一个或多个存储桶上设置生命周期配置。这 命令行上指定的 config-json-file 应该是一个路径 包含生命周期配置 JSON 文档的本地文件。

示例以下生命周期配置 JSON 文档 指定此存储桶中大于 365 的所有对象 天数将被自动删除:


  "rule":
  [
    
      "action": "type": "Delete",
      "condition": "age": 365
    
  ]

以下(空)生命周期配置 JSON 文档删除 存储桶的所有生命周期配置:


我在这里遗漏了什么,我该如何解决?非常感谢。

【问题讨论】:

【参考方案1】:

您的命令的问题是您将规则放在要运行的命令中,而不是配置文件中。

这样做的方法是:

使用生命周期配置规则创建 JSON 文件 使用这样的生命周期集gsutil lifecycle set [CONFIG_FILE] gs://[BUCKET_NAME]

基本上,您可以按照您给出的示例:


  "rule":
  [
    
      "action": "type": "Delete",
      "condition": "age": 23
    
  ]

并使用您创建的 JSON 文件更改 CONFIG_FILE。

【讨论】:

感谢您的快速回答【参考方案2】:

显然,gsutil 检查存储桶名称是否属于谷歌之前它检查生命周期文件是否存在:

❯ gsutil lifecycle set foo bar gs://baz
CommandException: "lifecycle" command spanning providers not allowed.

❯ gsutil lifecycle set foo gs://baz
AccessDeniedException: 403 user@domain.com does not have storage.buckets.get access to baz.

❯ gsutil lifecycle set foo gs://a-real-bucket-name
Setting lifecycle configuration on gs://a-real-bucket-name/...
ArgumentException: JSON lifecycle data could not be loaded from:

因此,如果您在第五个位置提供除 google 控制的存储桶以外的任何东西:

gsutil lifecycle set file.json THIS_ARGUMENT

您将看到与该问题相关的错误而不是与文件相关的错误。

这也让我感到困惑,我认为谷歌可以对 gsutil 进行一些简单的修改,以使错误消息更有帮助。我在这里提交了一个与此有关的错误:https://issuetracker.google.com/issues/147020031

【讨论】:

以上是关于如何修复 GCP CommandException 中的错误:不允许跨越提供程序的“生命周期”命令的主要内容,如果未能解决你的问题,请参考以下文章

gsutil 导致“CommandException:您有多种类型的配置凭据”

gsutil cp 命令错误,CommandException:没有匹配的 URL:

如何禁用节点自动修复

CommandException:“mb”命令不支持“file://”URL。您的意思是使用 gs:// 网址吗?

org.im4java.core.CommandException:返回码:137

从 GCS 中删除文件:“gsutil -m rm”引发 CommandException:无法删除文件/对象