AWS ECS でコンテナ毎のメトリクス(CPU使用率やメモリ使用率など)を取得する方法です。
ECSの起動タイプはEC2、Fargateにて確認しています。
取得できるメトリクスは以下サイトの「Type: Container」に記載のある項目です。
Amazon ECS の Container Insights パフォーマンスログイベント
概要
CloudWatch Container Insightsを有効にしたECSクラスターは、コンテナのメトリクス情報
(パフォーマンスログ)がCloudWatch Logsに出力されます。
そのログに対してCloudWatch Logs Insightsでクエリを実行することでメトリクスを取得できます。
本記事ではCPU使用率とメモリ使用率を取得します。
CloudWatch Logs Insightsを使う理由
ECSのメトリクスを取得する方法は他にもあると思いますが、以下に挙げる方法は使いづらい点があります。
-
CloudWatch Container Insightsのダッシュボード
-
コンテナのホストであるEC2上でdocker stats等のコマンドを実行
- FargateではホストのEC2が不可視のためこの方法は実行不可。
- EC2にSSH接続やRDP接続で乗り込まないといけないので手間。
事前準備
ECSクラスターのContainer Insightsを有効にしておく
ECSクラスターのContainer Insightsを有効にしておくことで、CloudWatch Logsにパフォーマンスログが出力されます。
Container Insightsを有効にする方法はこちらをご確認ください。
クラスターおよびサービスレベルの Amazon ECS でメトリクスの Container Insights の設定
集計実施
CloudWatch Logs Insightsでクエリを実行する
以下項目を入力し、クエリの実行をします。
① ロググループ
ECSコンテナのパフォーマンスログは以下名称で作成されています。
/aws/ecs/containerinsights/{クラスター名}/performance
②集計対象の期間
③クエリ文
クエリ文 参照
クエリ文
fields @timestamp, CpuUtilized, CpuReserved, CpuUtilized * 100 / CpuReserved as CpuUtilization,
MemoryUtilized, MemoryReserved, MemoryUtilized * 100 / MemoryReserved as MemoryUtilization
| filter ContainerName = "XXXXXXXXXXXXXXXXXX" and Type = "Container" and TaskId = "XXXXXXXXXXXXXXXXXX"
| sort @timestamp asc
| limit 10000
- fields : 取得するメトリクス。上記クエリの内容は下表参照。
- filter : コンテナ名、パフォーマンスログの種類、タスクIDで集計対象のログをフィルタ。
※コンテナ名、タスクIDは環境に合わせて設定。 - sort : タイムスタンプの昇順に表示。(デフォルトは降順)
- limit : 取得するログ件数。最大10,000。(デフォルトは1,000)
fields | 内容 |
---|---|
@timestamp | パフォーマンスログのタイムスタンプ |
CpuUtilized | CPUユニット数の使用量 |
CpuReserved | コンテナに対するCPUユニット数の割り当て |
CpuUtilization | CPU使用率(CpuUtilized * 100 / CpuReserved で計算1) |
MemoryUtilized | メモリ使用量(MiB) |
MemoryReserved | コンテナに対するメモリの割り当て(MiB) |
MemoryUtilization | メモリ使用率(MemoryUtilized* 100 / MemoryReservedで計算1) |
CloudWatch Logs Insightsのクエリ文の書き方詳細は以下参照。
CloudWatch Logs Insights のクエリ構文
実行結果
「結果をエクスポート」からCSV形式およびMarkdown形式で上記を出力できます。
CSVから簡単にグラフにできますね。
なお、ECSコンテナのパフォーマンスログは1分おきに出力されるため、それ以上細かい時間でのメトリクスは取得できません。