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 を建てたい人は是非参考にしてください。