Amazon ECS叢集的範例NGINX工作負載 - Amazon CloudWatch

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Amazon ECS叢集的範例NGINX工作負載

NGINX Prometheus 匯出工具可以抓取和公開NGINX資料作為 Prometheus 指標。此範例會搭配 Amazon 的NGINX反向代理服務,以串聯方式使用匯出器ECS。

如需 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。首先,建立一個具有以下兩個檔案的目錄:

    • 一個範例 Dockerfile:

      FROM nginx COPY nginx.conf /etc/nginx/nginx.conf
    • nginx.conf 檔案,從 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; } } }
      注意

      必須在 nginx-prometheus-exporter 設定為從中湊集指標的相同連接埠啟用 stub_status。在我們的範例任務定義中,將 nginx-prometheus-exporter 設定為從連接埠 8080 湊集指標。

  4. 從新目錄中的檔案建置映像:

    docker build -t nginx-reverse-proxy ./path-to-your-directory
  5. 將您的新映像上傳至映像儲存庫以供日後使用。

在 Amazon 中建立要執行的任務定義NGINX和 Web 伺服器應用程式 ECS

接著,設定任務定義。

此任務定義可啟用 NGINX Prometheus 指標的收集和匯出。NGINX 容器會追蹤應用程式的輸入,並將資料公開至連接埠 8080,如 中設定nginx.conf。NGINX Prometheus 匯出器容器會抓取這些指標,並將其發佈到連接埠 9113,用於 CloudWatch。

設定NGINX範例 Amazon ECS工作負載的任務定義
  1. 使用下列內容建立任務定義JSON檔案。Replace (取代) your-customized-nginx-iamge 搭配自訂映像URI的NGINX映像,並取代 your-web-server-app-image 搭配 Web 伺服器應用程式映像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

將 CloudWatch 代理程式設定為抓取 NGINX Prometheus 指標

最後一個步驟是設定 CloudWatch 代理程式來抓取NGINX指標。在此範例中, CloudWatch 客服人員會透過服務名稱模式和連接埠 9113 來探索任務,匯出者在此連接埠中公開 的 Prometheus 指標NGINX。在探索任務和可用的指標後, CloudWatch 客服人員開始將收集的指標發佈到日誌串流 nginx-prometheus-exporter

若要設定 CloudWatch 代理程式來抓取NGINX指標
  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. 使用文字編輯器開啟 檔案,然後在 resource:CWAgentConfigSSMParameter區段的 value金鑰中找到完整的 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。

    如果您已使用 在 Amazon ECS叢集中部署 CloudWatch 代理程式 AWS CloudFormation,您可以輸入下列命令來建立變更集:

    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資源的變更。執行變更集,並輸入下列命令以重新啟動 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 日誌事件,請在導覽窗格中選擇日誌群組。事件位於日誌群組 /aws/containerinsights/ 中your_cluster_name/prometheus ,在日誌串流中 nginx-prometheus-exporter.