どうにか方法ないかなって調べてたら下記記事を見つけた。
Qiitaの画像アップロード機能も簡単に実装できる。そう、S3ならね。
まさにやりたいことはこれ。でもS3じゃなくてConoHaオブジェクトストレージでやりたい。
調べた。
- Form POST middleware
見た感じさっきのQiita記事はOpenStack Swiftの上記機能を使ってるっぽい。 - Secret Keys
上記FormPOSTを行うためにはSecret Keysってものを使う必要がある。 - Temporary URL middleware
Secret Keysは"Form POST" と "Temporary URL"って機能で使うらしい。 - temporary url middleware | ConoHa API Documantation
ConoHaのドキュメントにも"Temporary URL"が載っててサンプルコードもあった。
とりあえず簡単そうな"Temporary URL"を試してみる。
コンテナを作成しファイルをアップロード
"container"ってコンテナを作り、"hello.txt"をアップロードした。
コンテナには何もメタデータを設定していないので、今のところhello.txtは直接GETできない。
トークンの発行
前回の記事と同様にトークンを発行する。curl -i -X POST \ -H "Accept: application/json" \ -d '{"auth":{"passwordCredentials":{"username":"APIユーザー名","password":"APIユーザーパスワード"},"tenantId":"テナントID"}}' \ https://identity.tyo1.conoha.io/v2.0/tokens
TempURL用のKeyを登録
curl -i -X POST \ -H "Accept: application/json" \ -H "X-Auth-Token: [取得したトークン]" \ -H 'X-Account-Meta-Temp-URL-Key: [セットしたいキー]' \ https://object-storage.tyo1.conoha.io/v1/nc_df3bdbc45bc04950b558834f5728517aTemporary URL middlewareに4つのキーが必要、みたいに書いてあるけどここでセットしてるのアカウントに対する鍵の1つ目(X-Account-Meta-Temp-URL-Key)っぽいなぁ。1つでいいのかな。残り3つはなんなんやろ。
TempURLを生成するスクリプトを用意
create-tempurl.pyimport hmac from hashlib import sha1 from time import time method = 'GET' duration_in_seconds = 60*60*24 expires = int(time() + duration_in_seconds) path = '/v1/nc_df3bdbc45bc04950b558834f5728517a/container/hello.txt' key = '[セットしたキー]' hmac_body = '%s\n%s\n%s' % (method, expires, path) sig = hmac.new(key, hmac_body, sha1).hexdigest() s = 'https://{host}{path}?temp_url_sig={sig}&temp_url_expires={expires}' url = s.format(host='object-storage.tyo1.conoha.io', path=path, sig=sig, expires=expires) print '%s' % urlpythonにはhmacってライブラリがあるんですなぁ。rubyにもあるのかな。
スクリプト実行
$ python create-tempurl.py https://object-storage.tyo1.conoha.io/v1/nc_df3bdbc45bc04950b558834f5728517a/container/hello.txt?temp_url_sig=9775eacc57b95fe57435c8f5d8b6e404a0957930&temp_url_expires=1436284812こんな感じでURLが返ってくる。
このURLをブラウザで開くとダウンロードされるので一時URLが有効になってるのが確認できた。めでたしめでたし。
とりあえずhmacによる認証ハッシュを生成する方法はわかったので次はFormPOSTを試してみたい。
ConoHaのAPIドキュメントに"Form POST"っぽいものがないけど使えるんだろうか・・・
今日はここまで。
関連記事
ConoHa関連の記事をまとめました。ConoHa関連まとめ