ヤマムギ

growing hard days.

*

ハンズオン: CloudWatch、X-Ray ~AWS認定デベロッパーアソシエイト(DVA-C02)~

   

このブログは2026年6月29日翔泳社さんより発売される「AWS教科書 AWS認定デベロッパーアソシエイト テキスト&問題集」で扱う内容を体験していただくためのハンズオンガイドです。

このハンズオンガイドでは、CloudWatch、X-Rayを使って、アプリケーションのモニタリング、トレース、トラブルシューティングを体験します。Lambda関数にX-Rayトレースを有効化し、CloudWatch Logsでメトリクスフィルターやアラームを設定し、Logs Insightsでログ分析を行います。

全体構成

東京リージョンで構築してください。
完成する構成は以下のとおりです。

(1) Lambda関数を作成してX-Rayアクティブトレースを有効化する
(2) API Gatewayを作成してLambda関数と統合する
(3) CloudWatch Logsでメトリクスフィルターとアラームを設定する
(4) CloudWatch Logs Insightsでログを分析する
(5) X-Rayサービスマップとトレースを確認する
(6) エクスポネンシャルバックオフによる再試行を実装する

一連のフロー:API Gateway → Lambda(X-Rayトレース有効) → DynamoDB → CloudWatch Logs → メトリクスフィルター → アラーム → 通知

準備:IAMポリシーの作成とアタッチ

ハンズオンで使用するIAMユーザーまたはIAMロールに、以下のポリシーをアタッチしてください。

タスク 1:Lambda関数を作成してX-Rayトレースを有効化する

目的

DynamoDBに書き込みを行うLambda関数を作成し、X-Rayアクティブトレースを有効にして分散トレースの収集を開始しましょう。

手順

(1) まずDynamoDBテーブルを作成します。CloudShellで以下を実行します:

(2) Lambdaコンソールにアクセスし、[関数の作成]をクリック。
(3) 以下の設定を行います:

項目 設定値
作成方法 一から作成
関数名 HandsonMonitorFunction
ランタイム Python 3.14
アーキテクチャ x86_64

(4) [関数の作成]をクリック。
(5) [設定]タブ-[アクセス権限]をクリックし、ロール名のリンクをクリックしてIAMコンソールを開きます。
(6) [許可を追加]-[インラインポリシーを作成]をクリックし、以下のポリシーを貼り付けます:

(7) ポリシー名をHandsonMonitorPolicyとして保存します。
(8) Lambdaコンソールに戻り、[設定]タブ-[モニタリングおよび運用ツール]-[編集]をクリック。
(9) [CloudWatch アプリケーションシグナルと AWS X-Ray]-[Lambda サービストレース]を有効にして[保存]をクリック。
(10) ADOT Lambda Layerを追加してトレースを詳細化します。[コード]タブの下部の[レイヤー]セクションで[レイヤーの追加]をクリック。
(11) [ARNを指定]を選択し、以下のARNを入力して[検証]をクリック。レイヤーが表示されたら[追加]をクリック。

ADOT Lambda Layer ARNsで最新のARNを確認できます。

(12) [設定]タブ-[環境変数]-[編集]をクリックし、以下の環境変数を追加して[保存]をクリック。

キー
AWS_LAMBDA_EXEC_WRAPPER /opt/otel-instrument

(13) 続けて[設定]タブ-[モニタリングおよび運用ツール]-[編集]で[ロギング設定]を以下のように設定して[保存]をクリック。

項目 設定値
ログフォーマット JSON
アプリケーションログレベル INFO
システムログレベル INFO

(14) [コード]タブで以下のコードを貼り付けます:

(15) [Deploy]をクリック。

ポイント

  • X-Rayアクティブトレースを有効にすると、Lambda関数の実行が自動的にトレースされます。
  • ADOT Lambda Layerを追加して環境変数AWS_LAMBDA_EXEC_WRAPPERを設定すると、コードを変更せずに関数内のAWSサービス呼び出し(DynamoDBなど)も自動的にトレースされます。
  • loggingモジュールを使うことで、ログレベル(INFO、WARNING、ERROR)に応じた構造化ログを出力できます。

