0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

エラー時のメール送信機能載せたらメモリ容量食うので、GASにさせてみる

Last updated at Posted at 2023-01-24

Railway.appというサービスでRailsのスクリプトを無償の枠内で回してる。

ただRedisでsidekiqのジョブを回してる都合上、エラーが発生してしまうとスクリプトが正しく動いてくれなくなるのにくわえ、無駄な負荷がかかりつづけて無償枠を圧迫して、有償になってしまう可能性がある。

そこでスクリプト内でエラーを検知したら、メールを送って通知してくれるようにしたい。

普通に考えたらRailsにはAction Mailerというメール送信サービスがあるのでこれを使えばいいわけだが、試しにのせてみたところメール送信しなくとも、平時でメモリを60~80メガほど余計に喰うようになってしまった。

Railway.appでこの「常時メモリ数十メガ喰うようになる」と0.5~1ドルくらい余計にコストがかかるので、なるべくならこれは避けたい。

そこでメール送信は外部サービスに任せようと考えて、GoogleAppsScriptでやることにした。ちょー簡単なものであんまりに単純すぎるので、自分用とか身内向け用。セキュリティとかはガバガバ。

GAS側の設定

登録作業とかはさすがに覚えてないので自分でしていただくとして、全体的には「スクリプトがGASにGETリクエストを送り、GETリクエストを検知したらGASがメールを送信する」という内容。

function doGet(e) {

  //クエリにname=hoge指定
  if (e.parameter.name == "hoge"){

  console.log('メールを送信します');

  //メール内容
  let recipient = "hoge@gmail.com";
  let subject = "Railwayスクリプトで登録に失敗してます";
  let body = "Railway.appでスクリプトの登録に失敗してるようです。このメールはGoogle Apps Scriptによる自動送信です。アドレス: https://railway.app/dashboard";

  GmailApp.createDraft(recipient, subject, body, options);

  let draft = GmailApp.getDrafts()[0];
  draft.send();
  
  }

}

かんたんかんたん。doGetでGETリクエスト時の指定。一応アクセス時にクエリを指定するようにして、指定のクエリがついたアクセスのときに条件付け。メール内容を決めて、GmailApp.createDraftで下書きかいて、draft.send()で発送。

これでデプロイボタンを押し、新しいデプロイを押してデプロイしたらURLが発行されるのでこれを控えておく(「デプロイを管理」からあとでも見られる)

スクリプト側の設定

こちらも簡単。

# GASのメール送信スクリプトにGETリクエストを送る
require "net/http"
uri = URI.parse(ENV['GAS_ADDRESS']+"?name=hoge")
response = Net::HTTP.get_response(uri)
response.code

一応環境変数(ここではGAS_ADDRESSとした)で先ほどのGASのアドレスを指定して、クエリもつけたアドレスをつけとく。こんだけ。

超単純だが一応動いてる。こんなん悩むほどでもない気はするが、こういう備忘録ものちのち誰かの役にたったらいいね。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?