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

Google App Engine のデータストア料金(課金)対策


Google App Engine(GAE)の利用料金、みなさんどのようにお考えでしょうか。
自分のイメージはこうです。

データストアだけやたらハイコスト

いろんな課金条件がありますが、ほとんど全部が無料枠にあっさり収まっているのに、データストアのアクセスだけが枠をじゃんじゃん消費してしまっていたりしないでしょうか。

リソース消費という面でこの価格は妥当であるのは分かりますが、とにかくここで壁にぶち当たるという方も多いのではないでしょうか。

この記事ではその対策について書いてみたいと思います。
(データストアじゃない部分で課金を減らしたい方には参考にならないと思います)

対策できるか

まず、サービスのタイプが以下のどちらに当てはまるかで今回の対策ができるかが決まります。
  1. ブログのように閲覧が多く更新が少ない。もしくは更新ゼロ。
  2. Twitterやチャットのように常々更新され表示される。
ここで2の場合、以下の対策はできません。
そして1の場合、対策できる可能性があります。

その対策方法というのは...

データストアを使わない(超本気)

不可能だとか冗談に思われるかも知れませんが、可能です、本気です。

企業でAPサーバとDBサーバを繋いでゴニョゴニョしてた自分としては、すげえ納得いかねぇ!って思う技なのですが、今はこればかり使っています。

ある意味情報処理的には正しいとも言える方法なので最後まで読んでいただければと思います。


ではどうやってデータストアを使わないようにするか?
それは以下のGAEの制限を見るとおぼろげに見えてきます。
  • アプリでアップロードできる静的(static)ファイルは1万まで
  • 1フォルダにつき1000まで
静的ファイルというのは、favicon.icoとかrobots.txtとか〜.cssとか〜.jsとか・・・ですが、この制限を見る限り「結構多い」と思いませんか?これを利用しない手は無いのではないでしょうか。


結論から言えば、サイトを静的ファイルだけデプロイしてしまう、という方法です。


index.htmlとかabout.htmlとかarticle1.htmlとかarticle2.htmlとか、とにかくサイト全体を静的ファイルだけで構成してしまうのです。もはやGAEを、APサーバ・DBサーバではなく、単なるWebサーバ(Apacheみたいなもの)として使うのです。データストアも使わない、場合によってはサーブレットすらも使わない、という状態にするのです。

といっても、そんなことしたら沢山HTML書かなくちゃいけない気がしてくるわけですが、そこは違います。

HTMLは、ローカル環境でプログラムで生成するのです。データもローカルのDBに入れておくのです。

たとえばブログであれば、「前の記事」「次の記事」「○月」「テーマ:○○」みたいなリンクがいっぱいあります。でもこういうのをGAEで閲覧があった時にリアルタイムで処理しようとすると、その都度データストアに多大なアクセスが発生します。しかも散々アクセスした結果が、毎度同じだったりするわけです。

この手の何度やっても結果が同じというデータアクセスは、ローカル環境で好きなだけやれば良いわけで、出力結果(HTML)だけをGAEに載せておけばデータストアを使う必要すら無いのです。

ブログだったら、
記事を更新したい→ローカルDBの記事データ更新→HTML再生成→GAEにデプロイ
という手順になります。

副作用としてサイトの表示が高速になったり、生成部分にJDBCでSQLを使えるなどGAE非依存になります。

と、こんな方法でサイト(サービス)を実装できないか、データストアでお悩みの方は検討してみてはいかがでしょうか。

そうは言うものの一部HTMLだけでは実現できない動的な部分もあるかと思います。
そのような部分については、ちょっとこれもあまりやりたくありませんが、JavaScript(AJAX)などで補うしかないかも知れません。

もうちょっと洗練させたい

ので、次回へ続く予定です。

たとえば今回の対策だとファイル数が1万までしか対応できません。1万ファイルといえば日本の鉄道駅の数よりも多いし、記事が1万もあるブログなんて書けないしで、そこそこの規模のサイトはカバーできそうですが、それでも足りないケースはあるわけで...

あとデータストアの容量で困った場合なんかも絡めたいし、他にも色々書きたいし、、、という感じなので、後日また書きます。