rakumoビジネス開発部の小山(@koyhoge)です。
社内で組織変更があってコンサルティング部がなくなり、ビジネス開発部の所属になりました。このブログのタイトルどうするんだろ?w
ということで、またもやかなり久しぶりですが良いネタがあったのでブログを更新します。今回の内容は、Google App Engine (GAE) for Javaのローカル開発環境についてです。
GAE for Java のローカル開発環境
GAE は GCP の中でも最も古いサービスです。各サポート言語によって書かれたアプリケーションをアップロードするだけで、実行環境をまるごと面倒見てくれる、内容的には PaaS に分類されるサービスです。
GAE の各言語ごとの SDK には、環境をローカルでエミュレートするサンドボックスが含まれていて、本番環境にコードをアップロードしなくても手元でテストできるようになっています。
GAE for Java 開発環境の GCS エミュレーション
GAE プロジェクトでは、静的データの読み書きのために [プロジェクト名].appspot.com という名前の Google Cloud Storage (GCS) バケットが標準で割り当てられます。
GAE から GCS を扱うための以下のドキュメントを読むと、
開発用アプリサーバーでクライアント ライブラリを使用する
クライアント ライブラリは開発用サーバーで使用できます。ただし、Cloud Storage のローカル エミュレーションは行われないため、ファイルの読み取りと書き込みのすべてのリクエストは、インターネット経由で実際の Cloud Storage バケットに送信する必要があります。
という記述があります。しかし実際に試してみたところ、どうやら GCS バケットの読み書きについてもエミュレーションが行われていることが確認できました。
実際に試してみる
上記のリンクでも紹介されているサンプルソースを使って、GAEローカル開発環境で GCS への読み書きを実際に試してみましょう。
このリポジトリを git clone して手元にコピーします。
appengine-gcs-client/java/example に移動して、設定ファイル pom.xml の properties -> app.id を自分のGCPプロジェクトIDに変更します。
<properties> <app.id>koyhoge-project</app.id> (略)
Maven でビルドとローカル開発環境の起動を行います。
$ mvn appengine:devserver
成功すると開発サーバーが立ち上がりますので、http://localhost:8080/ にアクセスします。
ここで
を入力して「Upload Content」ボタンを押すと、データが GCS に書かれたように見えまが、実際の GCS 管理コンソールを見てもそんなファイルはできていません。画面下半分のフォームで同じバケットとファイル名を指定して「Download Content」を押すと、入力された文字列が表示されるので、どこかには保存されているようです。
ではデータはどこに保存されているのでしょう?
GAE for Java のローカル開発環境では Google Cloud Datastore のエミュレーション機能があることが明示されています。
実は GCS のエミュレーションも同じディレクトリ
- WEB-INF/appengine-generated/
にファイルとして保存されていました。以下のフォーマットのファイル名で、1オブジェクト1ファイルの形で存在しています。
encoded_gs_key:xxxxxxxxxxxxxxxxxxx
以下の URL から確認できるローカル開発環境の管理画面を見ると、
GCS で書かれたデータは Datastore のデータとして確認できるので、GAE for Java のローカル開発環境では、Datastore のエミュレーションを使用して GCS が実装されているようです。
このことは公式ドキュメントには書かれていないので、探すのに苦労しました。