Google Managed VMs で nginx を建ててみた

今更ですが、Managed VMs で nginx を建ててみました。GAE に Docker が使えるというのはとても便利ですね。GCE より手軽に使えるのが魅力です。
github appengine-nginx-hello を頼りに試しに nginx を動かしてみたところ、こちらの github のページに古い情報が残っていて多少躓いたので、今はどうなっているのかを書こうと思います。

GoogleCloudPlatform/appengine-nginx-hello · GitHub

1点目
gcloud preview app run /path/to/appengine-nginx-hello

とありますが、今は run の引数にフォルダを指定するのではなく、app.yaml を指定するようになっています。
github の appengine-nginx-hello は古い実行方法が残されたままで、Managed VMs の側のドキュメント自体は修正されているようです。
正しくは以下のようにします。

gcloud preview app run /path/to/appengine-nginx-hello/app.yaml
2点目

バージョンの指定を app.yaml 内で行っていますが、今はコマンドラインの引数として渡すようになっています。
app.yaml 内の

version: 1

は、コメントアウトするか削除しましょう。
以下のようにして実行しましょう。

gcloud preview app run /path/to/appengine-nginx-hello/app.yaml

はい、1点目の実行方法と特に変わりありません。ローカルでの実行時にはコマンドの引数にバージョンの指定は不要なのです。指定してしまうと以下のエラーが発生します。

usage: gcloud preview app run  RUNNABLES [RUNNABLES ...] [optional flags]
ERROR: (gcloud.preview.app.run) unrecognized arguments: --version=1

デプロイ時には、以下のようにします。

gcloud preview app deploy /path/to/appengine-nginx-hello/app.yaml --version=1

app.yaml 内に書いていた version: 1 の代わりに、コマンドラインの引数として --version=1 を渡します。
--version 引数を渡さずに deploy した場合、自動的にバージョンが割り振られます(日時に基づくバージョン)

FAQ(なんかエラーが出るんですけど・・・)
INFO: Refreshing access_token
DEBUG: Got http error 400.
DEBUG: Unexpected results: {'status': '400', 'alternate-protocol': '443:quic,p=1', 'content-length': '78', 'expires': 'Fri, 01 Jan 1990 00:00:00 GMT', 'server': 'Google Frontend', 'cache-control': 'no-cache', 'date': 'Tue, 02 Jun 2015 23:05:10 GMT', 'content-type': 'text/plain'}
DEBUG: (gcloud.preview.app.deploy) Server responded with code [400]:
  Bad Request Unexpected HTTP status 400
Traceback (most recent call last):
  File "/usr/local/google-cloud-sdk/./lib/googlecloudsdk/calliope/cli.py", line 537, in Execute
    result = args.cmd_func(cli=self, args=args)
  File "/usr/local/google-cloud-sdk/./lib/googlecloudsdk/calliope/backend.py", line 1089, in Run
    result = command_instance.Run(args)
  File "/usr/local/google-cloud-sdk/lib/googlecloudsdk/appengine/app_commands/deploy.py", line 111, in Run
    client.PrepareVmRuntime()
  File "/usr/local/google-cloud-sdk/./lib/googlecloudsdk/appengine/lib/appengine_client.py", line 281, in PrepareVmRuntime
    rpcserver.Send('/api/vms/prepare', app_id=self.project)
  File "/usr/local/google-cloud-sdk/./lib/googlecloudsdk/appengine/lib/util.py", line 347, in Send
    response = self._server.Send(*args, **kwargs)
  File "/usr/local/google-cloud-sdk/./lib/googlecloudsdk/appengine/lib/external/tools/appengine_rpc_httplib2.py", line 269, in Send
    'Unexpected HTTP status %s' % status)
  File "/usr/local/google-cloud-sdk/./lib/googlecloudsdk/appengine/lib/external/tools/appengine_rpc_httplib2.py", line 67, in RaiseHttpError
    raise urllib2.HTTPError(url, response_info.status, msg, response_info, stream)
RPCError: Server responded with code [400]:
  Bad Request Unexpected HTTP status 400
ERROR: (gcloud.preview.app.deploy) Server responded with code [400]:
  Bad Request Unexpected HTTP status 400
root@ubuntu-yanonaoki-docker /var/docker/managed_vms/nginx [12] gcloud --verbosity debug preview app run
usage: gcloud preview app run  RUNNABLES [RUNNABLES ...] [optional flags]
ERROR: (gcloud.preview.app.run) too few arguments

上記のようなエラーが出た場合、何か設定が間違っています。

  • プロジェクトの課金を有効にしているか
    • 実質 Compute Engine なので Compute Engine を有効にしてみる
    • Preemptible VM では GCE を有効にする、と書いてあるので、Managed VMs でも GCE を有効にする必要があるはず
  • いきなり deploy ではなく、run で動かしてみる
  • --verbosity debug を付与して動かしてみる

を試してみましょう。

gcloud --verbosity debug preview app run /path/to/appengine-nginx-hello/app.yaml

このように、まずは deploy ではなく run で動かしてみます。deploy 時とは違ったエラーメッセージが表示されるかも知れません。
さらに、--verbosity debug を付与することで、より詳細なエラーメッセージを出力することができます。

f1-micro で動かしたい。

g1-small ですら破産する、と言う方は app.yaml に以下の設定を追加することで f1-micro で動かすことができます。先日価格改定があり 30% 値下げされた結果、月 500 円で動かすことが可能です。

resources:
  cpu: 0.1
  memory_gb: 0.1
  disk_size_gb: 10

最初

resources:
  cpu: 0.5
  memory_gb: 0.6
  disk_size_gb: 10

と f1-micro になりそうな設定でデプロイしたところ g1-small になってしまいました。なので、cpu, memory_gb の両方を 0.1 にして試してみたところ、f1-micro になりました。
ちなみに、disk_size_gb は 10 以上を指定しなければなりません。これ以下を指定してしまうとデプロイ時にエラーになります。

以上です。App Engine に nginx を建てたい人は是非参考にしてください。