LoginSignup
9
4

More than 3 years have passed since last update.

minioでobjectをpublic readする

Posted at

TL; DR

  1. URLは http://{miniohost}:9000/{bucketname}/{key} のような形式
  2. BucketPolicyで読み取り権限を与える

手順

URLフォーマット

URLは http://{miniohost}:9000/{bucketname}/{key} のような形式。minioのUI画面のURLとは異なる。
以下に記載があった。
https://github.com/minio/minio/issues/5180

読み取り権限

S3 バケットのオブジェクトにパブリック読み取りアクセス許可を付与する
https://aws.amazon.com/jp/premiumsupport/knowledge-center/read-access-objects-s3-bucket/

AWS公式ドキュメントに記載があるようにS3だと4つの方式がある

  1. Amazon S3 コンソールを使用してオブジェクトのアクセスコントロールリスト (ACL) を更新する
  2. AWS コマンドラインインターフェイス (AWS CLI) を使用してオブジェクトの ACL を更新する
  3. 指定されたオブジェクトタグへのパブリック読み取りアクセス許可を付与するバケットポリシーを使用する
  4. 指定されたプレフィックスへのパブリック読み取りアクセス許可を付与するバケットポリシーを使用する

コンソールは使わないので1は置いておいて(やるとしてもminioのコンソールには機能がなさそう)、
2のようにobjectにACLを設定しても機能しなかった。

タグは付けていないので3は省略し、
4はminioで対応してそうなのでこちらで対応する。

UI画面から行う

以下の記事にminioのUI画面から行う説明がある。
こちらでは"Read Write"を設定しているけど、読み取りだけなら"Read"を設定したらアクセスできた。

minioでHTTPでアクセスする - Qiita
https://qiita.com/mo12ino/items/312a16a32ec8b3fa30ce

CLIから行う

AWS CLIやAWS SDKから行う場合はAWS公式ドキュメントにあるように

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::examplebucket/publicprefix/*"]
    }
  ]
}

上記のようなPolicyを設定する。

以下はgoでBucket作成時にいっしょにPolicyを設定した例。

headInput := &s3.HeadBucketInput{
    Bucket: &bucket,
}
if _, err := s3Client.HeadBucket(headInput); err != nil {
    _, err := s3Client.CreateBucket(&s3.CreateBucketInput{
        Bucket: aws.String(bucket),
    })
    if err != nil {
        panic("failed to create buket")
    }

    readOnlyAnonUserPolicy := map[string]interface{}{
        "Version": "2012-10-17",
        "Statement": []map[string]interface{}{
            {
                "Sid":       "AddPerm",
                "Effect":    "Allow",
                "Principal": "*",
                "Action": []string{
                    "s3:GetObject",
                },
                "Resource": []string{
                    fmt.Sprintf("arn:aws:s3:::%s/*", bucket),
                },
            },
        },
    }
    policy, _ := json.Marshal(readOnlyAnonUserPolicy)

    s3Client.PutBucketPolicy(&s3.PutBucketPolicyInput{
        Bucket: aws.String(bucket),
        Policy: aws.String(string(policy)),
    })
}
9
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4