resonite ヘッドレスサーバの GCE インスタンスを複製しよう

この記事では Google Cloud で resonite ヘッドレスサーバ を構築する で構築した ヘッドレスサーバ を複製します。 同様の ヘッドレスサーバ を複数台準備したい時に便利な手順です

手順の流れ

こちらでセットアップした Google Cloud Shell を利用して Google Cloud をコマンドラインから操作します。

流れとしては以下の通り

  1. ヘッドレスサーバConfig.Jsonシークレット に格納する

  2. GCE インスタンスのマシンイメージを作成し、マシンイメージから新規インスタンスを構築する

Config.Jsonシークレット に格納する

新規で作成する ヘッドレスサーバConfig.Json を先に作って シークレット に格納します。

  1. 複製するインスタンス名を変数にする

    SOURCE_INSTANCE_NAME=$(gcloud compute instances list --format="value(name)"|fzf)
    
  2. 新規で作成するインスタンス名を考えて変数にする(例: インスタンス名を clone-server01 にする)

    RESONITE_HEADLESS_SERVER_INSTANCE_NAME=clone-server01 && echo ${RESONITE_HEADLESS_SERVER_INSTANCE_NAME}
    
  3. カレントディレクトリを クローンしたリポジトリ に変更します

    REPOSITORY_DIR="${HOME}/resonite-headless-infra" && cd ${REPOSITORY_DIR}/config/
    
  4. Config.json が存在することを確認する

    HEADLESS_CONFIG_FILE=Config.json && ls -l ${HEADLESS_CONFIG_FILE}
    
  5. Config.json を編集します(※Ctrl+s で上書き保存する)

    edit ${HEADLESS_CONFIG_FILE}
    
  6. 新しい シークレット をインスタンス名で作成し Config.json の内容を格納します

    gcloud secrets create ${RESONITE_HEADLESS_SERVER_INSTANCE_NAME} --data-file ${HEADLESS_CONFIG_FILE}
    
  7. シークレット に格納されたことを確認します

    gcloud secrets versions list ${RESONITE_HEADLESS_SERVER_INSTANCE_NAME}
    
  8. シークレット の内容を読みだして確認します

    gcloud secrets versions access latest --secret ${RESONITE_HEADLESS_SERVER_INSTANCE_NAME}
    

GCE インスタンス内部からシークレットへアクセスできるように設定する

Config.Json はインスタンス内部で毎回 シークレット から読みだす設定になっている為、アクセス許可の設定をします。

  1. GCE インスタンスに割り当てられている Google Service Account を変数にする

    GSA=$(gcloud projects describe $(gcloud config get-value project) --format="value(projectNumber)")-compute@developer.gserviceaccount.com && echo ${GSA}
    
  2. 作成したシークレットに対して IAM ポリシーバインディングを設定する

    gcloud secrets add-iam-policy-binding ${RESONITE_HEADLESS_SERVER_INSTANCE_NAME} \
        --member serviceAccount:${GSA} \
        --role roles/secretmanager.secretAccessor
    
  3. シークレットへのアクセスを確認する

    gcloud secrets get-iam-policy ${RESONITE_HEADLESS_SERVER_INSTANCE_NAME}
    

マシンイメージを作成する

複製元のインスタンスから マシンイメージ を作成します

  1. 作成する マシンイメージ の名前を考えて変数にします(例: resonite_image)

    MACHINE_IMAGE_NAME=resonite_image
    
  2. インスタンスからマシンイメージを作成します

    gcloud compute machine-images create ${MACHINE_IMAGE_NAME} --source-instance=${SOURCE_INSTANCE_NAME}
    
  3. マシンイメージが作成されたことを確認します

    gcloud compute machine-images describe ${MACHINE_IMAGE_NAME}
    

マシンイメージからインスタンスを作成する

  1. 作成したマシンイメージを元にして新しいインスタンスを作成します

    gcloud compute instances create ${RESONITE_HEADLESS_SERVER_INSTANCE_NAME} \
        --machine-type ${MACHINE_TYPE} \
        --source-machine-image=${MACHINE_IMAGE_NAME}
    
  2. 作成されたことを確認します(※作成すると同時に起動します)

    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)

明日の記事 へ続きます。