Edited at

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の情報が少なかったので作業したことをまとめてみました。

もっといい方法等あれば教えてください!