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
です
% 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/ |
指定DockerコンテナIDのメタデータJSONを返します |
169.254.170.2/v2/stats |
タスクに関連付けられた全てのコンテナのDocker統計JSONを返します |
169.254.170.2/v2/stats/ |
指定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モード種別の境界をなくす観点では有用な方法と思われること、またホストによってリソースの単位や見方が変わるという点を解消するものと思いました。 モヤモヤが減って嬉しい限りです。