GCPインスタンスをNode.js8のCloud Pub/Subでスケジュール起動停止(2)
前回「GCPインスタンスをNode.js8のCloud Pub/Subでスケジュール起動停止」で書いたNodejs8におけるGoogle公式リファレンスでのエラーについて。
以下のページのやり方ではNodejs8でエラーが発生してしまう。
https://cloud.google.com/scheduler/docs/start-and-stop-compute-engine-instances-on-a-schedule?hl=ja
なんとかインスタンスの起動・停止は操作するような対応を書いたが、それでもなお、callback関数のエラーログをはいていた。
Contents
Nodejs8 Cloud Pub/Subの書き方
今回、callback関数のエラーも発生させないように修正したので書き残す。
- const Buffer = require('safe-buffer').Buffer;
- const Compute = require('@google-cloud/compute');
- const compute = new Compute();
- exports.stopInstancePubSub = (event) => {
- try {
- const payload = _validatePayload(
- JSON.parse(Buffer.from(event.data, 'base64').toString())
- );
- compute
- .zone(payload.zone)
- .vm(payload.instance)
- .stop()
- .then(data => {
- // Operation pending.
- const operation = data[0];
- return operation.promise();
- })
- .then(() => {
- // Operation complete. Instance successfully stopped.
- const message = 'Successfully stopped instance ' + payload.instance;
- console.log(message);
- })
- .catch(err => {
- console.log(err);
- });
- } catch (err) {
- console.log(err);
- }
- return 0;
- };
- function _validatePayload(payload) {
- if (!payload.zone) {
- throw new Error(`Attribute 'zone' missing from payload`);
- } else if (!payload.instance) {
- throw new Error(`Attribute 'instance' missing from payload`);
- }
- return payload;
- }
特に大した変更はないのだが、pub/sub関数の第2引数にあったcallbackを無くし、関数の終了ポイントでのcallbackも削除した。
最後に「return 0;」を書いているのは、関数はnumberをリターンした方が良いとの情報があったからである。これもおそらくPromiseの解決を待たずにreturnしているのは正解ではないかもしれないが。
また、エラーキャッチ時には「return 1;」とした方が良さそうではある。
何はともあれ、上記のコードでCloud functions(Cloud Pub/Sub)をデプロイするとNodejs8でもスケジュールでインスタンスの起動・停止を動作させられた。同時に公式リファレンスコードをそのまま使用することによるエラーも回避できた。
ディスカッション
コメント一覧
まだ、コメントがありません