对象存储 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. 启动服务
执行
docker-compose up -d
命令后,服务就正常启动了,此时访问 localhost:9091 ,输入用户名密码就可登录控制台。
(画外音:learnku 上传图片出故障了?这里想传图但传不了……,后续补充)进入控制台后,创建一个用户(用户名:「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
目录下看到两个文件:config
和 credentials
,里面就是上边配置的信息。
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"}
小提示:
StsClient
有三个必填的初始化参数:endpoint
、region
、version
:
- endpoint:这是 MinIO 的接口服务地址,要注意端口号不要写成控制台的端口号了。
- region:这是 aws 配置时的信息,务必填写正确才可以
- version:这个值写死即可
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.
另外记得所有涉及账号安全的参数都不要直接写在代码中,上述代码只做演示之用。
写在最后
minIO 是个好东西,无奈文档陈旧不详实,因为调试 STS 走了不少弯路。本篇旨在为那些有意向接入 minIO 的 phper 提供入门指引,如有错误烦请指正,如果恰好帮到了您,还请打赏个赞,激励我继续写作分享,谢谢!
本作品采用《CC 协议》,转载必须注明作者和本文链接
对象存储最贵的应该是带宽吧?你们公司自己部署的对象存储用的多少兆的带宽哈?