三行で概要紹介
無料で使えるf1-microのGCEインスタンスでWebアプリ(コンテナ)のデプロイに失敗
ハマったポイントはgradleのdeamonの起動(が、終わらない)
原因はおそらくインスタンスのパワー不足
用語の超ざっくり解説
- GCP: Google Cloud Platform
Googleが提供するクラウドサービス。競合はAWSとかAzureとか。
- GCE: Google Compute Engine
GCPのIaaS。VMインスタンス。AWSでいうEC2。
- GCS: Google Cloud Storage
GCPのオブジェクトストレージ。AWSでいうS3。
- Google Container Registry
GCPのDockerイメージのストレージ。AWSでいうAmazon Elastic Container Registry。
背景
SpringBootで作った簡単なWebアプリを公開して、色んな端末で使いたい
→ でも、できれば金はかけずに手軽にやりたいな・・・
→ お、GCPの一番安いVMインスタンスは実質ずっと無料で使えるやん。これや!
GCPの無料枠(抜粋):https://cloud.google.com/free/docs/gcp-free-tier?hl=ja
やったこと
せっかくGCPを使うのだから、アプリをコンテナ化してやってみた。
おおまかな手順は以下の通り。
1.アプリケーション開発。
2.アプリケーションのDockerイメージ作成。ローカルで動作確認。
3.GCPにアカウント登録。
4.ローカルのDockerイメージをGoogle Container Registryに登録。
5.登録したDockerイメージを紐付けてVMインスタンスを作成。
6.VMインスタンスを起動し、ブラウザでアプリが立ち上がっていることを確認。
※ 4~6については、下記の参考で紹介している記事を参照。
参考:GCEにSpringBootアプリケーションをデプロイする方法
Google Container Engine (GKE) 使えやってツッコミも飛んできそうですが、
手軽にパパッとやるなら大きく2つの方法があるみたい。他にもあれば教えてください。
1.GCSのバケットにjarを配置する方法
公式ドキュメントを参照。英語やけど。
Run a Spring Boot application on Google Compute Engine
2.VMインスタンス作成時にDockerイメージを紐づける方法
DockerイメージはGoogle Container RegistryやDockerHubなどから指定する。
Google Container Registryは有料だけど、数円レベルなので許容した。
公式ドキュメントも大変分かりやすかったが、こちらがまとまっていて一番参考になった。
dockerイメージを GCE で起動する方法
↑ ローカルからGoogle Container Registryへアップするところから説明してくれています。
そして、ハマる
前置きが長くなりました。
私は当初の思惑通り、一番安い(というか無料の)f1-micro(vCPU x 1、メモリ 0.6 GB)インスタンスを作成していたのですが、アプリが立ち上がらなくてハマりました。
※ GCPの初期登録時に一年間使える3万円くらいのクレジットをもらえましたが、一年後以降のことも考えて無料のインスタンスを選択しました。
ログをみてる感じは正常そうなんですが、一向にGradleのデーモンが立ち上がってくれません。
何度か再起動させてみたり、インスタンス作り直したり、2日待ってみたりしたが、結局ここから進むことはなく・・・
・・・で、どうしたか
すみません、結局、根本的な原因は分かりませんでした。
ただ、以下の2点から、単純にf1-microインスタンスのパワー不足としか思えませんでした。
- f1-microインスタンスのCPU利用率が常に100%近く(下記のグラフ参照)
- 比較用にn1-standard-2(vCPU x 2、メモリ 7.5 GB)を作成したが、同様の問題は発生せず。
(※ブラウザでもアプリケーションが動いていることを確認できました。)
※ instance-3はn1-standard-2インスタンスです。見やすさのためグラフを非表示にしてます。
所感
SpringBootの簡単なアプリケーションですら、起動できないのは予想外でした。
「インスタンス「f1micro1cpu-614mb」は過剰に使われています。次のマシンタイプへの切り替えを検討してください: g1-small(vCPU x 1、メモリ 1.7 GB)。」なんてメッセージすら届きました。
無料にこだわったばかりにかなり多くの時間を費やしてしまいました。素直にJarでやれば良かったです。
とはいえ、初めてGCPだけでなくDockerも初めて触ったのでいい経験にはなりました。
かなりレアなケースかと思いますが、同じようにハマった方の参考になれば幸いです。