MinIO 技术分享:自建 S3 兼容对象存储与 Spring Boot 集成实践

发布于:2025-08-16 ⋅ 阅读:(19) ⋅ 点赞:(0)

MinIO 技术分享:自建 S3 兼容对象存储与 Spring Boot 集成实践

作者注:随着云原生、微服务和大数据的普及,对象存储在企业开发中的应用越来越广泛。本文将带你快速了解 Amazon S3 与 MinIO 的关系,并通过 Docker 部署 MinIO、配置访问策略,以及在 Spring Boot 项目中集成 AWS S3 SDK 来访问 MinIO。


1. 什么是 Amazon S3?

S3 全称 Simple Storage Service(简单存储服务),是亚马逊 AWS 在 2006 年推出的公共云对象存储服务。
它的核心特点:

  • 可以存储任意类型数据(文本、图片、视频、日志、备份等)
  • 使用 桶(Bucket) 组织数据,桶内文件称为 对象(Object)
  • 数据唯一标识 = 桶名 + 对象名
  • 提供 HTTP/HTTPS API(REST / SDK)进行上传、下载、管理
  • 高可用、高持久,适用于海量非结构化数据

在 S3 权限策略中,常见的概念:

  • 操作:如 s3:GetObject(下载对象)、s3:PutObject(上传对象)
  • 资源 ARN:如 arn:aws:s3:::mybucket(桶)、arn:aws:s3:::mybucket/*(桶内对象)

2. 什么是 MinIO?

MinIO 是一个 开源、自托管、与 Amazon S3 API 100% 兼容 的对象存储服务器。

  • 不是 AWS 官方 S3,但 API 协议完全兼容
  • 可部署在本地机房、云服务器、Kubernetes 等
  • 支持自建文件存储、备份存储、图片/视频分发等场景
  • 由于完全兼容 S3 API,任何访问 S3 的代码/工具,只需修改endpoint、access key、secret key 就可以访问 MinIO

常见 S3 API 权限(MinIO 也支持):

  • 下载:s3:GetObject
  • 上传:s3:PutObject
  • 列出对象:s3:ListBucket
  • 整桶资源 ARN 示例:arn:aws:s3:::mybucket + arn:aws:s3:::mybucket/*

3. Docker 安装 MinIO

首先,部署 MinIO 服务器:

docker run -d \
  --name minio \
  -p 9000:9000 \
  -p 9001:9001 \
  -v /data/minio/data:/data \
  -v /data/minio/config:/root/.minio \
  -e "MINIO_ROOT_USER=minioadmin" \
  -e "MINIO_ROOT_PASSWORD=minioadmin123" \
  quay.io/minio/minio server /data --console-address ":9001"

参数说明:

  • -p 9000:9000 → S3 API 端口
  • -p 9001:9001 → Web 控制台端口
  • MINIO_ROOT_USER / MINIO_ROOT_PASSWORD → 管理账号(密码要求≥8位)
  • /data → 对象存储数据路径(挂载到宿主机保证持久化)
  • /root/.minio → MinIO 配置路径
  • --console-address ":9001" → 启动 Web 控制台

访问方式:

  • Web 控制台http://服务器IP:9001
  • API 地址http://服务器IP:9000

4. 安装与使用 MinIO 客户端(mc)

MinIO 提供了 mc(MinIO Client)命令行工具,方便管理桶、上传文件、设置权限。

安装 mc:

wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/

配置别名:

mc alias set local http://服务器IP:9000 minioadmin minioadmin123

新建桶:

mc mb local/mybucket

设置公共只读(匿名可下载)权限:

mc anonymous set download local/mybucket

文件下载 URL 格式:

http://<IP>:9000/<bucket>/<object>

例:

http://192.168.1.100:9000/lxzs/somefile.txt

5. HTTPS 支持

生产环境建议开启 HTTPS,防止明文传输 Access Key/Secret Key。

配置步骤概述:

  1. 获取 SSL 证书(Let’s Encrypt 或自签名)
  2. 将证书放到 MinIO 容器的 /root/.minio/certs 目录:
    public.crt
    private.key
    
  3. 启动 MinIO 时映射证书目录
  4. 使用 https:// 访问

6. Spring Boot 集成 MinIO

由于 MinIO 兼容 AWS S3 API,可以直接使用 AWS 官方 S3 SDK 访问。

Maven 依赖(版本建议升级到至少 1.12.x,这里是原有的 1.11.80 示例):

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-s3</artifactId>
    <version>1.11.80</version>
</dependency>

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-sts</artifactId>
    <version>1.11.80</version>
</dependency>

Java 示例代码:

AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
    .withEndpointConfiguration(
        new AwsClientBuilder.EndpointConfiguration("http://127.0.0.1:9000", "")
    )
    .withCredentials(new AWSStaticCredentialsProvider(
        new BasicAWSCredentials("minioadmin", "minioadmin123")
    ))
    .withPathStyleAccessEnabled(true)
    .build();

// 上传
s3Client.putObject("mybucket", "test.txt", "Hello MinIO");

// 下载
String content = s3Client.getObjectAsString("mybucket", "test.txt");
System.out.println(content);

关键点:

  • endpoint 改成 MinIO API 地址
  • 必须 .withPathStyleAccessEnabled(true),否则可能因虚拟主机模式报错
  • region 可以传空字符串

7. 总结

  • S3 是 AWS 的云对象存储服务,MinIO 是开源、自托管、S3 兼容的对象存储服务器
  • MinIO 部署简单,三步即用:Docker 启动 → mc 管理 → 权限配置
  • API 层兼容 AWS S3,可直接复用现有 S3 SDK 和工具
  • 安全部署建议:
    • 生产开启 HTTPS
    • Access Key/Secret Key 不要硬编码
    • 桶策略按需限制(不要随意全部公共读写)
    • 数据卷记得持久化挂载,防止容器删除导致数据丢失

📌 后续进阶可参考:

  • MinIO 集群部署(分布式高可用)
  • 使用 MinIO Gateway 代理访问 Amazon S3、Azure Blob、GCS 等
  • 对象生命周期管理 + 版本控制
  • 与 CDN 结合做大文件分发

网站公告

今日签到

点亮在社区的每一天
去签到