rakumoコンサルティング部 Tech Blog

GCPの構築ノウハウをそろりと公開 コンサル部によるテックブログ

GAE for Javaのローカル開発環境のGCSエミュレーション

rakumoビジネス開発部の小山(@koyhoge)です。

社内で組織変更があってコンサルティング部がなくなり、ビジネス開発部の所属になりました。このブログのタイトルどうするんだろ?w

ということで、またもやかなり久しぶりですが良いネタがあったのでブログを更新します。今回の内容は、Google App Engine (GAE) for Javaのローカル開発環境についてです。

GAE for Java のローカル開発環境

GAE は GCP の中でも最も古いサービスです。各サポート言語によって書かれたアプリケーションをアップロードするだけで、実行環境をまるごと面倒見てくれる、内容的には PaaS に分類されるサービスです。

cloud.google.com

GAE の各言語ごとの SDK には、環境をローカルでエミュレートするサンドボックスが含まれていて、本番環境にコードをアップロードしなくても手元でテストできるようになっています。

GAE for Java 開発環境の GCS エミュレーション

GAE プロジェクトでは、静的データの読み書きのために [プロジェクト名].appspot.com という名前の Google Cloud Storage (GCS) バケットが標準で割り当てられます。

GAE から GCS を扱うための以下のドキュメントを読むと、

https://cloud.google.com/appengine/docs/standard/java/googlecloudstorageclient/setting-up-cloud-storage

開発用アプリサーバーでクライアント ライブラリを使用する

クライアント ライブラリは開発用サーバーで使用できます。ただし、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/ にアクセスします。

Hello Google Cloud Stroage

ここで

  • Bucket: koyhoge-project.appspot.com
  • File Name: hoge.txt
  • File Contents: 適当な文字列

を入力して「Upload Content」ボタンを押すと、データが GCS に書かれたように見えまが、実際の GCS 管理コンソールを見てもそんなファイルはできていません。画面下半分のフォームで同じバケットとファイル名を指定して「Download Content」を押すと、入力された文字列が表示されるので、どこかには保存されているようです。

ではデータはどこに保存されているのでしょう?

GAE for Java のローカル開発環境では Google Cloud Datastore のエミュレーション機能があることが明示されています。

cloud.google.com

実は GCS のエミュレーションも同じディレクト

  • WEB-INF/appengine-generated/

にファイルとして保存されていました。以下のフォーマットのファイル名で、1オブジェクト1ファイルの形で存在しています。

encoded_gs_key:xxxxxxxxxxxxxxxxxxx

以下の URL から確認できるローカル開発環境の管理画面を見ると、

GCS で書かれたデータは Datastore のデータとして確認できるので、GAE for Java のローカル開発環境では、Datastore のエミュレーションを使用して GCS が実装されているようです。

このことは公式ドキュメントには書かれていないので、探すのに苦労しました。