Slide 1

Slide 1 text

CDK 一発で全てのエラーログを Slack に流す 23/5/20 CDK Conference Japan 2023
 @acomagu


Slide 2

Slide 2 text

自己紹介 - @acomagu
 - 株式会社デザイニウム所属
 - CDK 使用歴4年(AWS 使用歴も4年)
 - でかい唐辛子とでかいラー油にハマって いる


Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

Agenda - やりたいこと
 - 背景
 - 検討した方法
 - Lambda error metric → CloudWatch Alarm → Chatbot 
 - CloudWatch Metrics Filter → CloudWatch Alarm → Chatbot 
 - Datadog
 - Sentry
 - 自作→公開
 - その後
 - まとめ


Slide 5

Slide 5 text

やりたいこと エラーログを全て Slack に流したい!

Slide 6

Slide 6 text

背景 - 副業先でエラーログを全て Slack に流していて、とても体験が良かった
 - 本番環境/開発環境でのエラーにいち早く気づける 
 - 担当エンジニア以外も簡単にアクセスできる/ 障害発生時のコミュニケーションに便利 
 - 開発中もフロントエンドエンジニアさんがサーバーのエラーを見れると便利 
 - 年1件ほど新規プロジェクトの立ち上げに関わる(受託開発のため)
 - 複数プロジェクトの監視を続けていく必要がある→ エラーが出たら何らかの通知が欲しい 
 - 毎回監視をポチポチ作るのは大変なため、できる限り IaC 化しておきたい 
 - 使っている AWS サービスは様々
 - AppRunner, Lambda, Step Functions, Elastic Beanstalk, API Gateway 
 - 可能な限り「全て」のサービスのエラーログを読みたい 
 → アプリケーション内に通知の仕組みを作るのではなく、 CloudWatch Logs 経由 で通知する仕組 みが必要


Slide 7

Slide 7 text

改めてやりたいこと - エラーログを全て Slack に流す
 - できれば StepFunctions や AppSync 等、いろいろな AWS サービスのエラーログを 集約したい
 - CDK でセットアップの大部分が終わるようにしたい


Slide 8

Slide 8 text

検討した方法

Slide 9

Slide 9 text

検討した方法① Lambda error metric → CloudWatch Alarm → Chatbot Lambda エラーメトリクスが1件で発火する Alarm を作成して、Chatbot に連携する方 法
 - “Show logs” のボタンを押すことでロ グを表示できる
 - グラフが表示される
 - datapoint ごとにしか通知されない(最 小10秒)
 - Lambda にしか使えない
 - Lambda がエラー状態で終了した場合 しかカウントされない(console.error が 通知されない)


Slide 10

Slide 10 text

- Lambda Error Metrics はエラーログを見ているのではなく、Lambda Runtime API に 通知されたエラーの数を見ている
 - (尚、CloudWatch Logs にはそもそもログレベルの概念が無いので、標準出力も標 準エラー出力も同等に扱われるイメージ)
 console.error が通知されない?

Slide 11

Slide 11 text

検討した方法② CloudWatch Metrics Filter → CloudWatch Alarm → Chatbot 文字列 “ERROR” が含まれているログを 検知する Metrics Filter を作成して、エラー ログが1件で発火する Alarm を作成し、 Chatbot に連携する方法
 - Lambda 以外でも使える
 - ログを表示できない(Slack 上でも見れ ないし、リンクも無い)
 - グラフが表示される
 - datapoint ごとにしか通知されない


Slide 12

Slide 12 text

検討した方法③ Datadog SDK もしくは CloudWatch 経由で Datadog にログを送信する
 - Lambda 以外でも使える
 - Slack に全てのログを送信する方法は 無く、こちらもアラートのみ
 - ログの内容が Slack で見れる
 - Monitor Window ごとにしか通知され ない(最小1分)


Slide 13

Slide 13 text

検討した方法④ Sentry SDK 経由で Sentry にログを送信する
 - Step Functions 等のエラーは補足でき ない
 - Slack に全てのエラーログを送信でき る
 - ログへのリンクも(一応)通知に含めら れる
 - ただしアプリケーション側で URL をタグとし て注入しておくというトリッキーな方法 
 - URL を 200 字に収めなければならない 


Slide 14

Slide 14 text

いまいちユースケースに合うものがない やりたいことはシンプル「全てのエラーログを Slack に流す」だけ
 自分で作ってみてもいいのでは?


Slide 15

Slide 15 text

試しに作ってみた

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

便利だったのでコンストラクト化してみる

Slide 19

Slide 19 text

監視するロググループを一行で追加できるようになった
 便利だったのでコンストラクト化してみる

Slide 20

Slide 20 text

ライブラリ化して公開してみる

Slide 21

Slide 21 text

何が言いたいか 一度書いた CDK のコードを
 「リファクタリングする → ライブラリとして切り出す → 公開する」
 この一連の流れが言語の知識さえあればできる(手癖でできる)
 追加で学ばなければならない CDK の知識はほとんどない!


Slide 22

Slide 22 text

何が言いたいか 一度書いた CDK のコードを
 「リファクタリングする → ライブラリとして切り出す → 公開する」
 この一連の流れが言語の知識さえあればできる(手癖でできる)
 追加で学ばなければならない CDK の知識はほとんどない!
 なぜか?
 ひとつは Stack と L3 Construct がほぼ同じものだから
 Stack を書く感覚で L3 Construct も書けてしまう
 ↑CDK is Beautiful ポイント


Slide 23

Slide 23 text

cdk-log-notifier のその後 - Reddit で宣伝したところ、40スターくらいつけてもらえた
 - 開発から3年が経ち、社内では現在 7 のサービスで使われている
 - 先日 Jsii 対応し、Construct Hub に載った
 - TypeScript 以外に、Java, Python, Go, .NET に対応 


Slide 24

Slide 24 text

まとめ - エラーログを Slack に流す機構を CDK で構築した
 - ライブラリ化によって、あらゆるプロジェクトで CDK コードに数行追加するだけでエ ラーログを Slack に流せるようになった
 - CDK の美しさのひとつは、Stack、L3 Construct、L2 Construct の違いがほとんど 無いこと
 それによって CDK Construct ライブラリを作成するハードルがとても低い