ボクココ

サービス開発を成功させるまでの歩み

Amazon CloudWatch でのエラー通知

ども、@kimhiom です。そしてあけましておめでとうございます、今年もよろしくお願いします。

f:id:cevid_cpp:20220108142207j:plain

AWS Lambda でエラーが起きた時、どのように通知を受けているだろうか。ものすごい一般的な内容にもかかわらず、AWS 側の設定が多くて面倒だったので、参考サイトの補足として執筆時点で最新の対応について記す。

目標

やりたかったことはものすごくシンプルで、「Lambda 内で例外エラーが発生した際に Slack へ通知する」というもの。 今まで自前で全コードを try で囲って、rescue で Slack 通知させる実装をしていたけど、とても探しづらい問題があった。

具体的にはエラー通知を Cloudwatch の ログストリーム単位(ex: [$LATEST]f76663ac408647ccb336a269aad132aa)でしか場所を特定できず、詳細のエラー内容を見るには Cloudwatch からログストリームのページで対象の時間までスクロールしたりジャンプさせる手間があった。

・・・こんな一般的なこと(バグのログを閲覧すること)は AWS 側でなんとかしてほしいなと感じていた。

対応

調べると、それだけのために自前の AWS Lambda メソッドをあげて実行させる方法がたくさん掲載されており、「面倒すぎる・・」と感じた。

それが、"AWS Lambda エラー Cloudwatch" 関連の記事を1年以内に限定して対応方法を調べると、どうやら AWS Chatbot が登場したおかげで、より簡単に設定ができるようだった。参考になったページ

Lambdaの実行時エラーをChatbotでSlackに通知するのが便利すぎる話 | public memo

その中で、自分がはまったところだけ、この記事に記載しておく。

エラー詳細がどうやっても見えない問題

まず IAM を設定し、各 AWS サービスをちょろっと設定して無事に Slack へ通知が届いた!

f:id:cevid_cpp:20220108134056p:plain

ただ、このままだと単にエラー通知が来ただけで、どんなエラーかを把握することができない。一番知りたいのは Show error logs の先のボタンである。

しかし、このボタンをクリックしても Cloudwatch からのエラーが止まらなかった。

❗️ I can't get the logs for you because the role arn:aws:iam::123412341234:role/my-chatbot in account 123412341234 is missing necessary permissions related to commands.

If you want to get logs, go to the AWS Chatbot console and choose or create a role that includes Read-only command permission for this channel.

amazon web services - What minimal IAM permissions are needed by AWS Chatbot so that it can show logs? - DevOps Stack Exchange

上記で全く同じ Issue があったけど、上記のような IAM をセットしても動作せず。なんとかしようと1日くらい色々と設定を変えてみて、ついに問題を発見。AWS Chatbot の設定が以下の表示になっていた。

f:id:cevid_cpp:20220108135247p:plain

ガードレールのポリシー ?? これに関してより詳細を調べたところ、

ガードレールは、AWS 環境全体に継続的なガバナンスを提供する高レベルのルールです。これは、わかりやすい形式で表されます。ガードレールを通じて、AWS Control Tower は予防的または探偵リソースを管理し、AWS アカウントのグループ全体でコンプライアンスをモニタリングするのに役立つコントロールです。

ふ〜むふむ・・、ということで ここのポリシーに IAM 設定を同様にしたところ、無事動かすことができた。

エラー内容が出てこない

さて、これでようやく Show error logs でエラー内容が見れると思ったら、なぜかエラーが表示されない。。

f:id:cevid_cpp:20220108140517p:plain

No logs found。何のために通知してきたのだろうか。

よく見ると、from ** to ** の間が1分間の間であった。この Lambda 処理が 1分以上のものだったため、その一分に含まれていなかったのが原因だった。これは、 Cloudwatch の アラームの設定で期間を 5分に変えたことで、無事エラー内容がが表示されるようになった◎

終わりに

今回の Cloudwatch エラーの Slack 通知の結果、今まではエラー通知のたびに Cloudwatch から対象のエラーを探すことをしていたのが、Slack にあるボタンをワンポチするだけでどこでのエラーかを表示させることができるようになった。

このために新しく使った AWS は AWS Chatbot とAmazon SNS の2つのみ。これから運用をしていく上で詰まるところがあるかもしれないが、現状はとても簡単(?)に設定できたので満足。

私と同じところで無駄に時間を使わないで さっと設定いただけたら幸いである。

さぁ始めよう、より短く素早く問題を解決するために。