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関数のエラーも発生させないように修正したので書き残す。

  1. const Buffer = require('safe-buffer').Buffer;
  2. const Compute = require('@google-cloud/compute');
  3. const compute = new Compute();
  4.  
  5. exports.stopInstancePubSub = (event) => {
  6. try {
  7. const payload = _validatePayload(
  8. JSON.parse(Buffer.from(event.data, 'base64').toString())
  9. );
  10. compute
  11. .zone(payload.zone)
  12. .vm(payload.instance)
  13. .stop()
  14. .then(data => {
  15. // Operation pending.
  16. const operation = data[0];
  17. return operation.promise();
  18. })
  19. .then(() => {
  20. // Operation complete. Instance successfully stopped.
  21. const message = 'Successfully stopped instance ' + payload.instance;
  22. console.log(message);
  23. })
  24. .catch(err => {
  25. console.log(err);
  26. });
  27. } catch (err) {
  28. console.log(err);
  29. }
  30. return 0;
  31. };
  32.  
  33. function _validatePayload(payload) {
  34. if (!payload.zone) {
  35. throw new Error(`Attribute 'zone' missing from payload`);
  36. } else if (!payload.instance) {
  37. throw new Error(`Attribute 'instance' missing from payload`);
  38. }
  39. return payload;
  40. }

特に大した変更はないのだが、pub/sub関数の第2引数にあったcallbackを無くし、関数の終了ポイントでのcallbackも削除した。

最後に「return 0;」を書いているのは、関数はnumberをリターンした方が良いとの情報があったからである。これもおそらくPromiseの解決を待たずにreturnしているのは正解ではないかもしれないが。
また、エラーキャッチ時には「return 1;」とした方が良さそうではある。

何はともあれ、上記のコードでCloud functions(Cloud Pub/Sub)をデプロイするとNodejs8でもスケジュールでインスタンスの起動・停止を動作させられた。同時に公式リファレンスコードをそのまま使用することによるエラーも回避できた。