Beispiel für NGINX-Workload für Amazon ECS-Cluster - Amazon CloudWatch

Beispiel für NGINX-Workload für Amazon ECS-Cluster

Der NGINX Prometheus Exporter kann NGINX-Daten als Prometheus-Metriken scrapen und verfügbar machen. In diesem Beispiel wird der Exporter zusammen mit dem NGINX-Reverse-Proxy-Service für Amazon ECS verwendet.

Weitere Informationen zum NGINX-Prometheus-Exporter finden Sie unter nginx-prometheus-exporter auf Github. Weitere Informationen zum NGINX-Reverse-Proxy finden Sie unter ecs-nginx-reverse-proxy auf Github.

Der CloudWatch-Agent mit Prometheus-Unterstützung erfasst die NGINX-Prometheus-Metriken basierend auf der Serviceerkennungskonfiguration im Amazon-ECS-Cluster. Sie können den NGINX Prometheus Exporter so konfigurieren, dass die Metriken auf einem anderen Port oder metrics_path verfügbar gemacht werden. Wenn Sie den Port oder den Pfad ändern, aktualisieren Sie den ecs_service_discovery-Abschnitt in der CloudWatch-Agentenkonfigurationsdatei.

Installieren Sie den NGINX-Reverse-Proxy-Beispiel-Workload für Amazon ECS-Cluster

Zum Installieren des NGINX-Reverse-Proxy-Beispiel-Workloads führen Sie die folgenden Schritte aus.

Erstellen der Docker-Images

So erstellen Sie die Docker-Images für die NGINX-Reverse-Proxy-Beispiel-Workload
  1. Laden Sie den folgenden Ordner aus dem NGINX-Reverse-Proxy-Repo herunter: https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/aus.

  2. Suchen Sie das app-Verzeichnis und erstellen Sie ein Image aus diesem Verzeichnis:

    docker build -t web-server-app ./path-to-app-directory
  3. Erstellen Sie ein benutzerdefiniertes Image für NGINX. Erstellen Sie zunächst ein Verzeichnis mit den folgenden zwei Dateien:

    • Eine Beispieldatei für Dockerdatei:

      FROM nginx COPY nginx.conf /etc/nginx/nginx.conf
    • Eine nginx.conf-Datei, geändert von https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/:

      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; } } }
      Anmerkung

      stub_status muss auf demselben Port aktiviert sein, für den nginx-prometheus-exporter konfiguriert ist, um Metriken zu scrapen. In unserer Beispielaufgabendefinition ist nginx-prometheus-exporter so konfiguriert, dass Metriken von Port 8080 gescrapet werden.

  4. Erstellen Sie ein Image aus Dateien in Ihrem neuen Verzeichnis:

    docker build -t nginx-reverse-proxy ./path-to-your-directory
  5. Laden Sie Ihre neuen Images zur späteren Verwendung in ein Bild-Repository hoch.

Erstellen Sie die Aufgabendefinition zum Ausführen von NGINX und der Webserver-App in Amazon ECS

Als Nächstes richten Sie die Aufgabendefinition ein.

Diese Aufgabendefinition ermöglicht das Sammeln und Exportieren von NGINX-Prometheus-Metriken. Der NGINX-Container verfolgt die Eingaben von der App und stellt diese Daten an Port 8080 bereit, wie in nginx.conf festgelegt. Der NGINX-Prometheus-Exporter-Container scrapet diese Metriken und sendet sie zur Verwendung in CloudWatch an Port 9113.