タスク 2:API Gatewayを作成する

目的

Lambda関数を呼び出すAPI Gatewayを作成して、外部からリクエストを送信できるようにしましょう。

手順

(1) API Gatewayコンソールにアクセスし、[APIの作成]をクリック。
(2) HTTP APIの[構築]をクリック。
(3) 以下の設定を行います:

項目 設定値
統合 Lambda
Lambda関数 HandsonMonitorFunction
API名 HandsonMonitorAPI

(4) [次へ]をクリック。ルートの設定でメソッドGET、リソースパス/monitorを確認して[次へ]をクリック。
(5) ステージ名はデフォルト($default)のまま[次へ]をクリック。
(6) [作成]をクリック。
(7) 表示されるURLの呼び出しをメモします。

例:https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com

(8) CloudShellからAPIをテストします:

(9) ログ分析用にリクエストを複数回実行しておきます:

ポイント

  • HTTP API(V2)はREST APIより低コストでシンプルな構成です。
  • 複数パターンのリクエストを送信することで、あとのタスクでログ分析やトレース確認のデータが蓄積されます。

タスク 3:CloudWatch Logsメトリクスフィルターとアラームを設定する

目的

CloudWatch Logsのログからエラーを検知するメトリクスフィルターを作成し、アラームで通知する仕組みを構築しましょう。

手順

(1) CloudWatchコンソールにアクセスし、左メニューから[ロググループ]をクリック。
(2) /aws/lambda/HandsonMonitorFunctionロググループを選択します。
(3) [メトリクスフィルター]タブをクリックし、[メトリクスフィルターを作成]をクリック。
(4) 以下の設定を行います:

項目 設定値
フィルターパターン ERROR
フィルター名 HandsonErrorFilter
メトリクス名前空間 HandsonMonitor
メトリクス名 ErrorCount
メトリクス値 1
デフォルト値 0

(5) [メトリクスフィルターを作成]をクリック。
(6) 次にアラームを作成します。CloudWatchコンソールの左メニューから[アラーム]-[アラームの作成]をクリック。
(7) [メトリクスの選択]をクリックし、カスタム名前空間のHandsonMonitor → メトリクス → ErrorCountを選択して[メトリクスの選択]をクリック。
(8) 以下の設定を行います:

項目 設定値
統計 合計
期間 1分
しきい値の種類 静的
条件 以上
しきい値 3

(9) [次へ]をクリック。
(10) 通知先としてSNSトピックを新規作成します:

項目 設定値
SNSトピック 新しいトピックの作成
トピック名 HandsonMonitorAlarm
Eメールエンドポイント 自分のメールアドレス

(11) [トピックの作成]をクリックして[次へ]をクリック。
(12) アラーム名にHandsonErrorAlarmと入力して[次へ]をクリック。
(13) [アラームの作成]をクリック。
(14) メールアドレスに届いた確認メールのリンクをクリックしてサブスクリプションを確認します。
(15) アラームをテストします。CloudShellでエラーリクエストを複数回送信します:

1分後にアラームがALARM状態になり、メール通知が届くことを確認します。

ポイント

  • メトリクスフィルターはログ内の特定パターンを検知してメトリクスとして集計します。
  • CloudWatchアラームはメトリクスのしきい値を超えたときにアクション(SNS通知)を実行します。
  • 「1分間にERRORが3回以上」のような条件で、アプリケーションの異常を自動検知できます。
  • 本番環境では、Slackや PagerDutyなどと連携した通知も構成できます。

タスク 4:CloudWatch Logs Insightsでログを分析する

目的

CloudWatch Logs Insightsを使って、Lambda関数のログをインタラクティブに分析してみましょう。

手順

(1) CloudWatchコンソールの左メニューから[ログのインサイト]をクリック。
(2) ロググループに/aws/lambda/HandsonMonitorFunctionを選択します。
(3) 以下のクエリを入力して[クエリの実行]をクリック。actionごとのリクエスト数を集計します:

