ECS での標準的に利用できるメトリクスとしては、サービス単位での CPU 利用率、メモリ利用率であり、タスク毎にどんなパフォーマンスなのかというのはわかりません。そこで Container Insights を利用することで、マネジメントコンソールからは現在値になりますがタスク単位での平均 CPU 使用率、メモリ利用率の他、サービス単位で時系列のネットワーク I/O、ストレージ I/O などが確認可能になります。これらでも充分有用なのですが、タスクにサイドカーも備えるなど複数コンテナで構成しているケースで、時には調査のため “コンテナ単位” でのパフォーマンス値を確認したいことがあるかもしれません。一発でグラフなどに出せるわけではありませんが、そんなシーンで利用できる Tips を紹介します。
2024/12/07 更新
2024年 12月に 「Amazon CloudWatch Container Insights で Amazon ECS の強化されたオブザーバビリティがローンチ」というアップデートがありました。
ECS のアカウントレベルの設定、もしくはクラスターごとの設定で、Container Insights のレベルを「オブザーバビリティが強化された Container Insights」にすることで、直近 3時間のコンテナ単位のメトリクスがグラフで視覚的に参照可能になります。
CloudWatch の Container Insights から以下のようなイメージでタスク内のコンテナ単位でメトリクスがグラフで参照可能になります。
有効にするには ECS の「アカウント設定」、もしくは「クラスターを更新」から「オブザーバビリティが強化された Container Insights」を選択して更新します。
CLI でクラスターレベルで有効する場合は以下のようになります。値が enabled
ではなく enhanced
になる点にご注意ください。
enabled
: Container Insights を有効化enhanced
: 強化されたオブザーバビリティを有効化した Container Insights
aws ecs update-cluster-settings \
--cluster ${CLUSTER_NAME} \
--settings '[
{
"name": "containerInsights",
"value": "enhanced"
}
]'
料金は通常の Container Insights とは少し変わるようです。詳細は料金ページを参照ください。
直近 3時間前までのメトリクスになりますが、「強化されたオブザーバビリティ」を有効にすることでグラフ化された状態で、かつ複数のコンテナについてまとめて参照できるのでコンテナのパフォーマンスが一目でわかるようになります。
3時間以上前から1日以内 (デオフォルトのパフォーマンスログの保存期間) のメトリクスを知りたいケースでは引き続き以降の過去の投稿が有効ですのでご参照ください。
(更新ここまで。以降は過去の投稿です。)
はじめに
今回の Tips を利用するには対象のクラスタで Container Insights が有効化されている必要があります(有効化手順については最後に一部紹介したいと思います)。
試していませんが、Windows 環境や EKS 環境でも取得できるメトリクスに違いはあれど利用できるのではないかと思います。
コンテナ単位のメトリクスの取得
Container Insights で確認できるグラフの元ネタは /aws/ecs/containerinsights/<クラスタ名>/performance
に記録されているパフォーマンスログになるのではないかと思います。さまざまな種類のログが出力されていますが、中には以下のようなコンテナ単位のパフォーマンス値が 1分単位という分解能で記録されています。
マネジメントコンソール上のグラフなどにはない、NetworkXxDropped
、NetworkXxErrors
といったメトリクスも取得できそうです。
この値を使って、コンテナ単位のメトリクスを取得しようというというわけです。
|
|
集計方法
このメトリクスの集計するには CloudWatch Logs Insights を利用します。
ロググループ /aws/ecs/containerinsights/<クラスタ名>/performance
を開いて、「Logs Insights で表示」をクリックします。
テキストボックスに以下のように入力して「クエリの実行」をクリックします。
(7 - 10、12 行目については適宜ご指定ください。)
|
|
すると以下のように表示されますので、「結果をエクスポート」から CSV などで取得し Excel などでグラフ化いただければと思います。
しっかりやるのであればこのパフォーマンスログにサブスクリプションフィルターを設定し、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」から設定します。
CLI の場合は以下のように。
|
|
クラスター新規作成時の有効化
マネジメントコンソールから新規にクラスターを作成する場合は、どのテンプレートからでも最下段にチェックボックスがあるのでチェックを入れます。
CLI の場合は以下のように。
|
|
既存のクラスターで有効化したい場合
既存のクラスターから Container Insights を有効化するには CLI を利用します。残念ながらマネジメントコンソールからは現時点では設定できません。
|
|
無効化したい場合
無効化したい場合も CLI から実行します。value=disabled
としてあげれば OK です。
|
|
まとめ
Container Insights によるパフォーマンスログを使った「コンテナ単位」のメトリクス確認方法についてご紹介しました。
途中にも書きましたが、パフォーマンスログにサブスクリプションフィルターを設定し、Elasticsearch に送ってあげることで Kibana から綺麗に可視化する、なんてのも要件によっては検討できるかと思います。
最後に・・・
この投稿は個人的なものであり、所属組織を代表するものではありません。ご了承ください。