Amazon ECS クラスターでの自動検出の詳細ガイド
Prometheus には、<scrape_config>
Amazon ECS Prometheus サービス検出を有効にするときに、CloudWatch エージェントは定期的に Amazon ECS および Amazon EC2 フロントエンドに対して次の API コールを行い、ターゲット ECS クラスターで実行中の ECS タスクのメタデータを取得します。
EC2:DescribeInstances ECS:ListTasks ECS:ListServices ECS:DescribeContainerInstances ECS:DescribeServices ECS:DescribeTasks ECS:DescribeTaskDefinition
このメタデータは、ECS クラスター内の Prometheus ターゲットをスキャンするために CloudWatch エージェントによって使用されます。CloudWatch エージェントは、次の 3 つのサービス検出モードをサポートします。
-
コンテナドッカーのラベルベースのサービス検出
-
ECS タスク定義 ARN 正規表現ベースのサービス検出
-
ECS サービス名正規表現ベースのサービス検出
すべてのモードを一緒に使用することができます。CloudWatch エージェントは、{private_ip}:{port}/{metrics_path}
に基づいて検出されたターゲットの重複を解除します。
検出されたターゲットはすべて、CloudWatch エージェントコンテナ内の sd_result_file
設定フィールドで指定された結果ファイルに書き込まれます。次に、結果ファイルの例を示します。
- targets: - 10.6.1.95:32785 labels: __metrics_path__: /metrics ECS_PROMETHEUS_EXPORTER_PORT: "9406" ECS_PROMETHEUS_JOB_NAME: demo-jar-ec2-bridge-dynamic ECS_PROMETHEUS_METRICS_PATH: /metrics InstanceType: t3.medium LaunchType: EC2 SubnetId: subnet-123456789012 TaskDefinitionFamily: demo-jar-ec2-bridge-dynamic-port TaskGroup: family:demo-jar-ec2-bridge-dynamic-port TaskRevision: "7" VpcId: vpc-01234567890 container_name: demo-jar-ec2-bridge-dynamic-port job: demo-jar-ec2-bridge-dynamic - targets: - 10.6.3.193:9404 labels: __metrics_path__: /metrics ECS_PROMETHEUS_EXPORTER_PORT_SUBSET_B: "9404" ECS_PROMETHEUS_JOB_NAME: demo-tomcat-ec2-bridge-mapped-port ECS_PROMETHEUS_METRICS_PATH: /metrics InstanceType: t3.medium LaunchType: EC2 SubnetId: subnet-123456789012 TaskDefinitionFamily: demo-tomcat-ec2-bridge-mapped-port TaskGroup: family:demo-jar-tomcat-bridge-mapped-port TaskRevision: "12" VpcId: vpc-01234567890 container_name: demo-tomcat-ec2-bridge-mapped-port job: demo-tomcat-ec2-bridge-mapped-port
この結果ファイルは、Prometheus ファイルベースのサービス検出と直接統合できます。Prometheus ファイルベースのサービス検出の詳細については、「<file_sd_config>
結果ファイルが /tmp/cwagent_ecs_auto_sd.yaml
に書き込まれたとします。次の Prometheus スクレイプ設定はそれを消費します。
global: scrape_interval: 1m scrape_timeout: 10s scrape_configs: - job_name: cwagent-ecs-file-sd-config sample_limit: 10000 file_sd_configs: - files: [ "/tmp/cwagent_ecs_auto_sd.yaml" ]
CloudWatch エージェントは、検出されたターゲットに対して次の追加ラベルも追加します。
-
container_name
-
TaskDefinitionFamily
-
TaskRevision
-
TaskGroup
-
StartedBy
-
LaunchType
-
job
-
__metrics_path__
-
Docker のラベル
クラスターの起動タイプが EC2 の場合、次の 3 つのラベルが追加されます。
-
InstanceType
-
VpcId
-
SubnetId
注記
正規表現 [a-zA-Z_][a-zA-Z0-9_]*
と一致しない Docker ラベルは除外されます。これは、Prometheus のマニュアルの「構成ファイルlabel_name
に記載されている Prometheus の規則と一致します。
ECS サービス検出の設定例
このセクションでは、ECS サービスの検出を示す例について説明します。
例 1
"ecs_service_discovery": { "sd_frequency": "1m", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "docker_label": { } }
この例では、Docker ラベルベースのサービス検出を有効にします。CloudWatch エージェントは、ECS タスクのメタデータを 1 分間に照会し、検出されたターゲットを CloudWatch エージェントコンテナ内の /tmp/cwagent_ecs_auto_sd.yaml
ファイルに書き込みます。
sd_port_label
セクションの docker_label
のデフォルト値は ECS_PROMETHEUS_EXPORTER_PORT
です。ECS タスク内の実行中のコンテナに ECS_PROMETHEUS_EXPORTER_PORT
ドッカーラベルがある場合、CloudWatch エージェントはその値を container port
として使用して、コンテナのすべての公開ポートをスキャンします。一致するものがある場合、マッピングされたホストポートとコンテナのプライベート IP を使用して、Prometheus エクスポータターゲットが private_ip:host_port
の形式で構築されます。
sd_metrics_path_label
セクションの docker_label
のデフォルト値は ECS_PROMETHEUS_METRICS_PATH
です。コンテナにこのドッカーラベルがある場合、その値は __metrics_path__
として使用されます。コンテナにこのラベルがない場合は、デフォルト値 /metrics
が使用されます。
sd_job_name_label
セクションの docker_label
のデフォルト値は job
です。コンテナにこのドッカーラベルがある場合、その値はターゲットのラベルの 1 つとして追加され、Prometheus 設定で指定されたデフォルトのジョブ名が置き換えられます。このドッカーラベルの値は、CloudWatch Logs ロググループのログストリーム名として使用されます。
例 2
"ecs_service_discovery": { "sd_frequency": "15s", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "docker_label": { "sd_port_label": "ECS_PROMETHEUS_EXPORTER_PORT_SUBSET_A", "sd_job_name_label": "ECS_PROMETHEUS_JOB_NAME" } }
この例では、Docker ラベルベースのサービス検出を有効にします。CloudWatch エージェントは、ECS タスクのメタデータを 15 秒ごとに照会し、検出されたターゲットを CloudWatch エージェントコンテナ内の /tmp/cwagent_ecs_auto_sd.yaml
ファイルに書き込みます。ドッカーラベルが ECS_PROMETHEUS_EXPORTER_PORT_SUBSET_A
のコンテナがスキャンされます。ドッカーラベルが ECS_PROMETHEUS_JOB_NAME
の値がジョブ名として使用されます。
例 3
"ecs_service_discovery": { "sd_frequency": "5m", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "task_definition_list": [ { "sd_job_name": "java-prometheus", "sd_metrics_path": "/metrics", "sd_metrics_ports": "9404; 9406", "sd_task_definition_arn_pattern": ".*:task-definition/.*javajmx.*:[0-9]+" }, { "sd_job_name": "envoy-prometheus", "sd_metrics_path": "/stats/prometheus", "sd_container_name_pattern": "^envoy$", "sd_metrics_ports": "9901", "sd_task_definition_arn_pattern": ".*:task-definition/.*appmesh.*:23" } ] }
この例では、ECS タスク定義 ARN 正規表現ベースのサービス検出をイネーブルにします。CloudWatch エージェントは、ECS タスクのメタデータを 5 分ごとに照会し、検出されたターゲットを CloudWatch エージェントコンテナ内の /tmp/cwagent_ecs_auto_sd.yaml
ファイルに書き込みます。
2 つのタスク定義 ARN 通常記述セクションが定義されています。
-
最初のセクションでは、ECS タスク定義 ARN に
javajmx
が含まれる ECS タスクが、コンテナポートスキャン用にフィルタリングされます。これらの ECS タスク内のコンテナが 9404 または 9406 のコンテナポートを公開する場合、マップされたホストポートとコンテナのプライベート IP が Prometheus エクスポーターターゲットの作成に使用されます。sd_metrics_path
の値は__metrics_path__
から/metrics
に設定します。したがって、CloudWatch エージェントは Prometheus メトリクスをprivate_ip:host_port/metrics
からスクレイプし、スクレイプされたメトリクスは、java-prometheus
ロググループ内の CloudWatch Logs の/aws/ecs/containerinsights/cluster_name/prometheus
ログストリームに送信 されます。 -
2 番目のセクションでは、ECS タスク定義 ARN に
appmesh
があり、version
の:23
がある ECS タスクが、コンテナポートスキャン用にフィルタリングされます。コンテナポートをenvoy
上に公開する9901
という名前のコンテナの場合、マッピングされたホストポートとコンテナのプライベート IP が Prometheus エクスポーターターゲットの作成に使用されます。これらの ECS タスク内の値は、9404 または 9406 のコンテナポートを公開し、マッピングされたホストポートとコンテナのプライベート IP が Prometheus エクスポーターターゲットの作成に使用されます。sd_metrics_path
の値は__metrics_path__
から/stats/prometheus
に設定します。したがって、CloudWatch エージェントはprivate_ip:host_port/stats/prometheus
から Prometheus メトリクスをスクレイプし、スクレイプされたメトリクスをロググループenvoy-prometheus
内の CloudWatch Logs の/aws/ecs/containerinsights/cluster_name/prometheus
ログストリームに送信します。
例 4
"ecs_service_discovery": { "sd_frequency": "5m", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "service_name_list_for_tasks": [ { "sd_job_name": "nginx-prometheus", "sd_metrics_path": "/metrics", "sd_metrics_ports": "9113", "sd_service_name_pattern": "^nginx-.*" }, { "sd_job_name": "haproxy-prometheus", "sd_metrics_path": "/stats/metrics", "sd_container_name_pattern": "^haproxy$", "sd_metrics_ports": "8404", "sd_service_name_pattern": ".*haproxy-service.*" } ] }
この例では、ECS サービス名正規表現ベースのサービス検出を有効にします。CloudWatch エージェントは、ECS サービスのメタデータを 5 分ごとに照会し、検出されたターゲットを CloudWatch エージェントコンテナ内の /tmp/cwagent_ecs_auto_sd.yaml
ファイルに書き込みます。
2 つのサービス名正規表現セクションが定義されています。
-
最初のセクションについて、正規表現
^nginx-.*
に一致する名前を持つ ECS サービスに関連付けられた ECS タスクがコンテナポートスキャン用にフィルタリングされます。これらの ECS タスク内のコンテナが 9113 のコンテナポートを公開する場合、マップされたホストポートとコンテナのプライベート IP が Prometheus エクスポーターターゲットの作成に使用されます。sd_metrics_path
の値は__metrics_path__
から/metrics
に設定します。したがって、CloudWatch エージェントは Prometheus メトリクスをprivate_ip:host_port/metrics
からスクレイプし、スクレイプされたメトリクスは、nginx-prometheus
ロググループ内の CloudWatch Logs の/aws/ecs/containerinsights/cluster_name/prometheus
ログストリームに送信されます。 -
または、2 つ目のセクションについて、正規表現
.*haproxy-service.*
に一致する名前を持つ ECS サービスに関連付けられた ECS タスクがコンテナポートスキャン用にフィルタリングされます。コンテナポートを 8404 上に公開するhaproxy
という名前のコンテナの場合、マッピングされたホストポートとコンテナのプライベート IP が Prometheus エクスポーターターゲットの作成に使用されます。sd_metrics_path
の値は__metrics_path__
から/stats/metrics
に設定します。したがって、CloudWatch エージェントは Prometheus メトリクスをprivate_ip:host_port/stats/metrics
からスクレイプし、スクレイプされたメトリクスは、haproxy-prometheus
ロググループ内の CloudWatch Logs の/aws/ecs/containerinsights/cluster_name/prometheus
ログストリームに送信されます。
例 5
"ecs_service_discovery": { "sd_frequency": "1m30s", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "docker_label": { "sd_port_label": "MY_PROMETHEUS_EXPORTER_PORT_LABEL", "sd_metrics_path_label": "MY_PROMETHEUS_METRICS_PATH_LABEL", "sd_job_name_label": "MY_PROMETHEUS_METRICS_NAME_LABEL" } "task_definition_list": [ { "sd_metrics_ports": "9150", "sd_task_definition_arn_pattern": "*memcached.*" } ] }
この例では、両方の ECS サービス検出モードを有効にします。CloudWatch エージェントは、ECS タスクのメタデータを 90 秒ごとに照会し、検出されたターゲットを CloudWatch エージェントコンテナ内の /tmp/cwagent_ecs_auto_sd.yaml
ファイルに書き込みます。
ドッカーベースのサービス検出設定の場合。
-
ドッカーラベル
MY_PROMETHEUS_EXPORTER_PORT_LABEL
付きの ECS タスクは、Prometheus ポートスキャン用にフィルタリングされます。ターゲットの Prometheus コンテナポートは、ラベルMY_PROMETHEUS_EXPORTER_PORT_LABEL
の値によって指定されます。 -
ドッカーラベル
MY_PROMETHEUS_EXPORTER_PORT_LABEL
の値は、__metrics_path__
に使用されます。コンテナにこのドッカーラベルがない場合は、デフォルト値/metrics
が使用されます。 -
ドッカーラベル
MY_PROMETHEUS_EXPORTER_PORT_LABEL
の値は、ジョブラベルとして使用されます。コンテナにこのドッカーラベルがない場合は、Prometheus 設定で定義されたジョブ名が使用されます。
ECS タスク定義 ARN 正規表現ベースのサービス検出設定の場合。
-
ECS タスク定義 ARN
memcached
内の ECS タスクは、コンテナポートスキャン用にフィルタリングされます。ターゲットの Prometheus コンテナポートは、sd_metrics_ports
で定義されている 9150 です。デフォルトのメトリクスパス/metrics
が使用されます。Prometheus 設定で定義されているジョブ名が使用されます。