ECS での標準的に利用できるメトリクスとしては、サービス単位での CPU 利用率、メモリ利用率であり、タスク毎にどんなパフォーマンスなのかというのはわかりません。そこで Container Insights を利用することで、マネジメントコンソールからは現在値になりますがタスク単位での平均 CPU 使用率、メモリ利用率の他、サービス単位で時系列のネットワーク I/O、ストレージ I/O などが確認可能になります。これらでも充分有用なのですが、タスクにサイドカーも備えるなど複数コンテナで構成しているケースで、時には調査のため “コンテナ単位” でのパフォーマンス値を確認したいことがあるかもしれません。一発でグラフなどに出せるわけではありませんが、そんなシーンで利用できる Tips を紹介します。

はじめに

今回の Tips を利用するには対象のクラスタで Container Insights が有効化されている必要があります(有効化手順については最後に一部紹介したいと思います)。
試していませんが、Windows 環境や EKS 環境でも取得できるメトリクスに違いはあれど利用できるのではないかと思います。

コンテナ単位のメトリクスの取得

Container Insights で確認できるグラフの元ネタは /aws/ecs/containerinsights/<クラスタ名>/performance に記録されているパフォーマンスログになるのではないかと思います。さまざまな種類のログが出力されていますが、中には以下のようなコンテナ単位のパフォーマンス値が 1分単位という分解能で記録されています。
マネジメントコンソール上のグラフなどにはない、NetworkXxDroppedNetworkXxErrors といったメトリクスも取得できそうです。
この値を使って、コンテナ単位のメトリクスを取得しようというというわけです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
    "Version": "0",
    "Type": "Container",
    "ContainerName": "nginx", // コンテナ名
    "TaskId": "4a5118620ef24e0982ba2147fbeeda6a",
    "TaskDefinitionFamily": "myApp",
    "TaskDefinitionRevision": "3",
    "ServiceName": "myService",
    "ClusterName": "myCluster",
    "Image": "<Account ID>.dkr.ecr.<Region>.amazonaws.com/myApp:latest",
    "ContainerKnownStatus": "RUNNING",
    "Timestamp": 1628357760000,
    "CpuUtilized": 0.7575988006591796,
    "CpuReserved": 256,
    "MemoryUtilized": 9,
    "MemoryReserved": 512,
    "StorageReadBytes": 39014400,
    "StorageWriteBytes": 66519040,
    "NetworkRxBytes": 26,
    "NetworkRxDropped": 0,
    "NetworkRxErrors": 0,
    "NetworkRxPackets": 21358138,
    "NetworkTxBytes": 29,
    "NetworkTxDropped": 0,
    "NetworkTxErrors": 0,
    "NetworkTxPackets": 16881337
}

集計方法

このメトリクスの集計するには CloudWatch Logs Insights を利用します。
ロググループ /aws/ecs/containerinsights/<クラスタ名>/performance を開いて、「Logs Insights で表示」をクリックします。

CloudWatch Logs Insights の起動

テキストボックスに以下のように入力して「クエリの実行」をクリックします。
(7 - 10、12 行目については適宜ご指定ください。)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
fields @timestamp,
   CpuUtilized, MemoryUtilized,
   NetworkRxBytes, NetworkRxPackets, NetworkRxDropped, NetworkRxErrors,
   NetworkTxBytes, NetworkTxPackets, NetworkTxDropped, NetworkTxErrors,
   StorageReadBytes, StorageWriteBytes, @message
| filter Type = 'Container'
      and ClusterName = 'クラスタ名'
      and ServiceName = 'サービス名'
      and TaskId = 'タスクID'
      and ContainerName = 'コンテナ名'
| sort @timestamp desc
| limit 20

すると以下のように表示されますので、「結果をエクスポート」から CSV などで取得し Excel などでグラフ化いただければと思います。

CloudWatch Logs Insights のクエリ結果

しっかりやるのであればこのパフォーマンスログにサブスクリプションフィルターを設定し、Elasticsearch に送ってあげることで Kibana から綺麗に可視化することもできるのではないかと思います。

補足

一部の値について補足しますと

  • CpuUtilized の値を タスク に割り当てた 「CPU 単位(ユニット)(128、256 とか)」で割ると CPU 利用率になります。
  • MemoryUtilized の値を タスク に割り当てた「メモリ(MiB)」で割るとメモリ利用率になります。

例えば上記の「2021-08-08T13:56:00.000+09:00」時点で、タスクに割り当てた CPU、メモリが以下の時は、、、

タスクサイズの例

それぞれ以下のようになります。

CPU 利用率

  • 1.410086… ÷ 256 = 0.0055.. → 0.55 % ぐらい

メモリ利用率

  • 9 ÷ 512 = 0.01757… → 1.76 % ぐらい

注意点

いくつか注意点があります。

  • Container Insights を該当のクラスターでそもそも有効化しておく必要がある(有効化方法は後述)
  • Container Insights の利用には別途料金がかかる(料金ページ
  • Container Insights の元ネタとなるパフォーマンスログ(/aws/ecs/containerinsights/<クラスタ名>/performance)のデフォルトの保持期間は1日 なので保持期間以前のパフォーマンスメトリクスは CloudWatch Logs Insights からは取得できません。 パフォーマンスログの保持期間

Appendix : Container Insights の有効化

Container Insights を利用するためには該当のクラスターで有効化しておく必要があります。
公式ドキュメント : サポートされているプラットフォーム 」についても事前に確認してください。

有効化についての、公式ドキュメントは以下です。

ここでは ECS についてかいつまんでおきます。

アカウントレベルのデフォルトの有効化設定

アカウントレベルでクラスター作成時に Container Insights の利用をデフォルトで有効にするには ECS の左メニュー「Account Settings」から設定します。

Container Insights の有効化

CLI の場合は以下のように。

1
2
aws ecs put-account-setting \
  --name "containerInsights" --value "enabled"

クラスター新規作成時の有効化

マネジメントコンソールから新規にクラスターを作成する場合は、どのテンプレートからでも最下段にチェックボックスがあるのでチェックを入れます。

Container Insights の有効化

CLI の場合は以下のように。

1
2
3
aws ecs create-cluster \
  --cluster-name myCluster \
  --settings "name=containerInsights,value=enabled"

既存のクラスターで有効化したい場合

既存のクラスターから Container Insights を有効化するには CLI を利用します。残念ながらマネジメントコンソールからは現時点では設定できません。

1
2
3
aws ecs update-cluster-settings \
  --cluster myCluster \
  --settings name=containerInsights,value=enabled

無効化したい場合

無効化したい場合も CLI から実行します。value=disabled としてあげれば OK です。

1
2
3
aws ecs update-cluster-settings \
  --cluster myCluster \
  --settings name=containerInsights,value=disabled

まとめ

Container Insights によるパフォーマンスログを使った「コンテナ単位」のメトリクス確認方法についてご紹介しました。
途中にも書きましたが、パフォーマンスログにサブスクリプションフィルターを設定し、Elasticsearch に送ってあげることで Kibana から綺麗に可視化する、なんてのも要件によっては検討できるかと思います。

最後に・・・

この投稿は個人的なものであり、所属組織を代表するものではありません。ご了承ください。