

# Amazon CloudWatch ソリューション: Amazon ECS での Prometheus メトリクス収集
<a name="Solution-Prometheus-On-ECS"></a>

このソリューションでは、独自の収集インフラストラクチャを実行またはスケーリングせずに、Amazon ECS タスクから Prometheus 互換メトリクスを収集できます。タスクは Prometheus エクスポーターを介してメトリクスを公開し、Amazon CloudWatch マネージド Prometheus コレクターは DNS ベースのサービス検出を通じて VPC 内のタスクを検出し、それらの `/metrics` エンドポイントをスクレイプして、メトリクスを CloudWatch に配信します。Amazon ECS タスクは一時的であり IP アドレスが変化するため、このソリューションでは AWS Cloud Map サービス検出を使用し、コレクターが現在のタスクセットを常にスクレイプするようにします。すべての CloudWatch オブザーバビリティソリューションの一般的な情報については、「[CloudWatch オブザーバビリティソリューション](Monitoring-Solutions.md)」を参照してください。マネージドコレクターの詳細については、「[Amazon CloudWatch マネージド Prometheus コレクター](managed-prometheus-collectors.md)」を参照してください。

**Topics**
+ [要件](#Solution-Prometheus-On-ECS-Requirements)
+ [Prometheus エクスポーターを有効にする](#Solution-Prometheus-On-ECS-Exporters)
+ [ステップ 1: セキュリティグループをセットアップする](#Solution-Prometheus-On-ECS-Security-Groups)
+ [ステップ 2: スクレイプ構成をセットアップする](#Solution-Prometheus-On-ECS-Scrape-Config)
+ [ステップ 3: スクレーパーをセットアップする](#Solution-Prometheus-On-ECS-Create-Scraper)
+ [メトリクスの収集を検証する](#Solution-Prometheus-On-ECS-Validate)
+ [カスタムダッシュボードを構築する](#Solution-Prometheus-On-ECS-Dashboards)
+ [コスト](#Solution-Prometheus-On-ECS-Costs)

## 要件
<a name="Solution-Prometheus-On-ECS-Requirements"></a>

このソリューションは、以下の条件に適しています。
+ コンピューティング: AWS 互換メトリクスを公開する Amazon ECS タスク (Amazon EC2 または Prometheus Fargate 上)。
+ DNS ベースのサービス検出用に AWS Cloud Map に登録される Amazon ECS サービス。
+ DNS が有効化された Amazon VPC と、コレクター用の異なるアベイラビリティーゾーンにある少なくとも 2 つのサブネット。
+ コレクターがタスク上のメトリクスポートに到達できるようにするセキュリティグループ。タスクとコレクターがセキュリティグループを共有している場合は、メトリクスポート用の自己参照イングレスルールを追加します。

## Prometheus エクスポーターを有効にする
<a name="Solution-Prometheus-On-ECS-Exporters"></a>

Prometheus エクスポーターは、HTTP Prometheus エンドポイントで `/metrics` 表記形式のメトリクスを公開するプロセスです。Amazon ECS では、通常、エクスポーターをアプリケーションと同じタスク定義内のサイドカーコンテナとして実行するか、アプリケーションを計装してメトリクスを直接公開します。一般的に使用されるエクスポーターを以下に示します:
+ **Node Exporter** – Amazon EC2 起動タイプ上のタスク向けのホストレベルのインフラストラクチャメトリクス (デフォルトポート 9100)。詳細については、GitHub の「[Node Exporter](https://github.com/prometheus/node_exporter) リポジトリ」を参照してください。
+ **JMX Exporter** – Java ワークロード向けの JVM および Java アプリケーションメトリクス。詳細については、GitHub の「[JMX Exporter](https://github.com/prometheus/jmx_exporter) リポジトリ」を参照してください。
+ **NGINX Prometheus Exporter** – NGINX ウェブサーバーおよびリバースプロキシメトリクス。詳細については、GitHub の「[NGINX Prometheus Exporter](https://github.com/nginx/nginx-prometheus-exporter) リポジトリ」を参照してください。
+ **DCGM Exporter** – GPU ワークロード向けの NVIDIA GPU メトリクス (デフォルトポート 9400)。詳細については、GitHub の「[DCGM Exporter](https://github.com/NVIDIA/dcgm-exporter) リポジトリ」を参照してください。
+ **HAProxy Exporter** – HAProxy ロードバランサーメトリクス。詳細については、GitHub の「[HAProxy Exporter](https://github.com/prometheus/haproxy_exporter) リポジトリ」を参照してください。
+ **Apache Exporter** – Apache HTTP Server メトリクス。詳細については、GitHub の「[Apache Exporter](https://github.com/Lusitaniae/apache_exporter) リポジトリ」を参照してください。

エクスポーターの公式ドキュメントに従って、エクスポーターをタスク定義に追加し、それのメトリクスポートを公開します。利用可能なエクスポーターの完全なカタログについては、Prometheus ドキュメントの「[エクスポーターと統合](https://prometheus.io/docs/instrumenting/exporters/)」を参照してください。

## ステップ 1: セキュリティグループをセットアップする
<a name="Solution-Prometheus-On-ECS-Security-Groups"></a>

Amazon ECS タスクのセキュリティグループが、メトリクスポートでコレクターからのインバウンドトラフィックを許可していることを確認します。タスクとコレクターがセキュリティグループを共有している場合は、同じセキュリティグループ内のリソースが通信できるように、自己参照イングレスルールを追加します。次のコマンドは、同じセキュリティグループからのポート 80 へのインバウンドトラフィックを許可します:

```
aws ec2 authorize-security-group-ingress \
  --group-id {{sg-security-group-id}} \
  --ip-permissions IpProtocol=tcp,FromPort=80,ToPort=80,UserIdGroupPairs='[{GroupId={{sg-security-group-id}}}]'
```

## ステップ 2: スクレイプ構成をセットアップする
<a name="Solution-Prometheus-On-ECS-Scrape-Config"></a>

AWS Cloud Map に登録する Amazon ECS タスクの場合は、DNS ベースのサービス検出 (`dns_sd_configs`) を使用して、タスクの開始および停止時に自動的にタスクを検出およびスクレイプします。`dns_sd_configs` セクションでは、コレクターに AWS Cloud Map DNS 名をクエリし、返されたすべての IP アドレスをスクレイプするように指示します。Amazon ECS がタスクを置き換えると、コレクターは次の DNS クエリで変更を取得します。`relabel_configs` セクションでは、サービス間でクエリおよびフィルターを実行できるように、メトリクスに一貫したラベルを追加します。サポートされている構成オプションの完全なセットについては、「[スクレイパー設定](managed-prometheus-collectors-scraper-configuration.md)」を参照してください。

```
global:
  scrape_interval: 30s
  scrape_timeout: 10s

scrape_configs:
  - job_name: 'ecs-payforadoption'
    dns_sd_configs:
      - names: ['{{payforadoption-go.Workshop-space}}']
        type: A
        port: 80
    metrics_path: '/metrics'
    relabel_configs:
      - target_label: service_name
        replacement: '{{payforadoption-go}}'
      - target_label: cloudmap_namespace
        replacement: '{{Workshop-space}}'
      - target_label: environment
        replacement: 'production'
      - target_label: compute_platform
        replacement: 'ecs-fargate'
```

## ステップ 3: スクレーパーをセットアップする
<a name="Solution-Prometheus-On-ECS-Create-Scraper"></a>

Amazon ECS タスクをスクレイプし、メトリクスを CloudWatch データセットに配信する VPC 接続マネージドコレクターを作成します。

[GetDefaultScraperConfiguration](https://docs.aws.amazon.com/prometheus/latest/APIReference/API_GetDefaultScraperConfiguration.html) を使用して、汎用スクレーパー設定を取得するか、独自のものを提供できます。

------
#### [ AWS API ]

`CreateScraper` API オペレーションを使用して、CloudWatch 送信先を持つスクレーパーを作成します。サブネット、セキュリティグループ、データセット情報を独自の值に置き換えます。

```
POST /scrapers HTTP/1.1

{
  "alias": "ecs-payforadoption-scraper",
  "source": {
    "vpcConfiguration": {
      "subnetIds": ["{{subnet-subnet-id-1}}", "{{subnet-subnet-id-2}}"],
      "securityGroupIds": ["{{sg-security-group-id}}"]
    }
  },
  "destination": {
    "cloudWatchConfiguration": {
      "datasetArn": "arn:aws:cloudwatch:{{us-west-2}}:{{123456789012}}:dataset/default"
    }
  },
  "scrapeConfiguration": {
    "configurationBlob": "{{base64-encoded-blob}}"
  }
}
```

------
#### [ AWS CLI ]

`create-scraper` コマンドを使用して、CloudWatch 送信先を持つスクレーパーを作成します。サブネット、セキュリティグループ、データセット情報を独自の值に置き換えます。

```
aws amp create-scraper \
  --alias "ecs-payforadoption-scraper" \
  --source '{
    "vpcConfiguration": {
      "subnetIds": ["{{subnet-subnet-id-1}}", "{{subnet-subnet-id-2}}"],
      "securityGroupIds": ["{{sg-security-group-id}}"]
    }
  }' \
  --scrape-configuration configurationBlob=$(cat {{ecs-scraper.yml}} | base64 -w 0) \
  --destination '{
    "cloudWatchConfiguration": {
      "datasetArn": "arn:aws:cloudwatch:{{us-west-2}}:{{123456789012}}:dataset/default"
    }
  }'
```

------

## メトリクスの収集を検証する
<a name="Solution-Prometheus-On-ECS-Validate"></a>

コレクターがメトリクスを配信し始めたら、[Query Studio](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-PromQL-QueryStudio.html) を使用して CloudWatch でアドホッククエリを実行し、メトリクスが到着していることを確認します。例えば、次のクエリは過去 5 分間の Amazon ECS タスクへの平均リクエストを秒単位で返します。

```
rate(payforadoption_requests_total[5m])
```

## カスタムダッシュボードを構築する
<a name="Solution-Prometheus-On-ECS-Dashboards"></a>

コレクターが Amazon ECS メトリクスを CloudWatch に配信し始めたら、それらを可視化するためのカスタム CloudWatch ダッシュボードを構築できます。カスタムダッシュボードでは、Prometheus エクスポーターからのメトリクスをウィジェットに組み合わせ、PromQL ベースのクエリを追加し、モニタリングニーズに合わせてウィジェットを整理できます。詳細については、「[CloudWatch ダッシュボードの使用](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Dashboards.html)」を参照してください。

## コスト
<a name="Solution-Prometheus-On-ECS-Costs"></a>

Prometheus コレクターについては時間単位で課金され、CloudWatch OpenTelemetry メトリクスの取り込み料金が適用されます。CloudWatch の料金の詳細については、「[Amazon CloudWatch の料金](https://aws.amazon.com/cloudwatch/pricing/)」をご覧ください。