🦁

docker-composeで建てたminioサーバーにpresigned urlを使ってファイルをアップロードする

2022/10/12に公開

目的

  • 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 requestsVirtual-hosted–style requestsがある。
それぞれの詳細はドキュメントを読めば分かるが、前者はパスで、後者はサブドメインでバケット指定する。
ローカルでドメインの設定を良きようにするには/etc/hostsを編集したり、dockerのネットワーク周りの設定をイジる必要がありそうだったが、それはめんどくさかったので、今回はPath-style requestに従ったpresigned urlを発行するようにアプリケーション側を書き換えた。

補足

localhostでpresigned urlを使ってアップロードする場合はまだ未検証。
近々検証する予定なので、覚えていたら加筆します。

Discussion