🦁
docker-composeで建てたminioサーバーにpresigned urlを使ってファイルをアップロードする
目的
- docker-composeで建てたminioサーバーにpresigned urlを使ってファイルをアップロードする方法を雑に記載する
対象読者
- docker-composeで建てたminioサーバーにpresigned urlを使ってファイルをアップロードする方法を知りたい人
記事執筆背景
- 苦労した & そんなに日本語の情報ないと感じて、誰かの役に立つかもしれないし、書いてみることにした。
結論
やり方は色々とあると思うが、以下のようにした。
- docker-compose.ymlに
post-file-to-minio
というサービスを定義し、docker-compose runコマンドに引数を渡してファイルをアップロードできるようにするシェルスクリプトを書いた - S3クライアントの設定をちょこっと変更した
具体的には以下のようなymlとシェルスクリプトをを書いた(一部抜粋)。
post-files-to-minio:
image: curlimages/curl
volumes:
- /path/to/files:/files/
docker compose run post-files-to-minio \
-X PUT \
--upload-file /files/$1 \
$2
使い方は下記のようなイメージ。
$ bash post-files-to-minio.sh ${FILE_NAME} ${PRESIGNED_URL}
# 第1引数はdocker-compose.ymlのvolumesで指定したディレクトリに配置したファイル名を指定する
# 第2引数はpresigned url
$ bash post-files-to-minio.sh sample-file "http://minio:9000/..."
S3クライアントは以下のような設定をする(抜粋)。キモは S3ForcePathStyle
である。
// ...(略)...
session, err := session.NewSession(&aws.Config{
S3ForcePathStyle: aws.Bool(true),
Endpoint: aws.String("http://minio:9000"),
})
s3 := s3.New(session)
// ...(略)...
ドキュメントを読んだ限りだと、S3にはバケットを指定するURL形式としてPath-style requestsとVirtual-hosted–style requestsがある。
それぞれの詳細はドキュメントを読めば分かるが、前者はパスで、後者はサブドメインでバケット指定する。
ローカルでドメインの設定を良きようにするには/etc/hostsを編集したり、dockerのネットワーク周りの設定をイジる必要がありそうだったが、それはめんどくさかったので、今回はPath-style requestに従ったpresigned urlを発行するようにアプリケーション側を書き換えた。
補足
localhostでpresigned urlを使ってアップロードする場合はまだ未検証。
近々検証する予定なので、覚えていたら加筆します。
Discussion