You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过MinIO客户端在Garage S3存储中创建存储桶?

问题:Garage是否支持通过MinIO客户端创建存储桶?

我此前使用MinIO作为S3存储服务,因MinIO近期产品变动,转而采用单节点部署的Garage。编写了如下Python代码,通过MinIO客户端遍历本地datasets目录的一级子目录,以目录名创建存储桶:

import minio
from pathlib import Path

client = minio.Minio(
  "gin-vm-postgresql.iosb.fraunhofer.de:3900", #:3902
  # Bucket-specific key (here for bucket "tutorial")
  #"---------------",
  #"+++++++++++++++",
  # API key
  '::::::::::::::::',
  '................',
  # Force the region, this is specific to garage
  region='garage',
  secure=False
)

print(client.list_buckets())

p = Path('./datasets').absolute()
dss = [ds for ds in p.iterdir() if ds.is_dir()] 
for ds in dss:
    print(f'Dataset "{ds.stem}" at "{ds}"')
    try:
        client.make_bucket(bucket_name=ds.stem.lower())
    except Exception as err:
        print(err)

但每次创建存储桶的尝试均返回如下错误:

S3 operation failed; code: AccessDenied, message: Forbidden: Access key :::::::::::::::::::: is not allowed to create buckets, resource: /BUCKET_NAME, request_id: None, host_id: None

我使用命令garage -c /etc/garage/garage.toml key create mykey创建了未分配存储桶的API密钥,而Garage中需在存储桶创建后,通过garage -c /etc/garage/garage.toml bucket allow BUCKET_NAME --read --write --key mykey命令配置密钥权限。

我的疑问是:Garage是否支持通过MinIO客户端创建存储桶?我已生成具备CreateBucket权限的管理API令牌,但该令牌无法用于MinIO客户端;虽找到Garage SDK,但需使用非MinIO客户端,增加了复杂度,希望能使用同一客户端完成存储桶创建与内容管理。


解答

Garage当前的S3兼容API不支持通过普通用户密钥创建存储桶,存储桶的创建只能通过Garage的管理CLI或管理API完成,这源于Garage与标准S3的权限模型差异:

  • 通过key create生成的普通API密钥,默认无存储桶创建权限,必须先通过管理方式创建桶,再为密钥分配对应桶的读写权限。
  • 你提到的具备CreateBucket权限的管理API令牌,仅适用于Garage的管理API(而非S3兼容API),MinIO客户端只能调用S3兼容接口,因此无法识别该管理令牌。

若想尽量复用MinIO客户端完成大部分操作,可按以下流程处理:

  1. 通过Garage CLI批量创建存储桶
    编写简单shell脚本,遍历本地datasets目录的子目录名,批量执行桶创建与权限配置命令:
    #!/bin/bash
    DATASETS_DIR="./datasets"
    for dir in "$DATASETS_DIR"/*/; do
        BUCKET_NAME=$(basename "$dir" | tr '[:upper:]' '[:lower:]')
        garage -c /etc/garage/garage.toml bucket create "$BUCKET_NAME"
        garage -c /etc/garage/garage.toml bucket allow "$BUCKET_NAME" --read --write --key mykey
    done
    
  2. 继续使用MinIO客户端管理桶内内容
    完成上述步骤后,你的Python代码即可正常操作存储桶内容,此时密钥已拥有对应桶的读写权限,不会再触发权限错误。

另外,Garage的S3兼容能力目前聚焦于核心操作对齐,存储桶管理这类涉及全局权限的操作暂未完全匹配标准S3,若有相关需求可关注Garage后续版本更新。

内容的提问来源于stack exchange,提问作者rbaleksandar

火山引擎 最新活动