

# Amazon ECS クラスターで Prometheus メトリクスコレクションをセットアップおよび設定する
<a name="ContainerInsights-Prometheus-Setup-ECS"></a>

Amazon ECS クラスターから Prometheus メトリクスを収集するには、CloudWatch エージェントをコレクターとして使用するか、AWS Distro for OpenTelemetry コレクターを使用できます。AWS Distro for OpenTelemetry コレクターの使用については、[https://aws-otel.github.io/docs/getting-started/container-insights/ecs-prometheus](https://aws-otel.github.io/docs/getting-started/container-insights/ecs-prometheus) を参照してください。

以下のセクションでは、CloudWatch エージェントをコレクターとして使用して Prometheus メトリクスを取得する方法について説明します。Amazon ECS を実行しているクラスターに Prometheus モニターリングを使用して CloudWatch エージェントをインストールし、オプションで追加のターゲットをスクレイプするようにエージェントを設定することができます。また、これらのセクションでは、Prometheus モニターリングでのテストに使用するサンプルワークロードを設定するためのオプションのチュートリアルも提供します。

Amazon ECS の Container Insights は、Prometheus メトリクスの次の起動タイプとネットワークモードの組み合わせをサポートしています。


| Amazon ECS 起動タイプ | サポートされているネットワークモード | 
| --- | --- | 
|  EC2 (Linux)  |  ブリッジ、ホストおよび awsvpc  | 
|  Fargate  |  awsvpc  | 

**VPC セキュリティグループの要件**

Prometheus ワークロードのセキュリティグループの受信ルールでは、Prometheus のメトリクスをプライベート IP でスクレイピングするために、CloudWatch エージェントへの Prometheus ポートを開く必要があります。

CloudWatch エージェントのセキュリティグループの出力ルールでは、CloudWatch エージェントがプライベート IP によって Prometheus ワークロードのポートに接続できるようにする必要があります。

**Topics**
+ [Amazon ECS クラスターに Prometheus メトリクスコレクションを持つ CloudWatch エージェントをインストールする](ContainerInsights-Prometheus-install-ECS.md)
+ [追加の Prometheus ソースのスクレイピングと、それらのメトリクスのインポート](ContainerInsights-Prometheus-Setup-configure-ECS.md)
+ [(オプション) Prometheus メトリクスのテストのためにコンテナ化された Amazon ECS のサンプルワークロードを設定する](ContainerInsights-Prometheus-Sample-Workloads-ECS.md)

# Amazon ECS クラスターに Prometheus メトリクスコレクションを持つ CloudWatch エージェントをインストールする
<a name="ContainerInsights-Prometheus-install-ECS"></a>

このセクションでは、Amazon ECS を実行しているクラスターで Prometheus モニターリングを使用して CloudWatch エージェントをセットアップする方法について説明します。これを行うと、エージェントは、そのクラスターで実行されている次のワークロードのメトリクスを自動的にスクレイプし、インポートします。
+ AWS App Mesh
+ Java/JMX

また、追加の Prometheus ワークロードとソースからメトリクスをスクレイプしてインポートするようにエージェントを設定することもできます。

## IAM ロールの設定
<a name="ContainerInsights-Prometheus-Setup-ECS-IAM"></a>

CloudWatch エージェントタスク定義には、2 つの IAM ロールが必要です。Container Insights がこれらのロールを作成するように **CreateIAMRoles=True** スタックで CloudFormation を指定すると、ロールは正しいアクセス許可によって作成されます。お客様自身でロールを作成する場合、または既存のロールを使用する場合は、次のロールとアクセス許可が必要です。
+ **CloudWatch エージェントの ECS タスクロール** – CloudWatch エージェントコンテナはこのロールを使用します。これには、**CloudWatchAgentServerPolicy** ポリシーと、次の読み取り専用のアクセス許可を含むカスタマー管理ポリシーが含まれている必要があります。
  + `ec2:DescribeInstances`
  + `ecs:ListTasks`
  + `ecs:ListServices`
  + `ecs:DescribeContainerInstances`
  + `ecs:DescribeServices`
  + `ecs:DescribeTasks`
  + `ecs:DescribeTaskDefinition`
+ **CloudWatch エージェント ECS タスク実行ロール** – これは、コンテナを起動して実行するために Amazon ECS が必要とするロールです。タスク実行ロールに [**AmazonSSMReadOnlyAccess**]、[**AmazonECSTaskExecutionRolePolicy**]、および [**CloudWatchAgentServerPolicy**] ポリシーがアタッチされていることを確認します。Amazon ECS で使用するためにより機密性の高いデータを保存する場合は、「[機密データの指定](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data.html)」を参照してください。

## を使用して、Prometheus モニターリングを使用する CloudWatch エージェントをインストールするCloudFormation
<a name="ContainerInsights-Prometheus-Setup-ECS-CFN"></a>

AWS CloudFormation を使用して、Amazon ECS クラスターの Prometheus モニターリングで CloudWatch エージェントをインストールします。次のリストは、CloudFormation テンプレートで使用するパラメータを示しています。
+ **EcsClusterName** – ターゲット Amazon ECS クラスターを指定します。
+ **CreateIamRoles** – Amazon ECS タスク実行ロールと Amazon ECS タスクロールの新しいロールを作成するときに **True** を指定します 。既存のロールを再利用する場合に **False** を指定します。
+ **TaskRoleName** – [**CreateIAMRoles**] に **True** を指定した場合、新しい Amazon ECS タスクロールに使用する名前を指定します。[**CreateIAMRoles**] に **False** を指定した場合、Amazon ECS タスクロールとして使用する既存のロールを指定します。
+ **ExecutionRoleName** – [**CreateIAMRoles**] に **True** を指定した場合、新しい Amazon ECS タスク実行ロールに使用する名前を指定します。[**CreateIAMRoles**] に **False** を指定した場合、Amazon ECS タスク実行ロールとして使用する既存のロールを指定します。
+ **ECSNetworkMode** – EC2 起動タイプを使用している場合、ここでネットワークモードを指定します。これは **bridge** または **host** である必要があります。
+ **ECSLaunchType** – **fargate** または **EC2** を指定します。
+ **SecurityGroupID** – [**ECSNetworkMode**] が **awsvpc** である場合、ここでセキュリティグループ ID を指定します。
+ **SubnetID** – **ECSNetworkMode** が **awsvpc** の場合、ここでサブネット ID を指定します。

### コマンドサンプル
<a name="ContainerInsights-Prometheus-Setup-ECS-CFNcommands"></a>

このセクションでは、さまざまなシナリオで Prometheus モニターリングを使用して Container Insights をインストールするためのサンプル CloudFormation コマンドについて説明します。

**ブリッジネットワークモードで Amazon ECS クラスターの CloudFormation スタックを作成する**

```
export AWS_PROFILE=your_aws_config_profile_eg_default
export AWS_DEFAULT_REGION=your_aws_region_eg_ap-southeast-1
export ECS_CLUSTER_NAME=your_ec2_ecs_cluster_name
export ECS_NETWORK_MODE=bridge
export CREATE_IAM_ROLES=True
export ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
export ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name

curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-bridge-host.yaml

aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
    --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
    --parameters ParameterKey=ECSClusterName,ParameterValue=${ECS_CLUSTER_NAME} \
                 ParameterKey=CreateIAMRoles,ParameterValue=${CREATE_IAM_ROLES} \
                 ParameterKey=ECSNetworkMode,ParameterValue=${ECS_NETWORK_MODE} \
                 ParameterKey=TaskRoleName,ParameterValue=${ECS_TASK_ROLE_NAME} \
                 ParameterKey=ExecutionRoleName,ParameterValue=${ECS_EXECUTION_ROLE_NAME} \
    --capabilities CAPABILITY_NAMED_IAM \
    --region ${AWS_DEFAULT_REGION} \
    --profile ${AWS_PROFILE}
```

**ホストネットワークモードで Amazon ECS クラスターの CloudFormation スタックを作成する**

```
export AWS_PROFILE=your_aws_config_profile_eg_default
export AWS_DEFAULT_REGION=your_aws_region_eg_ap-southeast-1
export ECS_CLUSTER_NAME=your_ec2_ecs_cluster_name
export ECS_NETWORK_MODE=host
export CREATE_IAM_ROLES=True
export ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
export ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name


curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-bridge-host.yaml

aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
    --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
    --parameters ParameterKey=ECSClusterName,ParameterValue=${ECS_CLUSTER_NAME} \
                 ParameterKey=CreateIAMRoles,ParameterValue=${CREATE_IAM_ROLES} \
                 ParameterKey=ECSNetworkMode,ParameterValue=${ECS_NETWORK_MODE} \
                 ParameterKey=TaskRoleName,ParameterValue=${ECS_TASK_ROLE_NAME} \
                 ParameterKey=ExecutionRoleName,ParameterValue=${ECS_EXECUTION_ROLE_NAME} \ 
    --capabilities CAPABILITY_NAMED_IAM \
    --region ${AWS_DEFAULT_REGION} \
    --profile ${AWS_PROFILE}
```

**awsvpc ネットワークモードで Amazon ECS クラスターの CloudFormation スタックを作成する**

```
export AWS_PROFILE=your_aws_config_profile_eg_default
export AWS_DEFAULT_REGION=your_aws_region_eg_ap-southeast-1
export ECS_CLUSTER_NAME=your_ec2_ecs_cluster_name
export ECS_LAUNCH_TYPE=EC2
export CREATE_IAM_ROLES=True
export ECS_CLUSTER_SECURITY_GROUP=your_security_group_eg_sg-xxxxxxxxxx
export ECS_CLUSTER_SUBNET=your_subnet_eg_subnet-xxxxxxxxxx
export ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
export ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name

curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-awsvpc.yaml

aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-${ECS_LAUNCH_TYPE}-awsvpc \
    --template-body file://cwagent-ecs-prometheus-metric-for-awsvpc.yaml \
    --parameters ParameterKey=ECSClusterName,ParameterValue=${ECS_CLUSTER_NAME} \
                 ParameterKey=CreateIAMRoles,ParameterValue=${CREATE_IAM_ROLES} \
                 ParameterKey=ECSLaunchType,ParameterValue=${ECS_LAUNCH_TYPE} \
                 ParameterKey=SecurityGroupID,ParameterValue=${ECS_CLUSTER_SECURITY_GROUP} \
                 ParameterKey=SubnetID,ParameterValue=${ECS_CLUSTER_SUBNET} \
                 ParameterKey=TaskRoleName,ParameterValue=${ECS_TASK_ROLE_NAME} \
                 ParameterKey=ExecutionRoleName,ParameterValue=${ECS_EXECUTION_ROLE_NAME} \
    --capabilities CAPABILITY_NAMED_IAM \
    --region ${AWS_DEFAULT_REGION} \
    --profile ${AWS_PROFILE}
```

** awsvpc ネットワークモードでの Fargate クラスターの CloudFormation スタックの作成**

```
export AWS_PROFILE=your_aws_config_profile_eg_default
export AWS_DEFAULT_REGION=your_aws_region_eg_ap-southeast-1
export ECS_CLUSTER_NAME=your_ec2_ecs_cluster_name
export ECS_LAUNCH_TYPE=FARGATE
export CREATE_IAM_ROLES=True
export ECS_CLUSTER_SECURITY_GROUP=your_security_group_eg_sg-xxxxxxxxxx
export ECS_CLUSTER_SUBNET=your_subnet_eg_subnet-xxxxxxxxxx
export ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
export ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name            

curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-awsvpc.yaml

aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-${ECS_LAUNCH_TYPE}-awsvpc \
    --template-body file://cwagent-ecs-prometheus-metric-for-awsvpc.yaml \
    --parameters ParameterKey=ECSClusterName,ParameterValue=${ECS_CLUSTER_NAME} \
                 ParameterKey=CreateIAMRoles,ParameterValue=${CREATE_IAM_ROLES} \
                 ParameterKey=ECSLaunchType,ParameterValue=${ECS_LAUNCH_TYPE} \
                 ParameterKey=SecurityGroupID,ParameterValue=${ECS_CLUSTER_SECURITY_GROUP} \
                 ParameterKey=SubnetID,ParameterValue=${ECS_CLUSTER_SUBNET} \
                 ParameterKey=TaskRoleName,ParameterValue=${ECS_TASK_ROLE_NAME} \
                 ParameterKey=ExecutionRoleName,ParameterValue=${ECS_EXECUTION_ROLE_NAME} \
    --capabilities CAPABILITY_NAMED_IAM \
    --region ${AWS_DEFAULT_REGION} \
    --profile ${AWS_PROFILE}
```

### AWS スタックによって作成された CloudFormation リソース
<a name="ContainerInsights-Prometheus-Setup-ECS-resources"></a>

次の表は、AWS を使用して Amazon ECS クラスターで Prometheus モニターリングを使用した Container Insights をセットアップするときに作成される CloudFormation リソースの一覧です。


| リソースタイプ | リソース名 | コメント | 
| --- | --- | --- | 
|  AWS::SSM::Parameter  |  AmazonCloudWatch-CWAgentConfig-\$1*ECS\$1CLUSTER\$1NAME*-\$1*ECS\$1LAUNCH\$1TYPE*-\$1*ECS\$1NETWORK\$1MODE*  |  これは、デフォルト App Mesh および Java/JMX 埋め込みメトリクス形式定義を持つ CloudWatch エージェントです。  | 
|  AWS::SSM::Parameter  |  AmazonCloudWatch-PrometheusConfigName-\$1*ECS\$1CLUSTER\$1NAME*-\$1*ECS\$1LAUNCH\$1TYPE*-\$1*ECS\$1NETWORK\$1MODE*  |  これは Prometheus のスクレイピング設定です。  | 
|  AWS::IAM::Role  |  **\$1ECS\$1TASK\$1ROLE\$1NAME**。  |  Amazon ECS タスクロール。これは、**True** に `CREATE_IAM_ROLES` を指定した場合にのみ作成されます 。  | 
|  AWS::IAM::Role  |  **\$1\$1ECS\$1EXECUTION\$1ROLE\$1NAME\$1**   |  Amazon ECS タスク実行ロール。これは、**True** に `CREATE_IAM_ROLES` を指定した場合にのみ作成されます 。  | 
|  AWS::ECS::TaskDefinition  |  cwagent-prometheus-\$1*ECS\$1CLUSTER\$1NAME*-\$1*ECS\$1LOUNCH\$1TYPE*-\$1*ECS\$1NETWORK\$1MODE*   |   | 
|  AWS::ECS::Service  |  cwagent-prometheus-replica-service-\$1*ECS\$1LAUNCH\$1TYPE*-\$1*ECS\$1NETWORK\$1MODE*  |   | 

### Prometheus モニターリングを使用した CloudWatch エージェントの CloudFormation スタックの削除
<a name="ContainerInsights-Prometheus-ECS-delete"></a>

Amazon ECS クラスターから CloudWatch エージェントを削除するには、次のコマンドを入力します。

```
export AWS_PROFILE=your_aws_config_profile_eg_default
export AWS_DEFAULT_REGION=your_aws_region_eg_ap-southeast-1
export CLOUDFORMATION_STACK_NAME=your_cloudformation_stack_name

aws cloudformation delete-stack \
--stack-name ${CLOUDFORMATION_STACK_NAME} \
--region ${AWS_DEFAULT_REGION} \
--profile ${AWS_PROFILE}
```

# 追加の Prometheus ソースのスクレイピングと、それらのメトリクスのインポート
<a name="ContainerInsights-Prometheus-Setup-configure-ECS"></a>

Prometheus モニターリングを使用した CloudWatch エージェントは、Prometheus メトリクスをスクレイプするために 2 つの設定が必要です。1 つは標準の Prometheus 設定用で、Prometheus ドキュメントの「[<scrape\$1config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config)」に記載されています。もう 1 つは CloudWatch エージェント設定用です。

Amazon ECS クラスターでは、設定は Amazon ECS タスク定義のシークレットによって AWS Systems Manager の Parameter Store と統合されます。
+ このシークレット `PROMETHEUS_CONFIG_CONTENT` は、Prometheus スクレイプ設定用です。
+ このシークレット `CW_CONFIG_CONTENT` は、 CloudWatch エージェント設定用です。

追加の Prometheus メトリクスソースをスクレイプし、それらのメトリクスを CloudWatch にインポートするには、Prometheus スクレイプ設定と CloudWatch エージェント設定の両方を変更し、更新された設定でエージェントを再デプロイします。

**VPC セキュリティグループの要件**

Prometheus ワークロードのセキュリティグループの受信ルールでは、Prometheus のメトリクスをプライベート IP でスクレイピングするために、CloudWatch エージェントへの Prometheus ポートを開く必要があります。

CloudWatch エージェントのセキュリティグループの出力ルールでは、CloudWatch エージェントがプライベート IP によって Prometheus ワークロードのポートに接続できるようにする必要があります。

## Prometheus スクレイプ設定
<a name="ContainerInsights-Prometheus-Setup-config-global"></a>

この CloudWatch エージェントは、Prometheus のドキュメントの「[<scrape\$1config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config)」に記載されているように、標準の Prometheus スクレイプ設定をサポートしています。このセクションを編集して、このファイルに既に含まれている設定を更新したり、Prometheus スクレイピングターゲットを追加したりできます。デフォルトでは、サンプル設定ファイルに次のグローバル設定行が含まれています。

```
global:
  scrape_interval: 1m
  scrape_timeout: 10s
```
+ **scrape\$1interval** – ターゲットをスクレイプする頻度を定義します。
+ **scrape\$1timeout** – スクレイプリクエストがタイムアウトするまでの待機時間を定義します。

また、ジョブレベルでこれらの設定に対して異なる値を定義し、グローバル設定をオーバーライドすることもできます。

### Prometheus スクレイピングジョブ
<a name="ContainerInsights-Prometheus-Setup-config-scrape"></a>

CloudWatch エージェント YAML ファイルには、既にいくつかのデフォルトのスクレイピングジョブが設定されています。例えば、`cwagent-ecs-prometheus-metric-for-bridge-host.yaml` などのAmazon ECS の YAML ファイルでは、デフォルトのスクレイピングジョブが `ecs_service_discovery` セクションで設定されています。

```
"ecs_service_discovery": {
                  "sd_frequency": "1m",
                  "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml",
                  "docker_label": {
                  },
                  "task_definition_list": [
                    {
                      "sd_job_name": "ecs-appmesh-colors",
                      "sd_metrics_ports": "9901",
                      "sd_task_definition_arn_pattern": ".*:task-definition\/.*-ColorTeller-(white):[0-9]+",
                      "sd_metrics_path": "/stats/prometheus"
                    },
                    {
                      "sd_job_name": "ecs-appmesh-gateway",
                      "sd_metrics_ports": "9901",
                      "sd_task_definition_arn_pattern": ".*:task-definition/.*-ColorGateway:[0-9]+",
                      "sd_metrics_path": "/stats/prometheus"
                    }
                  ]
                }
```

これらのデフォルトターゲットはそれぞれスクレイピングされ、メトリクスは埋め込みメトリクス形式を使用してログイベントで CloudWatch に送信されます。詳細については、「[ログ内へのメトリクスの埋め込み](CloudWatch_Embedded_Metric_Format.md)」を参照してください。

Amazon ECS クラスターからのログイベントは、[**/aws/ecs/containerinsights/*cluster\$1name*/prometheus**] ロググループに保存されます。

各スクレイピングジョブは、このロググループ内の異なるログストリームに含まれています。

新しいスクレイピングターゲットを追加するには、YAML ファイルの `task_definition_list` セクションの `ecs_service_discovery` セクションに新しいエントリを追加し、エージェントを再起動します。このプロセスの例については、「[新しい Prometheus スクレイピングターゲットを追加するためのチュートリアル: Prometheus API サーバーメトリクス](ContainerInsights-Prometheus-Setup-configure.md#ContainerInsights-Prometheus-Setup-new-exporters)」を参照してください。

## Prometheus の CloudWatch エージェント設定
<a name="ContainerInsights-Prometheus-Setup-cw-agent-config"></a>

CloudWatch エージェント設定ファイルには、Prometheus スクレイピング設定の `prometheus` の `metrics_collected` セクションがあります。これには、次の設定オプションが含まれます。
+ **cluster\$1name** – ログイベントのラベルとして追加されるクラスター名を指定します。このフィールドはオプションです。これを省略すると、エージェントは Amazon ECS クラスター名を検出できます。
+ **log\$1group\$1name** – スクレイプされた Prometheus メトリクスのロググループ名を指定します。このフィールドはオプションです。これを省略すると、CloudWatch では Amazon ECS クラスターからのログに**/aws/ecs/containerinsights/*cluster\$1name*/prometheus**が使用されます。
+ **prometheus\$1config\$1path** – Prometheus スクレイプ設定ファイルパスを指定します。このフィールドの値が `env:` で始まる場合、Prometheus スクレイプ設定ファイルの内容は、コンテナの環境変数から取得されます。このフィールドは変更しないでください。
+ **ecs\$1service\$1discovery** – Amazon ECS Prometheus ターゲット自動検出関数の設定を指定するセクションです。Prometheus ターゲットを検出するには、コンテナの docker ラベルに基づく検出と、Amazon ECS タスク定義の ARN 正規表現に基づく検出の 2 つのモードがサポートされています。2 つのモードを一緒に使用すると、CloudWatch エージェントは *\$1private\$1ip\$1:\$1port\$1/\$1metrics\$1path\$1* に基づいて検出されたターゲットの重複排除を行います。

  `ecs_service_discovery` セクションには、次のフィールドを含めることができます。
  + `sd_frequency` は、Prometheus エクスポーターを検出する頻度です。数値と単位サフィックスを指定します。例えば、`1m` の場合は 1 分に 1 回、`30s` の場合は 30 秒に 1 回です。有効な単位サフィックスは、`ns`、`us`、`ms`、`s`、`m`、`h` です。

    このフィールドはオプションです。デフォルト値は 60 秒 (1 分) です。
  + `sd_target_cluster` は、自動検出のターゲット Amazon ECS クラスター名です。このフィールドはオプションです。デフォルトは、CloudWatch エージェントがインストールされている Amazon ECS クラスターの名前です。
  + `sd_cluster_region` は、ターゲット Amazon ECS クラスターのリージョンです。このフィールドはオプションです。デフォルトは、CloudWatch エージェントがインストールされている Amazon ECS クラスターのリージョンです。
  + `sd_result_file` は、Prometheus ターゲット結果の YAML ファイルのパスです。Prometheus スクレイプ設定は、このファイルを参照します。
  + `docker_label` は、docker のラベルベースのサービス検出の設定を指定するために使用できるオプションのセクションです。このセクションを省略すると、docker のラベルベースの検出は使用されません。このセクションには、次のフィールドを含めることができます。
    + `sd_port_label` は、Prometheus メトリクスのコンテナポートを指定するコンテナの docker ラベル名です。デフォルト値は `ECS_PROMETHEUS_EXPORTER_PORT` です。コンテナにこの docker ラベルがない場合、CloudWatch エージェントはそれをスキップします。
    + `sd_metrics_path_label` は、Prometheus メトリクスパスを指定するコンテナの docker ラベル名です。デフォルト値は `ECS_PROMETHEUS_METRICS_PATH` です。コンテナにこの docker ラベルがない場合は、エージェントはデフォルトパス `/metrics` を想定します。
    + `sd_job_name_label` は、Prometheus スクレイプジョブ名を指定するコンテナの docker ラベル名です。デフォルト値は `job` です。コンテナにこの docker ラベルがない場合、CloudWatch エージェントは Prometheus スクレイプ設定でジョブ名を使用します。
  + `task_definition_list` は、タスク定義ベースのサービス検出の設定を指定するために使用できるオプションのセクションです。このセクションを省略すると、タスク定義ベースの検出は使用されません。このセクションには、次のフィールドを含めることができます。
    + `sd_task_definition_arn_pattern` は、検出する Amazon ECS タスク定義を指定するために使用するパターンです。これは正規表現です。
    + `sd_metrics_ports` に、Prometheus メトリクスの containerPort を示します。containerPort はセミコロンで区切ります。
    + `sd_container_name_pattern` は、Amazon ECS タスクコンテナ名を指定します。これは正規表現です。
    + `sd_metrics_path` は、Prometheus のメトリクスパスを指定します。これを省略すると、エージェントはデフォルトのパス `/metrics` を引き受けます。
    + `sd_job_name` Prometheus スクレイプジョブ名を指定します。このフィールドを省略すると、CloudWatch エージェントは Prometheus スクレイプ設定のジョブ名を使用します。
  + `service_name_list_for_tasks` は、サービス名ベースの検出の設定を指定するために使用できるオプションのセクションです。このセクションを省略すると、サービス名ベースの検出は使用されません。このセクションには、次のフィールドを含めることができます。
    + `sd_service_name_pattern` は、タスクを検出する Amazon ECS サービスを指定するために使用するパターンです。これは正規表現です。
    + `sd_metrics_ports` は、Prometheus メトリクスの `containerPort` をリストします。複数の `containerPorts` をセミコロンで区切ります。
    + `sd_container_name_pattern` は、Amazon ECS タスクコンテナ名を指定します。これは正規表現です。
    + `sd_metrics_path` は、Prometheus のメトリクスパスを指定します。これを省略すると、エージェントはデフォルトのパス `/metrics` を引き受けます。
    + `sd_job_name` Prometheus スクレイプジョブ名を指定します。このフィールドを省略すると、CloudWatch エージェントは Prometheus スクレイプ設定のジョブ名を使用します。
+ **metric\$1declaration** – 生成されるメトリクス形式が埋め込まれたログの配列を指定するセクションです。CloudWatch エージェントがインポートする各 Prometheus ソースには、デフォルトで `metric_declaration` セクションがあります。これらの各セクションには、次のフィールドが含まれています。
  + `label_matcher` は、 `source_labels` に表示されているラベルの値をチェックする正規表現です。一致するメトリクスは、CloudWatch に送信される埋め込みメトリクス形式に含めることができます。

    `source_labels` で複数のラベルを指定する場合は、`^` の正規表現に `$` や `label_matcher` 文字を使用しないことをお勧めします。
  + `source_labels` は、`label_matcher` 行によってチェックされるラベルの値を指定します。
  + `label_separator` は、複数の ` label_matcher` が指定されている場合に、`source_labels` 行で使用するセパレータを指定します。デフォルト: `;`。このデフォルトは、次の例の `label_matcher` 行で使用されています。
  + `metric_selectors` は、収集され、CloudWatch に送信されるメトリクスを指定する正規表現です。
  + `dimensions` は、選択した各メトリクスの CloudWatch ディメンションとして使用されるラベルのリストです。

次の `metric_declaration` の例を参照してください。

```
"metric_declaration": [
  {
     "source_labels":[ "Service", "Namespace"],
     "label_matcher":"(.*node-exporter.*|.*kube-dns.*);kube-system$",
     "dimensions":[
        ["Service", "Namespace"]
     ],
     "metric_selectors":[
        "^coredns_dns_request_type_count_total$"
     ]
  }
]
```

この例では、次の条件が満たされた場合にログイベントとして送信される埋め込みメトリクス形式セクションを設定します。
+ `Service` の値には `node-exporter` または `kube-dns` が含まれます。
+ `Namespace` の値は `kube-system` です。
+ Prometheus メトリクス `coredns_dns_request_type_count_total` には、`Service` ラベルおよび `Namespace` ラベルの両方が含まれます。

送信されるログイベントには、次の強調表示されたセクションが含まれます。

```
{
   "CloudWatchMetrics":[
      {
         "Metrics":[
            {
               "Name":"coredns_dns_request_type_count_total"
            }
         ],
         "Dimensions":[
            [
               "Namespace",
               "Service"
            ]
         ],
         "Namespace":"ContainerInsights/Prometheus"
      }
   ],
   "Namespace":"kube-system",
   "Service":"kube-dns",
   "coredns_dns_request_type_count_total":2562,
   "eks_amazonaws_com_component":"kube-dns",
   "instance":"192.168.61.254:9153",
   "job":"kubernetes-service-endpoints",
   ...
}
```

# Amazon ECS クラスターでの自動検出の詳細ガイド
<a name="ContainerInsights-Prometheus-Setup-autodiscovery-ecs"></a>

Prometheus には、[<scrape\$1config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config)で説明されているように、多数の動的なサービス検出メカニズムが用意されています。ただし、Amazon ECS の組み込みサービス検出はありません。CloudWatch エージェントはこのメカニズムを追加します。

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\$1sd\$1config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#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 のマニュアルの「[構成ファイル](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#labelname)」 の `label_name` に記載されている Prometheus の規則と一致します。

## ECS サービス検出の設定例
<a name="ContainerInsights-Prometheus-Setup-autodiscovery-ecs-examples"></a>

このセクションでは、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 設定で定義されているジョブ名が使用されます。

# (オプション) Prometheus メトリクスのテストのためにコンテナ化された Amazon ECS のサンプルワークロードを設定する
<a name="ContainerInsights-Prometheus-Sample-Workloads-ECS"></a>

CloudWatch Container Insights で Prometheus メトリクスのサポートをテストするには、次のコンテナ化されたワークロードを 1 つ以上設定できます。Prometheus をサポートする CloudWatch エージェントは、これらの各ワークロードからメトリクスを自動的に収集します。デフォルトで収集されるメトリクスを表示する方法については、「[CloudWatch エージェントにより収集される Prometheus メトリクス](ContainerInsights-Prometheus-metrics.md)」を参照してください。

**Topics**
+ [Amazon ECS クラスターの App Mesh ワークロードのサンプル](ContainerInsights-Prometheus-Sample-Workloads-ECS-appmesh.md)
+ [Amazon ECS クラスター用の Java/JMX ワークロードのサンプル](ContainerInsights-Prometheus-Sample-Workloads-ECS-javajmx.md)
+ [Amazon ECS クラスターの NGINX ワークロードのサンプル](ContainerInsights-Prometheus-Setup-nginx-ecs.md)
+ [Amazon ECS クラスターの NGINX Plus ワークロードのサンプル](ContainerInsights-Prometheus-Setup-nginx-plus-ecs.md)
+ [新しい Prometheus スクレイピングターゲットを追加するためのチュートリアル: Amazon ECS の Memcached](ContainerInsights-Prometheus-Setup-memcached-ecs.md)
+ [Amazon ECS Fargate 上の Redis OSS Prometheus メトリクスのスクレイピングに関するチュートリアル](ContainerInsights-Prometheus-Setup-redis-ecs.md)

# Amazon ECS クラスターの App Mesh ワークロードのサンプル
<a name="ContainerInsights-Prometheus-Sample-Workloads-ECS-appmesh"></a>

Amazon ECS のサンプル Prometheus ワークロードからメトリクスを収集するには、クラスターで Container Insights を実行している必要があります。Container Insights のインストールの詳細については、「[Amazon ECS での Container Insights のセットアップ](deploy-container-insights-ECS.md)」を参照してください。

まず、この[チュートリアル](https://github.com/aws/aws-app-mesh-examples/tree/main/examples/apps/colorapp#app-mesh-walkthrough-deploy-the-color-app-on-ecs)に従って、サンプルカラーアプリを Amazon ECS クラスターにデプロイします。完了したら、ポート 9901 に App Mesh Prometheus メトリクスが公開されます。

次に、以下のステップに従って、カラーアプリをインストールした同じ Amazon ECS クラスターに Prometheus モニターリングを使用して CloudWatch エージェントをインストールします。このセクションのステップでは、ブリッジネットワークモードで CloudWatch エージェントをインストールします。

チュートリアルで設定した環境変数 `ENVIRONMENT_NAME`、 `AWS_PROFILE`、`AWS_DEFAULT_REGION` は、次のステップでも使用されます。

**テスト用に Prometheus モニターリングを使用して CloudWatch エージェントをインストールするには**

1. 次のコマンドを入力して、CloudFormation テンプレートをダウンロードします。

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-bridge-host.yaml
   ```

1. 次のコマンドを入力して、ネットワークモードを設定します。

   ```
   export ECS_CLUSTER_NAME=${ENVIRONMENT_NAME}
   export ECS_NETWORK_MODE=bridge
   ```

1. 次のコマンドを入力して、CloudFormation スタックを作成します。

   ```
   aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
       --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=${ECS_CLUSTER_NAME} \
                    ParameterKey=CreateIAMRoles,ParameterValue=True \
                    ParameterKey=ECSNetworkMode,ParameterValue=${ECS_NETWORK_MODE} \
                    ParameterKey=TaskRoleName,ParameterValue=CWAgent-Prometheus-TaskRole-${ECS_CLUSTER_NAME} \
                    ParameterKey=ExecutionRoleName,ParameterValue=CWAgent-Prometheus-ExecutionRole-${ECS_CLUSTER_NAME} \
       --capabilities CAPABILITY_NAMED_IAM \
       --region ${AWS_DEFAULT_REGION} \
       --profile ${AWS_PROFILE}
   ```

1. (オプション) CloudFormation スタックが作成されると、 `CREATE_COMPLETE` メッセージが表示されます。そのメッセージが表示される前にステータスを確認する場合は、次のコマンドを入力します。

   ```
   aws cloudformation describe-stacks \
   --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
   --query 'Stacks[0].StackStatus' \
   --region ${AWS_DEFAULT_REGION} \
   --profile ${AWS_PROFILE}
   ```

**トラブルシューティング**

チュートリアルのステップでは、jq を使用して、 の出力結果を解析しますAWS CLI jq のインストールの詳細については、「[ jq](https://stedolan.github.io/jq/)」を参照してください。jq が正しく解析できるように、次のコマンドを使用して AWS CLI のデフォルトの出力形式を JSON に設定します。

```
$ aws configure
```

レスポンスが `Default output format` に到達したら、**json** と入力します 。

## Prometheus モニターリングを使用した CloudWatch エージェントのアンインストール
<a name="ContainerInsights-Prometheus-Sample-Workloads-ECS-appmesh-uninstall"></a>

テストが終了したら、次のコマンドを入力し、CloudFormation スタックを削除して CloudWatch エージェントをアンインストールします。

```
aws cloudformation delete-stack \
--stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
--region ${AWS_DEFAULT_REGION} \
--profile ${AWS_PROFILE}
```

# Amazon ECS クラスター用の Java/JMX ワークロードのサンプル
<a name="ContainerInsights-Prometheus-Sample-Workloads-ECS-javajmx"></a>

JMX Exporter は、Prometheus メトリクスとして JMX mBeans をスクレイプおよび公開できる公式の Prometheus エクスポーターです。詳細については、[prometheus/jmx\$1exporter](https://github.com/prometheus/jmx_exporter) を参照してください。

Prometheus をサポートする CloudWatch エージェントは、Amazon ECS クラスターのサービス検出設定に基づいて Java/JMX Prometheus メトリクスをスクレイプします。別のポートまたは metrics\$1path でメトリクスを公開するように JMX Exporter を設定できます。ポートまたはパスを変更する場合は、CloudWatch エージェント設定のデフォルトの `ecs_service_discovery` セクションを更新します。

Amazon ECS のサンプル Prometheus ワークロードからメトリクスを収集するには、クラスターで Container Insights を実行している必要があります。Container Insights のインストールの詳細については、「[Amazon ECS での Container Insights のセットアップ](deploy-container-insights-ECS.md)」を参照してください。

**Amazon ECS クラスターの Java/JMX サンプルワークロードをインストールするには**

1. これらのセクションのステップに従って、Docker イメージを作成します。
   + [例: Prometheus メトリクスを使用した Java Jar アプリケーション Docker イメージ](ContainerInsights-Prometheus-Sample-Workloads-javajmx.md#ContainerInsights-Prometheus-Sample-Workloads-javajmx-jar)
   + [例: Prometheus メトリクスを使用した Apache Tomcat Docker イメージ](ContainerInsights-Prometheus-Sample-Workloads-javajmx.md#ContainerInsights-Prometheus-Sample-Workloads-javajmx-tomcat)

1. Amazon ECS タスク定義ファイルに次の 2 つの docker ラベルを指定します。その後、クラスター内で Amazon ECS サービスまたは Amazon ECS タスクとしてタスク定義を実行できます。
   + Prometheus メトリクスが公開されている ContainerPort を指定するように`ECS_PROMETHEUS_EXPORTER_PORT` を設定します 。
   + `Java_EMF_Metrics` を `true` に設定します。CloudWatch エージェントは、このフラグを使用してログイベントに埋め込みメトリクス形式を生成します。

   次に例を示します。

   ```
   {
     "family": "workload-java-ec2-bridge",
     "taskRoleArn": "{{task-role-arn}}",
     "executionRoleArn": "{{execution-role-arn}}",
     "networkMode": "bridge",
     "containerDefinitions": [
       {
         "name": "tomcat-prometheus-workload-java-ec2-bridge-dynamic-port",
         "image": "your_docker_image_tag_for_tomcat_with_prometheus_metrics",
         "portMappings": [
           {
             "hostPort": 0,
             "protocol": "tcp",
             "containerPort": 9404
           }
         ],
         "dockerLabels": {
           "ECS_PROMETHEUS_EXPORTER_PORT": "9404",
           "Java_EMF_Metrics": "true"
         }
       }
     ],
     "requiresCompatibilities": [
       "EC2"  ],
     "cpu": "256",
     "memory": "512"
     }
   ```

CloudFormation テンプレートの CloudWatch エージェントのデフォルト設定では、docker のラベルベースのサービス検出とタスク定義の ARN ベースのサービス検出の両方が有効になります。これらのデフォルト設定を表示するには、「[CloudWatch エージェント YAML 設定ファイル](https://github.com/aws-samples/amazon-cloudwatch-container-insights/blob/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-bridge-host.yaml#L65)」の 65 行目を参照してください。`ECS_PROMETHEUS_EXPORTER_PORT` ラベル付きのコンテナは、Prometheus スクレイピング用に指定されたコンテナポートに基づいて自動検出されます。

CloudWatch エージェントのデフォルト設定には、同じファイルの 112 行目に Java/JMX の `metric_declaration` 設定もあります。ターゲットコンテナのすべての docker ラベルは、Prometheus メトリクスに追加ラベルとして追加され、CloudWatch Logs に送信されます。docker ラベル `Java_EMF_Metrics=“true”` 付きの Java/JMX コンテナの場合、埋め込みメトリクス形式が生成されます。

# Amazon ECS クラスターの NGINX ワークロードのサンプル
<a name="ContainerInsights-Prometheus-Setup-nginx-ecs"></a>

NGINX Prometheus エクスポーターは、NGINX データを Prometheus のメトリクスとしてスクレイピングして公開できます。この例では、エクスポーターを Amazon ECS 用の NGINX リバースプロキシサービスと連動させて使用します。

NGINX Prometheus エクスポーターの詳細については、GitHub の [nginx-prometheus-exporter](https://github.com/nginxinc/nginx-prometheus-exporter) をご参照ください。NGINX リバースプロキシの詳細については、GitHub の [ecs-nginx-reverse-proxy](https://github.com/awslabs/ecs-nginx-reverse-proxy)をご参照ください。

Prometheus をサポートする CloudWatch エージェントは、Amazon ECS クラスターのサービス検出設定に基づいて NGINX Prometheus メトリクスをスクレイプします。別のポートまたはパスでメトリクスを公開するように NGINX Prometheus Exporter を設定できます。ポートまたはパスを変更する場合は、CloudWatch エージェント設定ファイルの `ecs_service_discovery` セクションを更新します。

## Amazon ECS クラスター用の NGINX リバースプロキシサンプルワークロードをインストールする
<a name="ContainerInsights-Prometheus-nginx-ecs-setup"></a>

NGINX リバースプロキシサンプルワークロードをインストールするには、次の手順を実行します。

### Docker イメージを作成する
<a name="ContainerInsights-Prometheus-nginx-ecs-setup-docker"></a>

**NGINX リバースプロキシサンプルワークロード用の Docker イメージを作成するには**

1. NGINX リバースプロキシリポジトリから次のフォルダをダウンロードします: [ https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/](https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/)。

1. `app` ディレクトリを検索し、そのディレクトリからイメージを作成します。

   ```
   docker build -t web-server-app ./path-to-app-directory
   ```

1. NGINX 用のカスタムイメージを作成します。まず、次の 2 つのファイルを含むディレクトリを作成します。
   + サンプル Dockerfile:

     ```
     FROM nginx
     COPY nginx.conf /etc/nginx/nginx.conf
     ```
   + [https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/](https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/) から変更された `nginx.conf` ファイル:

     ```
     events {
       worker_connections 768;
     }
     
     http {
       # Nginx will handle gzip compression of responses from the app server
       gzip on;
       gzip_proxied any;
       gzip_types text/plain application/json;
       gzip_min_length 1000;
     
       server{
         listen 8080;
         location /stub_status {
             stub_status   on;
         }
       }
     
       server {
         listen 80;
     
         # Nginx will reject anything not matching /api
         location /api {
           # Reject requests with unsupported HTTP method
           if ($request_method !~ ^(GET|POST|HEAD|OPTIONS|PUT|DELETE)$) {
             return 405;
           }
     
           # Only requests matching the whitelist expectations will
           # get sent to the application server
           proxy_pass http://app:3000;
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection 'upgrade';
           proxy_set_header Host $host;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_cache_bypass $http_upgrade;
         }
       }
     }
     ```
**注記**  
`stub_status` は、`nginx-prometheus-exporter` がメトリクスをスクレイピングするように設定されているのと同じポートで有効にする必要があります。このタスク定義例では、`nginx-prometheus-exporter` がポート 8080 からメトリクスをスクレイピングするように設定されています。

1. 新しいディレクトリのファイルからイメージを作成します。

   ```
   docker build -t nginx-reverse-proxy ./path-to-your-directory
   ```

1. 後で使用するために、新しいイメージをイメージリポジトリにアップロードします。

### Amazon ECS で NGINX とウェブサーバーアプリを実行するタスク定義を作成します。
<a name="ContainerInsights-Prometheus-nginx-ecs-setup-task"></a>

次に、タスク定義を設定します。

このタスク定義により、NGINX Prometheus メトリクスの収集とエクスポートが可能になります。NGINX コンテナは、アプリからの入力を追跡し、(`nginx.conf` で設定されているとおり) そのデータをポート 8080 に公開します。NGINX Prometheus エクスポーターコンテナは、CloudWatch で使用するために、これらのメトリクスをスクレイピングし、ポート 9113 に投稿します。

**NGINX サンプル Amazon ECS ワークロードのタスク定義を設定するには**

1. 次の内容でタスク定義 JSON ファイルを作成します。*your-customized-nginx-iamge* をカスタマイズした NGINX イメージのイメージ URI に置き換え、*your-web-server-app-image* をウェブサーバーアプリイメージのイメージ URI に置き換えます。

   ```
   {
     "containerDefinitions": [
       {
         "name": "nginx",
         "image": "your-customized-nginx-image",
         "memory": 256,
         "cpu": 256,
         "essential": true,
         "portMappings": [
           {
             "containerPort": 80,
             "protocol": "tcp"
           }
         ],
         "links": [
           "app"
         ]
       },
       {
         "name": "app",
         "image": "your-web-server-app-image",
         "memory": 256,
         "cpu": 256,
         "essential": true
       },
       {
         "name": "nginx-prometheus-exporter",
         "image": "docker.io/nginx/nginx-prometheus-exporter:0.8.0",
         "memory": 256,
         "cpu": 256,
         "essential": true,
         "command": [
           "-nginx.scrape-uri",
           "http://nginx:8080/stub_status"
       ],
       "links":[
         "nginx"
       ],
         "portMappings":[
           {
             "containerPort": 9113,
             "protocol": "tcp"
           }
         ]
       }
     ],
     "networkMode": "bridge",
     "placementConstraints": [],
     "family": "nginx-sample-stack"
   }
   ```

1. 次のコマンドを入力して、タスク定義を登録します。

   ```
   aws ecs register-task-definition --cli-input-json file://path-to-your-task-definition-json
   ```

1. 次のコマンドを入力して、タスクを実行するサービスを作成します。

   サービス名は変更しないでください。CloudWatch エージェントサービスは、タスクを開始したサービスの名前パターンを使用してタスクを検索する設定を使用して実行します。例えば、このコマンドによって起動されたタスクを CloudWatch エージェントが検出するには、`sd_service_name_pattern` の値を `^nginx-service$` に指定します。次のセクションでは、詳細を説明します。

   ```
   aws ecs create-service \
    --cluster your-cluster-name \
    --service-name nginx-service \
    --task-definition nginx-sample-stack:1 \
    --desired-count 1
   ```

### NGINX Prometheus メトリクスをスクレイプするように CloudWatch エージェントを設定する
<a name="ContainerInsights-Prometheus-nginx-ecs-setup-agent"></a>

最後のステップでは、NGINX メトリクスをスクレイピングするように CloudWatch エージェントを設定します。この例では、CloudWatch エージェントはサービス名パターンとポート 9113 を使用してタスクを検出します。このポートでは、エクスポーターは NGINX の Prometheus メトリクスを公開します。タスクが検出され、メトリクスが使用可能になると、CloudWatch エージェントは、ログストリーム **nginx-prometheus-exporter** への収集したメトリクスの投稿を開始します。

**NGINX メトリクスをスクレイピングするように CloudWatch エージェントを設定するには**

1. 次のコマンドを入力して、必要な YAML ファイルの最新バージョンをダウンロードします。

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-bridge-host.yaml
   ```

1. テキストエディタでファイルを開き、`value` セクションの `resource:CWAgentConfigSSMParameter` キーにある完全な CloudWatch エージェント設定を見つけます。その後、`ecs_service_discovery` セクションで、次の `service_name_list_for_tasks` セクションを追加します。

   ```
   "service_name_list_for_tasks": [
     {
       "sd_job_name": "nginx-prometheus-exporter",
       "sd_metrics_path": "/metrics",
       "sd_metrics_ports": "9113",
       "sd_service_name_pattern": "^nginx-service$"
      }
   ],
   ```

1. 同じファイルで、`metric_declaration` セクションに次のセクションを追加して、NGINX メトリクスを許可します。デフォルトのインデントパターンに従ってください。

   ```
   {
     "source_labels": ["job"],
     "label_matcher": ".*nginx.*",
     "dimensions": [["ClusterName", "TaskDefinitionFamily", "ServiceName"]],
     "metric_selectors": [
       "^nginx_.*$"
     ]
   },
   ```

1. このクラスターにまだ CloudWatch エージェントがデプロイされていない場合は、ステップ 8 に進みます。

   AWS CloudFormation を使用することによって Amazon ECS クラスターに CloudWatch エージェントを既にデプロイしている場合は、次のコマンドを入力して変更セットを作成できます。

   ```
   ECS_CLUSTER_NAME=your_cluster_name
   AWS_REGION=your_aws_region
   ECS_NETWORK_MODE=bridge
   CREATE_IAM_ROLES=True
   ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
   ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name
   
   aws cloudformation create-change-set --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
       --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                    ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \
                    ParameterKey=ECSNetworkMode,ParameterValue=$ECS_NETWORK_MODE \
                    ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \
                    ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \
       --capabilities CAPABILITY_NAMED_IAM \
       --region $AWS_REGION \
       --change-set-name nginx-scraping-support
   ```

1. [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) で CloudFormation コンソール を開きます。

1. 新しく作成されたチェンジセット **nginx-scraping-support** を確認します。**CWAgentConfigSSMParameter** リソースに適用された変更が 1 つ表示されます。次のコマンドを入力して、変更セットを実行し、CloudWatch エージェントタスクを再起動します。

   ```
   aws ecs update-service --cluster $ECS_CLUSTER_NAME \
   --desired-count 0 \
   --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \
   --region $AWS_REGION
   ```

1. 10 秒ほど待ってから、次のコマンドを入力します。

   ```
   aws ecs update-service --cluster $ECS_CLUSTER_NAME \
   --desired-count 1 \
   --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \
   --region $AWS_REGION
   ```

1. クラスターの Prometheus メトリクス収集を使用して CloudWatch エージェントを初めてインストールする場合は、次のコマンドを入力します。

   ```
   ECS_CLUSTER_NAME=your_cluster_name
   AWS_REGION=your_aws_region
   ECS_NETWORK_MODE=bridge
   CREATE_IAM_ROLES=True
   ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
   ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name
   
   aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
       --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                    ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \
                    ParameterKey=ECSNetworkMode,ParameterValue=$ECS_NETWORK_MODE \
                    ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \
                    ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \
       --capabilities CAPABILITY_NAMED_IAM \
       --region $AWS_REGION
   ```

## NGINX メトリクスとログの表示
<a name="ContainerInsights-Prometheus-Setup-nginx-view"></a>

これで、収集されている NGINX メトリクスを表示できるようになりました。

**サンプル NGINX ワークロードのメトリクスを表示するには**

1. CloudWatch コンソールの [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) を開いてください。

1. クラスターが実行されているリージョンにおいて、左のナビゲーションペインで [**Metrics**] (メトリクス) を選択します。**ContainerInsights/Prometheus** 名前空間を検索して、メトリクスを確認します。

1. CloudWatch Logs イベントを表示するには、ナビゲーションペインで [**Log Groups (ロググループ)**] を選択します。イベントは、ログストリーム *nginx-prometheus-exporter* のロググループ **/aws/containerinsights/*your\$1cluster\$1name*/prometheus** にあります。

# Amazon ECS クラスターの NGINX Plus ワークロードのサンプル
<a name="ContainerInsights-Prometheus-Setup-nginx-plus-ecs"></a>

NGINX Plus は NGINX の商用バージョンです。これを使用するには、ライセンスが必要です。詳細については、「[NGINX Plus](https://www.nginx.com/products/nginx/)」をご参照ください。

NGINX Prometheus エクスポーターは、NGINX データを Prometheus のメトリクスとしてスクレイピングして公開できます。この例では、エクスポーターを Amazon ECS 用の NGINX Plus リバースプロキシサービスと連動させて使用します。

NGINX Prometheus エクスポーターの詳細については、GitHub の [nginx-prometheus-exporter](https://github.com/nginxinc/nginx-prometheus-exporter) をご参照ください。NGINX リバースプロキシの詳細については、GitHub の [ecs-nginx-reverse-proxy](https://github.com/awslabs/ecs-nginx-reverse-proxy)をご参照ください。

Prometheus をサポートする CloudWatch エージェントは、Amazon ECS クラスターのサービス検出設定に基づいて NGINX Plus Prometheus メトリクスをスクレイプします。別のポートまたはパスでメトリクスを公開するように NGINX Prometheus Exporter を設定できます。ポートまたはパスを変更する場合は、CloudWatch エージェント設定ファイルの `ecs_service_discovery` セクションを更新します。

## Amazon ECS クラスター用の NGINX Plus リバースプロキシサンプルワークロードをインストールする
<a name="ContainerInsights-Prometheus-nginx-plus-ecs-setup"></a>

NGINX リバースプロキシサンプルワークロードをインストールするには、次の手順を実行します。

### Docker イメージを作成する
<a name="ContainerInsights-Prometheus-nginx-plus-ecs-setup-docker"></a>

**NGINX Plus リバースプロキシサンプルワークロード用の Docker イメージを作成するには**

1. NGINX リバースプロキシリポジトリから次のフォルダをダウンロードします: [ https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/](https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/)。

1. `app` ディレクトリを検索し、そのディレクトリからイメージを作成します。

   ```
   docker build -t web-server-app ./path-to-app-directory
   ```

1. NGINX Plus 用のカスタムイメージを作成します。NGINX Plus のイメージを作成する前に、ライセンスされている NGINX Plus の `nginx-repo.key` という名前のキーと SSL 証明書 `nginx-repo.crt` を取得する必要があります。ディレクトリを作成し、その中に `nginx-repo.key` ファイルと `nginx-repo.crt` ファイルを格納します。

   作成したディレクトリに、次の 2 つのファイルを作成します。
   + 以下の内容を含むサンプル Dockerfile。この docker ファイルは [https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-docker/\$1docker\$1plus\$1image](https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-docker/#docker_plus_image) で提供されているサンプルファイルから採用されています。実行する重要な変更は、次のステップで作成される `nginx.conf` と呼ばれる別個のファイルをロードすることです。

     ```
     FROM debian:buster-slim
     
     LABEL maintainer="NGINX Docker Maintainers <docker-maint@nginx.com>“
     
     # Define NGINX versions for NGINX Plus and NGINX Plus modules
     # Uncomment this block and the versioned nginxPackages block in the main RUN
     # instruction to install a specific release
     # ENV NGINX_VERSION 21
     # ENV NJS_VERSION 0.3.9
     # ENV PKG_RELEASE 1~buster
     
     # Download certificate and key from the customer portal (https://cs.nginx.com (https://cs.nginx.com/))
     # and copy to the build context
     COPY nginx-repo.crt /etc/ssl/nginx/
     COPY nginx-repo.key /etc/ssl/nginx/
     # COPY nginx.conf /etc/ssl/nginx/nginx.conf
     
     RUN set -x \
     # Create nginx user/group first, to be consistent throughout Docker variants
     && addgroup --system --gid 101 nginx \
     && adduser --system --disabled-login --ingroup nginx --no-create-home --home /nonexistent --gecos "nginx user" --shell /bin/false --uid 101 nginx \
     && apt-get update \
     && apt-get install --no-install-recommends --no-install-suggests -y ca-certificates gnupg1 \
     && \
     NGINX_GPGKEY=573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62; \
     found=''; \
     for server in \
     ha.pool.sks-keyservers.net (http://ha.pool.sks-keyservers.net/) \
     hkp://keyserver.ubuntu.com:80 \
     hkp://p80.pool.sks-keyservers.net:80 \
     pgp.mit.edu (http://pgp.mit.edu/) \
     ; do \
     echo "Fetching GPG key $NGINX_GPGKEY from $server"; \
     apt-key adv --keyserver "$server" --keyserver-options timeout=10 --recv-keys "$NGINX_GPGKEY" && found=yes && break; \
     done; \
     test -z "$found" && echo >&2 "error: failed to fetch GPG key $NGINX_GPGKEY" && exit 1; \
     apt-get remove --purge --auto-remove -y gnupg1 && rm -rf /var/lib/apt/lists/* \
     # Install the latest release of NGINX Plus and/or NGINX Plus modules
     # Uncomment individual modules if necessary
     # Use versioned packages over defaults to specify a release
     && nginxPackages=" \
     nginx-plus \
     # nginx-plus=${NGINX_VERSION}-${PKG_RELEASE} \
     # nginx-plus-module-xslt \
     # nginx-plus-module-xslt=${NGINX_VERSION}-${PKG_RELEASE} \
     # nginx-plus-module-geoip \
     # nginx-plus-module-geoip=${NGINX_VERSION}-${PKG_RELEASE} \
     # nginx-plus-module-image-filter \
     # nginx-plus-module-image-filter=${NGINX_VERSION}-${PKG_RELEASE} \
     # nginx-plus-module-perl \
     # nginx-plus-module-perl=${NGINX_VERSION}-${PKG_RELEASE} \
     # nginx-plus-module-njs \
     # nginx-plus-module-njs=${NGINX_VERSION}+${NJS_VERSION}-${PKG_RELEASE} \
     " \
     && echo "Acquire::https::plus-pkgs.nginx.com::Verify-Peer \"true\";" >> /etc/apt/apt.conf.d/90nginx \
     && echo "Acquire::https::plus-pkgs.nginx.com::Verify-Host \"true\";" >> /etc/apt/apt.conf.d/90nginx \
     && echo "Acquire::https::plus-pkgs.nginx.com::SslCert \"/etc/ssl/nginx/nginx-repo.crt\";" >> /etc/apt/apt.conf.d/90nginx \
     && echo "Acquire::https::plus-pkgs.nginx.com::SslKey \"/etc/ssl/nginx/nginx-repo.key\";" >> /etc/apt/apt.conf.d/90nginx \
     && printf "deb https://plus-pkgs.nginx.com/debian buster nginx-plus\n" > /etc/apt/sources.list.d/nginx-plus.list \
     && apt-get update \
     && apt-get install --no-install-recommends --no-install-suggests -y \
     $nginxPackages \
     gettext-base \
     curl \
     && apt-get remove --purge --auto-remove -y && rm -rf /var/lib/apt/lists/* /etc/apt/sources.list.d/nginx-plus.list \
     && rm -rf /etc/apt/apt.conf.d/90nginx /etc/ssl/nginx
     
     # Forward request logs to Docker log collector
     RUN ln -sf /dev/stdout /var/log/nginx/access.log \
     && ln -sf /dev/stderr /var/log/nginx/error.log
     
     COPY nginx.conf /etc/nginx/nginx.conf
     
     EXPOSE 80
     
     STOPSIGNAL SIGTERM
     
     CMD ["nginx", "-g", "daemon off;"]
     ```
   + [https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/nginx](https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/nginx) から変更された `nginx.conf` ファイル:

     ```
     events {
       worker_connections 768;
     }
     
     http {
       # Nginx will handle gzip compression of responses from the app server
       gzip on;
       gzip_proxied any;
       gzip_types text/plain application/json;
       gzip_min_length 1000;
     
       upstream backend {
         zone name 10m;
         server app:3000    weight=2;
         server app2:3000    weight=1;
       }
     
       server{
         listen 8080;
         location /api {
           api write=on;
         }
       }
     
       match server_ok {
         status 100-599;
       }
     
       server {
         listen 80;
         status_zone zone;
         # Nginx will reject anything not matching /api
         location /api {
           # Reject requests with unsupported HTTP method
           if ($request_method !~ ^(GET|POST|HEAD|OPTIONS|PUT|DELETE)$) {
             return 405;
           }
     
           # Only requests matching the whitelist expectations will
           # get sent to the application server
           proxy_pass http://backend;
           health_check uri=/lorem-ipsum match=server_ok;
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection 'upgrade';
           proxy_set_header Host $host;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_cache_bypass $http_upgrade;
         }
       }
     }
     ```

1. 新しいディレクトリのファイルからイメージを作成します。

   ```
   docker build -t nginx-plus-reverse-proxy ./path-to-your-directory
   ```

1. 後で使用するために、新しいイメージをイメージリポジトリにアップロードします。

### Amazon ECS で NGINX Plus とウェブサーバーアプリを実行するタスク定義を作成します。
<a name="ContainerInsights-Prometheus-nginx-plus-ecs-setup-task"></a>

次に、タスク定義を設定します。

このタスク定義により、NGINX Plus Prometheus メトリクスの収集とエクスポートが可能になります。NGINX コンテナは、アプリからの入力を追跡し、(`nginx.conf` で設定されているとおり) そのデータをポート 8080 に公開します。NGINX Prometheus エクスポーターコンテナは、CloudWatch で使用するために、これらのメトリクスをスクレイピングし、ポート 9113 に投稿します。

**NGINX サンプル Amazon ECS ワークロードのタスク定義を設定するには**

1. 次の内容でタスク定義 JSON ファイルを作成します。*your-customized-nginx-plus-image* をカスタマイズした NGINX Plus イメージのイメージ URI に置き換え、*your-web-server-app-image* をウェブサーバーアプリイメージのイメージ URI に置き換えます。

   ```
   {
     "containerDefinitions": [
       {
         "name": "nginx",
         "image": "your-customized-nginx-plus-image",
         "memory": 256,
         "cpu": 256,
         "essential": true,
         "portMappings": [
           {
             "containerPort": 80,
             "protocol": "tcp"
           }
         ],
         "links": [
           "app",
           "app2"
         ]
       },
       {
         "name": "app",
         "image": "your-web-server-app-image",
         "memory": 256,
         "cpu": 128,
         "essential": true
       },
       {
         "name": "app2",
         "image": "your-web-server-app-image",
         "memory": 256,
         "cpu": 128,
         "essential": true
       },
       {
         "name": "nginx-prometheus-exporter",
         "image": "docker.io/nginx/nginx-prometheus-exporter:0.8.0",
         "memory": 256,
         "cpu": 256,
         "essential": true,
         "command": [
           "-nginx.plus",
           "-nginx.scrape-uri",
            "http://nginx:8080/api"
       ],
       "links":[
         "nginx"
       ],
         "portMappings":[
           {
             "containerPort": 9113,
             "protocol": "tcp"
           }
         ]
       }
     ],
     "networkMode": "bridge",
     "placementConstraints": [],
     "family": "nginx-plus-sample-stack"
   }
   ```

1. タスク定義を登録します。

   ```
   aws ecs register-task-definition --cli-input-json file://path-to-your-task-definition-json
   ```

1. 次のコマンドを入力して、タスクを実行するサービスを作成します。

   ```
   aws ecs create-service \
    --cluster your-cluster-name \
    --service-name nginx-plus-service \
    --task-definition nginx-plus-sample-stack:1 \
    --desired-count 1
   ```

   サービス名は変更しないでください。CloudWatch エージェントサービスは、タスクを開始したサービスの名前パターンを使用してタスクを検索する設定を使用して実行します。例えば、このコマンドによって起動されたタスクを CloudWatch エージェントが検出するには、`sd_service_name_pattern` の値を `^nginx-plus-service$` に指定します。次のセクションでは、詳細を説明します。

### NGINX Plus Prometheus メトリクスをスクレイプするように CloudWatch エージェントを設定する
<a name="ContainerInsights-Prometheus-nginx-plus-ecs-setup-agent"></a>

最後のステップでは、NGINX メトリクスをスクレイピングするように CloudWatch エージェントを設定します。この例では、CloudWatch エージェントはサービス名パターンとポート 9113 を使用してタスクを検出します。このポートでは、エクスポーターは NGINX の Prometheus メトリクスを公開します。タスクが検出され、メトリクスが使用可能になると、CloudWatch エージェントは、ログストリーム **nginx-prometheus-exporter** への収集したメトリクスの投稿を開始します。

**NGINX メトリクスをスクレイピングするように CloudWatch エージェントを設定するには**

1. 次のコマンドを入力して、必要な YAML ファイルの最新バージョンをダウンロードします。

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-bridge-host.yaml
   ```

1. テキストエディタでファイルを開き、`value` セクションの `resource:CWAgentConfigSSMParameter` キーにある完全な CloudWatch エージェント設定を見つけます。その後、`ecs_service_discovery` セクションで、次の `service_name_list_for_tasks` セクションを追加します。

   ```
   "service_name_list_for_tasks": [
     {
       "sd_job_name": "nginx-plus-prometheus-exporter",
       "sd_metrics_path": "/metrics",
       "sd_metrics_ports": "9113",
       "sd_service_name_pattern": "^nginx-plus.*"
      }
   ],
   ```

1. 同じファイルで、`metric_declaration` セクションに次のセクションを追加して、NGINX Plus メトリクスを許可します。デフォルトのインデントパターンに従ってください。

   ```
   {
     "source_labels": ["job"],
     "label_matcher": "^nginx-plus.*",
     "dimensions": [["ClusterName", "TaskDefinitionFamily", "ServiceName"]],
     "metric_selectors": [
       "^nginxplus_connections_accepted$",
       "^nginxplus_connections_active$",
       "^nginxplus_connections_dropped$",
       "^nginxplus_connections_idle$",
       "^nginxplus_http_requests_total$",
       "^nginxplus_ssl_handshakes$",
       "^nginxplus_ssl_handshakes_failed$",
       "^nginxplus_up$",
       "^nginxplus_upstream_server_health_checks_fails$"
     ]
   },
   {
     "source_labels": ["job"],
     "label_matcher": "^nginx-plus.*",
     "dimensions": [["ClusterName", "TaskDefinitionFamily", "ServiceName", "upstream"]],
     "metric_selectors": [
       "^nginxplus_upstream_server_response_time$"
     ]
   },
   {
     "source_labels": ["job"],
     "label_matcher": "^nginx-plus.*",
     "dimensions": [["ClusterName", "TaskDefinitionFamily", "ServiceName", "code"]],
     "metric_selectors": [
       "^nginxplus_upstream_server_responses$",
       "^nginxplus_server_zone_responses$"
     ]
   },
   ```

1. このクラスターにまだ CloudWatch エージェントがデプロイされていない場合は、ステップ 8 に進みます。

   AWS CloudFormation を使用することによって Amazon ECS クラスターに CloudWatch エージェントを既にデプロイしている場合は、次のコマンドを入力して変更セットを作成できます。

   ```
   ECS_CLUSTER_NAME=your_cluster_name
   AWS_REGION=your_aws_region
   ECS_NETWORK_MODE=bridge
   CREATE_IAM_ROLES=True
   ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
   ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name
   
   aws cloudformation create-change-set --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
       --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                    ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \
                    ParameterKey=ECSNetworkMode,ParameterValue=$ECS_NETWORK_MODE \
                    ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \
                    ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \
       --capabilities CAPABILITY_NAMED_IAM \
       --region $AWS_REGION \
       --change-set-name nginx-plus-scraping-support
   ```

1. [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) で CloudFormation コンソール を開きます。

1. 新しく作成されたチェンジセット **nginx-plus-scraping-support** を確認します。**CWAgentConfigSSMParameter** リソースに適用された変更が 1 つ表示されます。次のコマンドを入力して、変更セットを実行し、CloudWatch エージェントタスクを再起動します。

   ```
   aws ecs update-service --cluster $ECS_CLUSTER_NAME \
   --desired-count 0 \
   --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \
   --region $AWS_REGION
   ```

1. 10 秒ほど待ってから、次のコマンドを入力します。

   ```
   aws ecs update-service --cluster $ECS_CLUSTER_NAME \
   --desired-count 1 \
   --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \
   --region $AWS_REGION
   ```

1. クラスターの Prometheus メトリクス収集を使用して CloudWatch エージェントを初めてインストールする場合は、次のコマンドを入力します。

   ```
   ECS_CLUSTER_NAME=your_cluster_name
   AWS_REGION=your_aws_region
   ECS_NETWORK_MODE=bridge
   CREATE_IAM_ROLES=True
   ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
   ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name
   
   aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
       --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                    ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \
                    ParameterKey=ECSNetworkMode,ParameterValue=$ECS_NETWORK_MODE \
                    ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \
                    ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \
       --capabilities CAPABILITY_NAMED_IAM \
       --region $AWS_REGION
   ```

## NGINX Plus メトリクスとログの表示
<a name="ContainerInsights-Prometheus-Setup-nginx-plus-view"></a>

これで、収集されている NGINX Plus メトリクスを表示できるようになりました。

**サンプル NGINX ワークロードのメトリクスを表示するには**

1. CloudWatch コンソールの [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) を開いてください。

1. クラスターが実行されているリージョンにおいて、左のナビゲーションペインで [**Metrics**] (メトリクス) を選択します。**ContainerInsights/Prometheus** 名前空間を検索して、メトリクスを確認します。

1. CloudWatch Logs イベントを表示するには、ナビゲーションペインで [**Log Groups (ロググループ)**] を選択します。イベントは、ログストリーム *nginx-plus-prometheus-exporter* のロググループ **/aws/containerinsights/*your\$1cluster\$1name*/prometheus** にあります。

# 新しい Prometheus スクレイピングターゲットを追加するためのチュートリアル: Amazon ECS の Memcached
<a name="ContainerInsights-Prometheus-Setup-memcached-ecs"></a>

このチュートリアルでは、EC2 起動タイプの Amazon ECS クラスター上のサンプル Memcached アプリケーションの Prometheus メトリクスをスクレイプする実践的な紹介を提供します。Memcached Prometheus エクスポーターのターゲットは、ECS タスク定義ベースのサービス検出によって CloudWatch エージェントによって自動検出されます。

Memcached は、汎用分散メモリキャッシュシステムです。多くの場合、データおよびオブジェクトを RAM にキャッシュし、外部データソース (データベースや API など) を読み取る回数を減らすことで、動的なデータベース駆動のウェブサイトを高速化するために使用されます。詳細については、「[Memcached とは](https://www.memcached.org/)」を参照してください。

[ memchached\$1exporter](https://github.com/prometheus/memcached_exporter) (Apache License 2.0) は、Prometheus 公式エクスポーターの一つです。デフォルトでは、memcache\$1exporter は `/metrics.` のポート 0.0.0.0:9150 でサービスを提供します。

このチュートリアルでは、次の 2 つの Docker ハブリポジトリの Docker イメージを使用します。
+ [Memcached](https://hub.docker.com/_/memcached?tab=description)
+ [ prom/memcached-exporter](https://hub.docker.com/r/prom/memcached-exporter/)

**前提条件**

Amazon ECS のサンプル Prometheus ワークロードからメトリクスを収集するには、クラスターで Container Insights を実行している必要があります。Container Insights のインストールの詳細については、「[Amazon ECS での Container Insights のセットアップ](deploy-container-insights-ECS.md)」を参照してください。

**Topics**
+ [Amazon ECS EC2 クラスター環境変数を設定する](#ContainerInsights-Prometheus-Setup-memcached-ecs-environment)
+ [Memcached サンプルワークロードのインストール](#ContainerInsights-Prometheus-Setup-memcached-ecs-install-workload)
+ [Memcached Prometheus メトリクスをスクレイプするように CloudWatch エージェントを設定する](#ContainerInsights-Prometheus-Setup-memcached-ecs-agent)
+ [Memcached メトリクスの表示](#ContainerInsights-Prometheus-ECS-memcached-view)

## Amazon ECS EC2 クラスター環境変数を設定する
<a name="ContainerInsights-Prometheus-Setup-memcached-ecs-environment"></a>

**Amazon ECS EC2 クラスター環境変数を設定するには**

1. まだの場合は、Amazon ECS CLI をインストールしてください。詳細については、「[Amazon ECS CLI のインストール](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_CLI_installation.html)」を参照してください。

1. 新しい Amazon ECS クラスター名とリージョンを設定します。次に例を示します。

   ```
   ECS_CLUSTER_NAME=ecs-ec2-memcached-tutorial
   AWS_DEFAULT_REGION=ca-central-1
   ```

1. (オプション) Memcached サンプルワークロードと CloudWatch エージェントをインストールする EC2 起動タイプの Amazon ECS クラスターがまだない場合は、次のコマンドを入力してクラスターを作成できます。

   ```
   ecs-cli up --capability-iam --size 1 \
   --instance-type t3.medium \
   --cluster $ECS_CLUSTER_NAME \
   --region $AWS_REGION
   ```

   このコマンドの予想される結果は次のとおりです。

   ```
   WARN[0000] You will not be able to SSH into your EC2 instances without a key pair. 
   INFO[0000] Using recommended Amazon Linux 2 AMI with ECS Agent 1.44.4 and Docker version 19.03.6-ce 
   INFO[0001] Created cluster                               cluster=ecs-ec2-memcached-tutorial region=ca-central-1
   INFO[0002] Waiting for your cluster resources to be created... 
   INFO[0002] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
   INFO[0063] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
   INFO[0124] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
   VPC created: vpc-xxxxxxxxxxxxxxxxx
   Security Group created: sg-xxxxxxxxxxxxxxxxx
   Subnet created: subnet-xxxxxxxxxxxxxxxxx
   Subnet created: subnet-xxxxxxxxxxxxxxxxx
   Cluster creation succeeded.
   ```

## Memcached サンプルワークロードのインストール
<a name="ContainerInsights-Prometheus-Setup-memcached-ecs-install-workload"></a>

**Prometheus メトリクスを公開する Memcached サンプルワークロードをインストールするには**

1. 次のコマンドを入力して、Memcached CloudFormation テンプレートをダウンロードします。

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/sample_traffic/memcached/memcached-traffic-sample.yaml
   ```

1. 次のコマンドを入力して、Memcached 用に作成する IAM ロール名を設定します。

   ```
   MEMCACHED_ECS_TASK_ROLE_NAME=memcached-prometheus-demo-ecs-task-role-name
   MEMCACHED_ECS_EXECUTION_ROLE_NAME=memcached-prometheus-demo-ecs-execution-role-name
   ```

1. 次のコマンドを入力して、Memcached サンプルワークロードをインストールします。このサンプルでは、ワークロードを `host` ネットワークモードでインストールします。

   ```
   MEMCACHED_ECS_NETWORK_MODE=host
   
   aws cloudformation create-stack --stack-name Memcached-Prometheus-Demo-ECS-$ECS_CLUSTER_NAME-EC2-$MEMCACHED_ECS_NETWORK_MODE \
       --template-body file://memcached-traffic-sample.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                    ParameterKey=ECSNetworkMode,ParameterValue=$MEMCACHED_ECS_NETWORK_MODE \
                    ParameterKey=TaskRoleName,ParameterValue=$MEMCACHED_ECS_TASK_ROLE_NAME \
                    ParameterKey=ExecutionRoleName,ParameterValue=$MEMCACHED_ECS_EXECUTION_ROLE_NAME \
       --capabilities CAPABILITY_NAMED_IAM \
       --region $AWS_REGION
   ```

CloudFormation スタックは、次の 4 つのリソースを作成します。
+ 1 つの ECS タスクロール
+ 1 つの ECS タスク実行ロール
+ 1 つの Memcached タスク定義
+ 1 つの Memcached サービス

Memcached タスク定義では、次の 2 つのコンテナが定義されています。
+ プライマリコンテナは単純な Memcached アプリケーションを実行し、アクセス用にポート 11211 を開きます。
+ もう一方のコンテナは Redis OSS エクスポータープロセスを実行して、ポート 9150 の Prometheus メトリクスを公開します。これは、CloudWatch エージェントによって検出され、スクレイプされるコンテナです。

## Memcached Prometheus メトリクスをスクレイプするように CloudWatch エージェントを設定する
<a name="ContainerInsights-Prometheus-Setup-memcached-ecs-agent"></a>

**Memcached Prometheus メトリクスをスクレイプするように CloudWatch エージェントを設定するには**

1. 次のコマンドを入力して、`cwagent-ecs-prometheus-metric-for-awsvpc.yaml` の最新バージョンをダウンロードします。

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-awsvpc.yaml
   ```

1. テキストエディタでファイルを開き、`value` セクションの `resource:CWAgentConfigSSMParameter` キーの背後にある完全な CloudWatch エージェント設定を見つけます。

   次に、`ecs_service_discovery` セクションで、次の設定を `task_definition_list` セクションに追加します。

   ```
   {
       "sd_job_name": "ecs-memcached",
       "sd_metrics_ports": "9150",
       "sd_task_definition_arn_pattern": ".*:task-definition/memcached-prometheus-demo.*:[0-9]+"
   },
   ```

   `metric_declaration` セクションの場合、デフォルト設定では Memcached メトリクスを許可しません。Memcached メトリクスを許可するには、次のセクションを追加します。デフォルトのインデントパターンに従ってください。

   ```
   {
     "source_labels": ["container_name"],
     "label_matcher": "memcached-exporter-.*",
     "dimensions": [["ClusterName", "TaskDefinitionFamily"]],
     "metric_selectors": [
       "^memcached_current_(bytes|items|connections)$",
       "^memcached_items_(reclaimed|evicted)_total$",
       "^memcached_(written|read)_bytes_total$",
       "^memcached_limit_bytes$",
       "^memcached_commands_total$"
     ]
   },
   {
     "source_labels": ["container_name"],
     "label_matcher": "memcached-exporter-.*",
     "dimensions": [["ClusterName", "TaskDefinitionFamily","status","command"], ["ClusterName", "TaskDefinitionFamily","command"]],
     "metric_selectors": [
       "^memcached_commands_total$"
     ]
   },
   ```

1. CloudFormation によって Amazon ECS クラスターに CloudWatch エージェントを既にデプロイしている場合は、次のコマンドを入力して変更セットを作成できます。

   ```
   ECS_NETWORK_MODE=bridge
   CREATE_IAM_ROLES=True
   ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
   ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name
   
   aws cloudformation create-change-set --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
       --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                    ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \
                    ParameterKey=ECSNetworkMode,ParameterValue=$ECS_NETWORK_MODE \
                    ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \
                    ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \
       --capabilities CAPABILITY_NAMED_IAM \
       --region $AWS_REGION \
       --change-set-name memcached-scraping-support
   ```

1. [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) で CloudFormation コンソール を開きます。

1. 新しく作成された変更セット `memcached-scraping-support` を確認します。`CWAgentConfigSSMParameter` リソースに 1 つの変更が適用されていることがわかります。次のコマンドを入力して、変更セットを実行し、CloudWatch エージェントタスクを再起動します。

   ```
   aws ecs update-service --cluster $ECS_CLUSTER_NAME \
   --desired-count 0 \
   --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \
   --region $AWS_REGION
   ```

1. 10 秒ほど待ってから、次のコマンドを入力します。

   ```
   aws ecs update-service --cluster $ECS_CLUSTER_NAME \
   --desired-count 1 \
   --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \
   --region $AWS_REGION
   ```

1. クラスターの Prometheus メトリクス収集を使用して CloudWatch エージェントを初めてインストールする場合は、次のコマンドを入力します。

   ```
   ECS_NETWORK_MODEE=bridge
   CREATE_IAM_ROLES=True
   ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
   ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name
   
   aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
       --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                    ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \
                    ParameterKey=ECSNetworkMode,ParameterValue=$ECS_NETWORK_MODE \
                    ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \
                    ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \
       --capabilities CAPABILITY_NAMED_IAM \
       --region $AWS_REGION
   ```

## Memcached メトリクスの表示
<a name="ContainerInsights-Prometheus-ECS-memcached-view"></a>

このチュートリアルでは、次のメトリクスを CloudWatch の **ECS/ContainerInsights/Prometheus** 名前空間に送信します。CloudWatch コンソールを使用して、その名前空間のメトリクスを表示できます。


| メトリクス名 | ディメンション | 
| --- | --- | 
|  `memcached_current_items` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `memcached_current_connections` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `memcached_limit_bytes` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `memcached_current_bytes` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `memcached_written_bytes_total` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `memcached_read_bytes_total` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `memcached_items_evicted_total` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `memcached_items_reclaimed_total` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `memcached_commands_total` |  `ClusterName`, `TaskDefinitionFamily` `ClusterName`、TaskDefinitionFamily、コマンド `ClusterName`、TaskDefinitionFamily、ステータス、コマンド  | 

**注記**  
**コマンド** ディメンションの値には `delete`、`get`、`cas`、`set`、`decr`、`touch`、`incr`、または `flush` を指定できます。  
**ステータス** ディメンションの値は `hit`、`miss`、または `badval`です。

Memcached Prometheus メトリクスの CloudWatch ダッシュボードを作成することもできます。

**Memcached Prometheus メトリクスのダッシュボードを作成するには**

1. 環境変数を作成し、以下の値をデプロイに合わせて置き換えます。

   ```
   DASHBOARD_NAME=your_memcached_cw_dashboard_name
   ECS_TASK_DEF_FAMILY=memcached-prometheus-demo-$ECS_CLUSTER_NAME-EC2-$MEMCACHED_ECS_NETWORK_MOD
   ```

1. 次のコマンドを入力して、ダッシュボードを作成します。

   ```
   curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/sample_cloudwatch_dashboards/memcached/cw_dashboard_memcached.json \
   | sed "s/{{YOUR_AWS_REGION}}/$AWS_REGION/g" \
   | sed "s/{{YOUR_CLUSTER_NAME}}/$ECS_CLUSTER_NAME/g" \
   | sed "s/{{YOUR_TASK_DEF_FAMILY}}/$ECS_TASK_DEF_FAMILY/g" \
   | xargs -0 aws cloudwatch put-dashboard --dashboard-name ${DASHBOARD_NAME} --region $AWS_REGION --dashboard-body
   ```

# Amazon ECS Fargate 上の Redis OSS Prometheus メトリクスのスクレイピングに関するチュートリアル
<a name="ContainerInsights-Prometheus-Setup-redis-ecs"></a>

このチュートリアルでは、Amazon ECS Fargate クラスター内のサンプル Redis OSS アプリケーションの Prometheus メトリクスをスクレイピングする方法を実践的に説明します。Redis OSS Prometheus エクスポーターのターゲットは、コンテナの Docker ラベルに基づいて Prometheus メトリクスサポートを持つ CloudWatch エージェントによって自動検出されます。

Redis OSS (https://redis.io/) は、オープンソース (BSD ライセンス適用) のインメモリ型のデータ構造ストアで、データベース、キャッシュ、メッセージブローカーとして使用されます。詳細については、「[redis](https://redis.io/)」を参照してください。

redis\$1exporter (MIT ライセンス適用) は、指定されたポート (デフォルト: 0.0.0.0:9121) で Redis OSS Prometheus メトリクスを公開するために使用します。詳細については、「[redis\$1exporter](https://github.com/oliver006/redis_exporter)」を参照してください。

このチュートリアルでは、次の 2 つの Docker ハブリポジトリの Docker イメージを使用します。
+ [redis](https://hub.docker.com/_/redis?tab=description)
+ [redis\$1exporter](https://hub.docker.com/r/oliver006/redis_exporter)

**前提条件**

Amazon ECS のサンプル Prometheus ワークロードからメトリクスを収集するには、クラスターで Container Insights を実行している必要があります。Container Insights のインストールの詳細については、「[Amazon ECS での Container Insights のセットアップ](deploy-container-insights-ECS.md)」を参照してください。

**Topics**
+ [Amazon ECS Fargate クラスター環境変数を設定する](#ContainerInsights-Prometheus-Setup-redis-ecs-variable)
+ [Amazon ECS Fargate クラスターのネットワーク環境変数を設定する](#ContainerInsights-Prometheus-Setup-redis-ecs-variable2)
+ [サンプル Redis OSS ワークロードのインストール](#ContainerInsights-Prometheus-Setup-redis-ecs-install-workload)
+ [CloudWatch エージェントを設定して Redis OSS Prometheus メトリクスをスクレイピングする](#ContainerInsights-Prometheus-Setup-redis-ecs-agent)
+ [Redis OSS メトリクスの表示](#ContainerInsights-Prometheus-Setup-redis-view)

## Amazon ECS Fargate クラスター環境変数を設定する
<a name="ContainerInsights-Prometheus-Setup-redis-ecs-variable"></a>

**Amazon ECS Fargate クラスター環境変数を設定するには**

1. まだの場合は、Amazon ECS CLI をインストールしてください。詳細については、「[Amazon ECS CLI のインストール](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_CLI_installation.html)」を参照してください。

1. 新しい Amazon ECS クラスター名とリージョンを設定します。例えば、次のようになります。

   ```
   ECS_CLUSTER_NAME=ecs-fargate-redis-tutorial
   AWS_DEFAULT_REGION=ca-central-1
   ```

1. (オプション) サンプル Redis OSS ワークロードと CloudWatch エージェントのインストール先となる Amazon ECS Fargate クラスターがまだない場合は、次のコマンドを入力してクラスターを作成できます。

   ```
   ecs-cli up --capability-iam \
   --cluster $ECS_CLUSTER_NAME \
   --launch-type FARGATE \
   --region $AWS_DEFAULT_REGION
   ```

   このコマンドの予想される結果は次のとおりです。

   ```
   INFO[0000] Created cluster   cluster=ecs-fargate-redis-tutorial region=ca-central-1
   INFO[0001] Waiting for your cluster resources to be created...
   INFO[0001] Cloudformation stack status   stackStatus=CREATE_IN_PROGRESS
   VPC created: vpc-xxxxxxxxxxxxxxxxx
   Subnet created: subnet-xxxxxxxxxxxxxxxxx
   Subnet created: subnet-xxxxxxxxxxxxxxxxx
   Cluster creation succeeded.
   ```

## Amazon ECS Fargate クラスターのネットワーク環境変数を設定する
<a name="ContainerInsights-Prometheus-Setup-redis-ecs-variable2"></a>

**Amazon ECS Fargate クラスターのネットワーク環境変数を設定するには**

1. Amazon ECS クラスターの VPC とサブネット ID を設定します。前の手順で新しいクラスターを作成した場合は、最後のコマンドの結果にこれらの値が表示されます。それ以外の場合は、Redis で使用する既存のクラスターの ID を使用します。

   ```
   ECS_CLUSTER_VPC=vpc-xxxxxxxxxxxxxxxxx
   ECS_CLUSTER_SUBNET_1=subnet-xxxxxxxxxxxxxxxxx
   ECS_CLUSTER_SUBNET_2=subnet-xxxxxxxxxxxxxxxxx
   ```

1. このチュートリアルでは、Redis OSS アプリケーションと CloudWatch エージェントを Amazon ECS クラスターの VPC のデフォルトセキュリティグループにインストールします。デフォルトセキュリティグループでは、同じセキュリティグループ内のすべてのネットワーク接続が許可されるため、CloudWatch エージェントによる Redis OSS コンテナで公開されている Prometheus メトリクスのスクレイピングが可能です。実際の本番環境では、Redis OSS アプリケーションと CloudWatch エージェント専用のセキュリティグループを作成し、カスタマイズしたアクセス許可をそれぞれに設定することもできます。

   次のコマンドを入力して、デフォルトのセキュリティグループ ID を取得します。

   ```
   aws ec2 describe-security-groups \
   --filters Name=vpc-id,Values=$ECS_CLUSTER_VPC  \
   --region $AWS_DEFAULT_REGION
   ```

   次に、次のコマンドを入力して、Fargate クラスターデフォルトセキュリティグループ変数を設定します。*my-default-security-group* を前のコマンドから取得した値に置き換えます。

   ```
   ECS_CLUSTER_SECURITY_GROUP=my-default-security-group
   ```

## サンプル Redis OSS ワークロードのインストール
<a name="ContainerInsights-Prometheus-Setup-redis-ecs-install-workload"></a>

**Prometheus メトリクスを公開するサンプル Redis OSS ワークロードをインストールするには**

1. 次のコマンドを入力して、Redis OSS CloudFormation テンプレートをダウンロードします。

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/sample_traffic/redis/redis-traffic-sample.yaml
   ```

1. 次のコマンドを入力して、Redis OSS 用に作成する IAM ロール名を設定します。

   ```
   REDIS_ECS_TASK_ROLE_NAME=redis-prometheus-demo-ecs-task-role-name
   REDIS_ECS_EXECUTION_ROLE_NAME=redis-prometheus-demo-ecs-execution-role-name
   ```

1. 次のコマンドを入力して、サンプル Redis OSS ワークロードをインストールします。

   ```
   aws cloudformation create-stack --stack-name Redis-Prometheus-Demo-ECS-$ECS_CLUSTER_NAME-fargate-awsvpc \
       --template-body file://redis-traffic-sample.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                    ParameterKey=SecurityGroupID,ParameterValue=$ECS_CLUSTER_SECURITY_GROUP \
                    ParameterKey=SubnetID,ParameterValue=$ECS_CLUSTER_SUBNET_1 \
                    ParameterKey=TaskRoleName,ParameterValue=$REDIS_ECS_TASK_ROLE_NAME \
                    ParameterKey=ExecutionRoleName,ParameterValue=$REDIS_ECS_EXECUTION_ROLE_NAME \
       --capabilities CAPABILITY_NAMED_IAM \
       --region $AWS_DEFAULT_REGION
   ```

CloudFormation スタックは、次の 4 つのリソースを作成します。
+ 1 つの ECS タスクロール
+ 1 つの ECS タスク実行ロール
+ 1 つの Redis OSS タスク定義
+ 1 つの Redis OSS サービス

Redis OSS タスク定義では、2 つのコンテナが定義されています。
+ プライマリコンテナは単純な Redis OSS アプリケーションを実行し、アクセス用にポート 6379 を開きます。
+ もう一方のコンテナは Redis OSS エクスポータープロセスを実行して、ポート 9121 で Prometheus メトリクスを公開します。これは、CloudWatch エージェントによって検出され、スクレイプされるコンテナです。次のドッカーラベルは、CloudWatch エージェントがそれに基づいてこのコンテナを検出できるように定義されています。

  ```
  ECS_PROMETHEUS_EXPORTER_PORT: 9121
  ```

## CloudWatch エージェントを設定して Redis OSS Prometheus メトリクスをスクレイピングする
<a name="ContainerInsights-Prometheus-Setup-redis-ecs-agent"></a>

**CloudWatch エージェントを設定して Redis OSS Prometheus メトリクスをスクレイピングするには**

1. 次のコマンドを入力して、`cwagent-ecs-prometheus-metric-for-awsvpc.yaml` の最新バージョンをダウンロードします。

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-awsvpc.yaml
   ```

1. テキストエディタでファイルを開き、`value` セクションの `resource:CWAgentConfigSSMParameter` キーの背後にある完全な CloudWatch エージェント設定を見つけます。

   次に、ここに示す `ecs_service_discovery` セクションでは、`docker_label` ベースのサービス検出が、Redis OSS ECS タスク定義で定義した Docker ラベルと一致する `ECS_PROMETHEUS_EXPORTER_PORT` をベースとしたデフォルト設定で有効になっています。したがって、このセクションで変更を加える必要はありません。

   ```
   ecs_service_discovery": {
     "sd_frequency": "1m",
     "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml",
   *  "docker_label": {
     },*
     ...
   ```

   `metric_declaration` セクションの場合、デフォルト設定で Redis OSS メトリクスは許可されません。Redis OSS メトリクスを許可するには、次のセクションを追加します。デフォルトのインデントパターンに従ってください。

   ```
   {
     "source_labels": ["container_name"],
     "label_matcher": "^redis-exporter-.*$",
     "dimensions": [["ClusterName","TaskDefinitionFamily"]],
     "metric_selectors": [
       "^redis_net_(in|out)put_bytes_total$",
       "^redis_(expired|evicted)_keys_total$",
       "^redis_keyspace_(hits|misses)_total$",
       "^redis_memory_used_bytes$",
       "^redis_connected_clients$"
     ]
   },
   {
     "source_labels": ["container_name"],
     "label_matcher": "^redis-exporter-.*$",
     "dimensions": [["ClusterName","TaskDefinitionFamily","cmd"]],
     "metric_selectors": [
       "^redis_commands_total$"
     ]
   },
   {
     "source_labels": ["container_name"],
     "label_matcher": "^redis-exporter-.*$",
     "dimensions": [["ClusterName","TaskDefinitionFamily","db"]],
     "metric_selectors": [
       "^redis_db_keys$"
     ]
   },
   ```

1. CloudFormation によって Amazon ECS クラスターに CloudWatch エージェントを既にデプロイしている場合は、次のコマンドを入力して変更セットを作成できます。

   ```
   ECS_LAUNCH_TYPE=FARGATE
   CREATE_IAM_ROLES=True
   ECS_CLUSTER_SUBNET=$ECS_CLUSTER_SUBNET_1
   ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
   ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name
   
   aws cloudformation create-change-set --stack-name CWAgent-Prometheus-ECS-$ECS_CLUSTER_NAME-$ECS_LAUNCH_TYPE-awsvpc \
       --template-body file://cwagent-ecs-prometheus-metric-for-awsvpc.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                    ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \
                    ParameterKey=ECSLaunchType,ParameterValue=$ECS_LAUNCH_TYPE \
                    ParameterKey=SecurityGroupID,ParameterValue=$ECS_CLUSTER_SECURITY_GROUP \
                    ParameterKey=SubnetID,ParameterValue=$ECS_CLUSTER_SUBNET \
                    ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \
                    ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \
       --capabilities CAPABILITY_NAMED_IAM \
       --region ${AWS_DEFAULT_REGION} \
       --change-set-name redis-scraping-support
   ```

1. [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) で CloudFormation コンソール を開きます。

1. 新しく作成された変更セット `redis-scraping-support` を確認します。`CWAgentConfigSSMParameter` リソースに 1 つの変更が適用されていることがわかります。次のコマンドを入力して、変更セットを実行し、CloudWatch エージェントタスクを再起動します。

   ```
   aws ecs update-service --cluster $ECS_CLUSTER_NAME \
   --desired-count 0 \
   --service cwagent-prometheus-replica-service-$ECS_LAUNCH_TYPE-awsvpc \
   --region ${AWS_DEFAULT_REGION}
   ```

1. 10 秒ほど待ってから、次のコマンドを入力します。

   ```
   aws ecs update-service --cluster $ECS_CLUSTER_NAME \
   --desired-count 1 \
   --service cwagent-prometheus-replica-service-$ECS_LAUNCH_TYPE-awsvpc \
   --region ${AWS_DEFAULT_REGION}
   ```

1. クラスターの Prometheus メトリクス収集を使用して CloudWatch エージェントを初めてインストールする場合は、次のコマンドを入力します。

   ```
   ECS_LAUNCH_TYPE=FARGATE
   CREATE_IAM_ROLES=True
   ECS_CLUSTER_SUBNET=$ECS_CLUSTER_SUBNET_1
   ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
   ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name
   
   aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-$ECS_CLUSTER_NAME-$ECS_LAUNCH_TYPE-awsvpc \
       --template-body file://cwagent-ecs-prometheus-metric-for-awsvpc.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                    ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \
                    ParameterKey=ECSLaunchType,ParameterValue=$ECS_LAUNCH_TYPE \
                    ParameterKey=SecurityGroupID,ParameterValue=$ECS_CLUSTER_SECURITY_GROUP \
                    ParameterKey=SubnetID,ParameterValue=$ECS_CLUSTER_SUBNET \
                    ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \
                    ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \
       --capabilities CAPABILITY_NAMED_IAM \
       --region ${AWS_DEFAULT_REGION}
   ```

## Redis OSS メトリクスの表示
<a name="ContainerInsights-Prometheus-Setup-redis-view"></a>

このチュートリアルでは、次のメトリクスを CloudWatch の **ECS/ContainerInsights/Prometheus** 名前空間に送信します。CloudWatch コンソールを使用して、その名前空間のメトリクスを表示できます。


| メトリクス名 | ディメンション | 
| --- | --- | 
|  `redis_net_input_bytes_total` |  ClusterName、`TaskDefinitionFamily`  | 
|  `redis_net_output_bytes_total` |  ClusterName、`TaskDefinitionFamily`  | 
|  `redis_expired_keys_total` |  ClusterName、`TaskDefinitionFamily`  | 
|  `redis_evicted_keys_total` |  ClusterName、`TaskDefinitionFamily`  | 
|  `redis_keyspace_hits_total` |  ClusterName、`TaskDefinitionFamily`  | 
|  `redis_keyspace_misses_total` |  ClusterName、`TaskDefinitionFamily`  | 
|  `redis_memory_used_bytes` |  ClusterName、`TaskDefinitionFamily`  | 
|  `redis_connected_clients` |  ClusterName、`TaskDefinitionFamily`  | 
|  `redis_commands_total` |  ` ClusterName`, `TaskDefinitionFamily`, `cmd`  | 
|  `redis_db_keys` |  `ClusterName`, `TaskDefinitionFamily`, `db`  | 

**注記**  
**cmd** ディメンションの値には `append`、`client`、`command`、`config`、`dbsize`、`flushall`、`get`、`incr`、`info`、`latency`、または `slowlog` を指定できます。  
**db** ディメンションの値は `db0` から `db15` に指定できます。

また、Redis OSS Prometheus メトリクスの CloudWatch ダッシュボードを作成することもできます。

**Redis OSS Prometheus メトリクスのダッシュボードを作成するには**

1. 環境変数を作成し、以下の値をデプロイに合わせて置き換えます。

   ```
   DASHBOARD_NAME=your_cw_dashboard_name
   ECS_TASK_DEF_FAMILY=redis-prometheus-demo-$ECS_CLUSTER_NAME-fargate-awsvpc
   ```

1. 次のコマンドを入力して、ダッシュボードを作成します。

   ```
   curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_cloudwatch_dashboards/redis/cw_dashboard_redis.json \
   | sed "s/{{YOUR_AWS_REGION}}/${REGION_NAME}/g" \
   | sed "s/{{YOUR_CLUSTER_NAME}}/${CLUSTER_NAME}/g" \
   | sed "s/{{YOUR_NAMESPACE}}/${NAMESPACE}/g" \
   ```