aibangjuxin / groovy

study groovy
1 stars 0 forks source link

buckets #62

Open aibangjuxin opened 8 months ago

aibangjuxin commented 8 months ago

是的,可行。您可以使用以下方法之一来重命名存储桶:

在您的示例中,您可以将新名称输入为gs://avp-dev-new

您还可以使用 Cloud Storage API 或 Cloud Storage CLI 来重命名存储桶。

以下是使用 Cloud Storage API 重命名存储桶的示例:

curl -X POST \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "gs://avp-dev-new"
  }' \
  "https://storage.googleapis.com/v1/b/gs://avp-dev"

以下是使用 Cloud Storage CLI 重命名存储桶的示例:

gsutil rename gs://avp-dev gs://avp-dev-new

请注意,重命名存储桶不会影响存储桶中的数据。但是,如果您使用存储桶名称作为 DNS 记录的一部分,则需要更新 DNS 记录以引用新的存储桶名称。

是的,Google Cloud buckets支持重命名。但是,存储桶的名称和地理位置是不可修改的元数据。如果您需要指定特定名称或地理位置,则必须在创建存储桶时进行指定。

要重命名存储桶,您可以使用以下方法之一:

您还可以使用 Cloud Storage API 或 Cloud Storage CLI 来重命名存储桶。

以下是使用 Cloud Storage API 重命名存储桶的示例:

curl -X POST \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "new-bucket-name"
  }' \
  "https://storage.googleapis.com/v1/b/my-bucket"

以下是使用 Cloud Storage CLI 重命名存储桶的示例:

gsutil rename my-bucket new-bucket-name

请注意,重命名存储桶不会影响存储桶中的数据。但是,如果您使用存储桶名称作为 DNS 记录的一部分,则需要更新 DNS 记录以引用新的存储桶名称。

aibangjuxin commented 8 months ago

在大多数情况下,gsutil mv 的效率更高。

gsutil mv 不会创建新对象,而是将对象从旧位置移动到新位置。这意味着 gsutil mv 只需要执行一次数据写入操作,而 gsutil cp 需要执行两次数据写入操作。

以下是 gsutil mv 和 gsutil cp 的效率比较:

操作 描述 效率
gsutil mv 将对象从旧位置移动到新位置 更高
gsutil cp 将对象从旧位置复制到新位置 更低

但是,在某些情况下,gsutil cp 的效率可能更高。例如,如果对象位于不同的区域或可用区,则 gsutil mv 需要将对象复制到新区域或可用区,然后再将其移动到新位置。这可能会导致 gsutil mv 的效率降低。

以下是 gsutil mv 和 gsutil cp 效率的影响因素:

因素 描述
对象大小 对象越大,gsutil mv 的效率越高。
对象位置 对象位于同一区域或可用区,gsutil mv 的效率更高。
对象内容 对象内容相同,gsutil mv 的效率更高。

总体而言,gsutil mv 的效率更高。但是,在某些情况下,gsutil cp 的效率可能更高。您需要根据具体情况进行选择。

以下是一些使用 gsutil mv 和 gsutil cp 的示例:

# 使用 gsutil mv 将对象从旧位置移动到新位置
gsutil mv gs://old-bucket-name/object gs://new-bucket-name/object

# 使用 gsutil cp 将对象从旧位置复制到新位置
gsutil cp gs://old-bucket-name/object gs://new-bucket-name/object
aibangjuxin commented 8 months ago

移动只针对object 不针对buckets

aibangjuxin commented 7 months ago

可以实现。您可以使用NumVersions条件来指定要保留的对象数量。

以下是保留最近30个版本的lifecycle JSON文件示例:

{
  "rules": [
    {
      "condition": {
        "num_versions": {
          "max": 30
        }
      },
      "action": {
        "type": "Delete"
      }
    }
  ]
}

这个文件指定,存储桶中最多保留30个版本的每个对象。

您可以将此JSON文件上传到GCP控制台,然后将其应用到存储桶。

以下是如何在GCP控制台上设置lifecycle管理的步骤:

  1. 在GCP控制台中,导航到存储 > 存储桶
  2. 选择要设置lifecycle管理的存储桶。
  3. Lifecycle选项卡中,单击Create
  4. Create lifecycle configuration页面上,输入lifecycle的名称和描述。
  5. Rules部分中,单击Add rule
  6. Rule页面上,选择NumVersions条件和Delete操作。
  7. 输入要保留的对象数量。
  8. 单击Save

