如何修复 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:// 网址吗?