AWS S3互換を意識して、設定にあたってMinIOに依存しすぎないようにしたい (それはそれとしてMinIO ClientはAWS S3互換クライアントとして便利らしい)
-
https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
-
aws-cli version: 2.7.7
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