📝

GAS のトリガーでエラー検知を工夫してみた

2021/12/16に公開

YAMAP エンジニア Advent Calendar 2021 の15日目になります。

YAMAP STOREのいろいろなエンジニアリングをやっています、 @issyxissy です。
一応、フロントエンドエンジニアのリーダーでもありますが、ほぼ、YAMAP STOREにコミットしています・・・(꒪⌓꒪;

Shopify と 倉庫システムとの間でやりとりを行っている、GAS版バックヤード。
今は、GAS版バックヤードを引退させるべく、所々でがんばっております。

とはいえ、稼働中のGAS版バックヤードですが、トリガー経由での処理が複雑なったりして、実行エラーを検知しにくくなったため、Slackに通知が届くようにしたいということで、少し工夫してみました。

前提

GASのトリガーは、毎日、時間指定して実行しています。
また、トリガーの設定は、実行処理の中で、トリガーを削除して次回トリガーを再設定しています。

なぜ、工夫しようとしているのか?

GASのトリガー経由エラー検知は、トリガー設定画面上で、設定できます。
しかし、GAS上で、下記のコードからエラー通知は設定できません。(なぜ?)

ScriptApp.newTrigger([function name]).timeBased().at([Date]).create();

そうなると、デフォルトのエラー通知設定の毎日通知を受け取るに設定されてしまいます。
結果、1日1回のみエラー検知になってしまいます。

理想としては、エラーが出たら、すぐに検知したい!

どうやってエラー通知しようかと考えてみました。

調査

まず、エラー検知は、Cloud Logging のアラートで出来ないかなー、漠然と思っていました。

ログ出力ですが、Logger.log('') で出力していましたが、
console.log('') で出力できるようになっていたことを気づきました(知らなかった・・・)

以前、ごにょごにょしたときに、プロジェクトと紐付けた記憶が・・・。
https://www.hidetoshl.com/gas-gcp/
紐付けることで、Cloud Logging に出力できます。

ログ出力として、フロントエンドと同じように、下記で出力可能でした。

console.log() -> debug?
console.info() -> info
console.warn() -> Warning 
console.error() -> Error

このログデータが、Cloud Loggingに出力されていることを確認できました。

こんなことが実現できた

こんな流れになります。

  1. GAS上のトリガー設定
  2. トリガー実行
  3. エラー発生
  4. Cloud Logging にログ出力
  5. アラートでメール送信
  6. Gmailで、Slack Eメールで転送
  7. Slackで投稿される
  8. 検知!

これらを設定するとできるよ

GASとGCPのプロジェクトとの紐付け

ご参考までに・・・(꒪⌓꒪)
https://www.hidetoshl.com/gas-gcp/

Cloud Loggingでのアラート作成

GCPのコンソールで、ロギング -> ログエクスプローラーで、出力したログが閲覧できます。
アラートを作成をクリックして、↓を設定します・・・(꒪⌓꒪)

SlackのEメールを設定します。

Slackのヘルプをご参考に・・・(꒪⌓꒪)
https://slack.com/intl/ja-jp/help/articles/206819278-Slack-にメールを送信する#h_01F4WE00ERHA012ATFV1PYA1TG

GmailでSlackのEメールに転送します。

ググって、ご参考に・・・(꒪⌓꒪)
https://reworkstyle.com/it-tool/gmail-slack-notification/

まとめ

  • エラーは、Cloud Loggingを使うと、GASのトリガーに頼らず、すぐに検知できる
  • ログは、Cloud Loggingに出力しておくと、後々便利
  • もう少しきれいに出来ないものかなー(꒪⌓꒪)

Discussion