normal、error、slowの各リクエスト数が集計されます。

(4) 次に、エラーログだけを抽出するクエリを実行します:

(5) Lambda関数の実行時間を分析するクエリを実行します:

5分間隔での平均・最大・最小実行時間が表示されます。slowリクエストがあった時間帯で最大実行時間が大きくなっていることが確認できます。

(6) メモリ使用率を確認するクエリを実行します:

ポイント

  • Logs Insightsは専用のクエリ言語で、ログデータをリアルタイムに検索・集計・可視化できます。
  • filterでログを絞り込み、parseでフィールドを抽出し、statsで集計します。
  • @typeがREPORTの行にはLambda関数の実行時間やメモリ使用量が含まれています。
  • 定期的な監視にはメトリクスフィルターを使い、対話形式での分析にはLogs Insightsを使います。

タスク 5:X-Rayサービスマップとトレースを確認する

目的

X-Rayコンソールでサービスマップとトレースを確認して、リクエストの処理フローとパフォーマンスを可視化しましょう。

手順

(1) X-Rayコンソール(CloudWatchコンソールの左メニュー[Application Signals(APM)]-[サービスマップ])にアクセスします。
(2) サービスマップに、クライアント → API Gateway → Lambda → DynamoDBのフローが表示されていることを確認します。
(3) 各ノード(丸いアイコン)をクリックすると、レイテンシー、リクエスト数、エラー率などの情報が表示されます。
(4) エラーが発生しているノードは色付き(赤やオレンジ)で表示されます。Lambda関数のノードを確認しましょう。
(5) 左メニューから[トレース]をクリックして、個別のトレースを確認します。
(6) 正常なリクエストのトレースを選択して、各セグメントの実行時間を確認します。DynamoDBへのPutItemにどのぐらい時間がかかっているかが見えます。
(7) action=slowのリクエストのトレースを選択して、遅延が発生している箇所を確認します。
(8) action=errorのリクエストのトレースを選択して、エラーが記録されているセグメントを確認します。

ポイント

  • X-Rayはリクエスト全体の処理フローを可視化するサービスで、マイクロサービスのパフォーマンスボトルネックやエラー箇所を特定するのに役立ちます。
  • サービスマップではリクエストのフロー全体と各サービスのレイテンシー・エラー率を俯瞰できます。
  • 個別トレースでは、各セグメント(Lambda初期化、関数実行、DynamoDB呼び出し等)の実行時間を詳細に確認できます。
  • X-RayはLambda、API Gateway、DynamoDB、S3、SQS、SNSなど多数のAWSサービスと統合されています。

タスク 6:エクスポネンシャルバックオフによる再試行を実装する

目的

スロットリングエラーや5xxエラーが発生した際の再試行ロジックとして、エクスポネンシャルバックオフ(指数バックオフ)を実装してみましょう。

手順

(1) CloudShellで以下のPythonスクリプトを実行します。意図的にスロットリングを発生させて、エクスポネンシャルバックオフで再試行する動作を確認します:

URLのxxxxxxxxxx部分はタスク2でメモしたAPIのIDに置き換えてください。

ポイント

  • エクスポネンシャルバックオフは再試行のたびに待機時間を指数的に増やすアルゴリズムです(1秒→2秒→4秒→8秒…)。
  • ジッター(ランダムな遅延)を加えることで、複数クライアントの再試行タイミングが重なることを防ぎます。
  • AWS SDKにはエクスポネンシャルバックオフが組み込まれているため、通常は開発者が実装する必要はありません。
  • SDKを使わない場合(直接HTTP API呼び出し等)では、自前でエクスポネンシャルバックオフを実装します。
  • 再試行対象は5xx(サーバーエラー)と429(スロットリング)です。4xx(クライアントエラー)は再試行しても解決しないため対象外です。

クリーンアップ

ハンズオンで作成したリソースをすべて削除します。以下の順番で削除してください。

(1) CloudWatchアラームの削除

