
マネージドインスタンスグループ(MIG)のアップデート方式を整理してみた
はじめに
こんにちは。
クラウド事業本部コンサルティング部の渡邉です。
Compute Engine の マネージドインスタンスグループ(MIG) は、同一構成の VM インスタンスを自動管理する機能です。マネージドインスタンスにはいくつかのアップデート方式があり、アプリケーションのバージョンアップや OS イメージの更新を、サービスへの影響を最小化しながら計画的に適用することができます。
本記事では、MIG の アップデート方式 を整理し、それぞれのハンズオンを通じて実際の動作を確認します。
MIG インスタンスアップデートの全体像
MIG では、既存 VM に新しい設定を適用する方法として主に以下の種類があります。
| 方法 | 種別 | 概要 |
|---|---|---|
| 自動(プロアクティブ)アップデート | ローリングアップデート | MIG が自動的にすべてまたは一部の VM に順次適用 |
| 自動(プロアクティブ)アップデート | カナリアアップデート | 一部の VM にだけ新テンプレートを適用して検証 |
| 選択的(オポチュニスティック)アップデート | 特定 VM への適用 | 指定した VM にだけ手動で適用 |
| 選択的(オポチュニスティック)アップデート | 全 VM への一括適用 | すべての VM に手動で一括適用 |
| ローリング再起動 / 再作成 | restart / replace | テンプレート変更なしに VM を再起動・置換 |
また、アップデート時の「中断レベル(Disruption Level)」を制御するオプションも重要です。
| アクション | 説明 | 更新可能なプロパティ |
|---|---|---|
REFRESH |
VM を停止せずに適用 | 追加ディスク、動的 NIC、メタデータ、ラベル、タグ |
RESTART |
VM を停止して再起動 | REFRESH の対象 + マシンタイプ |
REPLACE |
VM を置換(デフォルト) | インスタンステンプレートのすべてのプロパティ |
事前準備
ハンズオンで共通して使うリソースをあらかじめ作成しておきます。
前提条件
- Google Cloud プロジェクトが作成済みであること
gcloudCLI がインストール・認証済みであること- Compute Engine API が有効になっていること
環境変数の設定
プロジェクト名や、各種テンプレート名などのリソース名を環境変数として定義します。
export PROJECT_ID=YOUR_PROJECT_ID
export ZONE=asia-northeast1-a
export MIG_NAME=my-mig
export TEMPLATE_V1=my-instance-template-v1
export TEMPLATE_V2=my-instance-template-v2
インスタンステンプレートの作成(v1・v2)
MIGで使用するインスタンステンプレートを作成します。
# v1 テンプレート(Debian 12、e2-micro)
gcloud compute instance-templates create ${TEMPLATE_V1} \
--machine-type=e2-micro \
--image-family=debian-12 \
--image-project=debian-cloud \
--metadata=vmDnsSetting=ZonalOnly \
--project=${PROJECT_ID}
# v2 テンプレート(メタデータでバージョンを区別)
gcloud compute instance-templates create ${TEMPLATE_V2} \
--machine-type=e2-micro \
--image-family=debian-12 \
--image-project=debian-cloud \
--metadata=app-version=v2,vmDnsSetting=ZonalOnly \
--project=${PROJECT_ID}
Created [https://www.googleapis.com/compute/v1/projects/your-project-id/global/instanceTemplates/my-instance-template-v1].
NAME MACHINE_TYPE PREEMPTIBLE CREATION_TIMESTAMP
my-instance-template-v1 e2-micro 2026-06-23T16:06:57.879-07:00
Created [https://www.googleapis.com/compute/v1/projects/your-project-id/global/instanceTemplates/my-instance-template-v2].
NAME MACHINE_TYPE PREEMPTIBLE CREATION_TIMESTAMP
my-instance-template-v2 e2-micro 2026-06-23T16:07:01.817-07:00
MIG の作成
インスタンステンプレートを利用してMIGを作成していきます。
gcloud compute instance-groups managed create ${MIG_NAME} \
--template=${TEMPLATE_V1} \
--size=4 \
--zone=${ZONE} \
--project=${PROJECT_ID}
Created [https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a/instanceGroupManagers/my-mig].
NAME LOCATION SCOPE BASE_INSTANCE_NAME SIZE TARGET_SIZE INSTANCE_TEMPLATE AUTOSCALED
my-mig asia-northeast1-a zone my-mig 0 4 my-instance-template-v1 no
# MIG の状態を確認
gcloud compute instance-groups managed describe ${MIG_NAME} \
--zone=${ZONE} \
--project=${PROJECT_ID}
baseInstanceName: my-mig
creationTimestamp: '2026-06-23T16:10:31.294-07:00'
currentActions:
abandoning: 0
creating: 0
creatingWithoutRetries: 0
deleting: 0
none: 4
recreating: 0
refreshing: 0
restarting: 0
resuming: 0
starting: 0
stopping: 0
suspending: 0
verifying: 0
fingerprint: evCVRzBwBlg=
id: '7826522394596912264'
instanceGroup: https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a/instanceGroups/my-mig
instanceLifecyclePolicy:
defaultActionOnFailure: REPAIR
forceUpdateOnRepair: NO
onFailedHealthCheck: DEFAULT_ACTION
instanceTemplate: https://www.googleapis.com/compute/v1/projects/your-project-id/global/instanceTemplates/my-instance-template-v1
kind: compute#instanceGroupManager
listManagedInstancesResults: PAGELESS
name: my-mig
satisfiesPzi: true
satisfiesPzs: true
selfLink: https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a/instanceGroupManagers/my-mig
standbyPolicy:
mode: MANUAL
status:
allInstancesConfig:
effective: true
isStable: true
stateful:
hasStatefulConfig: false
perInstanceConfigs:
allEffective: true
versionTarget:
isReached: true
targetSize: 4
targetSizePolicy:
mode: INDIVIDUAL
targetStoppedSize: 0
targetSuspendedSize: 0
updatePolicy:
maxSurge:
calculated: 1
fixed: 1
maxUnavailable:
calculated: 1
fixed: 1
minimalAction: REPLACE
replacementMethod: SUBSTITUTE
type: OPPORTUNISTIC
versions:
- instanceTemplate: https://www.googleapis.com/compute/v1/projects/your-project-id/global/instanceTemplates/my-instance-template-v1
targetSize:
calculated: 4
zone: https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a
方法1: 自動(プロアクティブ)ローリングアップデート
ローリングアップデート は、MIG が自動的にすべての VM に段階的に新しいテンプレートを適用する方法です。--type=proactive(デフォルト)を指定することで、ユーザーが追加操作をしなくてもアップデートが完了します。
主なオプション
| オプション | 説明 | デフォルト |
|---|---|---|
--max-surge |
アップデート中に追加作成できる VM 数 | ゾーナル: 1、リージョナル: ゾーン数 |
--max-unavailable |
アップデート中に停止できる VM 数 | ゾーン数 |
--minimal-action |
最小の中断レベル(refresh/restart/replace) | replace |
基本的なローリングアップデート
# v1 から v2 へのローリングアップデートを開始
gcloud compute instance-groups managed rolling-action start-update ${MIG_NAME} \
--version=template=${TEMPLATE_V2} \
--max-surge=1 \
--max-unavailable=1 \
--zone=${ZONE} \
--project=${PROJECT_ID}
Updated [https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a/instanceGroupManagers/my-mig].
---
baseInstanceName: my-mig
creationTimestamp: '2026-06-23T16:10:31.294-07:00'
currentActions:
abandoning: 0
creating: 1
creatingWithoutRetries: 0
deleting: 1
none: 3
recreating: 0
refreshing: 0
restarting: 0
resuming: 0
starting: 0
stopping: 0
suspending: 0
verifying: 0
fingerprint: 4CElWR3C954=
id: '7826522394596912264'
instanceGroup: https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a/instanceGroups/my-mig
instanceLifecyclePolicy:
defaultActionOnFailure: REPAIR
forceUpdateOnRepair: NO
onFailedHealthCheck: DEFAULT_ACTION
instanceTemplate: https://www.googleapis.com/compute/v1/projects/your-project-id/global/instanceTemplates/my-instance-template-v2
kind: compute#instanceGroupManager
listManagedInstancesResults: PAGELESS
name: my-mig
satisfiesPzi: true
satisfiesPzs: true
selfLink: https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a/instanceGroupManagers/my-mig
standbyPolicy:
mode: MANUAL
status:
allInstancesConfig:
effective: true
isStable: false
stateful:
hasStatefulConfig: false
perInstanceConfigs:
allEffective: true
versionTarget:
isReached: false
targetSize: 4
targetSizePolicy:
mode: INDIVIDUAL
targetStoppedSize: 0
targetSuspendedSize: 0
updatePolicy:
maxSurge:
calculated: 1
fixed: 1
maxUnavailable:
calculated: 1
fixed: 1
minimalAction: REPLACE
replacementMethod: SUBSTITUTE
type: PROACTIVE
versions:
- instanceTemplate: https://www.googleapis.com/compute/v1/projects/your-project-id/global/instanceTemplates/my-instance-template-v2
targetSize:
calculated: 4
zone: https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a
アップデートの進捗は list-instances を繰り返し実行して確認します。
① 開始直後(ACTION が CREATING / DELETING になっている)
gcloud compute instance-groups managed list-instances ${MIG_NAME} \
--zone=${ZONE} \
--project=${PROJECT_ID}
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-5kk1 asia-northeast1-a RUNNING NONE my-instance-template-v1
my-mig-gn05 asia-northeast1-a STAGING CREATING my-instance-template-v2
my-mig-kmwj asia-northeast1-a RUNNING NONE my-instance-template-v1
my-mig-lzzc asia-northeast1-a RUNNING NONE my-instance-template-v1
my-mig-wk8v asia-northeast1-a STOPPING DELETING
新しい VM(v2)が CREATING で作成される一方、古い VM(v1)が DELETING で削除されているのがわかります。--max-surge=1 のため、一時的にインスタンス数が 5 台になっています。
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-3mh4 asia-northeast1-a CREATING my-instance-template-v2
my-mig-5kk1 asia-northeast1-a RUNNING NONE my-instance-template-v1
my-mig-gn05 asia-northeast1-a RUNNING NONE my-instance-template-v2
my-mig-kmwj asia-northeast1-a RUNNING NONE my-instance-template-v1
my-mig-lzzc asia-northeast1-a STOPPING DELETING
② 完了後(全インスタンスが ACTION: NONE になり、テンプレートが v2 に切り替わっている)
gcloud compute instance-groups managed list-instances ${MIG_NAME} \
--zone=${ZONE} \
--project=${PROJECT_ID}
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-3mh4 asia-northeast1-a RUNNING NONE my-instance-template-v2
my-mig-gn05 asia-northeast1-a RUNNING NONE my-instance-template-v2
my-mig-l3d3 asia-northeast1-a RUNNING NONE my-instance-template-v2
my-mig-wjjm asia-northeast1-a RUNNING NONE my-instance-template-v2
SUBSTITUTE 方式のため、インスタンス名が変わっている点も確認できます。
また、wait-until --version-target-reached を使うと、アップデートの完了をポーリングなしに待機できます。CI/CD パイプラインでの利用に便利です。
# バージョンターゲットに到達するまで待機
gcloud compute instance-groups managed wait-until ${MIG_NAME} \
--version-target-reached \
--zone=${ZONE} \
--project=${PROJECT_ID}
Waiting for group to reach version target
Waiting for group to reach version target
Waiting for group to reach version target
Waiting for group to reach version target
Waiting for group to reach version target
Waiting for group to reach version target
Version target is reached
方法2: 自動(プロアクティブ)カナリアアップデート
カナリアアップデート は、MIG の一部の VM(たとえば 20%)にのみ新テンプレートを適用し、問題がなければ全体に展開する方法です。2 種類のインスタンステンプレートを同時に指定することで実現します。
カナリアアップデートの開始
# ここでは固定数(1 インスタンス)でカナリアを実施
gcloud compute instance-groups managed rolling-action start-update ${MIG_NAME} \
--version=template=${TEMPLATE_V1} \
--canary-version=template=${TEMPLATE_V2},target-size=1 \
--zone=${ZONE} \
--project=${PROJECT_ID}
Updated [https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a/instanceGroupManagers/my-mig].
---
baseInstanceName: my-mig
creationTimestamp: '2026-06-23T16:10:31.294-07:00'
currentActions:
abandoning: 0
creating: 0
creatingWithoutRetries: 0
deleting: 0
none: 4
recreating: 0
refreshing: 0
restarting: 0
resuming: 0
starting: 0
stopping: 0
suspending: 0
verifying: 0
fingerprint: DMMUr0MeYpk=
id: '7826522394596912264'
instanceGroup: https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a/instanceGroups/my-mig
instanceLifecyclePolicy:
defaultActionOnFailure: REPAIR
forceUpdateOnRepair: NO
onFailedHealthCheck: DEFAULT_ACTION
kind: compute#instanceGroupManager
listManagedInstancesResults: PAGELESS
name: my-mig
satisfiesPzi: true
satisfiesPzs: true
selfLink: https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a/instanceGroupManagers/my-mig
standbyPolicy:
mode: MANUAL
status:
allInstancesConfig:
effective: true
isStable: false
stateful:
hasStatefulConfig: false
perInstanceConfigs:
allEffective: true
versionTarget:
isReached: false
targetSize: 4
targetSizePolicy:
mode: INDIVIDUAL
targetStoppedSize: 0
targetSuspendedSize: 0
updatePolicy:
maxSurge:
calculated: 1
fixed: 1
maxUnavailable:
calculated: 1
fixed: 1
minimalAction: REPLACE
replacementMethod: SUBSTITUTE
type: PROACTIVE
versions:
- instanceTemplate: https://www.googleapis.com/compute/v1/projects/your-project-id/global/instanceTemplates/my-instance-template-v1
targetSize:
calculated: 3
- instanceTemplate: https://www.googleapis.com/compute/v1/projects/your-project-id/global/instanceTemplates/my-instance-template-v2
targetSize:
calculated: 1
fixed: 1
zone: https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a
① 開始直後(カナリア VM が VERIFYING → NONE に変わる)
gcloud compute instance-groups managed list-instances ${MIG_NAME} \
--zone=${ZONE} \
--project=${PROJECT_ID}
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-6tqh asia-northeast1-a RUNNING NONE my-instance-template-v1
my-mig-g6vn asia-northeast1-a RUNNING NONE my-instance-template-v1
my-mig-nglh asia-northeast1-a STOPPING DELETING
my-mig-p0zc asia-northeast1-a STAGING CREATING my-instance-template-v2
my-mig-vnbx asia-northeast1-a RUNNING NONE my-instance-template-v1
② カナリア安定後(v1 と v2 が共存している状態)
gcloud compute instance-groups managed list-instances ${MIG_NAME} \
--zone=${ZONE} \
--project=${PROJECT_ID}
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-6tqh asia-northeast1-a RUNNING NONE my-instance-template-v1
my-mig-g6vn asia-northeast1-a RUNNING NONE my-instance-template-v1
my-mig-p0zc asia-northeast1-a RUNNING NONE my-instance-template-v2
my-mig-vnbx asia-northeast1-a RUNNING NONE my-instance-template-v1
1 台だけ v2 で稼働し、残り 3 台は v1 のまま維持されています。この状態でカナリア VM の動作を検証します。
カナリアアップデートを全体展開(ロールフォワード)
カナリア版に問題がなければ、全インスタンスに展開します。
# --canary-version を省略して v2 を全体へ展開
gcloud compute instance-groups managed rolling-action start-update ${MIG_NAME} \
--version=template=${TEMPLATE_V2} \
--zone=${ZONE} \
--project=${PROJECT_ID}
Updated [https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a/instanceGroupManagers/my-mig].
---
baseInstanceName: my-mig
creationTimestamp: '2026-06-23T16:10:31.294-07:00'
currentActions:
abandoning: 0
creating: 1
creatingWithoutRetries: 0
deleting: 1
none: 3
recreating: 0
refreshing: 0
restarting: 0
resuming: 0
starting: 0
stopping: 0
suspending: 0
verifying: 0
fingerprint: 4CElWR3C954=
id: '7826522394596912264'
instanceGroup: https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a/instanceGroups/my-mig
instanceLifecyclePolicy:
defaultActionOnFailure: REPAIR
forceUpdateOnRepair: NO
onFailedHealthCheck: DEFAULT_ACTION
instanceTemplate: https://www.googleapis.com/compute/v1/projects/your-project-id/global/instanceTemplates/my-instance-template-v2
kind: compute#instanceGroupManager
listManagedInstancesResults: PAGELESS
name: my-mig
satisfiesPzi: true
satisfiesPzs: true
selfLink: https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a/instanceGroupManagers/my-mig
standbyPolicy:
mode: MANUAL
status:
allInstancesConfig:
effective: true
isStable: false
stateful:
hasStatefulConfig: false
perInstanceConfigs:
allEffective: true
versionTarget:
isReached: false
targetSize: 4
targetSizePolicy:
mode: INDIVIDUAL
targetStoppedSize: 0
targetSuspendedSize: 0
updatePolicy:
maxSurge:
calculated: 1
fixed: 1
maxUnavailable:
calculated: 1
fixed: 1
minimalAction: REPLACE
replacementMethod: SUBSTITUTE
type: PROACTIVE
versions:
- instanceTemplate: https://www.googleapis.com/compute/v1/projects/your-project-id/global/instanceTemplates/my-instance-template-v2
targetSize:
calculated: 4
zone: https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a
① 展開中(v1 から v2 に順次切り替わっている)
gcloud compute instance-groups managed list-instances ${MIG_NAME} \
--zone=${ZONE} \
--project=${PROJECT_ID}
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-6tqh asia-northeast1-a RUNNING NONE my-instance-template-v1
my-mig-g6vn asia-northeast1-a STOPPING DELETING
my-mig-nbdm asia-northeast1-a STAGING CREATING my-instance-template-v2
my-mig-p0zc asia-northeast1-a RUNNING NONE my-instance-template-v2
my-mig-vnbx asia-northeast1-a RUNNING NONE my-instance-template-v1
② 完了後(全インスタンスが v2 に切り替わっている)
gcloud compute instance-groups managed list-instances ${MIG_NAME} \
--zone=${ZONE} \
--project=${PROJECT_ID}
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-f78b asia-northeast1-a RUNNING NONE my-instance-template-v2
my-mig-fszs asia-northeast1-a RUNNING NONE my-instance-template-v2
my-mig-nbdm asia-northeast1-a RUNNING NONE my-instance-template-v2
my-mig-p0zc asia-northeast1-a RUNNING NONE my-instance-template-v2
カナリアアップデートをロールバック
問題が発生した場合は、旧テンプレートに戻します。
# v1 へ素早くロールバック(max-unavailable=100% で全インスタンスを即座に更新)
gcloud compute instance-groups managed rolling-action start-update ${MIG_NAME} \
--version=template=${TEMPLATE_V1} \
--max-unavailable=100% \
--zone=${ZONE} \
--project=${PROJECT_ID}
Updated [https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a/instanceGroupManagers/my-mig].
---
baseInstanceName: my-mig
creationTimestamp: '2026-06-23T16:10:31.294-07:00'
currentActions:
abandoning: 0
creating: 1
creatingWithoutRetries: 0
deleting: 4
none: 0
recreating: 0
refreshing: 0
restarting: 0
resuming: 0
starting: 0
stopping: 0
suspending: 0
verifying: 0
fingerprint: qvnNsPsDYGg=
id: '7826522394596912264'
instanceGroup: https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a/instanceGroups/my-mig
instanceLifecyclePolicy:
defaultActionOnFailure: REPAIR
forceUpdateOnRepair: NO
onFailedHealthCheck: DEFAULT_ACTION
instanceTemplate: https://www.googleapis.com/compute/v1/projects/your-project-id/global/instanceTemplates/my-instance-template-v1
kind: compute#instanceGroupManager
listManagedInstancesResults: PAGELESS
name: my-mig
satisfiesPzi: true
satisfiesPzs: true
selfLink: https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a/instanceGroupManagers/my-mig
standbyPolicy:
mode: MANUAL
status:
allInstancesConfig:
effective: true
isStable: false
stateful:
hasStatefulConfig: false
perInstanceConfigs:
allEffective: true
versionTarget:
isReached: false
targetSize: 4
targetSizePolicy:
mode: INDIVIDUAL
targetStoppedSize: 0
targetSuspendedSize: 0
updatePolicy:
maxSurge:
calculated: 1
fixed: 1
maxUnavailable:
calculated: 4
percent: 100
minimalAction: REPLACE
replacementMethod: SUBSTITUTE
type: PROACTIVE
versions:
- instanceTemplate: https://www.googleapis.com/compute/v1/projects/your-project-id/global/instanceTemplates/my-instance-template-v1
targetSize:
calculated: 4
zone: https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a
--max-unavailable=100% を指定しているため、全インスタンスが一斉に置き換わります。
① 開始直後(全インスタンスが同時に DELETING / CREATING になっている)
gcloud compute instance-groups managed list-instances ${MIG_NAME} \
--zone=${ZONE} \
--project=${PROJECT_ID}
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-5v4v asia-northeast1-a STAGING CREATING my-instance-template-v1
my-mig-f78b asia-northeast1-a STOPPING DELETING
my-mig-fszs asia-northeast1-a STOPPING DELETING
my-mig-nbdm asia-northeast1-a STOPPING DELETING
my-mig-p0zc asia-northeast1-a STOPPING DELETING
② 完了後(全インスタンスが v1 に戻っている)
gcloud compute instance-groups managed list-instances ${MIG_NAME} \
--zone=${ZONE} \
--project=${PROJECT_ID}
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-5v4v asia-northeast1-a RUNNING NONE my-instance-template-v1
my-mig-917l asia-northeast1-a RUNNING NONE my-instance-template-v1
my-mig-nt88 asia-northeast1-a RUNNING NONE my-instance-template-v1
my-mig-vr6m asia-northeast1-a RUNNING NONE my-instance-template-v1
方法3: 選択的(オポチュニスティック)アップデート
選択的アップデート は、ユーザーが明示的に指定した VM だけに新しい設定を適用する方法です。MIG のアップデートタイプを opportunistic に設定することで、MIG が自動的に既存 VM を更新することを防ぎます。
この方法は以下のようなシナリオで特に有効です。
- VM が修復されたときに設定を変更したくない(修復時の設定固定)
- オートスケーラーによるスケールアウト時だけ新設定を適用したい
- 更新のタイミングや順序を細かく制御したい
テンプレートをセットして特定の VM だけ更新
まず MIG のテンプレートを更新しますが、自動展開はさせません。
# アップデートタイプを opportunistic に設定してテンプレートを更新
gcloud compute instance-groups managed rolling-action start-update ${MIG_NAME} \
--version=template=${TEMPLATE_V2} \
--type=opportunistic \
--zone=${ZONE} \
--project=${PROJECT_ID}
Updated [https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a/instanceGroupManagers/my-mig].
---
baseInstanceName: my-mig
creationTimestamp: '2026-06-23T16:10:31.294-07:00'
currentActions:
abandoning: 0
creating: 0
creatingWithoutRetries: 0
deleting: 0
none: 4
recreating: 0
refreshing: 0
restarting: 0
resuming: 0
starting: 0
stopping: 0
suspending: 0
verifying: 0
fingerprint: nazd42P19g0=
id: '7826522394596912264'
instanceGroup: https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a/instanceGroups/my-mig
instanceLifecyclePolicy:
defaultActionOnFailure: REPAIR
forceUpdateOnRepair: NO
onFailedHealthCheck: DEFAULT_ACTION
instanceTemplate: https://www.googleapis.com/compute/v1/projects/your-project-id/global/instanceTemplates/my-instance-template-v2
kind: compute#instanceGroupManager
listManagedInstancesResults: PAGELESS
name: my-mig
satisfiesPzi: true
satisfiesPzs: true
selfLink: https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a/instanceGroupManagers/my-mig
standbyPolicy:
mode: MANUAL
status:
allInstancesConfig:
effective: true
isStable: true
stateful:
hasStatefulConfig: false
perInstanceConfigs:
allEffective: true
versionTarget:
isReached: false
targetSize: 4
targetSizePolicy:
mode: INDIVIDUAL
targetStoppedSize: 0
targetSuspendedSize: 0
updatePolicy:
maxSurge:
calculated: 1
fixed: 1
maxUnavailable:
calculated: 4
percent: 100
minimalAction: REPLACE
replacementMethod: SUBSTITUTE
type: OPPORTUNISTIC
versions:
- instanceTemplate: https://www.googleapis.com/compute/v1/projects/your-project-id/global/instanceTemplates/my-instance-template-v2
targetSize:
calculated: 4
zone: https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a
# MIG 内のインスタンス名を確認
gcloud compute instance-groups managed list-instances ${MIG_NAME} \
--zone=${ZONE} \
--project=${PROJECT_ID}
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-5v4v asia-northeast1-a RUNNING NONE my-instance-template-v1
my-mig-917l asia-northeast1-a RUNNING NONE my-instance-template-v1
my-mig-nt88 asia-northeast1-a RUNNING NONE my-instance-template-v1
my-mig-vr6m asia-northeast1-a RUNNING NONE my-instance-template-v1
# 特定のインスタンスだけ更新(INSTANCE_NAME_1 を実際の名前に置き換える)
gcloud compute instance-groups managed update-instances ${MIG_NAME} \
--instances=my-mig-5v4v \
--most-disruptive-allowed-action=replace \
--minimal-action=replace \
--zone=${ZONE} \
--project=${PROJECT_ID}
Updated [https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a/instanceGroupManagers/my-mig].
PROJECT ZONE INSTANCE STATUS
your-project-id asia-northeast1-a my-mig-5v4v SUCCESS
① 更新中(指定した my-mig-5v4v だけが RECREATING、他は NONE のまま)
gcloud compute instance-groups managed list-instances ${MIG_NAME} \
--zone=${ZONE} \
--project=${PROJECT_ID}
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-5v4v asia-northeast1-a RUNNING RECREATING my-instance-template-v2
my-mig-917l asia-northeast1-a RUNNING NONE my-instance-template-v1
my-mig-nt88 asia-northeast1-a RUNNING NONE my-instance-template-v1
my-mig-vr6m asia-northeast1-a RUNNING NONE my-instance-template-v1
② 完了後(my-mig-5v4v だけ v2 に切り替わり、残りは v1 のまま)
gcloud compute instance-groups managed list-instances ${MIG_NAME} \
--zone=${ZONE} \
--project=${PROJECT_ID}
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-5v4v asia-northeast1-a RUNNING NONE my-instance-template-v2
my-mig-917l asia-northeast1-a RUNNING NONE my-instance-template-v1
my-mig-nt88 asia-northeast1-a RUNNING NONE my-instance-template-v1
my-mig-vr6m asia-northeast1-a RUNNING NONE my-instance-template-v1
全インスタンスを一括で手動更新
gcloud compute instance-groups managed update-instances ${MIG_NAME} \
--all-instances \
--most-disruptive-allowed-action=replace \
--minimal-action=replace \
--zone=${ZONE} \
--project=${PROJECT_ID}
Updated [https://www.googleapis.com/compute/v1/projects/your-project-id/zones/asia-northeast1-a/instanceGroupManagers/my-mig].
① 更新中(複数インスタンスが同時に RECREATING)
gcloud compute instance-groups managed list-instances ${MIG_NAME} \
--zone=${ZONE} \
--project=${PROJECT_ID}
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-5v4v asia-northeast1-a RUNNING RECREATING my-instance-template-v2
my-mig-917l asia-northeast1-a RUNNING RECREATING my-instance-template-v2
my-mig-nt88 asia-northeast1-a RUNNING RECREATING my-instance-template-v2
my-mig-vr6m asia-northeast1-a RUNNING RECREATING my-instance-template-v2
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-5v4v asia-northeast1-a STOPPING RECREATING my-instance-template-v2
my-mig-917l asia-northeast1-a STOPPING RECREATING my-instance-template-v2
my-mig-nt88 asia-northeast1-a STOPPING RECREATING my-instance-template-v2
my-mig-vr6m asia-northeast1-a STOPPING RECREATING my-instance-template-v2
② 完了後(全インスタンスが v2 に切り替わっている)
# 更新後のインスタンス状態を確認
gcloud compute instance-groups managed list-instances ${MIG_NAME} \
--zone=${ZONE} \
--project=${PROJECT_ID}
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-5v4v asia-northeast1-a RUNNING NONE my-instance-template-v2
my-mig-917l asia-northeast1-a RUNNING NONE my-instance-template-v2
my-mig-nt88 asia-northeast1-a RUNNING NONE my-instance-template-v2
my-mig-vr6m asia-northeast1-a RUNNING NONE my-instance-template-v2
方法4: ローリング再起動(rolling restart)
ローリング再起動 は、インスタンステンプレートを変更せずに既存の VM を順次再起動する方法です。メモリリークの解消や、起動時にのみ読み込まれるメタデータの反映などに使います。
ローリング再起動
# すべての VM を 1 台ずつ順番に再起動
# --max-unavailable を省略した場合、ゾーナル MIG のデフォルトは 1
gcloud compute instance-groups managed rolling-action restart ${MIG_NAME} \
--max-unavailable=1 \
--zone=${ZONE} \
--project=${PROJECT_ID}
① 再起動中(1 台が RESTARTING、他は NONE のまま)
gcloud compute instance-groups managed list-instances ${MIG_NAME} \
--zone=${ZONE} \
--project=${PROJECT_ID}
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-5v4v asia-northeast1-a RUNNING NONE my-instance-template-v2
my-mig-917l asia-northeast1-a STOPPING RESTARTING my-instance-template-v2 0/2026-06-24 02:28:22.873157+00:00
my-mig-nt88 asia-northeast1-a RUNNING NONE my-instance-template-v2
my-mig-vr6m asia-northeast1-a RUNNING NONE my-instance-template-v2
② ほぼ完了(残り 1 台が RESTARTING、他は NONE に戻っている):
gcloud compute instance-groups managed list-instances ${MIG_NAME} \
--zone=${ZONE} \
--project=${PROJECT_ID}
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-5v4v asia-northeast1-a RUNNING RESTARTING my-instance-template-v2 0/2026-06-24 02:28:22.873157+00:00
my-mig-917l asia-northeast1-a RUNNING NONE my-instance-template-v2 0/2026-06-24 02:28:22.873157+00:00
my-mig-nt88 asia-northeast1-a RUNNING NONE my-instance-template-v2 0/2026-06-24 02:28:22.873157+00:00
my-mig-vr6m asia-northeast1-a RUNNING NONE my-instance-template-v2 0/2026-06-24 02:28:22.873157+00:00
# 2 台ずつ同時に再起動(速度を上げたい場合)
gcloud compute instance-groups managed rolling-action restart ${MIG_NAME} \
--max-unavailable=2 \
--zone=${ZONE} \
--project=${PROJECT_ID}
再起動中(2 台が同時に RESTARTING)
gcloud compute instance-groups managed list-instances ${MIG_NAME} \
--zone=${ZONE} \
--project=${PROJECT_ID}
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-5v4v asia-northeast1-a RUNNING NONE my-instance-template-v2 0/2026-06-24 02:28:22.873157+00:00
my-mig-917l asia-northeast1-a STOPPING RESTARTING my-instance-template-v2 0/2026-06-24 02:30:37.263791+00:00
my-mig-nt88 asia-northeast1-a STOPPING RESTARTING my-instance-template-v2 0/2026-06-24 02:30:37.263791+00:00
my-mig-vr6m asia-northeast1-a RUNNING NONE my-instance-template-v2 0/2026-06-24 02:28:22.873157+00:00
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-5v4v asia-northeast1-a RUNNING NONE my-instance-template-v2 0/2026-06-24 02:30:37.263791+00:00
my-mig-917l asia-northeast1-a RUNNING NONE my-instance-template-v2 0/2026-06-24 02:30:37.263791+00:00
my-mig-nt88 asia-northeast1-a RUNNING NONE my-instance-template-v2 0/2026-06-24 02:30:37.263791+00:00
my-mig-vr6m asia-northeast1-a RUNNING RESTARTING my-instance-template-v2 0/2026-06-24 02:30:37.263791+00:00
方法5: ローリング置換(rolling replace)
ローリング置換 は、インスタンステンプレートを変更せずに VM を削除・再作成する方法です。インスタンスを完全に新しい状態から作り直すため、再起動では解消しない問題にも対処できます。
置換方法(replacementMethod)
VM の置換方法には 2 種類あります。
| 置換方法 | 説明 | インスタンス名 |
|---|---|---|
SUBSTITUTE(デフォルト) |
新しい VM を先に作成してから旧 VM を削除 | 変更される |
RECREATE |
旧 VM を削除してから同じ名前で新 VM を作成 | 保持される |
RECREATE を使う場合は --max-surge=0 が必須です(旧 VM を削除して名前を解放する必要があるため)。
ローリング置換(SUBSTITUTE)
# すべての VM を 1 台ずつ置換(デフォルトは SUBSTITUTE = 名前変更あり)
gcloud compute instance-groups managed rolling-action replace ${MIG_NAME} \
--max-unavailable=1 \
--zone=${ZONE} \
--project=${PROJECT_ID}
rolling-action replace は rolling-action restart と同様に、テンプレートを変更せずにインスタンスを置換します。MIG のアップデートタイプが OPPORTUNISTIC の場合でも、自動的に AUTOMATIC(proactive)に変更されて即座に実行されます。
① 置換中(新しい名前の VM が CREATING、古い VM が DELETING)
gcloud compute instance-groups managed list-instances ${MIG_NAME} \
--zone=${ZONE} \
--project=${PROJECT_ID}
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-1dzw asia-northeast1-a RUNNING NONE my-instance-template-v2 0/2026-06-24 02:32:41.998262+00:00
my-mig-f2ch asia-northeast1-a RUNNING NONE my-instance-template-v2 0/2026-06-24 02:32:41.998262+00:00
my-mig-pkx1 asia-northeast1-a STOPPING DELETING
my-mig-r1c7 asia-northeast1-a RUNNING NONE my-instance-template-v2 0/2026-06-24 02:32:41.998262+00:00
my-mig-v07v asia-northeast1-a STAGING CREATING my-instance-template-v2 0/2026-06-24 02:35:09.675698+00:00
新しい VM(my-mig-v07v)が CREATING で作成されると同時に、古い VM(my-mig-pkx1)が DELETING で削除されています。SUBSTITUTE 方式では新 VM を先に作成するため、--max-surge=1(デフォルト)により一時的にインスタンス数が 5 台になっています。
② 完了後(インスタンス名が変わっている。SUBSTITUTE 方式の特徴)
gcloud compute instance-groups managed list-instances ${MIG_NAME} \
--zone=${ZONE} \
--project=${PROJECT_ID}
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-kjr8 asia-northeast1-a RUNNING NONE my-instance-template-v2 0/2026-06-24 02:35:09.675698+00:00
my-mig-qm22 asia-northeast1-a RUNNING NONE my-instance-template-v2 0/2026-06-24 02:35:09.675698+00:00
my-mig-v07v asia-northeast1-a RUNNING NONE my-instance-template-v2 0/2026-06-24 02:35:09.675698+00:00
my-mig-vx55 asia-northeast1-a RUNNING NONE my-instance-template-v2 0/2026-06-24 02:35:09.675698+00:00
すべてのインスタンス名が置換前(my-mig-5v4v など)から変わっていることが確認できます。これが SUBSTITUTE 方式の特徴です。
インスタンス名を保持した置換(RECREATE)
RECREATE 方式は rolling-action replace ではなく rolling-action start-update コマンドで --replacement-method=recreate を指定して実行します。アップデートタイプはデフォルトの proactive(自動)です。
RECREATE では旧 VM を削除してから同じ名前で新 VM を作成するため、--max-surge=0 が必須です。新 VM を先に作成する余地がないため、--max-unavailable を 1 以上に設定する必要があります。
# インスタンス名を保持しながら置換(stateful MIG に有効)
# RECREATE では --max-surge=0 が必須
gcloud compute instance-groups managed rolling-action start-update ${MIG_NAME} \
--version=template=${TEMPLATE_V2} \
--replacement-method=recreate \
--max-surge=0 \
--max-unavailable=2 \
--zone=${ZONE} \
--project=${PROJECT_ID}
① 置換中(同じ名前のまま RECREATING になっている)
gcloud compute instance-groups managed list-instances ${MIG_NAME} \
--zone=${ZONE} \
--project=${PROJECT_ID}
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-kjr8 asia-northeast1-a RUNNING NONE my-instance-template-v2 0/2026-06-24 02:35:09.675698+00:00
my-mig-qm22 asia-northeast1-a RUNNING RECREATING my-instance-template-v2
my-mig-v07v asia-northeast1-a RUNNING NONE my-instance-template-v2 0/2026-06-24 02:35:09.675698+00:00
my-mig-vx55 asia-northeast1-a RUNNING RECREATING my-instance-template-v2
--max-unavailable=2 を指定しているため、2 台が同時に RECREATING になっています。SUBSTITUTE のように CREATING / DELETING が別々に表示されるのではなく、RECREATING という単一のアクションで処理される点が異なります。
② 完了後(インスタンス名が保持されたまま全台が v2 に切り替わっている)
gcloud compute instance-groups managed list-instances ${MIG_NAME} \
--zone=${ZONE} \
--project=${PROJECT_ID}
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
my-mig-kjr8 asia-northeast1-a RUNNING NONE my-instance-template-v2
my-mig-qm22 asia-northeast1-a RUNNING NONE my-instance-template-v2
my-mig-v07v asia-northeast1-a RUNNING NONE my-instance-template-v2
my-mig-vx55 asia-northeast1-a RUNNING NONE my-instance-template-v2
インスタンス名(my-mig-kjr8, my-mig-qm22 など)が置換前と同じまま保持されていることが確認できます。これが RECREATE 方式の最大の特徴であり、インスタンス名に依存する stateful なワークロードで有効です。
アップデート方法の選び方
| シナリオ | 推奨方法 |
|---|---|
| テンプレートを全 VM に自動で順次適用したい | ローリングアップデート(proactive) |
| 一部の VM でテストしてから全体展開したい | カナリアアップデート |
| 更新タイミングを自分で制御したい | 選択的アップデート(opportunistic) |
| テンプレート変更なしに VM を再起動したい | ローリング再起動 |
| VM を完全に作り直したい | ローリング置換 |
| インスタンス名を保持して置換したい | ローリング置換(RECREATE) |
アップデート方法の選び方として、まず「テンプレートを変更するかどうか」で大きく二分されます。テンプレートの変更(マシンタイプ・イメージ・メタデータなど)を伴わない場合は、ローリング再起動またはローリング置換を選びます。再起動はメモリリークの解消など軽微な理由に向いており、置換は OS 状態のリセットなど VM を完全にクリーンな状態に戻したい場合に適しています。
テンプレートを変更する場合は、次に「更新の制御をどこまで自動化するか」を考えます。MIG に任せて自動的に展開したい場合は--type=proactive、更新のタイミングや対象 VM を自分でコントロールしたい場合は--type=opportunisticを選びます。
--type=proactiveを選んだ場合、さらに「段階的な検証が必要か」を判断します。本番環境では、いきなり全 VM に適用するリスクを避けてカナリアアップデートで一部先行検証してから全体展開するパターンが安全です。問題なければロールフォワード、問題があればロールバックという明確なフローを持てる点が強みです。
最後に、ローリング置換を使う場面では「インスタンス名の保持が必要か」を確認します。DNS 名や外部サービスとの連携でインスタンス名に依存している場合は RECREATE 方式を選びます。ただし RECREATE では --max-surge=0 が必須となり、一時的にキャパシティが下がる点に注意が必要です。インスタンス名への依存がなければデフォルトの SUBSTITUTE 方式(新 VM を先に作成してから旧 VM を削除)の方がダウンタイムを最小化できます。
まとめ
今回は、Compute Engine の マネージドインスタンスグループ(MIG) のインスタンスのアップデートについて解説しました。
Compute Engine の MIG では、目的に応じた複数のインスタンスアップデート方法が提供されており、用途に合わせて柔軟に選択できます。
CI/CD パイプラインで自動展開したい場合はproactiveを、メンテナンスウィンドウや特定の VM だけを対象にしたい場合はopportunisticを選ぶことで、運用スタイルに合ったコントロールが可能です。
また、本番環境への影響を最小化するうえでカナリアアップデートは特に有効な手段かと思います。一部の VM に新テンプレートを先行適用して動作を確認してから全体展開するフローにより、問題発生時のロールバックコストを大幅に抑えられます。
MIG のアップデート機能を活用して、安全かつ効率的なデプロイメントパイプラインの構築を検討してみてはいかがでしょうか。
この記事が誰かの助けになれば幸いです。
以上、クラウド事業本部コンサルティング部の渡邉でした!





