やりたいこと全体図
GitHubにpushされたら自動でGCBでビルド開始
→インスタンステンプレートを新規作成
→インスタンスグループのインスタンステンプレートを更新
→インスタンスグループが新しいインスタンステンプレートをもとに新しいインスタンスを作成して、いい感じにオートスケールしてくれる&nuxt起動してくれる
下準備
- GCRに適当なDockerイメージをpushしておく
- 1でpushしたDockerイメージをコンテナイメージ欄に指定してGCEでインスタンステンプレートを作成
- 2で作ったインスタンステンプレートを使ってインスタンスグループを作成
DockerfileにCMDを記載
CMD ["/bin/sh", "-c", "npm install && npm run build && nohup npm run start"]
インスタンステンプレートでContainer-Optimized OS イメージにしておけば、GCEでインスタンスが起動した時にdockerコンテナを起動してくれるので、こう書いておけばインスタンスが起動した時にnuxtも起動してくれる
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の情報が少なかったので作業したことをまとめてみました。
もっといい方法等あれば教えてください!