对象存储 minIO 接入指南(一)——服务部署及安全临牌(STS)获取

背景

公司目前使用的对象存储服务是阿里云的 OSS 和华为云的 OBS 。近日部分项目出于数据安全的考虑,计划将对象存储私有化部署,MinIO 就此进入我的视野。

MinIO 是什么?

MinIO 是一种高性能、兼容亚马逊 S3 协议的对象存储服务,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几 Kb 到最大 5T 不等。而且天然支持分布式,并可在任何云或本地基础设施上运行。(关于 MinIO 的更多信息可自行查阅 MinIO 官网

安装 MinIO

1. 编写 docker-compose 文件

version: '3'

services:
  minio:
    image: 'minio/minio:latest'
    container_name: minio
    restart: always
    ports:
      - '9090:9090' #api
      - '9091:9091' #控制台
    volumes:
      - ~/minio/data:/data  #数据目录
      - ~/minio/config:/root/.minio  #配置目录
    environment:
      - MINIO_ROOT_USER=minio  #控制台用户名
      - MINIO_ROOT_PASSWORD=minio123  #控制台用户密码
    command: server --address ':9090' --console-address ':9091' /data

2. 启动服务

  1. 执行 docker-compose up -d 命令后,服务就正常启动了,此时访问 localhost:9091 ,输入用户名密码就可登录控制台。
    (画外音:learnku 上传图片出故障了?这里想传图但传不了……,后续补充)

  2. 进入控制台后,创建一个用户(用户名:「aws」,密码:「12345678」),并为用户选择访问策略(Policy)。
    (画外音:learnku 上传图片出故障了?这里想传图但传不了……,后续补充)

通过 aws-cli 来获取 AssumeRole STS 授权

MinIO 提供多种获取安全令牌的方式,由于官方文档描述不详实,其他博文也都是 Java 版,无法验证是否可行,所以这里就不贴链接出来误导大家了。

1. 安装 aws-cli

链接送上,请自行取用:安装 aws-cli

2. 通过 aws configure 添加配置

# 注意,最后这个「aws」是上面我们在控制台创建的用户
aws configure --profile aws

# 输入上面的命令后,会依次显示如下四个配置项,填写即可
AWS Access Key ID [None]: aws #「aws」是控制台创建的用户名
AWS Secret Access Key [None]: 12345678 # 这里填写对应用户的密码
Default region name [None]: cn-chengdu # 这里填写地区
Default output format [None]: json # 这里配置为 json 即可

配置完成后,可在 ~/.aws 目录下看到两个文件:configcredentials,里面就是上边配置的信息。

3. 通过 aws 测试获取令牌信息

aws --profile aws --endpoint-url 'localhost:9090' sts assume-role --role-arn 'arn:aws:s3:::kyc/public/*' --role-session-name anything

# 执行上面的命令后得到如下信息即成功:
{
    "Credentials": {
        "AccessKeyId": "DZVCDDQ7SFRJ3L4VNYZQ",
        "SecretAccessKey": "2HZa8hvA8KFgfwAlwGRO0bPj9ZRRH4Yzmb9hCcYU",
        "SessionToken": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhY2Nlc3NLZXkiOiJEWlZDRERRN1NGUkozTDRWTllaUSIsImV4cCI6MTY5OTA3OTE5MiwicGFyZW50IjoiYXdzIn0.1V74eYkQPmggHRR4Z60ADfnUXNsbJlqT8dlvttbSIRveOOJbJe7iYTIs5lCnrViZyhvzkBgjlEe2JcXp-rHgtQ",
        "Expiration": "2023-11-04T06:26:32+00:00"
    },
    "AssumedRoleUser": {
        "Arn": ""
    }
}

php sdk 获取 STS

1. composer 安装 sdk

在项目中执行 composer require aws/aws-sdk-php 安装 sdk。

2. 获取 STS

<?php
use Aws\Sts\StsClient;

$client = new StsClient([
    'endpoint' => 'http://dev.cn:9090',
    'region' => 'chengdu',
    'version' => '2011-06-15',
    'credentials' => [
        'key'    => 'aws',
        'secret' => '12345678',
    ],
]);

$result = $client->assumeRole(
    [
        'RoleArn' => 'arn:aws:s3:::kyc/public/*', // 必填
        'RoleSessionName' => 'anything', //必填
        'DurationSeconds' => 900, // 过期时间,范围是 15 分钟到 12 小时,默认 900 (15分钟)
    ]
);

$this->info(json_encode($result->get('Credentials')));

运行上述代码,输出如下结果即成功:

{"AccessKeyId":"0AEA5RCHXHYLUJYTSMJ7","SecretAccessKey":"HbSxPCcmOHEYBULsImRgSfdjdUStCseEulW8xXA6","SessionToken":"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhY2Nlc3NLZXkiOiIwQUVBNVJDSFhIWUxVSllUU01KNyIsImV4cCI6MTY5OTA3MDY0NCwicGFyZW50IjoiYXdzIn0.Am4b9XWc4TLs0b2-l3EiRE9io99xI8MRbwk6hBp3-7hCBdYRnsfM-IpQ2TFvH23msU1Os9W_7tK7hBNW7wwrZQ","Expiration":"2023-11-04T04:04:04+00:00"}

小提示:

  1. StsClient 有三个必填的初始化参数:endpointregionversion
  • endpoint:这是 MinIO 的接口服务地址,要注意端口号不要写成控制台的端口号了
  • region:这是 aws 配置时的信息,务必填写正确才可以
  • version:这个值写死即可
  1. StsClient 还有一个很重要的选填参数:credentials,当这个参数为空时,会尝试从本地获取。缺少这个参数通常会导致一个错误:

    Aws\Exception\CredentialsException
    
    Error retrieving credentials from the instance profile metadata service. (cURL error 7: Failed to connect to 169.254.169.254 port 80 after 0 ms: Couldn't connect to server.
  2. 另外记得所有涉及账号安全的参数都不要直接写在代码中,上述代码只做演示之用。

写在最后

minIO 是个好东西,无奈文档陈旧不详实,因为调试 STS 走了不少弯路。本篇旨在为那些有意向接入 minIO 的 phper 提供入门指引,如有错误烦请指正,如果恰好帮到了您,还请打赏个赞,激励我继续写作分享,谢谢!

本作品采用《CC 协议》,转载必须注明作者和本文链接
代码是写给人看的,顺便给机器运行一下。
讨论数量: 2

对象存储最贵的应该是带宽吧?你们公司自己部署的对象存储用的多少兆的带宽哈?

5个月前 评论
luci (楼主) 5个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!