Google App Engine単体では(Blobstoreを使う以外)ファイルの読み書きはできないが、GCPのクラウドストレージ製品Google Cloud Storageを使えば、簡単にファイルを取り扱うことができる。今回は、ある特定の人にだけ動画を見せたい場合を想定して、Google Cloud Storageに置いた非公開な動画ファイルを、OpenIDでログインしている人にだけ見せる方法をメモしておく。
動画ファイルの配置
GCPのコンソールからGoogle Cloud Storageにファイルをアップロードする。(アップロード方法はまたの機会に。)ちなみに、動画ファイルはNHKクリエイティブ・ライブラリーから拝借した。今回保存したファイルパス(非公開)
/gcp-memo.appspot.com/movies/meteorite.mp4
動画再生ページの作成
videoタグを配置するページ(/member/movie)を作成。こちらもログイン必須のページにしておく。app.yamlでログイン必須指定する。- url: /member/(.*)今回も認証まわりの制御はGoogle App EngineのUsersライブラリを使う。過去記事参照。また、videoタグのsrcには、動画ダウンロードを行うスクリプト(/member/play_movie)を指定する。
script: controllers.front.member.application
secure: optional
login: required
<video autoplay="" controls="" src="/member/play_movie">
</video>
動画ダウンロードスクリプトの作成
/member/play_movie を実装する。上のapp.yamlで、/member配下は認証必須指定しているので、必ず認証された状態でアクセスされる。あとはダウンロード処理を実装すればいいだけ。from google.appengine.ext import blobstore
from google.appengine.ext.webapp import blobstore_handlers
class PlayMovie(blobstore_handlers.BlobstoreDownloadHandler):
def get(self):
blob_key = blobstore.create_gs_key('/gs/gcp-memo.appspot.com/movies/meteorite.mp4')
self.send_blob(blob_key)
url_map = [
('/member/play_movie', PlayMovie),
]
application = webapp.WSGIApplication(url_map, debug=True)
大きなサイズの動画でもDeadlineExceededErrorが出ることもないし、動画のシークも問題ない。ログを見ると14msで終わってるので、インスタンスを専有するわけでもなさそうだ。内部でどういうシーケンスになってるのか不明だが、これで目的の動作は果たせる。
【2015/12/10 追記】
内部のシーケンスについて、Google技術サポートに問い合わせる事があったので聞いてみると、Blobstore 経由で Cloud Storage のオブジェクトをクライアントに転送する場合、クライアントとインスタンスの経路の途中にある中継サーバに対して、Cloud Storage から直接データをクライアントに転送するように指示するそうです。なので、インスタンスを専有することもなく、大きめのファイルを転送できると。すばらしい!
0 件のコメント:
コメントを投稿