AWS S3互換を意識して、設定にあたってMinIOに依存しすぎないようにしたい (それはそれとしてMinIO ClientはAWS S3互換クライアントとして便利らしい)

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

--endpoint-urlで操作対象をAWS S3からMinIOに変更できる

AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS以外の認証情報を~/.aws/credentialsに保持するのもいまいちな感があるので、環境変数に設定することにする
(AWSのIAM?がどうなってるのかよくわからんけど、本来マニュアルオペレーションするときはAWSのアカウントで認証するのかな?)

まずは特権アクセスでBucketを作る
MinIOのrootユーザのユーザ名・パスワードを設定する(MINIO_ROOT_USER、MINIO_ROOT_PASSWORD)

export AWS_ACCESS_KEY_ID=minioadmin
export AWS_SECRET_ACCESS_KEY=minioadmin

Bucket一覧

aws --endpoint-url http://127.0.0.1:9000 s3 ls

Bucket作成(create-bucketも大して変わらんと思うので、あえて高レベルAPIのs3 mbを使わなくていい気もするけどまあいいでしょう)

aws --endpoint-url http://127.0.0.1:9000 s3 mb s3://mybucket

アクセス制御(Policy)周りはS3と一部互換性がない
Policyの構文自体はほぼ同じに作られているけれど、仕様が違うように思われる(AWS S3の仕様をよく知らんけど)

Bucket policyはパブリックアクセスのルール、User/ServiceAccount Policyは認証付きルールと使い分ければいいと思われる
Bucket policyはAWS S3互換APIから設定できる
User/ServiceAccount PolicyはAWS互換APIから設定できないのでWeb UIまたはMinIO Clientから設定する

Bucket policy: allow anonymous user (public) to read mybucket/*

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

PrincipalはMinIO上のBucketとしては意味がないと思うが、Web Consoleでいじると必要だといわれるので付けておく

Bucket Policyの設定には、特権アクセスのためにrootユーザの認証情報を使う(適切にPolicyを設定すればBucket Policyを更新する権限を持ったユーザも作れるだろうけれど、ここではいいでしょう)

export AWS_ACCESS_KEY_ID=minioadmin
export AWS_SECRET_ACCESS_KEY=minioadmin

aws --endpoint-url http://127.0.0.1:9000 s3api put-bucket-policy --bucket mybucket  --policy file://minio_bucket_policy.json

Bucket policyの設定は低レベルAPIしかない?

Service account policy: allow user to put/delete mybucket/*
apply on Web UI

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:DeleteObject",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::mybucket/*"
    }
  ]
}

VersionはよくわからんのでBucketからコピーしたが、これがない(自動で空文字列が挿入される)と動作しなかった
PrincipalはWeb Consoleで必要だといわれなかったのでいらないと判断した(*を設定するのもよくないと思うし)

Service accountを使ったPut objectのテスト

export AWS_ACCESS_KEY_ID=SERVICE_ACCOUNT_ACCESS_KEY_ID
export AWS_SECRET_ACCESS_KEY=SERVICE_ACCOUNT_SECRET_ACCESS_KEY
touch a.txt
aws --endpoint-url http://127.0.0.1:9000 s3 cp ./a.txt s3://mybucket/a.txt