gcloudコマンドでGCEスナップショット取得→インスタンス作成をやってみた


最近ちょっとGCPを使う機会が増えてきたんだけれど
データ消えたら嫌だなあ.定期的にバックアップとって,ついでにDB系ならバックアップからインスタンスを作成っていうのをスクリプトで自動でやってくれたら楽だなあ
と思ったのでgcloudコマンドでやってみた.忘備録として使用したコマンドを以下にまとめていく.

前提条件

  • gcloudは設定済み(ComputeEngineを操作できる権限が付与されている)
  • GCEにインスタンスが立ててある

使用したgcloudコマンド

スナップショットの作成

まずインスタンスを作成する際に元となるスナップショットを作成する.

$ gcloud compute disks snapshot バックアップ対象のインスタンス名 --zone=ゾーン名 --snapshot-names=スナップショット名

例)
$ gcloud compute disks snapshot instance-01 --zone=asia-northeast1-a --snapshot-names=snapshot-01

コンソール上からスナップショットをとる時にはインスタンスを一旦止めないと取れない様になっていたけど,gcloudコマンドだとインスタンスを停止しなくてもスナップショットが取れるらしい(←公式ドキュメントより).実際にコマンドを走らせてみたけど,特にインスタンスが停止した様子もなく起動状態のまま取れた.

ディスクの作成

インスタンスを立てる際にブートディスクになるディスクをスナップショットから作成する.

$ gcloud compute disks create ディスク名 --source-snapshot=スナップショット名 --zone=ゾーン名

例)
$ gcloud compute disks create disk-01 --source-snapshot=snapshot-01 --zone=asia-northeast1-c

インスタンスの作成

先ほど作成したディスクを元にインスタンスを作成する.

$ gcloud compute instances create 新しく作成するインスタンス名 \
  --disk name=ディスク名,boot=yes,auto-delete=yes \
  --zone=ゾーン名 --machine-type=インスタンスタイプ --tags=タグ名

例)
$ gcloud compute instances create instance-02 \
  --disk name=disk-01,boot=yes,auto-delete=yes \
  --zone=asia-northeast1-c --machine-type=n1-standard-2 --tags=http-server,https-server

auto-delete=yesでインスタンスを削除する時にディスクも一緒に削除してくれる.デフォルトでは,インスタンスを削除してもディスクは残ったままで,いちいち消しに行くのがめんどくさいので設定しておく.逆にインスタンスを削除してもディスクは残して置きたいという場合はauto-delete=yesはいらない.

スナップショットの削除

定期的にスナップショットを取るとすると,不要なスナップショットまで溜まっていくので削除する.

gcloud compute snapshots delete スナップショット名

例)
gcloud compute snapshots delete snapshot-01

使えそうなコマンド

インスタンスの削除

gcloud compute instances delete インスタンス名 --zone=ゾーン名 --quiet

インスタンスを削除する際に,コマンドライン上でディスクも削除するか[y,n]聞かれる.--quietをつけておくと聞かれなくなるのでスクリプト化する際とかに楽.インスタンス作成時にauto-delete=yesを選択した(上記の)コマンドを使用した場合だと,期待通りディスクも削除してくれた.

外部IPアドレスの取得

外部IPアドレスを取得したいインスタンスのネットワークの構成を表示.

$ gcloud compute instances describe インスタンス名 --zone=ゾーン名
...
networkInterfaces:
- accessConfigs:
  - kind: compute#accessConfig
    name: hogehoge
    natIP: 35.27.31.54 //外部IPアドレス(例)
 ...
  name: nic0
  network: default
  networkIP: 10.0.0.1 //内部IPアドレス(例)
  subnetwork: default
...

上記のネットワーク構成の際に外部IPアドレスだけ取りたい時は,

$ gcloud compute instances describe インスタンス名 --format="get(networkInterfaces[].accessConfigs[0].natIP)
35.27.31.54

で取れる.

AWS-CLIとの比較

aws-cliコマンドではインスタンスやAMIに対して何かしらコマンドで操作する時はIDを指定していたけど,gcloudコマンドでは最初につけた名前を指定するらしい.AWSだとインスタンスやAMIを操作するのに,条件指定してIDを取ってきてから操作していたけど,GCPだと自分で名前決められるので楽だった.その代わりそれぞれの名前は,ゾーンごとに一意である必要がある,後から変更できないっていう制約は付いてくるけど.
あと,スクリプト化するのにおいてスナップショットやインスタンスが作成中だったら待つみたいなコマンドを必要がない.例えばaws-cliだとAMIを取得するコマンドの後に作成したAMIからインスタンス作成を実行しようとすると,AMIが作成途中なのでインスタンス作成コマンドが失敗してしまう可能性がある.その為にAMIの作成が終了するまで待つコマンドを実行する必要がある.それに比べて,gcloudだとスナップショットを作成するコマンドを打つと実際にスナップショットが作成中であることがプロンプトに表示され,作成が終了するまで次のコマンドが実行できないので順々に実行できて楽だった.