メインコンテンツにスキップ

Lambda共通ハンドラで監視を自動化!CloudWatchメトリクスで運用が劇的に変わった話

タグ: 🏷 AWS ,Lambda ,CloudWatch

背景

「サーバーレスアプリケーションって、監視が難しいんだよな…」— これ、実際に開発してみて僕が痛感したことです。Lambda関数がそれぞれ独立して動く環境だと、**「全体として今何が起きているのか」**を把握するのが本当に大変でした。

監視の課題を会社に例えると? 11人の社員が、それぞれ自由な形式で週報を提出しているような状況です。フォーマットがバラバラなので、マネージャーは全社員の状況を把握するために、11個の報告書を一つずつ時間をかけて読み解かなければなりません。これが、私たちが直面していた問題でした。

この記事では、共通ハンドラーパターンメトリクス送信機能を統合することで、どのようにして統一的な監視基盤を構築していったのか、その価値を詳しくご紹介していきたいと思います。

監視の課題:見えない問題は解決できない

改善前は、Lambdaの標準機能と、構造化されていないログ(ただのテキストメッセージ)しか使っておらず、以下のような情報が全く見えていなかったんです。

  • ビジネス指標: 1時間あたりのユーザー登録数やログイン成功率は?
  • パフォーマンス分析: 処理が遅いのはデータベースアクセス?それとも外部API呼び出し?
  • セキュリティ: 不正なログイン試行はどれくらいある?

これにより、問題の発見や原因特定に膨大な時間がかかっていました。

共通ハンドラーでのメトリクス自動送信設計

この問題を解決するために、「共通ハンドラー」という仕組みを導入しました。

共通ハンドラーとは? 先ほどの会社員の週報の例で言えば、「全社共通の報告書テンプレート」を導入するようなものです。このテンプレートには、「報告者名」「日付」「部署名」といった共通項目が自動で入力される欄があります。社員は、報告書の中身(ビジネスロジック)を書くことだけに集中すればよくなります。

僕たちの「共通ハンドラー」も同じで、すべてのLambda関数がこの共通部品を通るように設計しました。この共通部品が、関数名、実行時間、成功/失敗といった共通の**メトリクス(測定基準となるデータ)**を自動的に記録し、CloudWatch(AWSの監視サービス)に送信してくれるんです。

共通ハンドラーへの統合

// pkg/lambda/common_handler.go(メトリクス機能統合版)

// この関数が、まさに「共通の報告書テンプレート」の役割を担ってくれます
func (h *CommonHandlerWrapper) WrapHandler(...) {
    return func(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
        // --- ここからが共通処理 ---
        startTime := time.Now()
        
        // メトリクスを送信する専門家(MetricsClient)を準備
        metricsClient, _ := middleware.NewMetricsClient(h.config.FunctionName)

        // 1. リクエスト受信メトリクスを自動送信
        //    (報告書のヘッダーに「報告者:〇〇」と自動で書くようなもの)
        if metricsClient != nil {
            metricsClient.RecordCount("Request", 1)
        }

        // --- 社員の仕事(ビジネスロジック) ---
        // 各Lambda関数固有の処理を実行
        response, err := businessHandler(ctx, request, log, metricsClient)
        // ------------------------------------ 

        // --- ここからが共通処理 ---
        
        // 2. 実行時間と成功/失敗メトリクスを自動送信
        //    (報告書のフッターに「作成時間:30分」と自動で書くようなもの)
        if metricsClient != nil {
            metricsClient.RecordDuration("Request.Duration", time.Since(startTime))
            if err != nil {
                metricsClient.RecordError("Business", "HandlerError")
            } else {
                metricsClient.RecordCount("Success", 1)
            }
        }

        return response, err
    }
}

各Lambda関数でのメトリクス活用

共通ハンドラーが基本的なメトリクスを自動で記録してくれるおかげで、各Lambda関数は**「その関数でしか分からない、より具体的な情報」**の記録にぐっと集中できるようになりました。

ビジネスメトリクスとは? 会社の週報で言えば、共通のヘッダー情報だけでなく、「今週の契約獲得数:3件」といった、部署や個人に特化した重要な成果を報告するようなものです。これを記録することで、ビジネスの状況がより詳しく分かります。

// cmd/login/main.go
// ログイン処理に特化したメトリクスを記録する
func businessHandler(...) {
    // ... (ログイン処理) ...

    // ビジネスメトリクス: 「ログイン試行が1件あった」ことを記録
    metricsClient.RecordBusinessMetric("User.LoginAttempt", 1, ...)

    // パフォーマンスメトリクス: 「Cognitoでの認証にかかった時間」を記録
    metricsClient.RecordDuration("Cognito.AuthLatency", cognitoLatency)

    if err != nil {
        // エラーメトリクス: 「ログイン失敗」をエラー種別ごとに記録
        metricsClient.RecordError("Login", errorType)
    } else {
        // 成功メトリクス: 「ログイン成功」を記録
        metricsClient.RecordBusinessMetric("User.LoginSuccess", 1, ...)
    }
}

CloudWatchダッシュボードと監視設定

すべてのLambda関数から同じ形式でメトリクスが送られてくるので、CloudWatchで統一されたダッシュボードを簡単に作成できるようになったんです。

CloudWatchダッシュボードとは? 全社員から集まった標準フォーマットの週報を、自動的に集計してグラフ化してくれる経営ダッシュボードのようなものです。マネージャーは、個別の報告書を読まなくても、「全社の契約獲得数の推移」「部署別のエラー発生率」などを一目で把握できます。

さらに、CloudWatchアラームを設定することで、「エラー率が5%を超えたら自動で通知する」といったプロアクティブな監視が可能になります。

運用での価値と効果

この監視基盤を導入したことで、僕たちの運用は劇的に改善されました。

  • パフォーマンス最適化: 「DynamoDBの接続が特定の時間帯だけ遅い」といった、これまで見えなかった問題を発見し、API応答時間を50%も改善できたんです。
  • ビジネス分析: 「週末は新規登録が2倍になる」といった傾向をデータで把握し、マーケティング施策に活かせるようになりました。
  • セキュリティ監視: 「同一IPからの連続ログイン失敗」を即座に検知し、インシデント対応時間を99%も短縮できたのは大きかったです。

コスト・ROI分析

この監視基盤の維持コストは月額約$13.50(約1500円)とわずかですが、手動での監視やレポート作成にかかっていた月間40時間もの工数を削減できました。これは金額に換算すると年間$24,000(約260万円)以上の効果に相当し、投資対効果は極めて高かったと言えるでしょう。

この監視基盤により、私たちは「何となく動いている」という不安な状態から、**「システムの健康状態を正確に把握し、コントロールできている」**という自信のある状態へと移行できました。

監視は「後から追加する機能」ではなく、「最初から組み込むべき品質の一部」だと僕は考えています。共通ハンドラーのような設計パターンは、監視基盤を効率的に構築する上で本当に強力な味方になってくれますよ。

実現された効果:

  • 📊 可視化: 全Lambda関数の統一監視(11個→1つのダッシュボード)
  • 応答改善: 検出時間99%短縮(3日→15分)
  • 💰 ROI: 14,700%の投資対効果($162投資→$24,000効果)
  • 🛡️ セキュリティ: インシデント対応92%短縮(1日→2時間)
  • 🎯 運用効率: 監視工数85%削減(40時間/月→5時間/月)