GCP VM Managerでバッチ処理

Compute Engineでアプリケーションを運用しています。現在バッチ処理はcronを用いていますが、SSHしないと状態が確認できません。
今回はVM Managerを使ってSSHせずにバッチ処理します。

実行スクリプトを作成する

定期実行するスクリプトを作成します。

#!bin/bash

# [batch.sh]
apt upgrade

スクリプトを「batch.sh」というファイル名で保存します。
batch.shを任意のGCSバケットに保管します。
保管したらバッチジョブ作成に使うGenerationを調べます。

gsutil stat gs://<bucket-name>/<folder-name>

以下のような出力結果からGenerationの番号を控えます。

gs://<bucket-name>/<folder-name>:
   Creation time:          Mon, 1 Apr 1900 00:00:00 GMT
   Update time:            Mon, 1 Apr 2000 00:00:00 GMT
   Storage class:          STANDARD
   Content-Length:         1234
   Content-Type:           xxxx/xxxxxx
   Hash (crc32c):          ABCDEF==
   Hash (md5):             ABCDEFGHIJKLMNOPQRSTUVW==
   ETag:                   ABCDEFGHIJKLMN=
   Generation:             <"ここの番号をメモする">
   Metageneration:         12

VM Managerでバッチを作成する

VM Managerでバッチジョブを作成します。
今回はgcloudコマンドを使ってバッチを作成します。

gcloud compute patch-jobs execute --display-name=<mypatch> \
    --instance-filter-names=zones/<ZONE>/instances/<INSTANCE_NAME> \
    --pre-patch-linux-executable=gs://<my-bucket>/<folder-name>/batch.sh#<Generation>

--pre-patch-linux-executableでバッチ処理をするスクリプトファイルを指定します。GCS上のファイルを指定する場合はファイル名の後に#をつけGeneration(世代番号)を付け加えます。

検証目的の場合、「--dry-run」オプションを付けることでCompute Engineに影響させることなくスクリプトを実行した結果のみを取得することができます。

コンソール画面でCompute Engine>OS バッチの管理>バッチジョブでバッチジョブ実行の状況が閲覧できます。

定期的にバッチジョブを実行する

バッチジョブをyamlファイルで記述します。

# [file.yaml]
instanceFilter:
 instances:
 - zones/<instance-zone>/instances/<instance-name>
patchConfig:
 preStep:
   linuxExecStepConfig:
     gcsObject:
       bucket: <my-bucket>
       generationNumber: '<Generation>'
       object: <folder-name/batch.sh>
 rebootConfig: NEVER
recurringSchedule:
 frequency: WEEKLY
 timeOfDay:
   hours: 1
 timeZone:
   id: Asia/Tokyo
 weekly:
   dayOfWeek: SUNDAY

yamlファイルを作成したら以下のコマンドでデプロイします。

gcloud compute os-config patch-deployments create <mypatch> --file=file.yaml

コンソール画面でCompute Engine>OS バッチの管理>スケジュール済みのデプロイでスケジュールが設定されていることを確認します。

スケジュールを変更する

スケジュールやコマンドが変更になった場合、一度削除して再デプロイする必要があります。
まず既存のデプロイを調べyaml形式を取得します。

gcloud compute os-config patch-deployments describe <mypatch>​

file.yamlで指定した内容が返ってきます。必要に応じてfile.yamlを修正します。次に現在のバッチジョブを削除し再度デプロイします。

gcloud compute os-config patch-deployments delete <mypatch>
gcloud compute os-config patch-deployments create <mypatch> --file=file.yaml

コンソール画面でCompute Engine>OS バッチの管理>スケジュール済みのデプロイでスケジュールが変更されていることを確認します。

これでcronを用いずにバッチジョブを実行することができました。SSHしない運用にすることで、踏み台サーバーのメンテナンスやネットワーク経路の穴あけなど保守のために考えなければいけないことが格段に減りました。

この記事が気に入ったらサポートをしてみませんか?