GCEインスタンスを別のプロジェクトに移動する

CUI版については既にやっている方がいたので以下の記事を参照。

https://qiita.com/k_myoda/items/e5aeea4e73f436fca87f

今回はブラウザだけでこれをやることにする。

スナップショットを作成

※ 事前にインスタンスは停止しておくこと。

Compute Engine > スナップショット

から「スナップショットを作成」を押下。
ソースディスクに移行するインスタンスで使用しているディスクを選択して作成する。

イメージを作成

Compute Engine > イメージ

から「イメージを作成」を押下。

  • ソース: スナップショットを選択
  • ソース スナップショット: 先程作成したスナップショットを選択

移行先のプロジェクトを作成

すでに別のプロジェクトにいる場合がほとんどなので上メニューに現在選択しているプロジェクトが出ているはず。
そこを押下して「新しいプロジェクト」から作成する。

作成後、そのプロジェクトに移動する。

GCE インスタンスを作成

Compute Engine > インスタンス

から作成する。

  • ブートディスク: カスタムイメージ
    • 表示するイメージの取得元: 移行元のプロジェクト
    • 作成したイメージを選択

で作れるのだが、その他の構成を同じにするのが面倒だったので、別途コマンドで以下に手順を示す。

移行元のプロジェクトでの操作

Compute Engine > インスタンス

移行元のインスタンスの詳細から「同様のものを作成」

ここでインスタンスは作成せずに、一番下の同等の REST またはコマンドラインを押下して、表示されたコマンドラインをコピーする。

gcloud beta compute instances create 移行先インスタンス \
  --zone 移行先インスタンスのゾーン \
  --image 作成したイメージ名 \
  --image-project 移行元プロジェクトID \
  --project 移行先プロジェクトID

これをベースにコピーしたときについていたオプションを生やしていく。
ただし、 --service-account, --disk がある場合は削除しておく。
今回自分がやったときは以下のような感じになった。

gcloud beta compute instances create xxxxx \
  --zone asia-northeast1-a \
  --image xxxxx \
  --image-project xxxxx \
  --project xxxxx \
  --machine-type=g1-small \
  --subnet=default \
  --network-tier=PREMIUM \
  --metadata=xxxxx \
  --no-restart-on-failure \
  --maintenance-policy=TERMINATE \
  --scopes=xxxxx \
  --tags=http-server,https-server \
  --preemptible

また、注意点としてインスタンスに関係しない箇所はプロジェクトごとに別途再設定する必要がある。

特に気をつけるべき箇所は以下の箇所

  • IAM
    • Bot用に権限絞ったものを使っていたので登録が必要だった。
  • ファイアウォールルール
    • http-server, https-serverタグだけインスタンスに付与されていてルール自体が存在しなかった。
      インスタンスを編集してファイアウォールのチェックボックスを付けて保存すると、自動生成された。
  • 静的IPアドレス
    • 同じIPアドレスにできないため、DNSに設定し直す必要がある。

後片付け

移行元のプロジェクトで作成したものを削除する。

  • イメージ
  • スナップショット
  • (不要であれば)インスタンス
  • (不要であれば)静的IPアドレス

まとめ

意外と面倒だったので、1プロジェクト1サービスをベースにしたほうが良さそう。
割当上限は問い合わせればできるらしいが、気軽に増やしてくれるのかは不明。