web-dev-qa-db-ja.com

毎晩GoogleCloudを作成するVMスナップショットで

Google Cloud Compute Engineを作成し、毎晩バックアップ(スナップショット)しました。同じプロジェクトに2番目のVMがあります。これは、最初のプロジェクトのクローンです。2番目のVMインスタンスを毎回更新することは可能ですか?最初のスナップショットを作成したばかりですか?それで、最悪の場合24時間経過したフェイルバックサーバーがありますか?

1
DonKanallie

スナップショットから新しいインスタンスを作成し、新しいインスタンスが正常であることを確認して、2番目のVMインスタンスを削除する必要があります。gcloudsdkにはそのためのフラグがあります-

gcloud compute instances create with --source-snapshot=SNAPSHOT 国旗。

あなたのケースについてはよくわかりませんが、新しくリリースされた GCPマシンイメージ が検討に適した代替手段になる可能性があります。複数のディスクのバックアップ、インスタンスのクローン作成、レプリケーションなど、ディスクスナップショットでは利用できない機能を提供します。 マシンからインスタンスを作成する すべてのインスタンスのプロパティ、構成、データをそのまま使用したイメージ。

3
Daniel t.

誰かが同じ問題に直面した場合、私はクラウド関数を作成し、それを毎日スケジュールしました。手順は次のとおりです。

  1. 最新のスナップショットを取得する
  2. 古いVMを削除する
  3. 新しいVMを作成する
  4. 新しく作成されたVM IPをCloudflareLoadBalancerに配置します

これはそのためのコードです:

    const Compute = require("@google-cloud/compute");
    const axios = require("axios");

    const compute = new Compute({
      projectId: "myProjectID",
      keyFilename: "./gcloud_key.json"
    });

    exports.updateFailOverVM = async (pubSubEvent, context) => {
      try {
        const snapshots = await compute.getSnapshots({
          orderBy: "creationTimestamp desc"
        });
        const snapshot = snapshots[0][0];
        console.log(`Going to use Snapshot: ${snapshot.name}`);
        const sourceSnapshot = `https://www.googleapis.com/compute/v1/projects/myProjectID/global/snapshots/${snapshot.name}`;

        const zone = compute.zone("MySelectedZone");
        const vm = zone.vm("MyVMName");

        // Delete old FailOver
        console.log("start deleting old VM");
        const [deleteOperation] = await vm.delete();

        deleteOperation.on("complete", async function(metadata) {
          console.log("finished deleting old VM");

          // Create new VM
          console.log("start creating new VM");
          const [newVM, createOperation] = await vm.create({
            http: false,
            https: true,
            machineType: "n1-standard-1",
            disks: [
              {
                initializeParams: {
                  sourceSnapshot
                },
                sizeGb: 50,
                type:
                  "projects/MyProjectID/zones/mySelectedZone/diskTypes/pd-standard",
                boot: true
              }
            ]
          });
          createOperation.on("complete", async function(metadata) {
            const [newVMMeta] = await vm.getMetadata();
            const newIP = newVMMeta.networkInterfaces[0].accessConfigs[0].natIP;
            console.log("finished creating new VM");

            // Route Cloudflare to new IP
            console.log("Put new IP to Cloudflare");
            await axios({
              method: "patch",
              url:
                "https://api.cloudflare.com/client/v4/user/load_balancers/pools/MyPoolID",
              data: {
                origins: [
                  {
                    name: "MyPoolName",
                    address: newIP,
                    enabled: true,
                    weight: 1
                  }
                ]
              },
              headers: {
                "X-Auth-Email": "MyCloudflareEmail",
                "X-Auth-Key": "MyCloudflareAuthKey"
              }
            });
            console.log("Finished putting IP to Cloudflare");
          });
        });
      } catch (err) {
        console.error(err);
      }
    };
1
DonKanallie