メインコンテンツまでスキップ

モニタリング

本カタログの構成に基づくアプリケーション監視方法について記載したドキュメントです。

概要

構築したアプリケーション監視は AWS 標準サービスである CloudWatch を活用します。具体的には API Gateway 及び AWS Lambdaの標準メトリクスを CloudWatch Dashboard に展開し、各メトリクスには CloudWatch Alarm を指定してEメールまたはメッセージングツール(Slack)に通知するための仕組みを構築する形です。

[A] 推奨監視対象の標準メトリクス

以下のメトリクスを CloudWatch Dashboard に追加し、また後述する Alarm の対象として閾値を設定して監視を行います。

Amazon API Gateway

メトリクス名備考
CountAPI 呼び出し回数
4xxErrorクライアントエラーであるため「警告」レベルとして扱い、短期間で集中的に発生した場合に異常通知を検討
5xxErrorサーバーエラーであるため「エラー」レベルとして扱い、短時間で一定数の数を超えた場合に異常として通知を行う

AWS Lambda

メトリクス名備考
Throttlesスロットリングが起きた回数・Burst Limit 検知
Duration実行時間が異様に長い場合や、外部システム連携時において相手先システムの応答不能状態検知など
ConcurrentExecutionアプリ稼働の同時実行数を確認、上限値に迫れば最適化や緩和申請を行う

上記に記載されていない項目に関しても、必要に応じて随時 Dashboard 及び Alarm への追加を設定して監視対応を行ってください。

[B] アプリケーションログ(Lambda)の監視

アプリケーションでは AWS Lambda Powertools ライブラリnの Logger を利用して以下のような JSON 構造化ログを出力することを基本としています。

{
"cold_start": true,
"function_arn": "arn:aws:lambda:us-east-1:123456789012:function:shopping-cart-api-lambda",
"function_memory_size": 128,
"function_request_id": "c6af9ac6-7b61-11e6-9a41-93e812345678",
"function_name": "shopping-cart-api-lambda",
"level": "ERROR",
"message": "This is an ERROR log with some context",
"service": "shopping-cart-api-handler",
"timestamp": "2023-12-12T21:21:08.921Z",
"xray_trace_id": "abcdef123456abcdef123456abcdef123456"
}

このように構造化されているログは、CloudWatch Logs のコンソールから { $.level = "ERROR" } のような形で項目の値を指定して検索をすることができます。この仕組みを利用し、CloudWatch Logs の Log Group から、構造化ログの項目をチェックしてヒットしたログを他のサービス(S3, Kinesis, Lambda, etc.)に転送する機能「Subscription Filter」を利用することも可能ですが、監視目的では CloudWatch メトリクスに反映する「Metric Filter」を利用します。

CloudWatch Logs のコンソールから作成でき、設定値の参考として CloudFormation Template のフォーマットで書いたコードサンプルをご参考ください。

# "Core" is an example of Lambda function name or alias
CoreErrorLogMetricFilter:
Type: AWS::Logs::MetricFilter
DependsOn: CoreLogGroup
Properties:
LogGroupName: !Ref CoreLogGroup
FilterPattern: '{ $.level = "ERROR" }'
MetricTransformations:
- MetricValue: 1
MetricNamespace: !Join [ '', [ 'Logs/', !Ref CoreLambdaFunction ]]
MetricName: Errors

CoreWarnLogMetricFilter:
# こちらのサンプルコードはカタログ AMI に含まれています。

Log Level が ERROR のログが出力された場合、CloudWatch Logs の Metric Filter によってカスタムメトリクスに登録され、Alarm を設定すれば、例えば 10 分以内にエラーログの件数が一定数を超えた場合通知が飛ぶような監視機構が作れるようになります。

Alarm を設定して異常検知を自動化する

CloudWatch Alarm は、メトリクスに閾値を設定し、通常時は OK という状態となります。もし、一定時間枠内でメトリクスの値が閾値を超えたら(または下回った場合等)「ALARM」という状態に変わり、この状態の変更をトリガーとして変更された状態とデータポイントが閾値に対してどうなったかのメッセージががメールまたは SNS に通知されます。 OKALARM だけでなく、その逆の場合も検知することが可能です。

ALARM は、標準メトリクスに対して、以下のような設定を行います。

ApiAll5xxAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: prod-webapi-ApiAll5xx-Alarm
AlarmDescription: Total 5xx count of all APIs
AlarmActions:
- !Ref MonitoringTopic
Namespace: AWS/ApiGateway
Dimensions:
- Name: ApiName
Value: prod-webapi
- Name: Stage
Value: prod
EvaluationPeriods: 5 # 5 minutes
MetricName: 5XXError
Period: 60 # 60 seconds
Statistic: Sum
Threshold: 10 # 10 5xx error response within 5 minutes
ComparisonOperator: GreaterThanThreshold

ApiAll4xxAlarm:
# こちらのサンプルコードはカタログ AMI に含まれています。

GetUsers5xxAlarm:
# こちらのサンプルコードはカタログ AMI に含まれています。

PostUsers5xxAlarm:
# こちらのサンプルコードはカタログ AMI に含まれています。

CoreLambdaThrottlesAlarm:
# こちらのサンプルコードはカタログ AMI に含まれています。

CoreLambdaDurationAlarm:
# こちらのサンプルコードはカタログ AMI に含まれています。

CoreLambdaConcurrentExecutionAlarm:
# こちらのサンプルコードはカタログ AMI に含まれています。

標準メトリクスだけでなく、先ほどの構造化ログと Metric Filter を利用したカスタムメトリクスにも適用可能です。

CoreLambdaErrorsAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: prod-webapi-CoreLambdaErrors-Alarm
AlarmDescription: "Log level `ERROR` count in CoreLambdaFunction"
AlarmActions:
- !Ref MonitoringTopic # SNS Topic
Namespace: !Join [ '', [ 'Logs/', !Ref CoreLambdaFunction ]]
EvaluationPeriods: 5 # 5 minutes
MetricName: Errors
Period: 60 # 60 seconds
Statistic: Sum
Threshold: 10 # 10 error logs within 5 minutes
ComparisonOperator: GreaterThanThreshold