Beispiel für eine NGINX Plus-Arbeitslast für ECS Amazon-Cluster - Amazon CloudWatch

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Beispiel für eine NGINX Plus-Arbeitslast für ECS Amazon-Cluster

NGINXPlus ist die kommerzielle Version von. NGINX Sie müssen über eine Lizenz verfügen, um sie zu verwenden. Weitere Informationen finden Sie unter Plus NGINX

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

Weitere Informationen zum NGINX Prometheus-Exporter finden Sie nginx-prometheus-exporterauf Github. Weitere Informationen zum NGINX Reverse-Proxy finden Sie ecs-nginx-reverse-proxyauf Github.

Der CloudWatch Agent mit Prometheus-Unterstützung scannt die NGINX Plus Prometheus-Metriken auf der Grundlage der Service Discovery-Konfiguration im Amazon-Cluster. ECS Sie können den NGINX Prometheus Exporter so konfigurieren, dass die Metriken auf einem anderen Port oder Pfad verfügbar gemacht werden. Wenn Sie den Port oder Pfad ändern, aktualisieren Sie den ecs_service_discovery Abschnitt in der CloudWatch Agenten-Konfigurationsdatei.

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

Gehen Sie wie folgt vor, um den NGINX Reverse-Proxy-Beispiel-Workload zu installieren.

Erstellen der Docker-Images

Um die Docker-Images für den NGINX Plus-Reverse-Proxy-Beispiel-Workload zu erstellen
  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/.

  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 Plus. NGINX Bevor Sie das Image für NGINX Plus erstellen können, müssen Sie den genannten Schlüssel nginx-repo.key und das SSL Zertifikat nginx-repo.crt für Ihr lizenziertes NGINX Plus abrufen. Erstellen Sie ein Verzeichnis und speichern Sie darin Ihre nginx-repo.key- und nginx-repo.crt-Dateien.

    Erstellen Sie in dem Verzeichnis, das Sie gerade erstellt haben, die folgenden zwei Dateien:

    • Ein Beispiel-Dockerfile mit dem folgenden Inhalt. Diese Docker-Datei wurde aus einer Beispieldatei übernommen, die unter https://docs.nginx.com/nginx/installing-nginx-dockeradmin-guide/installing-nginx//#docker_plus_image bereitgestellt wird. Die wichtige Änderung, die wir vornehmen, ist, dass wir eine separate Datei namens nginx.conf laden, die im nächsten Schritt erstellt wird.

      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;"]
    • Eine nginx.conf Datei, geändert von https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/nginx.

      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; } } }
  4. Erstellen Sie ein Image aus Dateien in Ihrem neuen Verzeichnis:

    docker build -t nginx-plus-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 für die Ausführung von NGINX Plus und der Webserver-App in Amazon ECS

Als Nächstes richten Sie die Aufgabendefinition ein.

Diese Aufgabendefinition ermöglicht die Erfassung und den Export von NGINX Plus Prometheus-Metriken. Der NGINX Container verfolgt Eingaben aus der App und stellt diese Daten, wie in festgelegt, dem Port 8080 zur Verfügung. nginx.conf Der NGINX Prometheus-Exportcontainer scannt diese Metriken und sendet sie zur Verwendung in Port 9113. CloudWatch

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

    { "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" }
  2. Registrieren Sie die Aufgabendefinition:

    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:

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

    Stellen Sie sicher, dass Sie den Servicenamen nicht ändern. Wir werden einen CloudWatch Agentendienst mit einer Konfiguration ausführen, die anhand der Namensmuster der Dienste, mit denen sie gestartet wurden, nach Aufgaben sucht. Damit der CloudWatch Agent beispielsweise die mit diesem Befehl gestartete Aufgabe finden kann, können Sie den Wert sd_service_name_pattern to be angeben^nginx-plus-service$. Im nächsten Abschnitt finden Sie weitere Details.

Konfigurieren Sie den CloudWatch Agenten für das Scraping von NGINX Plus Prometheus-Metriken

Der letzte Schritt besteht darin, den CloudWatch Agenten so zu konfigurieren, dass er die Metriken scannt. NGINX In diesem Beispiel erkennt der CloudWatch Agent die Aufgabe anhand des Dienstnamenmusters und des Ports 9113, für den der Exporter die Prometheus-Metriken verfügbar macht. NGINX Sobald die Aufgabe erkannt wurde und die Metriken verfügbar sind, beginnt der CloudWatch Agent, die gesammelten Metriken im Log-Stream zu posten. nginx-prometheus-exporter

Um den CloudWatch Agenten so zu konfigurieren, dass er die Metriken scannt NGINX
  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 finden Sie die vollständige CloudWatch Agentenkonfiguration im value Schlüssel im resource:CWAgentConfigSSMParameter Abschnitt. 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-plus-prometheus-exporter", "sd_metrics_path": "/metrics", "sd_metrics_ports": "9113", "sd_service_name_pattern": "^nginx-plus.*" } ],
  3. Fügen Sie in derselben Datei den folgenden Abschnitt hinzu, um metric_declaration NGINX Plus-Metriken zuzulassen. Beachten Sie unbedingt das vorhandene Einrückungsmuster.

    { "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$" ] },
  4. Wenn Sie den CloudWatch Agenten noch nicht in diesem Cluster bereitgestellt haben, fahren Sie mit Schritt 8 fort.

    Wenn Sie den CloudWatch Agenten mithilfe von bereits im ECS Amazon-Cluster bereitgestellt haben AWS CloudFormation, 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-plus-scraping-support
  5. Öffnen Sie die AWS CloudFormation Konsole unter https://console.aws.amazon.com/cloudformation.

  6. Überprüfen Sie das neu erstellte Changeset. nginx-plus-scraping-support Sie sollten sehen, dass eine Änderung auf die Ressource angewendet wurde. CWAgentConfigSSMParameter Führen Sie das Changeset aus und starten Sie die CloudWatch Agententask neu, indem Sie den folgenden Befehl 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 Agenten mit der Erfassung von Prometheus-Metriken zum ersten Mal 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

Ihre NGINX Plus-Metriken und -Logs anzeigen

Sie können jetzt die gesammelten NGINX Plus-Metriken einsehen.

Um die Metriken für Ihren NGINX Beispiel-Workload anzuzeigen
  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 zu sehen.

  3. Um die CloudWatch Logs-Ereignisse zu sehen, wählen Sie im Navigationsbereich Protokollgruppen aus. Die Ereignisse befinden sich in der Protokollgruppe /aws/containerinsights/your_cluster_name/prometheus, im Logstream nginx-plus-prometheus-exporter.