So richten Sie die Aufgabendefinition für die NGINX-Beispiel-Amazon ECS-Workload ein
  1. Erstellen Sie eine Aufgabendefinitions-JSON-Datei mit dem folgenden Inhalt. Ersetzen Sie your-custom-nginx-image durch den Image-URI für Ihr benutzerdefiniertes NGINX-Image und ersetzen Sie your-web-server-app-image durch den Image-URI für Ihr Webserver-App-Image.

    { "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. Registrieren Sie die Aufgabendefinition, indem Sie den folgenden Befehl eingeben.

    aws ecs register-task-definition --cli-input-json file://path-to-your-task-definition-json
  3. Erstellen Sie einen Service zum Ausführen der Aufgabe, indem Sie den folgenden Befehl eingeben:

    Stellen Sie sicher, dass Sie den Servicenamen nicht ändern. Wir führen einen CloudWatch-Agenten-Service mit einer Konfiguration aus, die mithilfe der Namensmuster der Services, die sie gestartet haben, nach Aufgaben sucht. Damit der CloudWatch-Agent beispielsweise die von diesem Befehl gestartete Aufgabe findet, können Sie den Wert von sd_service_name_pattern auf ^nginx-service$ festlegen. Im nächsten Abschnitt finden Sie weitere Details.

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

Konfigurieren Sie den CloudWatch-Agenten zum Scraping von NGINX-Prometheus-Metriken

Der letzte Schritt besteht darin, den CloudWatch-Agent so zu konfigurieren, dass er die NGINX-Metriken kratzt. In diesem Beispiel erkennt der CloudWatch-Agent die Aufgabe über das Servicenamenmuster und den Port 9113, wo der Exporteur die Prometheus-Metriken für NGINX verfügbar macht. Nachdem die Aufgabe erkannt und die Metriken verfügbar sind, beginnt der CloudWatch-Agent, die erfassten Metriken an den Protokollstream nginx-prometheus-exporter zu senden.

So konfigurieren Sie den CloudWatch-Agent für das Scraping der NGINX-Metriken
  1. Laden Sie die neueste Version der erforderlichen YAML-Datei herunter, indem Sie den folgenden Befehl eingeben.

    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. Öffnen Sie die Datei mit einem Texteditor und suchen Sie die vollständige CloudWatch-Agentenkonfiguration im Schlüssel value im Abschnitt resource:CWAgentConfigSSMParameter. Fügen Sie dann im ecs_service_discovery-Abschnitt den folgenden service_name_list_for_tasks-Abschnitt hinzu.

    "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. Fügen Sie in derselben Datei den folgenden Abschnitt im Abschnitt metric_declaration hinzu, um NGINX-Metriken zuzulassen. Beachten Sie unbedingt das vorhandene Einrückungsmuster.

    { "source_labels": ["job"], "label_matcher": ".*nginx.*", "dimensions": [["ClusterName", "TaskDefinitionFamily", "ServiceName"]], "metric_selectors": [ "^nginx_.*$" ] },
  4. Wenn Sie den CloudWatch-Agenten noch nicht in diesem Cluster bereitgestellt haben, fahren Sie mit Schritt 8 fort.

    Wenn Sie den CloudWatch-Agenten bereits mithilfe von AWS CloudFormation im Amazon-ECS-Cluster bereitgestellt haben, können Sie einen Änderungssatz erstellen, indem Sie die folgenden Befehle eingeben:

    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. Öffnen Sie die CloudFormation-Konsole unter https://console.aws.amazon.com/cloudformation.

  6. Sehen Sie sich den neu erstellten Änderungssatz nginx-scraping-support an. Eine Änderung sollte auf die Ressource CWAgentConfigSSMParameter angewendet werden. Führen Sie den Änderungssatz aus, und starten Sie die CloudWatch-Agent-Aufgabe neu, indem Sie die folgenden Befehle eingeben:

    aws ecs update-service --cluster $ECS_CLUSTER_NAME \ --desired-count 0 \ --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \ --region $AWS_REGION
  7. Warten Sie etwa 10 Sekunden und geben Sie den folgenden Befehl ein.

    aws ecs update-service --cluster $ECS_CLUSTER_NAME \ --desired-count 1 \ --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \ --region $AWS_REGION
  8. Wenn Sie den CloudWatch-Agent zum ersten Mal mit Prometheus-Metrik-Sammlung auf dem Cluster installieren, geben Sie die folgenden Befehle ein.

    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

Anzeigen Ihrer NGINX-Metriken und Protokolle

Sie können jetzt die gesammelten NGINX-Metriken anzeigen.

So zeigen Sie die Metriken für Ihren NGINX-Beispiel-Workload an
  1. Öffnen Sie die CloudWatch-Konsole unter https://console.aws.amazon.com/cloudwatch/.

  2. Wählen Sie in der Region, in der Ihr Cluster ausgeführt wird, im linken Navigationsbereich Metriken aus. Suchen Sie den ContainerInsights/Prometheus-Namespace, um die Metriken anzuzeigen.

  3. Um die CloudWatch-Logs-Ereignisse anzuzeigen, wählen Sie im Navigationsbereich Log Groups (Protokollgruppen) aus. Die Ereignisse befinden sich in der Protokollgruppe /aws/containerinsights/your_cluster_name/prometheus, im Protokoll-Stream nginx-prometheus-exporter.