スキップしてメイン コンテンツに移動

Google Cloud Storage上の非公開動画を特定の人にだけ公開する


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/(.*)
script: controllers.front.member.application
secure: optional
login: required
今回も認証まわりの制御はGoogle App EngineのUsersライブラリを使う。過去記事参照。また、videoタグのsrcには、動画ダウンロードを行うスクリプト(/member/play_movie)を指定する。
<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)

処理と言ってもこれだけ。blobstore.create_gs_keyでkeyを取得し、send_blobするだけ。あとはBlobstoreDownloadHandlerがうまいことやってくれる。

大きなサイズの動画でもDeadlineExceededErrorが出ることもないし、動画のシークも問題ない。ログを見ると14msで終わってるので、インスタンスを専有するわけでもなさそうだ。内部でどういうシーケンスになってるのか不明だが、これで目的の動作は果たせる。

【2015/12/10 追記】
内部のシーケンスについて、Google技術サポートに問い合わせる事があったので聞いてみると、Blobstore 経由で Cloud Storage のオブジェクトをクライアントに転送する場合、クライアントとインスタンスの経路の途中にある中継サーバに対して、Cloud Storage から直接データをクライアントに転送するように指示するそうです。なので、インスタンスを専有することもなく、大きめのファイルを転送できると。すばらしい!

コメント

このブログの人気の投稿

DatastoreとSerach APIを連携させる

Datastoreでは、複数のフィールドに対して不等式検索(!=や>など)やソートを行う場合、事前にIndexを構築しておく必要がある。しかも全ての検索条件の組み合わせごとにIndexが必要になるので、バックオフィス機能にありがちな複雑な条件での検索を行いたい場合、多くのIndexが必要だ。

Managed Virtual Machine に望むこと

先日2014年4月22日に行われた、Google Cloud Platformセッションの模様がYoutubeに公開されてた。 地方民はこういうイベントになかなか参加できないので、動画配信はほんとに助かる。ありがたや。。。 動画の中で語られている Managed VM は地味だけど、なにげにすごい機能だと思う。GAEでできなかったほとんどの事がこれで解決できるかもしれない。 ただ、個人的に Managed VMでは、(スケールアウトしなくていいので)固定IPも使えるようになってほしい。なぜなら、Google App Engineで外部のシステムと連携するとき、相手側でIPアドレス制限されている事がある。だから、連携前にあらかじめこちらのIPアドレスを教えておくのだけど、GAEはPaaSなのでその範囲も広いし、いつ変わるかわからない。まぁ、IPアドレス制限という方法自体がすでに時代遅れな感じではあるけど。 ともかく、GAEではそういうシステムと連携する時は、間にGAEでないサーバーを中継させておく必要がある。なので、このためだけにOSやApacheのメンテが発生する。これは、ほんとにアホらしいことだ。もし、Managed VMで固定IPが使えれば、対外部システムとの処理だけそのインスタンスで行えばいいし、中継サーバーも不要になるので、だいぶ楽になるのだ。 Googleさん、よろしくおねがいします。

BlobstoreUploadHandlerの文字化け問題の解決方法

Google App Engine Python2.7環境で、blobstore_handlers.BlobstoreUploadHandlerを使って、ファイルアップロードする際、日本語のリクエストパラメータが文字化けする問題に長年悩まされていた。 「文字化け」といっても、マルチバイト文字はBase64にエンコードされて送信される、という謎仕様。さらに、文字の組み合わせによっては Base64ではなく、Quoted-printable にエンコードされたりと、意味がわからない。。。 そんなわけで、ファイルとテキストは、別のリクエストに分けたりと、クライアント側で対処していた。 先日、この問題をGCPのサポートに問い合わせた結果、あっさりと対応方法を教えてくれた。 app.yamlに以下を追加すれば良いだけ。 libraries: - name: webob version: "1.2.3" なんと、WebObのバグだったようだ。 http://docs.webob.org/en/stable/changes.html#id25 GAEのPython2.7環境では、webobの1.1.1(かなり古い)がデフォルトらしく、1.2.3で解決されたこのbugfixのため、この対応で回避できる。という事らしい。 といっても、1.2.3もかなり前のバージョンなので、もっと上位のバージョンしても問題なさそうだけど、今回はこのバージョンで様子見で。。。 そろそろ、Goに移行しようかなぁ。。。