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:::*/*"
]
}
]
}

浙公网安备 33010602011771号