如何通过MinIO客户端在Garage S3存储中创建存储桶?
我此前使用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客户端完成大部分操作,可按以下流程处理:
- 通过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 - 继续使用MinIO客户端管理桶内内容:
完成上述步骤后,你的Python代码即可正常操作存储桶内容,此时密钥已拥有对应桶的读写权限,不会再触发权限错误。
另外,Garage的S3兼容能力目前聚焦于核心操作对齐,存储桶管理这类涉及全局权限的操作暂未完全匹配标准S3,若有相关需求可关注Garage后续版本更新。
内容的提问来源于stack exchange,提问作者rbaleksandar




