Minio
Minio
【一】介绍
MinIO 是一个开源对象存储服务器,兼容 Amazon S3 云存储服务。它设计用于存储非结构化数据,如照片、视频、日志文件、备份和容器镜像。MinIO 可以用于构建高性能的基础设施,以支持机器学习、分析和应用数据工作负载。
MinIO 的主要特性包括:
- S3 兼容性:MinIO 提供与 Amazon S3 API 高度兼容的接口,便于与使用 S3 的现有应用集成。
- 高性能:MinIO 优化了高性能处理,能够低延迟地处理大量数据。
- 可扩展性:MinIO 可以横向扩展到多个节点,以满足不断增长的存储需求。
- 安全性:MinIO 支持多种安全功能,包括加密、身份管理和访问控制。
- 简单部署:MinIO 易于部署,可以在任何硬件上运行,无论是本地部署、云端还是边缘设备。
【二】安装
【1】自建Minio
【1.1】docker-compose.yml
version: '3' services: minio: image: minio/minio ## 基于minio官方镜像 container_name: minio ## 容器名 ports: ## 端口映射 - "9000:9000" - "9090:9090" environment: ## 设置环境变量 - MINIO_ACCESS_KEY=lea4ning - MINIO_SECRET_KEY=12345678 # 密码最少8位 volumes: ## 文件映射 - ~/project/minio/data:/data - ~/project/minio/config:/root/.minio restart: always command: server /data --console-address ":9090" --address ":9000" # --console-address ":9090" # 后台控制台端口 # 后台登录账号密码就是上面设置的access_key 和 secret_key # --address ":9000" # 上传文件端口
【1.2】启动
# 创建文件夹 mkdir data mkdir config # 切换工作目录到包含 docker-compose.yml 文件下的文件夹 # 启动 docker-compose up --build -d # 访问【服务器ip:9090】 即可访问控制台
【三】使用
【1】python操作minio
python操作minio的API指南:https://min.io/docs/minio/linux/developers/python/API.html
【1.1】创建实例
pip install minio ## 安装模块
Minio(endpoint,access_key=None,secret_key=None, session_token=None,secure=True,region=None,http_client=None,credentials=None)
参数
参数 | 类型 | 描述 |
---|---|---|
endpoint |
str | S3 服务的主机名。 |
access_key |
str | (可选)您在 S3 服务中账户的访问密钥(又名用户 ID)。 |
secret_key |
str | (可选)您在 S3 服务中的账户的私有密钥(又名密码)。 |
session_token |
str | (可选)您在 S3 服务中的账户的会话令牌。 |
secure |
布尔 | (可选)指示是否使用与 S3 服务的安全 (TLS) 连接的标志。 |
region |
str | (可选)S3 服务中存储桶的区域名称。 |
http_client |
urllib3.poolmanager.PoolManager | (可选)自定义 HTTP 客户端。 |
credentials |
minio.credentials.Provider | (可选)您在 S3 服务中账户的凭证提供商。 |
cert_check |
布尔 | (可选)用于检查服务器证书上是否存在 HTTPS 连接的标志。 |
【1.2】桶操作
make_bucket(bucket_name, location='us-east-1', object_lock=False)
创建具有区域和对象锁定的存储桶。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
location |
str | 将在其中创建存储桶的区域。 |
object_lock |
布尔 | 标志以设置对象锁定功能。 |
例
## Create bucket. client.make_bucket("my-bucket") ## Create bucket on specific region. client.make_bucket("my-bucket", "us-west-1") ## Create bucket with object-lock feature on specific region. client.make_bucket("my-bucket", "eu-west-2", object_lock=True)
list_buckets()
列出所有可访问存储桶的信息。
参数
返回 |
---|
存储桶列表 |
例
buckets = client.list_buckets() for bucket in buckets: print(bucket.name, bucket.creation_date)
bucket_exists(bucket_name)
检查存储桶是否存在。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
例
if client.bucket_exists("my-bucket"): print("my-bucket exists") else: print("my-bucket does not exist")
remove_bucket(bucket_name)
移除空桶。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
例
client.remove_bucket("my-bucket")
list_objects(bucket_name, prefix=None, recursive=False, start_after=None, include_user_meta=False, include_version=False, use_api_v1=False, use_url_encoding_type=True)
列出存储桶的对象信息。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
prefix |
str | 对象名称以前缀开头。 |
recursive |
布尔 | 列表递归方式而不是目录结构仿真。 |
start_after |
str | 在此键名称后面列出对象。 |
include_user_meta |
布尔 | 要控制以包含用户元数据的 MinIO 特定标志。 |
include_version |
布尔 | 用于控制是否包含对象版本的标志。 |
use_api_v1 |
布尔 | 要控制是否使用 ListObjectV1 S3 API 的标志。 |
use_url_encoding_type |
布尔 | 用于控制是否使用 URL 编码类型的标志。 |
返回值
返回 |
---|
Object 的迭代器 |
例
## List objects information. objects = client.list_objects("my-bucket") for obj in objects: print(obj) ## List objects information whose names starts with "my/prefix/". objects = client.list_objects("my-bucket", prefix="my/prefix/") for obj in objects: print(obj) ## List objects information recursively. objects = client.list_objects("my-bucket", recursive=True) for obj in objects: print(obj) ## List objects information recursively whose names starts with ## "my/prefix/". objects = client.list_objects( "my-bucket", prefix="my/prefix/", recursive=True, ) for obj in objects: print(obj) ## List objects information recursively after object name ## "my/prefix/world/1". objects = client.list_objects( "my-bucket", recursive=True, start_after="my/prefix/world/1", ) for obj in objects: print(obj)
get_bucket_policy(bucket_name)
获取存储桶的存储桶策略配置。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
返回值
参数 |
---|
存储桶策略配置为 JSON 字符串。 |
例
policy = client.get_bucket_policy("my-bucket")
set_bucket_policy(bucket_name,政策)
将存储桶策略配置设置为存储桶。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
Policy |
str | 存储桶策略配置为 JSON 字符串。 |
例
## Example anonymous read-only bucket policy. policy = { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"AWS": "*"}, "Action": ["s3:GetBucketLocation", "s3:ListBucket"], "Resource": "arn:aws:s3:::my-bucket", }, { "Effect": "Allow", "Principal": {"AWS": "*"}, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-bucket/*", }, ], } client.set_bucket_policy("my-bucket", json.dumps(policy)) ## Example anonymous read-write bucket policy. policy = { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"AWS": "*"}, "Action": [ "s3:GetBucketLocation", "s3:ListBucket", "s3:ListBucketMultipartUploads", ], "Resource": "arn:aws:s3:::my-bucket", }, { "Effect": "Allow", "Principal": {"AWS": "*"}, "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:ListMultipartUploadParts", "s3:AbortMultipartUpload", ], "Resource": "arn:aws:s3:::my-bucket/images/*", }, ], } client.set_bucket_policy("my-bucket", json.dumps(policy))
delete_bucket_policy(bucket_name)
删除存储桶的存储桶策略配置。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
例
client.delete_bucket_policy("my-bucket")
get_bucket_notification(bucket_name)
获取存储桶的通知配置。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
返回值
参数 |
---|
NotificationConfig 对象。 |
例
config = client.get_bucket_notification("my-bucket")
set_bucket_notification(bucket_name,配置)
设置存储桶的通知配置。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
config |
通知配置 | 通知配置。 |
例
config = NotificationConfig( queue_config_list=[ QueueConfig( "QUEUE-ARN-OF-THIS-BUCKET", ["s3:ObjectCreated:*"], config_id="1", prefix_filter_rule=PrefixFilterRule("abc"), ), ], ) client.set_bucket_notification("my-bucket", config)
delete_bucket_notification(bucket_name)
删除存储桶的通知配置。成功后,S3 服务将停止对存储桶之前设置的事件的通知。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
例
client.delete_bucket_notification("my-bucket")
listen_bucket_notification(bucket_name, prefix='', suffix='', events=('s3:ObjectCreated:', 's3:ObjectRemoved:', 's3:ObjectAccessed:*'))
监听存储桶的对象前缀和后缀事件。调用方应迭代返回的迭代器以读取新事件。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
prefix |
str | 对象的侦听事件以前缀开头。 |
suffix |
str | 对象的侦听事件以后缀结尾。 |
events |
列表 | 要收听的事件。 |
返回值
参数 |
---|
事件记录的迭代器作为字典 |
with client.listen_bucket_notification( "my-bucket", prefix="my-prefix/", events=["s3:ObjectCreated:*", "s3:ObjectRemoved:*"], ) as events: for event in events: print(event)
get_bucket_encryption(bucket_name)
获取存储桶的加密配置。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
返回值
参数 |
---|
SSEConfig 对象。 |
例
config = client.get_bucket_encryption("my-bucket")
set_bucket_encryption(bucket_name,配置)
设置存储桶的加密配置。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
config |
上交所 | 服务器端加密配置。 |
例
client.set_bucket_encryption( "my-bucket", SSEConfig(Rule.new_sse_s3_rule()), )
delete_bucket_encryption(bucket_name)
删除存储桶的加密配置。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
例
client.delete_bucket_encryption("my-bucket")
get_bucket_versioning(bucket_name)
获取存储桶的版本控制配置。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
例
config = client.get_bucket_versioning("my-bucket") print(config.status)
set_bucket_versioning(bucket_name, 配置)
将版本控制配置设置为存储桶。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
config |
版本控制配置 | 版本控制配置。 |
例
client.set_bucket_versioning("my-bucket", VersioningConfig(ENABLED))
delete_bucket_replication(bucket_name)
删除存储桶的复制配置。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
例
client.delete_bucket_replication("my-bucket")
get_bucket_replication(bucket_name)
获取存储桶的复制配置。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
返回 |
---|
ReplicationConfig 对象。 |
例
config = client.get_bucket_replication("my-bucket")
set_bucket_replication(bucket_name,配置)
将复制配置设置为存储桶。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
config |
复制配置 | 复制配置。 |
例
config = ReplicationConfig( "REPLACE-WITH-ACTUAL-ROLE", [ Rule( Destination( "REPLACE-WITH-ACTUAL-DESTINATION-BUCKET-ARN", ), ENABLED, delete_marker_replication=DeleteMarkerReplication( DISABLED, ), rule_filter=Filter( AndOperator( "TaxDocs", {"key1": "value1", "key2": "value2"}, ), ), rule_id="rule1", priority=1, ), ], ) client.set_bucket_replication("my-bucket", config)
delete_bucket_lifecycle(bucket_name)
删除存储桶的生命周期配置。
Parameters
Param | Type | Description |
---|---|---|
bucket_name |
str | Name of the bucket. |
Example
client.delete_bucket_lifecycle("my-bucket")
get_bucket_lifecycle(bucket_name)
Get lifecycle configuration of a bucket.
Parameters
Param | Type | Description |
---|---|---|
bucket_name |
str | Name of the bucket. |
Return |
---|
LifecycleConfig object. |
Example
config = client.get_bucket_lifecycle("my-bucket")
set_bucket_lifecycle(bucket_name, config)
Set lifecycle configuration to a bucket.
Parameters
Param | Type | Description |
---|---|---|
bucket_name |
str | Name of the bucket. |
config |
LifecycleConfig | Lifecycle configuration. |
例
config = LifecycleConfig( [ Rule( ENABLED, rule_filter=Filter(prefix="documents/"), rule_id="rule1", transition=Transition(days=30, storage_class="GLACIER"), ), Rule( ENABLED, rule_filter=Filter(prefix="logs/"), rule_id="rule2", expiration=Expiration(days=365), ), ], ) client.set_bucket_lifecycle("my-bucket", config)
delete_bucket_tags(bucket_name)
删除存储桶的标签配置。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
例
client.delete_bucket_tags("my-bucket")
get_bucket_tags(bucket_name)
获取存储桶的标签配置。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
返回 |
---|
Tags 对象。 |
例
tags = client.get_bucket_tags("my-bucket")
set_bucket_tags(bucket_name,标签)
将标签配置设置为存储桶。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
tags |
标签 | 标记配置。 |
例
tags = Tags.new_bucket_tags() tags["Project"] = "Project One" tags["User"] = "jsmith" client.set_bucket_tags("my-bucket", tags)
delete_object_lock_config(bucket_name)
删除存储桶的对象锁定配置。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
例
client.delete_object_lock_config("my-bucket")
get_object_lock_config(bucket_name)
获取存储桶的对象锁定配置。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
返回 |
---|
ObjectLockConfig 对象。 |
例
config = client.get_object_lock_config("my-bucket")
set_object_lock_config(bucket_name,配置)
将对象锁定配置设置为存储桶。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
config |
对象LockConfig | 对象锁定配置。 |
例
config = ObjectLockConfig(GOVERNANCE, 15, DAYS) client.set_object_lock_config("my-bucket", config)
【1.3】对象操作
get_object(bucket_name, object_name, offset=0, length=0, request_headers=None, ssec=None, version_id=None, extra_query_params=None)
获取从偏移量到对象长度的数据。返回的响应在使用后应关闭,以释放网络资源。若要重用连接,需要显式调用。response.release_conn()
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
object_name |
str | 存储桶中的对象名称。 |
offset |
整数 | 对象数据的起始字节位置。 |
length |
整数 | 来自偏移量的对象数据的字节数。 |
request_headers |
字典 | 要随 GET 请求添加的任何其他标头。 |
ssec |
SseCustomerKey | 服务器端加密客户密钥。 |
version_id |
str | 对象的版本 ID。 |
extra_query_params |
字典 | 用于高级使用的额外查询参数。 |
返回值
返回 |
---|
urllib3.response.HTTPResponse 对象。 |
例
## Get data of an object. try: response = client.get_object("my-bucket", "my-object") ## Read data from response. finally: response.close() response.release_conn() ## Get data of an object of version-ID. try: response = client.get_object( "my-bucket", "my-object", version_id="dfbd25b3-abec-4184-a4e8-5a35a5c1174d", ) ## Read data from response. finally: response.close() response.release_conn() ## Get data of an object from offset and length. try: response = client.get_object( "my-bucket", "my-object", offset=512, length=1024, ) ## Read data from response. finally: response.close() response.release_conn() ## Get data of an SSE-C encrypted object. try: response = client.get_object( "my-bucket", "my-object", ssec=SseCustomerKey(b"32byteslongsecretkeymustprovided"), ) ## Read data from response. finally: response.close() response.release_conn()
select_object_content(bucket_name、object_name、请求)
按 SQL 表达式选择对象的内容。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
object_name |
str | 存储桶中的对象名称。 |
request |
选择请求 | 选择请求。 |
返回值
返回 |
---|
读取器以 SelectObjectReader 的形式包含请求的记录和进度信息 |
例
with client.select_object_content( "my-bucket", "my-object.csv", SelectRequest( "select * from S3Object", CSVInputSerialization(), CSVOutputSerialization(), request_progress=True, ), ) as result: for data in result.stream(): print(data.decode()) print(result.stats())
fget_object(bucket_name、object_name、file_path、request_headers=无、ssec=无、version_id=无、extra_query_params=无、tmp_file_path=无)
将对象的数据下载到文件。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
object_name |
str | 存储桶中的对象名称。 |
file_path |
str | 要下载的文件的名称。 |
request_headers |
字典 | 要随 GET 请求添加的任何其他标头。 |
ssec |
SseCustomerKey | 服务器端加密客户密钥。 |
version_id |
str | 对象的版本 ID。 |
extra_query_params |
字典 | 用于高级使用的额外查询参数。 |
tmp_file_path |
str | 临时文件的路径。 |
返回值
返回 |
---|
对象信息作为对象 |
例
## Download data of an object. client.fget_object("my-bucket", "my-object", "my-filename") ## Download data of an object of version-ID. client.fget_object( "my-bucket", "my-object", "my-filename", version_id="dfbd25b3-abec-4184-a4e8-5a35a5c1174d", ) ## Download data of an SSE-C encrypted object. client.fget_object( "my-bucket", "my-object", "my-filename", ssec=SseCustomerKey(b"32byteslongsecretkeymustprovided"), )
copy_object(bucket_name, object_name, source, sse=None, metadata=None, tags=None, retention=None, legal_hold=False, metadata_directive=None, tagging_directive=None)
通过服务器端从另一个对象复制数据来创建对象。在此 API 中,支持的最大源对象大小为 5GiB。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
object_name |
str | 存储桶中的对象名称。 |
source |
复制源 | 源对象信息。 |
sse |
上交所 | 目标对象的服务器端加密。 |
metadata |
字典 | 要与目标对象一起复制的任何用户定义的元数据。 |
tags |
标签 | 目标对象的标记。 |
retention |
保留 | 保留配置。 |
legal_hold |
布尔 | 用于为目标对象设置合法保留的标志。 |
metadata_directive |
str | 用于处理目标对象的用户元数据的指令。 |
tagging_directive |
str | 用于处理目标对象的标记的指令。 |
返回值
返回 |
---|
ObjectWriteResult 对象。 |
例
from datetime import datetime, timezone from minio.commonconfig import REPLACE, CopySource ## copy an object from a bucket to another. result = client.copy_object( "my-bucket", "my-object", CopySource("my-sourcebucket", "my-sourceobject"), ) print(result.object_name, result.version_id) ## copy an object with condition. result = client.copy_object( "my-bucket", "my-object", CopySource( "my-sourcebucket", "my-sourceobject", modified_since=datetime(2014, 4, 1, tzinfo=timezone.utc), ), ) print(result.object_name, result.version_id) ## copy an object from a bucket with replacing metadata. metadata = {"test_meta_key": "test_meta_value"} result = client.copy_object( "my-bucket", "my-object", CopySource("my-sourcebucket", "my-sourceobject"), metadata=metadata, metadata_directive=REPLACE, ) print(result.object_name, result.version_id)
compose_object(bucket_name、object_name、sources、sse=None、metadata=None、tags=None、retention=None、legal_hold=False)
通过使用服务器端复制合并来自不同源对象的数据来创建对象。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
object_name |
str | 存储桶中的对象名称。 |
sources |
列表 | ComposeSource 对象的列表。 |
sse |
上交所 | 目标对象的服务器端加密。 |
metadata |
字典 | 要与目标对象一起复制的任何用户定义的元数据。 |
tags |
标签 | 目标对象的标记。 |
retention |
保留 | 保留配置。 |
legal_hold |
布尔 | 用于为目标对象设置合法保留的标志。 |
返回值
返回 |
---|
ObjectWriteResult 对象。 |
例
from minio.commonconfig import ComposeSource from minio.sse import SseS3 sources = [ ComposeSource("my-job-bucket", "my-object-part-one"), ComposeSource("my-job-bucket", "my-object-part-two"), ComposeSource("my-job-bucket", "my-object-part-three"), ] ## Create my-bucket/my-object by combining source object ## list. result = client.compose_object("my-bucket", "my-object", sources) print(result.object_name, result.version_id) ## Create my-bucket/my-object with user metadata by combining ## source object list. result = client.compose_object( "my-bucket", "my-object", sources, metadata={"test_meta_key": "test_meta_value"}, ) print(result.object_name, result.version_id) ## Create my-bucket/my-object with user metadata and ## server-side encryption by combining source object list. client.compose_object("my-bucket", "my-object", sources, sse=SseS3()) print(result.object_name, result.version_id)
put_object(bucket_name, object_name, data, length, content_type=“application/octet-stream”, metadata=None, sse=None, progress=None, part_size=0, num_parallel_uploads=3, tags=None, retention=None, legal_hold=False)
将数据从流上传到存储桶中的对象。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
object_name |
str | 存储桶中的对象名称。 |
data |
对象 | 具有可调用的 read() 返回 bytes 对象的对象。 |
length |
整数 | 数据大小;-1 表示未知大小,并设置有效part_size。 |
content_type |
str | 对象的内容类型。 |
metadata |
字典 | 与您的 PUT 请求一起上传的任何其他元数据。 |
sse |
上交所 | 服务器端加密。 |
progress |
线程 | 进度对象。 |
part_size |
整数 | 多部件零件尺寸。 |
tags |
标签 | 对象的标记。 |
retention |
保留 | 保留配置。 |
legal_hold |
布尔 | 标志为对象设置合法保留。 |
返回值
返回 |
---|
ObjectWriteResult 对象。 |
例
## Upload data. result = client.put_object( "my-bucket", "my-object", io.BytesIO(b"hello"), 5, ) print( "created {0} object; etag: {1}, version-id: {2}".format( result.object_name, result.etag, result.version_id, ), ) ## Upload unknown sized data. data = urlopen( "https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.81.tar.xz", ) result = client.put_object( "my-bucket", "my-object", data, length=-1, part_size=10*1024*1024, ) print( "created {0} object; etag: {1}, version-id: {2}".format( result.object_name, result.etag, result.version_id, ), ) ## Upload data with content-type. result = client.put_object( "my-bucket", "my-object", io.BytesIO(b"hello"), 5, content_type="application/csv", ) print( "created {0} object; etag: {1}, version-id: {2}".format( result.object_name, result.etag, result.version_id, ), ) ## Upload data with metadata. result = client.put_object( "my-bucket", "my-object", io.BytesIO(b"hello"), 5, metadata={"My-Project": "one"}, ) print( "created {0} object; etag: {1}, version-id: {2}".format( result.object_name, result.etag, result.version_id, ), ) ## Upload data with customer key type of server-side encryption. result = client.put_object( "my-bucket", "my-object", io.BytesIO(b"hello"), 5, sse=SseCustomerKey(b"32byteslongsecretkeymustprovided"), ) print( "created {0} object; etag: {1}, version-id: {2}".format( result.object_name, result.etag, result.version_id, ), ) ## Upload data with KMS type of server-side encryption. result = client.put_object( "my-bucket", "my-object", io.BytesIO(b"hello"), 5, sse=SseKMS("KMS-KEY-ID", {"Key1": "Value1", "Key2": "Value2"}), ) print( "created {0} object; etag: {1}, version-id: {2}".format( result.object_name, result.etag, result.version_id, ), ) ## Upload data with S3 type of server-side encryption. result = client.put_object( "my-bucket", "my-object", io.BytesIO(b"hello"), 5, sse=SseS3(), ) print( "created {0} object; etag: {1}, version-id: {2}".format( result.object_name, result.etag, result.version_id, ), ) ## Upload data with tags, retention and legal-hold. date = datetime.utcnow().replace( hour=0, minute=0, second=0, microsecond=0, ) + timedelta(days=30) tags = Tags(for_object=True) tags["User"] = "jsmith" result = client.put_object( "my-bucket", "my-object", io.BytesIO(b"hello"), 5, tags=tags, retention=Retention(GOVERNANCE, date), legal_hold=True, ) print( "created {0} object; etag: {1}, version-id: {2}".format( result.object_name, result.etag, result.version_id, ), ) ## Upload data with progress bar. result = client.put_object( "my-bucket", "my-object", io.BytesIO(b"hello"), 5, progress=Progress(), ) print( "created {0} object; etag: {1}, version-id: {2}".format( result.object_name, result.etag, result.version_id, ), )
fput_object(bucket_name, object_name, file_path, content_type=“application/octet-stream”, metadata=None, sse=None, progress=None, part_size=0, num_parallel_uploads=3, tags=None, retention=None, legal_hold=False)
将数据从文件上传到存储桶中的对象。
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
object_name |
str | 存储桶中的对象名称。 |
file_path |
str | 要上传的文件的名称。 |
content_type |
str | 对象的内容类型。 |
metadata |
字典 | 与您的 PUT 请求一起上传的任何其他元数据。 |
sse |
上交所 | 服务器端加密。 |
progress |
线程 | 进度对象。 |
part_size |
整数 | 多部件零件尺寸。 |
tags |
标签 | 对象的标记。 |
retention |
保留 | 保留配置。 |
legal_hold |
布尔 | 标志为对象设置合法保留。 |
返回值
返回 |
---|
ObjectWriteResult 对象。 |
例
## Upload data. result = client.fput_object( "my-bucket", "my-object", "my-filename", ) print( "created {0} object; etag: {1}, version-id: {2}".format( result.object_name, result.etag, result.version_id, ), ) ## Upload data with content-type. result = client.fput_object( "my-bucket", "my-object", "my-filename", content_type="application/csv", ) print( "created {0} object; etag: {1}, version-id: {2}".format( result.object_name, result.etag, result.version_id, ), ) ## Upload data with metadata. result = client.fput_object( "my-bucket", "my-object", "my-filename", metadata={"My-Project": "one"}, ) print( "created {0} object; etag: {1}, version-id: {2}".format( result.object_name, result.etag, result.version_id, ), ) ## Upload data with customer key type of server-side encryption. result = client.fput_object( "my-bucket", "my-object", "my-filename", sse=SseCustomerKey(b"32byteslongsecretkeymustprovided"), ) print( "created {0} object; etag: {1}, version-id: {2}".format( result.object_name, result.etag, result.version_id, ), ) ## Upload data with KMS type of server-side encryption. result = client.fput_object( "my-bucket", "my-object", "my-filename", sse=SseKMS("KMS-KEY-ID", {"Key1": "Value1", "Key2": "Value2"}), ) print( "created {0} object; etag: {1}, version-id: {2}".format( result.object_name, result.etag, result.version_id, ), ) ## Upload data with S3 type of server-side encryption. result = client.fput_object( "my-bucket", "my-object", "my-filename", sse=SseS3(), ) print( "created {0} object; etag: {1}, version-id: {2}".format( result.object_name, result.etag, result.version_id, ), ) ## Upload data with tags, retention and legal-hold. date = datetime.utcnow().replace( hour=0, minute=0, second=0, microsecond=0, ) + timedelta(days=30) tags = Tags(for_object=True) tags["User"] = "jsmith" result = client.fput_object( "my-bucket", "my-object", "my-filename", tags=tags, retention=Retention(GOVERNANCE, date), legal_hold=True, ) print( "created {0} object; etag: {1}, version-id: {2}".format( result.object_name, result.etag, result.version_id, ), ) ## Upload data with progress bar. result = client.fput_object( "my-bucket", "my-object", "my-filename", progress=Progress(), ) print( "created {0} object; etag: {1}, version-id: {2}".format( result.object_name, result.etag, result.version_id, ), )
stat_object(bucket_name, object_name, ssec=无, version_id=无, extra_query_params=无)
获取对象信息和对象的元数据。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
object_name |
str | 存储桶中的对象名称。 |
ssec |
SseCustomerKey | 服务器端加密客户密钥。 |
version_id |
str | 对象的版本 ID。 |
extra_headers |
字典 | 用于高级使用的额外 HTTP 标头。 |
extra_query_params |
字典 | 用于高级使用的额外查询参数。 |
返回值
返回 |
---|
对象信息作为对象 |
例
## Get object information. result = client.stat_object("my-bucket", "my-object") print( "last-modified: {0}, size: {1}".format( result.last_modified, result.size, ), ) ## Get object information of version-ID. result = client.stat_object( "my-bucket", "my-object", version_id="dfbd25b3-abec-4184-a4e8-5a35a5c1174d", ) print( "last-modified: {0}, size: {1}".format( result.last_modified, result.size, ), ) ## Get SSE-C encrypted object information. result = client.stat_object( "my-bucket", "my-object", ssec=SseCustomerKey(b"32byteslongsecretkeymustprovided"), ) print( "last-modified: {0}, size: {1}".format( result.last_modified, result.size, ), )
remove_object(bucket_name, object_name, version_id=无)
删除对象。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
object_name |
str | 存储桶中的对象名称。 |
version_id |
str | 对象的版本 ID。 |
例
## Remove object. client.remove_object("my-bucket", "my-object") ## Remove version of an object. client.remove_object( "my-bucket", "my-object", version_id="dfbd25b3-abec-4184-a4e8-5a35a5c1174d", )
remove_objects(bucket_name, delete_object_list, bypass_governance_mode=False)
删除多个对象。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
delete_object_list |
可迭代 | 包含 :class: 对象的可迭代对象。DeleteObject <DeleteObject> |
bypass_governance_mode |
布尔 | 绕过治理保留模式。 |
返回值
返回 |
---|
包含 :class: 对象的迭代器DeleteError <DeleteError> |
例
## Remove list of objects. errors = client.remove_objects( "my-bucket", [ DeleteObject("my-object1"), DeleteObject("my-object2"), DeleteObject("my-object3", "13f88b18-8dcd-4c83-88f2-8631fdb6250c"), ], ) for error in errors: print("error occurred when deleting object", error) ## Remove a prefix recursively. delete_object_list = map( lambda x: DeleteObject(x.object_name), client.list_objects("my-bucket", "my/prefix/", recursive=True), ) errors = client.remove_objects("my-bucket", delete_object_list) for error in errors: print("error occurred when deleting object", error)
delete_object_tags(bucket_name, object_name, version_id=无)
删除对象的标签配置。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
object_name |
str | 存储桶中的对象名称。 |
version_id |
str | 对象的版本 ID。 |
例
client.delete_object_tags("my-bucket", "my-object")
get_object_tags(bucket_name, object_name, version_id=无)
获取对象的标签配置。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
object_name |
str | 存储桶中的对象名称。 |
version_id |
str | 对象的版本 ID。 |
返回 |
---|
Tags 对象。 |
例
tags = client.get_object_tags("my-bucket", "my-object")
set_object_tags(bucket_name、object_name、标签、version_id=无)
将标签配置设置为对象。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
object_name |
str | 存储桶中的对象名称。 |
tags |
标签 | 标记配置。 |
version_id |
str | 对象的版本 ID。 |
例
tags = Tags.new_object_tags() tags["Project"] = "Project One" tags["User"] = "jsmith" client.set_object_tags("my-bucket", "my-object", tags)
enable_object_legal_hold(bucket_name, object_name, version_id=无)
启用对对象的合法保留。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
object_name |
str | 存储桶中的对象名称。 |
version_id |
str | 对象的版本 ID。 |
例
client.enable_object_legal_hold("my-bucket", "my-object")
disable_object_legal_hold(bucket_name, object_name, version_id=无)
禁用对对象的合法保留。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
object_name |
str | 存储桶中的对象名称。 |
version_id |
str | 对象的版本 ID。 |
例
client.disable_object_legal_hold("my-bucket", "my-object")
is_object_legal_hold_enabled(bucket_name, object_name, version_id=无)
如果在对象上启用了合法保留,则返回 true。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
object_name |
str | 存储桶中的对象名称。 |
version_id |
str | 对象的版本 ID。 |
例
if client.is_object_legal_hold_enabled("my-bucket", "my-object"): print("legal hold is enabled on my-object") else: print("legal hold is not enabled on my-object")
get_object_retention(bucket_name, object_name, version_id=无)
获取对象的保留信息。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
object_name |
str | 存储桶中的对象名称。 |
version_id |
str | 对象的版本 ID。 |
返回值
返回 |
---|
保留对象 |
例
config = client.get_object_retention("my-bucket", "my-object")
set_object_retention(bucket_name, object_name, 配置, version_id=无)
将保留信息设置为对象。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
object_name |
str | 存储桶中的对象名称。 |
config |
保留 | 保留配置。 |
version_id |
str | 对象的版本 ID。 |
例
config = Retention(GOVERNANCE, datetime.utcnow() + timedelta(days=10)) client.set_object_retention("my-bucket", "my-object", config)
presigned_get_object(bucket_name, object_name, expires=timedelta(days=7), response_headers=None, request_date=None, version_id=None, extra_query_params=None)
获取对象的预签名 URL,以下载其数据,其中包含到期时间和自定义请求参数。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
object_name |
str | 存储桶中的对象名称。 |
expires |
日期时间.timedelta | 在几秒钟内过期;默认值为 7 天。 |
response_headers |
字典 | 可选的 response_headers 参数,用于指定响应字段,如日期、大小、文件类型、有关服务器的数据等。 |
request_date |
日期时间.datetime | 用于指定其他请求日期的可选 request_date 参数。默认值为当前日期。 |
version_id |
str | 对象的版本 ID。 |
extra_query_params |
字典 | 用于高级使用的额外查询参数。 |
返回值
返回 |
---|
URL 字符串 |
例
## Get presigned URL string to download 'my-object' in ## 'my-bucket' with default expiry (i.e. 7 days). url = client.presigned_get_object("my-bucket", "my-object") print(url) ## Get presigned URL string to download 'my-object' in ## 'my-bucket' with two hours expiry. url = client.presigned_get_object( "my-bucket", "my-object", expires=timedelta(hours=2), ) print(url)
presigned_put_object(bucket_name, object_name, expires=timedelta(days=7))
获取对象的预签名 URL,以上传具有到期时间和自定义请求参数的数据。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
object_name |
str | 存储桶中的对象名称。 |
expires |
日期时间.timedelta | 在几秒钟内过期;默认值为 7 天。 |
返回值
返回 |
---|
URL 字符串 |
例
## Get presigned URL string to upload data to 'my-object' in ## 'my-bucket' with default expiry (i.e. 7 days). url = client.presigned_put_object("my-bucket", "my-object") print(url) ## Get presigned URL string to upload data to 'my-object' in ## 'my-bucket' with two hours expiry. url = client.presigned_put_object( "my-bucket", "my-object", expires=timedelta(hours=2), ) print(url)
presigned_post_policy(政策)
获取对象的 PostPolicy 的表单数据,使用 POST 方法上传其数据。
参数
参数 | 类型 | 描述 |
---|---|---|
policy |
邮政政策 | 发布策略。 |
返回值
返回 |
---|
包含字典的表单数据 |
例
policy = PostPolicy( "my-bucket", datetime.utcnow() + timedelta(days=10), ) policy.add_starts_with_condition("key", "my/object/prefix/") policy.add_content_length_range_condition( 1*1024*1024, 10*1024*1024, ) form_data = client.presigned_post_policy(policy)
get_presigned_url(方法、bucket_name、object_name、expires=timedelta(days=7)、response_headers=None、request_date=None、version_id=None、extra_query_params=None)
获取对象的预签名 URL,用于 HTTP 方法、到期时间和自定义请求参数。
参数
参数 | 类型 | 描述 |
---|---|---|
method |
str | HTTP 方法。 |
bucket_name |
str | 存储桶的名称。 |
object_name |
str | 存储桶中的对象名称。 |
expires |
日期时间.timedelta | 在几秒钟内过期;默认值为 7 天。 |
response_headers |
字典 | 可选的 response_headers 参数,用于指定响应字段,如日期、大小、文件类型、有关服务器的数据等。 |
request_date |
日期时间.datetime | 用于指定其他请求日期的可选 request_date 参数。默认值为当前日期。 |
version_id |
str | 对象的版本 ID。 |
extra_query_params |
字典 | 用于高级使用的额外查询参数。 |
返回值
返回 |
---|
URL 字符串 |
例
## Get presigned URL string to delete 'my-object' in ## 'my-bucket' with one day expiry. url = client.get_presigned_url( "DELETE", "my-bucket", "my-object", expires=timedelta(days=1), ) print(url) ## Get presigned URL string to upload 'my-object' in ## 'my-bucket' with response-content-type as application/json ## and one day expiry. url = client.get_presigned_url( "PUT", "my-bucket", "my-object", expires=timedelta(days=1), response_headers={"response-content-type": "application/json"}, ) print(url) ## Get presigned URL string to download 'my-object' in ## 'my-bucket' with two hours expiry. url = client.get_presigned_url( "GET", "my-bucket", "my-object", expires=timedelta(hours=2), ) print(url)
upload_snowball_objects(bucket_name、object_list、元数据=无、sse=无、标记=无、保留=无、legal_hold=假、staging_filename=无、压缩=假)
在一次 put 调用中上传多个对象。它是通过创建中间 TAR 文件来完成的,该文件可以选择压缩并上传到 S3 服务。
参数
参数 | 类型 | 描述 |
---|---|---|
bucket_name |
str | 存储桶的名称。 |
object_list |
可迭代 | 包含 :class: 对象的可迭代对象。SnowballObject <SnowballObject> |
metadata |
字典 | 与您的 PUT 请求一起上传的任何其他元数据。 |
sse |
上交所 | 服务器端加密。 |
tags |
标签 | 对象的标记。 |
retention |
保留 | 保留配置。 |
legal_hold |
布尔 | 标志为对象设置合法保留。 |
staging_filename |
str | 用于创建中间压缩包的暂存文件名。 |
compression |
布尔 | 用于压缩压缩包的标志。 |
返回值
返回 |
---|
ObjectWriteResult 对象。 |
例
## Upload snowball object. client.upload_snowball_objects( "my-bucket", [ SnowballObject("my-object1", filename="/etc/hostname"), SnowballObject( "my-object2", data=io.BytesIO("hello"), length=5, ), SnowballObject( "my-object3", data=io.BytesIO("world"), length=5, mod_time=datetime.now(), ), ], )
【1.3】案例
from minio import Minio from minio.error import S3Error def main(): # Create a client with the MinIO server playground, its access key # and secret key. client = Minio("ip:9000", access_key="lea4ning", secret_key="12345678", secure=False ) # secure 如果为True使用https,false使用http # The file to upload, change this path if needed source_file = "./1.txt" # The destination bucket and filename on the MinIO server bucket_name = "resource" destination_file = "1.txt" # Make the bucket if it doesn't exist. found = client.bucket_exists(bucket_name) if not found: client.make_bucket(bucket_name) print("Created bucket", bucket_name) else: print("Bucket", bucket_name, "already exists") # Upload the file, renaming it in the process client.fput_object( bucket_name, destination_file, source_file, ) print( source_file, "successfully uploaded as object", destination_file, "to bucket", bucket_name, ) if __name__ == "__main__": try: main() except S3Error as exc: print("error occurred.", exc)
【2】权限设置
- 创建用户
- 调整权限内容
- 权限内容为json格式字符串
【2.1】基本语法
Version
:策略的版本号,通常为2012-10-17
。Statement
:策略语句的数组,每个语句定义一组权限。Effect
:操作的效果,可以是Allow
(允许)或Deny
(拒绝)。Action
:允许或拒绝的操作,如s3:ListBucket
,s3:GetObject
等。Resource
:操作适用的资源,可以是特定的存储桶或对象。Condition
(可选):操作的条件。
【2.2】Action常见参数
存储桶级操作
s3:ListBucket
:列出存储桶中的对象。s3:ListBucketMultipartUploads
:列出存储桶中的多部分上传。s3:ListBucketVersions
:列出存储桶中的所有版本。s3:GetBucketLocation
:获取存储桶的位置。s3:GetBucketPolicy
:获取存储桶的策略。s3:PutBucketPolicy
:设置存储桶的策略。s3:DeleteBucketPolicy
:删除存储桶的策略。s3:GetBucketAcl
:获取存储桶的 ACL(访问控制列表)。s3:PutBucketAcl
:设置存储桶的 ACL。s3:GetBucketNotification
:获取存储桶的通知配置。s3:PutBucketNotification
:设置存储桶的通知配置。s3:GetBucketLogging
:获取存储桶的日志记录配置。s3:PutBucketLogging
:设置存储桶的日志记录配置。s3:GetBucketTagging
:获取存储桶的标签。s3:PutBucketTagging
:设置存储桶的标签。s3:DeleteBucketTagging
:删除存储桶的标签。s3:GetBucketVersioning
:获取存储桶的版本控制配置。s3:PutBucketVersioning
:设置存储桶的版本控制配置。s3:GetBucketLifecycle
:获取存储桶的生命周期配置。s3:PutBucketLifecycle
:设置存储桶的生命周期配置。s3:GetBucketCors
:获取存储桶的跨域资源共享(CORS)配置。s3:PutBucketCors
:设置存储桶的 CORS 配置。s3:DeleteBucketCors
:删除存储桶的 CORS 配置。s3:GetBucketRequestPayment
:获取存储桶的请求支付配置。s3:PutBucketRequestPayment
:设置存储桶的请求支付配置。s3:GetBucketWebsite
:获取存储桶的网站配置。s3:PutBucketWebsite
:设置存储桶的网站配置。s3:DeleteBucketWebsite
:删除存储桶的网站配置。s3:GetBucketReplication
:获取存储桶的复制配置。s3:PutBucketReplication
:设置存储桶的复制配置。s3:DeleteBucketReplication
:删除存储桶的复制配置。
对象级操作
s3:GetObject
:获取对象数据。s3:PutObject
:上传对象数据。s3:DeleteObject
:删除对象。s3:GetObjectAcl
:获取对象的 ACL。s3:PutObjectAcl
:设置对象的 ACL。s3:RestoreObject
:还原归档对象。s3:AbortMultipartUpload
:终止多部分上传。s3:ListMultipartUploadParts
:列出多部分上传的所有部分。
多部分上传操作
s3:InitiateMultipartUpload
:初始化多部分上传。s3:CompleteMultipartUpload
:完成多部分上传。s3:UploadPart
:上传多部分中的一个部分。s3:UploadPartCopy
:复制多部分中的一个部分。
生命周期操作
s3:PutLifecycleConfiguration
:设置生命周期配置。s3:GetLifecycleConfiguration
:获取生命周期配置。s3:DeleteLifecycleConfiguration
:删除生命周期配置。
其他操作
s3:GetObjectTagging
:获取对象的标签。s3:PutObjectTagging
:设置对象的标签。s3:DeleteObjectTagging
:删除对象的标签。s3:ReplicateObject
:复制对象(用于跨区域复制)。
【2.3】权限模板
【2.3.1】只读
"arn:aws:s3:::*"
,可以将*
更换为指定的桶名
注:
"s3:PutObject"
正常来讲不算只读,但是不加上这个会报错我也不清楚是为什么
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::*" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetObjectTagging", "s3:GetObjectVersion", "s3:PutObject", ], "Resource": [ "arn:aws:s3:::*/*" ] } ] }
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签