ECSにおけるタスクメタエンドポイント(Task Metadata Endpoint)について整理しました

こんにちわ、札幌のヨシエです。
時間がかなり経ってしまいましたが、先日正式リリースされたmackerel-container-agentのメトリック取得方法について解説されていた@hayajoさんのスライドにTask Metadata Endpointについて記載があったので調べてみました。

Docker統計情報とは?

Task Metadata Endpointを説明する前にコンテナのリソース状況取得について簡単に触れます。
EC2といった仮想マシンでCPU使用率、メモリ使用量が取得できるようにDockerで起動しているコンテナに関してもリソース状況を取得することが出来ます。

docker statsコマンドを実行することでコンテナホスト内で起動しているコンテナのCPU使用率やメモリ使用量をcgroupから取得したり、ネットワークインターフェースの使用状況といったところをNamespaceから取得するというが実現できます。

詳細なリソース状況を取得する仕組みは@hayajoさんが纏められたコンテナ技術入門 - 仮想化との違いを知り、要素技術を触って学ぼうをご参照頂ければと思います。

テストとして一時的にredisのコンテナを起動し、統計情報を取得してみます。

% docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
85233384eebb        redis               "docker-entrypoint.s…"   9 seconds ago       Up 8 seconds        6379/tcp            elegant_ardinghelli

コマンドはdocker stat <container名> or <containerid>です

% docker stats 85233384eebb
CONTAINER ID        NAME                  CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
85233384eebb        elegant_ardinghelli   0.20%               1.762MiB / 1.952GiB   0.09%               1.25kB / 0B         7.24MB / 0B         4

Task Metadata Endpointとは?

冒頭のTask Metadata Endpointに戻ります。
これは一言で書くと、ECSで使用できるDocker統計をエンドポイントを実行することで取得できるものです。
上記で記載しているようにDocker統計情報はコンテナホストへログインしてdocker statを実行することでリソース状況を取得できます。

ですが、ECSではコンテナホストにEC2インスタンスとFargateを利用するパターンがあり、ホストが変わることでcgroupfsを利用したリソース情報取得ではパス構成が変わるなどの細かい設定が必要となります。
この点をクリアする点としてTask Metadata Endpointを実行することでタスク(コンテナ)に関するリソース情報を取得することが出来ます。

このTask Metadata Endopointはv2とv3が存在しておりますので、それぞれを整理してみました。

Task Metadata Endopoint v2

タスクメタデータエンドポイントv2はEC2インスタンスのメタデータ取得と同じように、169.254.170.2から始まるエンドポイントを 実行することでホスト上の実行タスク(コンテナ)の状況確認することが出来ます。

確認例

curl http://169.254.170.2/v2/stats

サポートバージョン

サポートバージョンは以下の通り

  • EC2:1.17.0以降のバージョン
    • NWモードがawsvpcを利用しているもののみ使用可能
  • Fargate : v1.1.0以降のバージョン

エンドポイント仕様

エンドポイント 使途
169.254.170.2/v2/metadata タスクのメタデータ JSON を返します。これには、タスクに関連付けられたすべてのコンテナのコンテナ ID および名前のリストが含まれています。
169.254.170.2/v2/metadata/<container-id> 指定DockerコンテナIDのメタデータJSONを返します
169.254.170.2/v2/stats タスクに関連付けられた全てのコンテナのDocker統計JSONを返します
169.254.170.2/v2/stats/<container-id> 指定DockerコンテナIDのDocker統計JSONを返します

Task Metadata Endopoint v3

v2のエンドポイントと異なるのは各コンテナに起動時にエンドポイントURLが環境変数として渡される形になりました。 上記のタスクメタデータエンドポイントv2のエンドポイントと見比べると把握しやすいのですが、予め環境変数のURIに 含まれるのでcurl + <エンドポイント変数> + パスで確認が出来るようになります。

確認例

curl ${ECS_CONTAINER_METADATA_URI}/stats

サポートバージョン

サポートバージョンは以下の通り

  • EC2:1.21.0以降のバージョン
  • Fargate : v1.3.0以降のバージョン

エンドポイント仕様

エンドポイント 使途
${ECS_CONTAINER_METADATA_URI} タスク(コンテナ)のメタデータJSONを返します。
${ECS_CONTAINER_METADATA_URI}/task タスク(コンテナ)に関連するコンテナIDなどを含んだメタデータJSONを返します。
${ECS_CONTAINER_METADATA_URI}/stats 特定DockerコンテナのDocker統計JSONを返します
${ECS_CONTAINER_METADATA_URI}/task/stats タスクにする全てのコンテナのDocker統計JSONを返します

最後に

ECSのTask Metadata Endpointはメトリクスの監視でほぼ使用されるエンドポイントかと思います。
これはEC2やFargateといったホスト種別やNWモード種別の境界をなくす観点では有用な方法と思われること、またホストによってリソースの単位や見方が変わるという点を解消するものと思いました。 モヤモヤが減って嬉しい限りです。