その5.外部IPアドレスを固定化とインスタンスの自動停止を設定する
インスタンスを立ち上げっぱなしにすると想定外のところで課金が発生するリスクがあるため、開発で使うときは手動で立ち上げて使い終わったら手動で停止する操作を毎回行うことにします。
しかし、停止操作は忘れがちなので一日の決まった時間になったら自動で停止するようにしたいと思います。
IPアドレスを固定にする
VMインスタンスを立ち上げた直後の状態では、固定IPアドレスが割り当てられていますが、インスタンスを停止すると起動したときに再度割り当てられるため毎回アドレスが変わってしまいます。
そうなると、SSH接続やWinSCP接続で設定している接続先IPアドレスを書き換えないといけなくなるため、静的アドレスを固定IPアドレスに割り当てるようにします。
GCPコンソールの左上のナビゲーションメニューから、
VPCネットワーク → 外部IPアドレス を選択します。
静的アドレスを予約 をクリックします。
各設定値を入力します。
名前: 好きな文字列
説明:使用用途などなんでも
ネットワークサービス階層:標準
IPバージョン:IPv4
タイプ:リージョン
リージョン:無料枠のところを選ぶ
接続先:自分が立ち上げた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.js と pucage.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インスタンスに戻り対象のインスタンスが停止したら成功です。
(表示が変わらない場合は更新ボタンを押します)
あとは、実際に指定した時間に停止すれば終了です。
以上。
0 件のコメント:
コメントを投稿