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のアドレスを指定して、クエリもつけたアドレスをつけとく。こんだけ。
超単純だが一応動いてる。こんなん悩むほどでもない気はするが、こういう備忘録ものちのち誰かの役にたったらいいね。