zoukankan      html  css  js  c++  java
  • MinIO设置永久访问链接

    MinIO 介绍

    MinIO 是一个基于 Apache License v2.0 开源协议的对象存储服务。它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几 kb 到最大 5T 不等。

    https://docs.min.io/cn/

    有效期限制

    文件上传到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 OnlyRead 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存储空间的策略,依照实际使用需要可以选择不同途径设置。如此可以对一些公共资源提供永久访问,但是也要注意安全性。

    参考

    1. https://docs.min.io/docs/
    2. https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/access-policy-language-overview.html

    2021-11-25,望技术有成后能回来看见自己的脚步

  • 相关阅读:
    设计模式 学习笔记(8) 适配器模式、单例模式、享元模式
    设计模式 学习笔记(7) 抽象工厂模式、状态模式
    判断页面是否被嵌入iframe里面
    css3的transform:tanslateZ没有效果
    vuecli3多页应用配置与优化
    正则的test和exec方法与字符串的search,replace,match,split方法的使用
    实验 1:Mininet 源码安装和可视化拓扑工具
    2020软件工程第一次作业
    R12新功能
    FSG(1) FSG报表组件
  • 原文地址:https://www.cnblogs.com/CKExp/p/15605367.html
Copyright © 2011-2022 走看看