参考
公式
ブログ
メモ
S3互換の仕組みを導入したく、検索してヒットしたので試した。
動作確認
前提
1 2
| $ cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
|
サーバ起動
Minioの公式ウェブサイト
を確認し、
1 2 3 4 5 6
| $ mkdir ~/Minio $ cd ~/Minio $ wget https://dl.min.io/server/minio/release/linux-amd64/minio $ chmod +x minio $ mkdir data $ ./minio server data
|
http://localhost:9000/minio/
にアクセスすると、ログイン画面が出るので、
デフォルトのID、パスワードを入力する。
コンフィグ
Minioのコンフィグガイド
を見ると、アドミンユーザとパスワードの設定方法が載っていた。
1 2 3
| $ export MINIO_ROOT_USER=minio $ export MINIO_ROOT_PASSWORD=miniominio $ ./minio server data
|
上記のようにすればよさそうである。なお、USERは3文字以上、PASSWORDは8文字以上が必要。
ここでは、ローカル環境用にお試し用のID、パスワードとした。
mcコマンドの利用
MinioのアドミンガイドとMinioのクライアントガイド
を参考に、いくつか動作確認、設定してみる。
1 2
| $ cd ~/Minio $ wget https://dl.min.io/client/mc/release/linux-amd64/mc
|
エイリアスを設定。
1
| $ ./mc alias set myminio http://172.24.88.24:9000 minio miniominio
|
情報を確認。
1 2 3 4 5
| $ ./mc admin info myminio ● 172.24.88.24:9000 Uptime: 6 minutes Version: 2021-06-09T18:51:39Z Network: 1/1 OK
|
バケットを作成
1 2
| $ ./mc mb myminio/test Bucket created successfully `myminio/test`.
|
ファイルを書き込み
1 2 3
| $ echo test > /tmp/test.txt $ ./mc cp /tmp/test.txt myminio/test/ /tmp/test.txt: 5 B / 5 B ┃┃ 224 B/s 0s
|
s3コマンドで利用
開発のためにローカルにもS3が欲しいというわがまま、MINIOが叶えてくれました
を参照し、 S3としてアクセスしてみる。
1 2 3 4 5 6
| $ aws --profile myminio configure AWS Access Key ID [None]: minio AWS Secret Access Key [None]: miniominio Default region name [None]: Default output format [None]: $ aws --endpoint-url http://127.0.0.1:9000 --profile myminio s3 mb s3://test2
|
上記のように、エンドポイントを指定して利用する。
1 2
| $ aws --endpoint-url http://127.0.0.1:9000 --profile myminio s3 cp /tmp/test.txt s3://test2 upload: ../../../tmp/test.txt to s3://test2/test.txt
|
アップデート
以下のメッセージが出たので、試しにアップデートしてみた。
1 2
| You are running an older version of MinIO released 2 months ago Update: Run `mc admin update`
|
まず、Minioのサーバを起動しておく。
この後別のターミナルを開き、エイリアすを設定しておく。
1
| $ ./mc alias set myminio http://172.24.32.250:9000 minioadmin minioadmin
|
アップデート実行
1 2
| $ ./mc admin update myminio Server `myminio` updated successfully from 2021-06-09T18:51:39Z to 2021-08-25T00-41-18Z
|
署名済みURL発行
boto3
を用いて MinIO でユーザの追加と Security Token Service(STS)
による一時認証情報での署名済み URL を発行する を参考に、
上記環境で署名済みURLを発行してみる。
これにより、あるオブジェクトへのアクセス権をデリゲート可能になるはずである。
S3互換サービスのためのエイリアス
前述の通り、 mc
alias を利用して、S3互換サービスのためのエイリアスを作成済みである。
ここでは、その作成した myminio
を利用する。
作業用バケット作成
今回の動作確認で使用するバケットを作成する。
ポリシーファイルの作成
以下のファイルを作成する。
share.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| $ cat << EOF > share.json > { > "Version": "2012-10-17", > "Statement": [ > { > "Action": [ > "s3:GetObject", > "s3:PutObject" > ], > "Effect": "Allow", > "Resource": [ > "arn:aws:s3:::share/*" > ], > "Sid": "" > } > ] > } > EOF
|
ポリシーを適用
mc
admin policy
の通り、AWSのIAM互換のポリシーを利用し、Minioのポリシーを設定する。
先程作成したファイルを用いる。
1
| $ ./mc admin policy add myminio share share.json
|
適用されたことを確かめる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| $ ./mc admin policy info myminio share { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::share/*" ] } ] }
|
ユーザ作成
mc
admin userを利用したユーザ作成 を利用して、
動作確認のためのユーザを作成する。
1
| $ ./mc admin user add myminio bob bob123456
|
なお、上記ドキュメントでは
mc admin user add ALIAS ACCESSKEY SECRETKEY
と記載されているが、ACCESSKEY
にしていた内容がユーザ名になるようだ。
ユーザにポリシーを設定
1
| $ ./mc admin policy set myminio share user=bob
|
ユーザ作成され、ポリシーが設定されたことを確かめる。
1 2
| $ ./mc admin user list myminio enabled bob share
|
共有の動作確認用のファイルの準備
手元でファイルを作り、Minio上にアップロードしておく。
1 2
| $ echo "hoge" > test.txt $ ./mc cp test.txt myminio/share/test.txt
|
Python
botoを利用して一時アカウント発行&署名済みURL発行
ウェブUIからの発行
実は、ウェブUIからも発行できるため、先にそちらを試した。
ウェブUIからの署名済みURL発行の例
ウェブUIからの署名済みURL発行の例
オブジェクトブラウザから辿りオブジェクトのページを開き、共有マークを押下すると発行できた。
実際にアクセスしたところ、ファイル本体にアクセスできた。
前提
- Pythonバージョン: 3.7.10
- 利用パッケージ: boto3、jupyter
ソースコードの例
https://github.com/dobachi/MinioPresignedURLExample
にサンプルを載せておくことにする。
こちらの手順で特に問題なく、発行できた。
(トラブルシュート)署名済みURLにアクセスしてみたらエラー
署名済みURLを発行してアクセスしてみたら、以下のようなエラーが生じた。
1 2 3 4 5 6 7 8 9
| <Error> <Code>AccessDenied</Code> <Message>Access Denied.</Message> <Key>test.txt</Key> <BucketName>share</BucketName> <Resource>/share/test.txt</Resource> <RequestId>16A34CDD784CBCCC</RequestId> <HostId>baec9ee7-bfb0-441b-a70a-493bfd80d745</HostId> </Error>
|
ひとまず、./mc admin trace
を利用してデバッグメッセージを確認しながらアクセスしてみる。
生じたエラーメッセージは以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| 172.24.32.250:9000 [REQUEST s3.GetObject] [2021-09-10T00:34:26:000] [Client IP: 172.24.32.1] 172.24.32.250:9000 GET /share/test.txt?xxxxxxxx 172.24.32.250:9000 Proto: HTTP/1.1 172.24.32.250:9000 Host: 172.24.32.250:9000 172.24.32.250:9000 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 172.24.32.250:9000 Accept-Encoding: gzip, deflate 172.24.32.250:9000 Cache-Control: max-age=0 172.24.32.250:9000 Content-Length: 0 172.24.32.250:9000 Dnt: 1 172.24.32.250:9000 Upgrade-Insecure-Requests: 1 172.24.32.250:9000 Accept-Language: ja,en;q=0.9,en-GB;q=0.8,en-US;q=0.7 172.24.32.250:9000 Connection: keep-alive 172.24.32.250:9000 Cookie: token=xxxxxxxxx 172.24.32.250:9000 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36 Edg/92.0.902.84 172.24.32.250:9000 <BODY> 172.24.32.250:9000 [RESPONSE] [2021-09-10T00:34:26:000] [ Duration 387µs ↑ 132 B ↓ 617 B ] 172.24.32.250:9000 403 Forbidden 172.24.32.250:9000 Accept-Ranges: bytes 172.24.32.250:9000 Content-Length: 294 172.24.32.250:9000 Server: MinIO 172.24.32.250:9000 X-Content-Type-Options: nosniff 172.24.32.250:9000 X-Amz-Request-Id: 16A34EBDA67B7B88 172.24.32.250:9000 X-Xss-Protection: 1; mode=block 172.24.32.250:9000 Content-Security-Policy: block-all-mixed-content 172.24.32.250:9000 Content-Type: application/xml 172.24.32.250:9000 Strict-Transport-Security: max-age=31536000; includeSubDomains 172.24.32.250:9000 Vary: Origin 172.24.32.250:9000 <?xml version="1.0" encoding="UTF-8"?> <Error><Code>AccessDenied</Code><Message>Request has expired</Message><Key>test.txt</Key><BucketName>share</BucketName><Resource>/share/test.txt</Resource><RequestId>16A34EBDA67B7B88</RequestId><HostId>baec9ee7-bfb0-441b-a70a-493bfd80d745</HostId></Error> 172.24.32.250:9000 172.24.32.250:9000 [REQUEST s3.ListObjectsV1] [2021-09-10T00:34:26:000] [Client IP: 172.24.32.1] 172.24.32.250:9000 GET /favicon.ico 172.24.32.250:9000 Proto: HTTP/1.1 172.24.32.250:9000 Host: 172.24.32.250:9000 172.24.32.250:9000 Accept: image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8 172.24.32.250:9000 Cache-Control: no-cache 172.24.32.250:9000 Connection: keep-alive 172.24.32.250:9000 Cookie: token=xxxxxxxxxxxxxxxxxxx 172.24.32.250:9000 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36 Edg/92.0.902.84 172.24.32.250:9000 Accept-Encoding: gzip, deflate 172.24.32.250:9000 Accept-Language: ja,en;q=0.9,en-GB;q=0.8,en-US;q=0.7 172.24.32.250:9000 Content-Length: 0 172.24.32.250:9000 Dnt: 1 172.24.32.250:9000 Pragma: no-cache 172.24.32.250:9000 Referer: http://172.24.32.250:9000/share/test.txt?xxxxxxxxxxxxxx 172.24.32.250:9000 172.24.32.250:9000 [RESPONSE] [2021-09-10T00:34:26:000] [ Duration 184µs ↑ 121 B ↓ 596 B ] 172.24.32.250:9000 403 Forbidden 172.24.32.250:9000 X-Xss-Protection: 1; mode=block 172.24.32.250:9000 Content-Length: 273 172.24.32.250:9000 Content-Type: application/xml 172.24.32.250:9000 Strict-Transport-Security: max-age=31536000; includeSubDomains 172.24.32.250:9000 X-Amz-Request-Id: 16A34EBDAA2A2630 172.24.32.250:9000 X-Content-Type-Options: nosniff 172.24.32.250:9000 Accept-Ranges: bytes 172.24.32.250:9000 Content-Security-Policy: block-all-mixed-content 172.24.32.250:9000 Server: MinIO 172.24.32.250:9000 Vary: OriginAccept-Encoding 172.24.32.250:9000 <?xml version="1.0" encoding="UTF-8"?> <Error><Code>AccessDenied</Code><Message>Access Denied.</Message><BucketName>favicon.ico</BucketName><Resource>/favicon.ico</Resource><RequestId>16A34EBDAA2A2630</RequestId><HostId>baec9ee7-bfb0-441b-a70a-493bfd80d745</HostId></Error> 172.24.32.250:9000
|
あまり追加情報はなさそう。ひとまず、いずれにせよ403
Forbidenエラーであることがわかる。
で、結論としては、PythonでURLを発行する際に指定したポリシが間違っていた。
以下のようにすべきところを、
1 2 3
| "Resource": [ "arn:aws:s3:::share/*" ],
|
以下のように *
が抜けていた。
1 2 3
| "Resource": [ "arn:aws:s3:::share/" ],
|
結果として指定するスコープが小さすぎたということか。