Google Cloud Storageで署名付きURLを発行してファイルをアップロードする
サービスアカウントで認証キーを発行する
署名済みURLを操作するため gcloud コマンドなどで事前に対応するサービスアカウントの認証キーを発行しておく code:sh
# 認証キーを作る (JSON形式)
gcloud iam service-accounts keys create $HOME/Desktop/key.json --iam-account=SA_NAME@PROJECT_NAME.iam.gserviceaccount.com
署名付きURLを発行する
gcloud コマンドでURLを発行する。メソッドはPUT 有効期限は1h Content-Type:text/plain がついているもののみ許容。このとき --headers に指定する文字列はすべて小文字でないとうまく動作しなかった。
code:fish(sh)
# 署名付きURLを発行して変数Xに格納する
# (例として OBJECT_NAME は sample.txt)
X=`
gcloud storage sign-url gs://BUCKET_NAME/sample.txt \
--private-key-file=$HOME/Desktop/key.json \
--http-verb=PUT \
--duration=1h \
--headers="content-type=text/plain" \
| grep signed_url | awk '{print $2}' \
`
ファイルアップロードをしてみる
URLの発行まで出来たら実際にファイルをアップロードしてみる。
URL発行時点で受け付ける Content-Type を text/plain のみに指定しているのでそれ以外のヘッダがきた場合は拒否される。素朴に curl を使用した code:sh
# サンプル用のデータを作る
echo UPLOADED > $HOME/Desktop/sample.txt
# URLに対してPUTしてファイルを置く (正常パターン)
curl -i -X PUT "$X" --upload-file $HOME/Desktop/sample.txt -H "Content-Type: text/plain"
# URLに対してPUTしてファイルを置く (異常パターン: 意図的に text/html を指定している)
curl -i -X PUT "$X" --upload-file $HOME/Desktop/sample.txt -H "Content-Type: text/html"
関連