MinIO 介紹
MinIO 是一個基於 Apache License v2.0 開源協議的對象存儲服務。它兼容亞馬遜 S3 雲存儲服務接口,非常適合於存儲大容量非結構化的數據,例如圖片、視頻、日志文件、備份數據和容器/虛擬機鏡像等,而一個對象文件可以是任意大小,從幾 kb 到最大 5T 不等。
有效期限制
文件上傳到minio后,要進行分享時,從管理界面點擊分享只能生成最多7 天有效期的鏈接。
或是使用sdk通過代碼調用minio的Api的請求參數也是最大7天有效期。
超過期限再次訪問便看不到了
有些資源是需要一直可以訪問(公共資源),需要對存儲空間(Bucket)進行一番設置方可。
Bucket訪問策略
存儲空間(Bucket)默認策略有如下幾種
- Read Only - download
- Write Only - upload
- Read and Write - public
- 不設置 - none
從管理界面新建一個存儲空間,然后查看策略,默認是為空的。
對存儲空間(Bucket)的策略更改,可通過管理界面或是命令行形式更改目標桶的訪問策略,當然了本質上最終都是對minio server的設置。
解決方案
- minio server管理界面直接操作修改
- minio相關的各語言SDK使用Api請求修改
- minio提供的客戶端修改
使用效果
當對存儲空間(Bucket)按照如上三種之一設置訪問策略后,直接通過如下格式訪問即可
域名或ip:端口/桶名稱/[文件前綴]/文件名
與直接點擊分享鏈接相比,后綴那節加密算法和憑證參數就不用了
方案一:管理界面
新增一條策略,設置匹配前綴,再選擇Read Only 或 Read and Write后點擊添加即可。
- 當填寫前綴 * 默認該存儲空間(Bucket)下所有文件都可以訪問
- 當填寫特殊前綴對應該存儲空間(Bucket)下特定這個前綴開頭文件可以訪問
如此處設置以下d開頭的前綴,那么便只有d開頭的文件可以公開訪問。
同時訪問day.png和autumn.jpg,d前綴訪問成功,其他跳轉到文件目錄下
方案二:SDK請求Api
此處以.Net為主,安裝MinIO包,快速創建一個Bucket並設置下訪問策略。
var minioClient = new MinioClient(Configuration["MinIO:EndPoint"], Configuration["MinIO:AccessKey"], Configuration["MinIO:SecretKey"]);
提供的SDK中由設置存儲空間(Bucket)的方法,提供桶名,策略json格式字符串即可。
在官網給出的調用示例中,設置Policy的參數為一個json,其格式如下,其中部分參數是固定化的,此次需要關心的是對Resource中的Prefix設置,即管理界面中要輸入的Prefix。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetBucketLocation"
],
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Resource": [
"arn:aws:s3:::starcity"
],
"Sid": ""
},
{
"Action": [
"s3:ListBucket"
],
"Condition": {
"StringEquals": {
"s3:prefix": [
"foo",
"prefix/"
]
}
},
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Resource": [
"arn:aws:s3:::starcity"
],
"Sid": ""
},
{
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Resource": [
"arn:aws:s3:::starcity/foo*",
"arn:aws:s3:::starcity/prefix/*"
],
"Sid": ""
}
]
}
其格式是由aws s3中給出的,需要了解具體格式內容的話可以參考
https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/access-policy-language-overview.html
此處設置的話我們只設置Resource部分即存儲空間資源部分,通過SDK提供的Api傳入一個json設置。
[HttpPost("/UpdatePolicy")]
public async Task UpdatePolicyAsync(string bucketName, string prefix)
{
var existedBucket = await _minioClient.BucketExistsAsync(bucketName);
if (existedBucket)
{
// 固定格式只需變更bucketName和prefix即可
var policyJson = $@"{{""Version"":""2012-10-17"",""Statement"":[{{""Action"":[""s3:GetBucketLocation""],""Effect"":""Allow"",""Principal"":{{""AWS"":[""*""]}},""Resource"":[""arn:aws:s3:::{bucketName}""],""Sid"":""""}},{{""Action"":[""s3:ListBucket""],""Condition"":{{""StringEquals"":{{""s3:prefix"":[""{prefix}""]}}}},""Effect"":""Allow"",""Principal"":{{""AWS"":[""*""]}},""Resource"":[""arn:aws:s3:::{bucketName}""],""Sid"":""""}},{{""Action"":[""s3:GetObject""],""Effect"":""Allow"",""Principal"":{{""AWS"":[""*""]}},""Resource"":[""arn:aws:s3:::{bucketName}/{prefix}*""],""Sid"":""""}}]}}";
await _minioClient.SetPolicyAsync(bucketName, policyJson);
}
}
或者從管理界面設置好后再通過SDK提供的獲取桶策略獲取json結構,是一致的。
var defaultPolicy = await _minioClient.GetPolicyAsync(bucketName);
如此一來,同樣可以在管理界面中看到設置的策略信息以及不需要設置有效期訪問文件。
方案三:客戶端
minio提供了用來管理minioserver的client和admin,當使用docker時,都在minio/mc鏡像下
安裝與綁定
通過命令行形式管理存儲空間(Bucket)也方便,如使用docker部署,拉取minio client的鏡像來管理minio server即可
拉取minio client鏡像
docker pull minio/mc
創建minio client容器並進入容器內
docker run -it --entrypoint=/bin/sh minio/mc
將minio server加入到minio client下
mc alias set <alias> <your-minio-endpoint> [YOUR-ACCESS-KEY] [YOUR-SECRET-KEY]
- ALIAS給綁定的minio server起個別名
- YOUR-MINIO-ENDPOINT格式為 schema://host:port
- YOUR-ACCESS-KEY和YOUR-SECRET-KEY即訪問minio server的賬號與密碼
操作命令
再直接按照給定的命令改變下桶的策略
mc policy或是mc anonymous都行,對存儲空間進行策略的一系列相關操作。
(mc policy)
(mc anonymous)
設置策略
設置一個prefix的前綴為public,這樣一來該部分前綴的文件便可直接訪問。
以上三種方式都可以設置下minio存儲空間的策略,依照實際使用需要可以選擇不同途徑設置。如此可以對一些公共資源提供永久訪問,但是也要注意安全性。
參考
- https://docs.min.io/docs/
- https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/access-policy-language-overview.html
2021-11-25,望技術有成后能回來看見自己的腳步