この記事はGMOアドマーケティング Advent Calendar 2023 20日目の記事です。
こんにちは。GMOアドマーケティングのT.Oです。
今回はGoogle CloudでSpot VMを利用する手順についてご紹介します。
1.Spot VMとは
Google CloudのSpot VMは、GCE(Google Compute Engine)の余剰のキャパシティを利用する低価格なVMです。以下のような特徴があります。
- すべてのリージョン、ほとんどのマシンタイプで利用できる。
- 標準のVMマシンタイプの料金と比べて60%〜91%の割引がある。
- Spot VMに接続されているGPU、ローカルSSD、外部IPアドレスに対する割引も適用される。
2.Spot VMの制限、注意事項
Spot VMの制限、注意事項は以下の通りです。
- Compute Engineのキャパシティに余剰がない場合、Spot VMのインスタンスが作成できないことがあります。
- Spot VMを作成できた場合においても、Compute Engineのキャパシティの余剰がなくなった場合は任意のタイミングでプリエンプト(強制終了)されます。
- Google CloudのCompute Engineのサービスレベル契約(Compute Engine SLA)の対象外となっている。
3.Spot VMを作成する
Spot VMを作成するには、Google Cloud コンソール、gcloud CLI、または Compute Engine API を利用します。
ここではGoogle Cloud コンソールを利用する方法をご紹介します。
1.Google Cloudのコンソール画面で「Compute Engine」→「VM インスタンス」
VM インスタンス画面に遷移します。
2.VM インスタンス画面で「インスタンスを作成」を選択します。
インスタンスの作成画面に遷移します。
3.インスタンスの作成画面でインスタンスの名前やマシンの構成などのパラメータを設定します。そして「可用性ポリシー」→「VM プロビジョニング モデル」で「スポット」を選択します。
4.「VM プロビジョニング モデル」でスポットを選択すると「VMの終了時」の動作を設定するプルダウンが表示されます。「停止」または「削除」を選択します。
「停止」を選択した場合、プリエンプトされた後にSpot VMの再起動が可能です。
ですので起動中にSpot VMにアタッチされたストレージにデータを書き込んでいる場合、プリエンプト後にSpot VMを再起動すると書き込んだデータを参照することができます。
注)Spot VMの再起動が成功するのはCompute Engineのキャパシティに余剰があるときになります。
「削除」を選択した場合にはSpot VMの再起動を行うことはできません。
ですのでSpot VMの起動中にデータの書き込みが生じる場合、外部ストレージ(例: Cloud Storage)にデータを保存するなどの対応を行う必要があります。
4.マネージドインスタンスグループ内でSpot VMを作成する
先にご紹介した「3.Spot VMを作成する」方法はお手軽ですが以下のような要件がある場合はマネージドインスタンスグループ内でSpot VMを作成する方が便利です。
- 同じ仕様のSpot VMを多数利用したい
- プリエンプトされた後、Spot VMを自動的に再作成して可用性を高めたい
マネージドインスタンスグループにはターゲットサイズ(VM数)を維持する機能があります。
このためCompute Engineがマネージドインスタンスグループ内のSpot VMをプリエンプトした場合、キャパシティに余剰が発生したタイミングでSpot VMが自動的に再作成されてターゲットサイズが維持されます。プリエンプトにより処理の中断は発生するもののSpot VMの再作成は自動的に実行されますので可用性を高めることができます。
注)自動的に実行されるのは「再起動」ではなく「再作成」になります。再作成後に再作成前のSpot VMにアタッチしていたストレージに書き込んだデータは参照できませんので注意してください。
4.1.インスタンステンプレートの作成
マネージドインスタンスグループ内で同じ仕様のSpot VMを複数作成するためにインスタンステンプレートを利用します。
1.Google Cloudのコンソール画面で「Compute Engine」→「インスタンステンプレート」を選択します。
インスタンステンプレート画面に遷移します。
2.「インスタンステンプレート」画面で「インスタンステンプレートを作成」を選択します。
インスタンス テンプレートの作成画面に遷移します。
3.「インスタンステンプレートの作成」画面で「マシンの構成」などVM作成に必要なプロパティを設定します。そして「可用性ポリシー」→「VM プロビジョニング モデル」で「スポット」を選択します。
4.「詳細オプション」→「管理」→「自動化」の「起動スクリプト」欄にスタートアップ処理を登録します。スタートアップ処理は初回の起動時だけではなく、プリエンプト後にSpot VMが再作成される時にも実行されます。
5.プリエンプトされる直前に実行されるシャットダウン処理を設定したい場合には「詳細オプション」→「管理」→「メタデータ」で「+ 項目を追加」を選択します。
「キー 1」、「値 1」の入力欄が表示されますので、「キー 1」の入力欄に「shutdown-script」と入力します。「値 1」にシャットダウン時に実行する任意の処理(例: 実行中の結果データをCloud Storageなど外部にバックアップするなど)を記述します。シャットダウン時間の長さはインスタンスの種類によって異なります。Spot VMではプリエンプションが発生した場合のシャットダウン時間は30 秒となっています。ですのでshutdown-scriptに記述する処理は30秒内で実行完了する必要があります。
6.これまでの手順でSpot VM関連の設定を行いましたが、マシンの構成などVMを利用する上で必要な各種のパラメータについても設定します。すべての設定が完了したら画面下部の「作成」を選択します。
インスタンステンプレート画面に遷移します。
作成時に指定した名前のインスタンステンプレートのリンクを選択すると以下のようにインスタンステンプレートの設定内容が表示されます。
4.2.マネージドインスタンスグループ内でSpot VMを作成する
「4.1.インスタンステンプレートの作成」で作成したインステンステンプレートを利用します。
ここでは以下のようにgcloudコマンドを実行してマネージドインスタンスグループ内でSpot VMを作成します。
1 2 3 4 5 |
gcloud compute instance-groups managed create {マネージド インスタンスグループ名} \ --template {テンプレート名} \ --base-instance-name {インスタンスのベース名} \ --size {インスタンス数} \ --zone {ゾーン名} |
コマンド実行結果
コマンド実行により、マネージドインスタンスグループ内にSpot VMが作成されます。
マネージドインスタンスグループの作成例
Spot VMの作成例
5.Spot VMのプリエンプトをSlack で通知する
5.1.プリエンプト時に出力されるログ
Spot VMがプリエンプトされた場合、監査ログが出力されます。以下はCloud Loggingを利用してログを表示した例ですが、”compute.instances.preempted”の文字列が含まれていることがわかります。
5.2.Cloud LoggingでSlack通知を設定する
(前提)以下の手順はCloud LoggingでSlack通知ができるよう設定済であることが前提となっています。
Cloud Loggingで通知対象とするログを抽出するためのクエリを作成します。今回は以下のような抽出条件を指定します。
1 2 3 4 5 6 |
resource.type="gce_instance" AND severity=INFO AND log_name="projects/{プロジェクトID}/logs/cloudaudit.googleapis.com%2Fsystem_event" AND resource.labels.project_id="{プロジェクトID}" AND proto_payload.method_name="compute.instances.preempted" AND proto_payload.resource_name=~"{インスタンスのベース名}" |
抽出条件を指定した状態で「アラートを作成」を選択します。
「ログベースのアラート ポリシーを作成」画面が表示されます。
各入力項目での設定内容は以下の通りです。入力が完了したら「Save」を選択します。
作成したアラートポリシーはCloud MonitoringのアラートのPoliciesで参照できます。
入力項目 | 設定内容 |
Alert Policy Name | アラート ポリシー名を設定します。 |
Documentation | アラートのドキュメントに記載する内容を設定します。 |
Choose logs to include in the alert | アラートの条件とするクエリを設定します。 (この項目は抽出条件を指定した状態だと設定済となっています。) |
Set notification frequency and autoclose duration | 通知の間隔、インシデントの自動クローズ期間を設定します。 |
Who should be notified? | 「通知チャンネル」に対象とするSlackのチャンネルを指定します。 |
Spot VMのプリエンプトのSlack通知例
6.まとめ
Google CloudでSpot VMを利用する手順をご紹介しました。
今回の内容が皆さんのお役に立てれば幸いです。
明日は@K-Kantaさんによる「【Python】噂の”LightweightMMM”を使ってみた」です。
引き続き、GMOアドマーケティング Advent Calendar 2023 をお楽しみください!
■採用ページはこちら!
■GMOアドパートナーズ 公式noteはこちら!