【GCP】IPアドレスの固定化と、インスタンスの自動停止を設定する

2021年1月8日金曜日

GCP サーバ 自動化

t f B! P L

 


その5.外部IPアドレスを固定化とインスタンスの自動停止を設定する





インスタンスを立ち上げっぱなしにすると想定外のところで課金が発生するリスクがあるため、開発で使うときは手動で立ち上げて使い終わったら手動で停止する操作を毎回行うことにします。


しかし、停止操作は忘れがちなので一日の決まった時間になったら自動で停止するようにしたいと思います。




IPアドレスを固定にする


VMインスタンスを立ち上げた直後の状態では、固定IPアドレスが割り当てられていますが、インスタンスを停止すると起動したときに再度割り当てられるため毎回アドレスが変わってしまいます。


そうなると、SSH接続やWinSCP接続で設定している接続先IPアドレスを書き換えないといけなくなるため、静的アドレスを固定IPアドレスに割り当てるようにします。


GCPコンソールの左上のナビゲーションメニューから、


VPCネットワーク → 外部IPアドレス  を選択します。








静的アドレスを予約 をクリックします。






各設定値を入力します。





名前: 好きな文字列

説明:使用用途などなんでも

ネットワークサービス階層:標準

IPバージョン:IPv4

タイプ:リージョン

リージョン:無料枠のところを選ぶ

接続先:自分が立ち上げたVMインスタンス



設定できたら 予約 を押します。


これで 静的アドレスの予約 が完了しました。





※注意
使用リソースが割り当てられていない場合は、課金が発生するので削除しましょう




VMインスタンス側へは既に設定されています。




固定IPアドレスが変わったので、SSHのターミナルソフトやWinSCPの設定も変更します。


RLogin




WinSCP







毎日21時にインスタンスを自動停止する


GCPの下記のサービスが利用されます。

  • Cloud Scheduler
  • Cloud Functions
  • Cloud Pub/Sub


必要な設定をしていきます。




■ Cloud Functions


GCPコンソールの左上にあるナビゲーションバーで Cloud Functions を選択します。






関数を作成 をクリックします。





①構成  ②コード  の2段階で設定していきます。


構成では下記内容で入力します。






関数名:stopInstancePubSub

リージョン:us-central1

トリガーのタイプ:Cloud Pub/Sub

Cloud Pub/Sub トピック:トピックを作成する




    トピックID:stop-instance-event


変数、ネットワーク、詳細設定:変更なし



保存 を押して 次へ②コード へ進みます。






ランタイム:Node.js 8

エントリポイント:stopInstancePubSub

ソースコード:下記参照(index.jspucage.json の両方)



>index.jp  のコード


// Copyright 2018 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// [START functions_stop_instance_pubsub]
const Compute = require('@google-cloud/compute');
const compute = new Compute();
// [START functions_stop_instance_pubsub]

/**
 * Stops Compute Engine instances.
 *
 * Expects a PubSub message with JSON-formatted event data containing the
 * following attributes:
 *  zone - the GCP zone the instances are located in.
 *  label - the label of instances to stop.
 *
 * @param {!object} event Cloud Function PubSub message event.
 * @param {!object} callback Cloud Function PubSub callback indicating completion.
 */
exports.stopInstancePubSub = async (event, context, callback) => {
  try {
    const payload = _validatePayload(
      JSON.parse(Buffer.from(event.data, 'base64').toString())
    );
    const options = {filter: `labels.${payload.label}`};
    const [vms] = await compute.getVMs(options);
    await Promise.all(
      vms.map(async instance => {
        if (payload.zone === instance.zone.id) {
          const [operation] = await compute
            .zone(payload.zone)
            .vm(instance.name)
            .stop();

          // Operation pending
          return operation.promise();
        } else {
          return Promise.resolve();
        }
      })
    );

    // Operation complete. Instance successfully stopped.
    const message = 'Successfully stopped instance(s)';
    console.log(message);
    callback(null, message);
  } catch (err) {
    console.log(err);
    callback(err);
  }
};
// [START functions_start_instance_pubsub]

/**
 * Validates that a request payload contains the expected fields.
 *
 * @param {!object} payload the request payload to validate.
 * @return {!object} the payload object.
 */
const _validatePayload = payload => {
  if (!payload.zone) {
    throw new Error("Attribute 'zone' missing from payload");
  } else if (!payload.label) {
    throw new Error("Attribute 'label' missing from payload");
  }
  return payload;
};
// [END functions_stop_instance_pubsub]



pucage.json  のコード


{
  "name": "cloud-functions-schedule-instance",
  "version": "0.0.1",
  "private": true,
  "license": "Apache-2.0",
  "author": "Google Inc.",
  "repository": {
    "type": "git",
    "url": "https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git"
  },
  "engines": {
    "node": ">=8"
  },
  "scripts": {
    "test": "mocha test/*.test.js --timeout=20000"
  },
  "devDependencies": {
    "@google-cloud/nodejs-repo-tools": "^3.3.0",
    "mocha": "^5.2.0",
    "proxyquire": "^2.0.0",
    "sinon": "^7.0.0"
  },
  "dependencies": {
    "@google-cloud/compute": "^0.11.0",
    "safe-buffer": "^5.1.2"
  }
}



書き換え終わったら デプロイ を押します。







■ Cloud Scheduler


ナビゲーションメニューから Cloud Scheduler を選択します。






ジョブを作成 をクリックします。





①ロケーションを選択 ②ジョブの作成 と2段階で進みます。


ロケーションの作成の設定は下記です。

リージョン:us-central


次へ で進みます。





ジョブの作成

各値を入力します。





名前:shutdown-workday-instance

説明:好きな文言

頻度:0 21 * * *

タイムゾーン:日本標準時(JST)

ターゲット:Pub/Sub

トピック:stop-instance-event

ペイロード:自分のVMインスタンスの情報になります。下記参照


ペイロードのフォーマット=============

{"zone":"ゾーン","instance":"インスタンス名","label":"ラベル名=ラベルの値"}


対象のVMインスタンスの詳細を確認します。
ラベルを設定していなければ追加しまs。


ペイロードが合っていないとコードが正常終了しても何も起きません
=============================


※ 後でテストするのでペイロードのコードをコピーしておきます




作成 をクリックします。







今すぐ実行してみる



■テスト実行する

Cloud Functions のページで作成した関数の 操作 メニューから 関数をテスト を選択します。






Cloud Scheduler で設定した ペイロードBASE64 にエンコードします。





トリガーとなるイベントのコード部に下記コードを入力します。

{"data":"BASE64エンコードしたペイロード文字列"}



関数をテストする をクリックします。



Successfully stopped instance(s)」  と出れば成功です。



※ もし、エラーになる場合は下記ページのコードに差し替えてみてください。





成功すると対象のVMインスタンスが停止しています。

手動で起動しておきます。





■ スケジュールでインスタンスを止める


Cloud Scheduler の 作成したジョブの実行にある 今すぐ実行 を押します。





VMインスタンスに戻り対象のインスタンスが停止したら成功です。
(表示が変わらない場合は更新ボタンを押します)


あとは、実際に指定した時間に停止すれば終了です。


以上。

このブログを検索

ブログをよくする

自己紹介

自分の写真
はじめまして。あまるちゃんです。 子供のプログラミング学習に協力できるように教え方を勉強中です。 このブログでは自分が学んだことを投稿していきます。

連絡フォーム

名前

メール *

メッセージ *

ブログ アーカイブ

QooQ