GCPインスタンスをNode.js8のCloud Pub/Subでスケジュール起動停止(2)

2019-09-29

前回「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関数のエラーログをはいていた。

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でもスケジュールでインスタンスの起動・停止を動作させられた。同時に公式リファレンスコードをそのまま使用することによるエラーも回避できた。