CloudWatchコンソールの[アラーム]でHandsonErrorAlarmを削除します。

(2) SNSトピックの削除

SNSコンソールでHandsonMonitorAlarmトピックを削除します。

(3) API Gatewayの削除

API GatewayコンソールでHandsonMonitorAPIを削除します。

(4) Lambda関数の削除

LambdaコンソールでHandsonMonitorFunctionを削除します。

(5) DynamoDBテーブルの削除

DynamoDBコンソールでHandsonMonitorLogテーブルを削除します。

(6) CloudWatch Logsロググループの削除

CloudWatchコンソールの[ロググループ]で/aws/lambda/HandsonMonitorFunctionを削除します。

(7) IAMロールの削除

IAMコンソールでLambda関数作成時に自動生成されたロールを削除します。

(8) ハンズオン用ポリシーの削除

ハンズオン用に作成したIAMポリシーがあれば削除します。

まとめ

タスク サービス 役割
タスク 1 Lambda + X-Ray + ADOT トレース有効化とログレベル設定
タスク 2 API Gateway HTTPエンドポイントの提供
タスク 3 CloudWatch Logs メトリクスフィルターとアラームによる異常検知
タスク 4 CloudWatch Logs Insights ログのインタラクティブ分析
タスク 5 X-Ray サービスマップとトレースによるパフォーマンス可視化
タスク 6 エクスポネンシャルバックオフ 再試行ロジックの実装

このハンズオンで体験したモニタリングとトラブルシューティングの特徴をまとめます。

  • X-Rayアクティブトレースを有効にすることで、Lambda関数の実行フローが自動的にトレースされます。
  • ADOTレイヤーを追加することで、コードを変更せずに関数内のAWSサービス呼び出しも詳細にトレースできます。
  • CloudWatch Logsのメトリクスフィルターで特定パターン(ERRORなど)を検知し、アラームで通知を自動化できます。
  • CloudWatch Logs Insightsで、大量のログをリアルタイムに検索・集計・可視化できます。
  • X-Rayのサービスマップでリクエスト全体のフローを俯瞰し、ボトルネックやエラー箇所を特定できます。
  • エクスポネンシャルバックオフ+ジッターにより、スロットリングやサーバーエラーに対して効率的に再試行できます。

最後までお読みいただきましてありがとうございました!

「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。

「AWS認定資格試験テキスト AWS認定AIプラクティショナー」という本を書きました。

「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

「AWSではじめるLinux入門ガイド」という本を書きました。

 - AWS

  関連記事

Amazon BedrockがGAしたので触りました(boto3からも)

Amazon Bedrock Is Now Generally Availabl …

S3バケットポリシーで特定のVPCエンドポイント以外からのリクエストを拒否しつつメンテナンスはしたい

特定のVPCで実行されているEC2のアプリケーションからのリクエストだけを許可し …

CloudFrontディストリビューションを別アカウントへ移動する

すでにCNAMEを設定しているCloudFrontディストリビューションを、別ア …

PyCharmにAWS Tool kitをインストールしてサンプルのLambda関数をデプロイして実行しました

この記事はJetBrainsIDE Advent Calendar 2018に参 …

AWS Service CatalogポートフォリオをOrganizations組織で共有する

AWS Service Catalogチュートリアルで作成したポートフォリオのO …

Amazon Route 53プライベートホストゾーン設定

Amazon Route 53プライベートホストゾーンを作成してみました。 Ro …

AWS CodeStarのプロジェクトテンプレートLambda+Pythonによって生成されるもの

勉強会のデモで、AWS CodeStarのプロジェクトテンプレートLambda+ …

AWS複数アカウントのリソースをLambda(Python)から一括操作したくて

AWSの複数アカウント(30ちょい)のリソースをまとめて自動処理したくて。 とり …

Amazon CloudWatch Syntheticsでハートビートモニタリングを実行

このブログに対してハートビートモニタリングのCanaryを実行してみました。 C …

EC2 プレイスメントグループを試してみました

やったことないのでやってみたやつです。 プレイスメントグループの作成 まず、EC …