CloudWatch メトリクスに ECS Fargate のタスク単位のCPU・メモリ使用量を記録してみた

Container Insights とメトリクスフィルターを利用すれば、タスク単位のCPU・メモリ使用量も CloudWatch メトリクスに登録できます
2022.06.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

アノテーション株式会社の hato です。

本記事は CloudWatch Container Insights と CloudWatch Logs のメトリクスフィルターを利用して、タスク単位のCPU・メモリ使用量を自動的に CloudWatch メトリクスに登録する方法をご紹介します。

完成図

タスク単位のCPU・メモリ使用量

Container Insights を設定すると「タスクのパフォーマンス」からタスク単位のCPU・メモリ使用率が確認できますが、過去のリソース状況を確認したい場合があります。

タスク単位のリソース状況は CloudWatch メトリクスには標準で保存されませんが、Container Insights のパフォーマンスログ にはタスク単位・コンテナ単位のリソース状況が収集されています。

そのため、CloudWatch Logs のデータをメトリクスフィルターを使用しメトリクス化すれば、タスク単位のCPU・メモリ使用量が CloudWatch メトリクスから確認できます。

注意:タスク単位にカスタムメトリクスが生成されるため、タスクの更新頻度やタスク数次第では高額請求に繋がる可能性があります *1メトリクス化が必要ではない場合は、CloudWatch Logs Insights で必要なタイミングでリソース状況を確認することを検討してください。

ECS タスクとコンテナデプロイをモニタリングするように CloudWatch Container Insights を設定する

Amazon ECS の Containers Insights によって収集されるメトリクスは、1 つのタスクを追跡できるほど詳細ではありません。これは、利用可能なすべてのメトリクスがタスク定義ファミリレベルで集計され、平均化されるためです。収集されたパフォーマンスデータをより詳細に分析するには、CloudWatch Logs Insights クエリを使用します。

やってみた

前提

  • ECS クラスターやタスクなどは設定、構築済み
  • Container Insightsは有効化済み

参考:Amazon ECS での Container Insights のセットアップ - Amazon CloudWatch

CPU使用量のメトリクス

CloudWatch コンソールのナビゲーションペインから「ロググループ」を選択して、パフォーマンスログが保管されているロググループを選択します。

# ロググループの形式
/aws/ecs/containerinsights/<クラスター名>/performance

「メトリクスフィルターを作成」を選択します。

フィルターパターンに{ $.Type = "Task" }を指定して「Next」を選択します。

次の値を指定して「Next」を選択します。
なお、必要に応じてディメンションは追加してください。(クラスター名やサービス名など)

  • フィルター名:任意の名前
  • メトリクスの詳細
    • メトリクス名前空間:ECS/ContainerInsights
    • メトリクス名:CpuUtilized
    • メトリクス値:$.CpuUtilized
  • ディメンション
    • ディメンション名:TaskID
    • ディメンション値:$.TaskId

「メトリクスフィルターを作成」を選択します。

メモリ使用量のメトリクス

同様にメモリ使用量のメトリクスフィルターを作成します。
「メトリクスフィルターを作成」を選択します。

フィルターパターンに{ $.Type = "Task" }を指定して「Next」を選択します。

次の値を指定して「Next」を選択します。
CPU使用量と同様、必要に応じてディメンションは追加してください。(クラスター名やサービス名など)

  • フィルター名:任意の名前
  • メトリクスの詳細
    • メトリクス名前空間:ECS/ContainerInsights
    • メトリクス名:MemoryUtilized
    • メトリクス値:$.MemoryUtilized
  • ディメンション
    • ディメンション名:TaskID
    • ディメンション値:$.TaskId

「メトリクスフィルターを作成」を選択します。

最終的に次のような設定になります。

メトリクスを表示する

「すべてのメトリクス」を選択して、カスタム名前空間のECS/ContainerInsightsを選択します。

「TaskID」を選択します。

メトリクスを表示したいタスク ID を選択します。

選択したタスクのメトリクスが表示されます。
必要に応じて作成したメトリクスは CloudWatch アラームなどを設定してください。

参考資料

最後に

パフォーマンスログイベントにはCPUやメモリ使用量以外の値も記録されているため、設定値を変更すると他の値をメトリクスに登録できます。 監視要件などにあわせてお好みのメトリクス作成をお試しください。

Amazon ECS の Container Insights パフォーマンスログイベント - Amazon CloudWatch

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。

脚注

  1. ディメンションに高カーディナリティな値を指定することは推奨されていません。意図しない高額請求の徴収を防ぐため、特定の時間内に指定したディメンションが 1000 の異なる名前と値のペアで生成された場合、AWS によりメトリクスフィルターを無効化されることがあります。AWS公式ドキュメント