Amazon ECS クラスターの NGINX ワークロードのサンプル - Amazon CloudWatch

Amazon ECS クラスターの NGINX ワークロードのサンプル

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

NGINX Prometheus エクスポーターの詳細については、GitHub の nginx-prometheus-exporter をご参照ください。NGINX リバースプロキシの詳細については、GitHub の ecs-nginx-reverse-proxyをご参照ください。

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

Amazon ECS クラスター用の NGINX リバースプロキシサンプルワークロードをインストールする

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

Docker イメージを作成する

NGINX リバースプロキシサンプルワークロード用の Docker イメージを作成するには
  1. NGINX リバースプロキシリポジトリから次のフォルダをダウンロードします: https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/

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

    docker build -t web-server-app ./path-to-app-directory
  3. NGINX 用のカスタムイメージを作成します。まず、次の 2 つのファイルを含むディレクトリを作成します。

    • サンプル Dockerfile:

      FROM nginx COPY nginx.conf /etc/nginx/nginx.conf
    • 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 からメトリクスをスクレイピングするように設定されています。

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

    docker build -t nginx-reverse-proxy ./path-to-your-directory
  5. 後で使用するために、新しいイメージをイメージリポジトリにアップロードします。

Amazon ECS で NGINX とウェブサーバーアプリを実行するタスク定義を作成します。

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

このタスク定義により、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" }
  2. 次のコマンドを入力して、タスク定義を登録します。

    aws ecs register-task-definition --cli-input-json file://path-to-your-task-definition-json
  3. 次のコマンドを入力して、タスクを実行するサービスを作成します。

    サービス名は変更しないでください。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 エージェントを設定する

最後のステップでは、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
  2. テキストエディタでファイルを開き、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$" } ],
  3. 同じファイルで、metric_declaration セクションに次のセクションを追加して、NGINX メトリクスを許可します。デフォルトのインデントパターンに従ってください。

    { "source_labels": ["job"], "label_matcher": ".*nginx.*", "dimensions": [["ClusterName", "TaskDefinitionFamily", "ServiceName"]], "metric_selectors": [ "^nginx_.*$" ] },
  4. このクラスターにまだ 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
  5. https://console.aws.amazon.com/cloudformation で AWS CloudFormation コンソール を開きます。

  6. 新しく作成されたチェンジセット 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
  7. 10 秒ほど待ってから、次のコマンドを入力します。

    aws ecs update-service --cluster $ECS_CLUSTER_NAME \ --desired-count 1 \ --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \ --region $AWS_REGION
  8. クラスターの 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 メトリクスとログの表示

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

サンプル NGINX ワークロードのメトリクスを表示するには
  1. CloudWatch コンソール (https://console.aws.amazon.com/cloudwatch/) を開きます。

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

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