resonite ヘッドレスサーバの GCE インスタンスを複製しよう¶
この記事では Google Cloud で resonite ヘッドレスサーバ を構築する で構築した ヘッドレスサーバ を複製します。 同様の ヘッドレスサーバ を複数台準備したい時に便利な手順です
手順の流れ¶
こちらでセットアップした Google Cloud Shell を利用して Google Cloud をコマンドラインから操作します。
流れとしては以下の通り
Config.Json
を シークレット に格納する¶
新規で作成する ヘッドレスサーバ の Config.Json
を先に作って シークレット に格納します。
複製するインスタンス名を変数にする
SOURCE_INSTANCE_NAME=$(gcloud compute instances list --format="value(name)"|fzf)
新規で作成するインスタンス名を考えて変数にする(例: インスタンス名を clone-server01 にする)
RESONITE_HEADLESS_SERVER_INSTANCE_NAME=clone-server01 && echo ${RESONITE_HEADLESS_SERVER_INSTANCE_NAME}
カレントディレクトリを クローンしたリポジトリ に変更します
REPOSITORY_DIR="${HOME}/resonite-headless-infra" && cd ${REPOSITORY_DIR}/config/
Config.json
が存在することを確認するHEADLESS_CONFIG_FILE=Config.json && ls -l ${HEADLESS_CONFIG_FILE}
Config.json
を編集します(※Ctrl+s で上書き保存する)edit ${HEADLESS_CONFIG_FILE}
新しい シークレット をインスタンス名で作成し
Config.json
の内容を格納しますgcloud secrets create ${RESONITE_HEADLESS_SERVER_INSTANCE_NAME} --data-file ${HEADLESS_CONFIG_FILE}
シークレット に格納されたことを確認します
gcloud secrets versions list ${RESONITE_HEADLESS_SERVER_INSTANCE_NAME}
シークレット の内容を読みだして確認します
gcloud secrets versions access latest --secret ${RESONITE_HEADLESS_SERVER_INSTANCE_NAME}
GCE インスタンス内部からシークレットへアクセスできるように設定する¶
Config.Json
はインスタンス内部で毎回 シークレット から読みだす設定になっている為、アクセス許可の設定をします。
GCE インスタンスに割り当てられている Google Service Account を変数にする
GSA=$(gcloud projects describe $(gcloud config get-value project) --format="value(projectNumber)")-compute@developer.gserviceaccount.com && echo ${GSA}
作成したシークレットに対して IAM ポリシーバインディングを設定する
gcloud secrets add-iam-policy-binding ${RESONITE_HEADLESS_SERVER_INSTANCE_NAME} \ --member serviceAccount:${GSA} \ --role roles/secretmanager.secretAccessor
シークレットへのアクセスを確認する
gcloud secrets get-iam-policy ${RESONITE_HEADLESS_SERVER_INSTANCE_NAME}
マシンイメージを作成する¶
複製元のインスタンスから マシンイメージ を作成します
作成する マシンイメージ の名前を考えて変数にします(例: resonite_image)
MACHINE_IMAGE_NAME=resonite_image
インスタンスからマシンイメージを作成します
gcloud compute machine-images create ${MACHINE_IMAGE_NAME} --source-instance=${SOURCE_INSTANCE_NAME}
マシンイメージが作成されたことを確認します
gcloud compute machine-images describe ${MACHINE_IMAGE_NAME}
マシンイメージからインスタンスを作成する¶
作成したマシンイメージを元にして新しいインスタンスを作成します
gcloud compute instances create ${RESONITE_HEADLESS_SERVER_INSTANCE_NAME} \ --machine-type ${MACHINE_TYPE} \ --source-machine-image=${MACHINE_IMAGE_NAME}
作成されたことを確認します(※作成すると同時に起動します)
gce-list
注釈
テスト用に、落ちることが許容されるインスタンスを作成するなら値段が 1/4 の Spot VM を利用することをお勧めします
gcloud compute instances create ${RESONITE_HEADLESS_SERVER_INSTANCE_NAME} \
--machine-type ${MACHINE_TYPE} \
--source-machine-image=${MACHINE_IMAGE_NAME} \
--provisioning-model=SPOT \
--instance-termination-action=STOP \
--maintenance-policy=TERMINATE
注釈
その他のコマンド
# マシンイメージの一覧を表示する
gcloud compute machine-images list
# マシンイメージの一覧から選択して変数に入れる
MACHINE_IMAGE_NAME=$(gcloud compute machine-images list --format="value(name)"|fzf)
# マシンイメージを削除する
gcloud compute machine-images delete ${MACHINE_IMAGE_NAME}
# マシンイメージを変数に入れる
MACHINE_IMAGE_NAME=$(gcloud compute machine-images list --format="value(name)"|fzf)
明日の記事 へ続きます。