设置lifecycle管理后,GCP将定期检查存储桶中的所有对象,并根据规则执行操作。

您还可以使用Google Cloud CLI或SDK来设置lifecycle管理。

以下是使用Google Cloud CLI设置lifecycle管理的示例:

gcloud storage lifecycle set my-bucket --lifecycle-file my-lifecycle.json

其中,my-bucket是存储桶的名称,my-lifecycle.json是lifecycle JSON文件的名称。

以下是使用Google Cloud SDK设置lifecycle管理的示例:

import google.cloud.storage

# 创建存储桶
bucket = storage.Bucket('my-bucket')

# 创建lifecycle JSON文件
with open('my-lifecycle.json', 'r') as f:
    lifecycle = json.load(f)

# 设置lifecycle管理
bucket.lifecycle.update(lifecycle)

其中,my-bucket是存储桶的名称,my-lifecycle.json是lifecycle JSON文件的名称。

aibangjuxin commented 7 months ago

Buckets delete reference


# 创建空文件
true > "$tmpdir/deleted-tmp-buckets.txt"

# 输出提示信息
echo "List all tmp Buckets:"

# 获取符合条件的tmp Buckets列表
tmp_buckets=$(gcloud storage ls --project "$project" | grep "^gs://new-")

# 检查命令是否成功执行且输出不为空
if [ $? -eq 0 ] && [ -n "$tmp_buckets" ]; then
    echo "The tmp Buckets exist in this Project"
else
    echo "Command failed or output is empty. Exiting."
    exit 1
fi

# 循环处理每个tmp bucket
for del_tmp_buckets in $tmp_buckets; do
    # 输出分隔线
    printf "%s\n" "--------------------------------------------------"
    echo "Begin Delete buckets: $del_tmp_buckets"

    # 记录删除开始时间
    echo "$(date) Begin delete old name  ${del_tmp_buckets}" >> "$tmpdir/deleted-tmp-buckets.txt"

    # 执行删除操作
    gsutil -m rm -rf "$del_tmp_buckets"

    # 记录删除结束时间
    echo "$(date) End delete old name  ${del_tmp_buckets}" >> "$tmpdir/deleted-tmp-buckets.txt"
done

# 定义打印分割线的函数
function print_delimiter(){
  awk 'BEGIN{while (a++<50) s=s "-"; print s}'
}

# 保存老的tmp buckets到数组
old_tmp_buckets=($(gcloud storage ls --project $project | grep "^gs://new-"))

# 检查是否有老的tmp buckets
if [[ -n "${old_tmp_buckets[@]}" ]]; then

  echo "Old tmp buckets exist in this project"

  # 循环删除
  for bucket in "${old_tmp_buckets[@]}"; do

    print_delimiter  
    echo "Begin deleting bucket: ${bucket}"

    if ! gsutil -m rm -rf "gs://${bucket}"; then
      echo "Failed to delete bucket: ${bucket}" >&2
      exit 1
    fi

    echo "$(date) Deleted bucket: ${bucket}"

  done

else
  echo "No old tmp buckets found in this project"
  exit 0
fi
aibangjuxin commented 3 months ago

你可以结合使用gcloud storage buckets describe和一些命令行工具来实现这一目标。以下是一个可能的方法:

# 获取项目下所有存储桶的名称
buckets=$(gcloud storage buckets list --project=$PROJECT --format="value(name)")

# 遍历每个存储桶,检查是否启用了版本控制
for bucket in $buckets; do
    # 获取存储桶的描述信息
    bucket_info=$(gcloud storage buckets describe gsutil://$bucket --project=$PROJECT)
    # 检查版本控制是否启用
    versioning_enabled=$(echo "$bucket_info" | grep -oP 'versioning:\s+\K\w+')
    # 如果版本控制启用,则打印存储桶名称
    if [ "$versioning_enabled" = "enabled" ]; then
        echo $bucket
    fi
done

这段代码将打印出项目下所有启用了版本控制的存储桶的名称。