GCB・GCE使ってNuxt.jsプロジェクトを起動・オートスケールしてくれるようにしてみた


やりたいこと全体図

GitHubにpushされたら自動でGCBでビルド開始
→インスタンステンプレートを新規作成
→インスタンスグループのインスタンステンプレートを更新
→インスタンスグループが新しいインスタンステンプレートをもとに新しいインスタンスを作成して、いい感じにオートスケールしてくれる&nuxt起動してくれる

下準備

  1. GCRに適当なDockerイメージをpushしておく
  2. 1でpushしたDockerイメージをコンテナイメージ欄に指定してGCEでインスタンステンプレートを作成
  3. 2で作ったインスタンステンプレートを使ってインスタンスグループを作成

DockerfileにCMDを記載

CMD ["/bin/sh", "-c", "npm install && npm run build && nohup npm run start"]

インスタンステンプレートでContainer-Optimized OS イメージにしておけば、GCEでインスタンスが起動した時にdockerコンテナを起動してくれるので、こう書いておけばインスタンスが起動した時にnuxtも起動してくれる

cloudbuild.yaml作成

cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
  id: 'Step 1/4: Run Build Docker Image'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/my-image:$BUILD_ID', '.']

- name: 'gcr.io/cloud-builders/docker'
  id: 'Step 2/4: Run Push to GCR'
  args: ['push', 'gcr.io/$PROJECT_ID/my-image:$BUILD_ID']

- name: 'gcr.io/cloud-builders/gcloud'
  id: 'Step 3/4: Create Instance Template'
  args: ['compute', 'instance-templates', 'create-with-container', '[インスタンステンプレート名]', '--container-image', 'gcr.io/$PROJECT_ID/my-image:$BUILD_ID']

- name: 'gcr.io/cloud-builders/gcloud'
  id: 'Step 4/4: Update Instance Group'
  args: ['beta', 'compute', 'instance-groups', 'managed', 'rolling-action', 'start-update', '[インスタンスグループ名]', '--version', '[インスタンステンプレート名]']

参考ページ

https://cloud.google.com/sdk/gcloud/reference/compute/instance-templates/create
https://cloud.google.com/sdk/gcloud/reference/beta/compute/instance-groups/managed/rolling-action/
https://cloudplatform-jp.googleblog.com/2017/09/meet-Compute-Engines-new-managed-instance-group-updater.html

おわりに

GCPの情報が少なかったので作業したことをまとめてみました。
もっといい方法等あれば教えてください!