部署 CloudWatch 代理程式以在 Amazon 上收集EC2執行個體層級指標 ECS - Amazon CloudWatch

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

部署 CloudWatch 代理程式以在 Amazon 上收集EC2執行個體層級指標 ECS

若要部署 CloudWatch 代理程式以從執行個EC2體上託管的 Amazon ECS 叢集收集執行個體層級指標,請使用具有預設組態的快速入門設定,或手動安裝代理程式以便能夠進行自訂。

這兩種方法都要求您至少已部署一個具有EC2啟動類型的 Amazon ECS 叢集,而且 CloudWatch 代理程式 Continer 必須能夠存取 Amazon EC2 執行個體中繼資料服務 (IMDS)。如需詳細資訊IMDS,請參閱執行個體中繼資料和使用者資料

這些方法也假設您已 AWS CLI 安裝。此外,若要在下列程序中執行命令,您必須登入具有IAMFullAccessAmazon ECS _ FullAccess 政策的帳戶或角色。

快速設置使用 AWS CloudFormation

若要使用快速設定,請輸入下列命令以用 AWS CloudFormation 來安裝代理程式。Replace (取代) cluster-name 以及 cluster-region 使用您的 Amazon ECS 集群的名稱和區域。

此指令會建立IAM角色CWAgentECSTaskRoleCWAgentECSExecutionRole。如果您的帳戶中已存在這些角色,請在輸入命令時改用 ParameterKey=CreateIAMRoles,ParameterValue=False,而不是使用 ParameterKey=CreateIAMRoles,ParameterValue=True。否則命令會失敗。

ClusterName=cluster-name Region=cluster-region curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/daemon-service/cwagent-ecs-instance-metric/cloudformation-quickstart/cwagent-ecs-instance-metric-cfn.json aws cloudformation create-stack --stack-name CWAgentECS-${ClusterName}-${Region} \ --template-body file://cwagent-ecs-instance-metric-cfn.json \ --parameters ParameterKey=ClusterName,ParameterValue=${ClusterName} \ ParameterKey=CreateIAMRoles,ParameterValue=True \ --capabilities CAPABILITY_NAMED_IAM \ --region ${Region}

(替代)使用自己的IAM角色

如果您想要使用自己的自訂ECS任務角色和ECS任務執行角色,而不是CWAgentECSTaskRoleCWAgentECSExecutionRole角色,請先確定已CloudWatchAgentServerPolicy附加作為ECS任務角色使用的角色。此外,請確定要用ECS作工作執行角色的角色同時附加了CloudWatchAgentServerPolicyA mazonECSTask ExecutionRolePolicy 原則。然後輸入下列命令。在命令中,替換 task-role-arn 與您ARN的自定義ECS任務角色,並替換 execution-role-arn 與您ARN的自定義ECS任務執行角色。

ClusterName=cluster-name Region=cluster-region TaskRoleArn=task-role-arn ExecutionRoleArn=execution-role-arn curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/daemon-service/cwagent-ecs-instance-metric/cloudformation-quickstart/cwagent-ecs-instance-metric-cfn.json aws cloudformation create-stack --stack-name CWAgentECS-${ClusterName}-${Region} \ --template-body file://cwagent-ecs-instance-metric-cfn.json \ --parameters ParameterKey=ClusterName,ParameterValue=${ClusterName} \ ParameterKey=TaskRoleArn,ParameterValue=${TaskRoleArn} \ ParameterKey=ExecutionRoleArn,ParameterValue=${ExecutionRoleArn} \ --capabilities CAPABILITY_NAMED_IAM \ --region ${Region}

故障診斷快速設定

若要檢查 AWS CloudFormation 堆疊的狀態,請輸入以下指令。

ClusterName=cluster-name Region=cluster-region aws cloudformation describe-stacks --stack-name CWAgentECS-$ClusterName-$Region --region $Region

如果您看到的 StackStatus 不是 CREATE_COMPLETECREATE_IN_PROGRESS,請檢查堆疊事件以找出錯誤。輸入以下命令。

ClusterName=cluster-name Region=cluster-region aws cloudformation describe-stack-events --stack-name CWAgentECS-$ClusterName-$Region --region $Region

若要檢查 cwagent 常駐程式服務的狀態,請輸入以下命令。在輸出中,您應該會看到 runningCount 等於 deployment 區段的 desiredCount。如果不相等,請檢查輸出的 failures 區段。

ClusterName=cluster-name Region=cluster-region aws ecs describe-services --services cwagent-daemon-service --cluster $ClusterName --region $Region

您也可以使用 CloudWatch 記錄主控台來檢查代理程式記錄檔。尋找 /ecs/ ecs-cwagent-daemon-service 記錄群組。

刪除代 CloudWatch 理程式的 AWS CloudFormation 堆疊

如果您需要刪除 AWS CloudFormation 堆疊,請輸入以下指令。

ClusterName=cluster-name Region=cluster-region aws cloudformation delete-stack --stack-name CWAgentECS-${ClusterName}-${Region} --region ${Region}

手動和自訂設定

請遵循本節中的步驟手動部署 CloudWatch 代理程式,以從執行個體上EC2託管的 Amazon ECS 叢集收集執行個體層級指標。

必要的IAM角色和政策

需要兩個 IAM 角色。如果角色不存在,即必須建立角色。如需這些角色的詳細資訊,請參閱任務的IAM角色Amazon ECS 任務執行角色。

  • ECS工作角色, CloudWatch 代理程式會使用此角色來發佈指標。如果此角色已經存在,您必須確定它連接了 CloudWatchAgentServerPolicy 政策。

  • ECS任務執行角色,Amazon ECS 代理程式會使用此角色來啟動 CloudWatch 代理程式。如果此角色已經存在,您必須確定它連接了 AmazonECSTaskExecutionRolePolicyCloudWatchAgentServerPolicy 政策。

如果您尚未擁有這些角色,您可以使用下列命令建立它們並連接必要的政策。這第一個命令會建立ECS工作角色。

aws iam create-role --role-name CWAgentECSTaskRole \ --assume-role-policy-document "{\"Version\": \"2012-10-17\",\"Statement\": [{\"Sid\": \"\",\"Effect\": \"Allow\",\"Principal\": {\"Service\": \"ecs-tasks.amazonaws.com\"},\"Action\": \"sts:AssumeRole\"}]}"

輸入上一個命令後,請將命令輸出Arn中的值記下為 "TaskRoleArn」。稍後建立任務定義時需要使用此值。然後輸入下列命令以連接必要的政策。

aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy \ --role-name CWAgentECSTaskRole

下一個命令會建立工ECS作執行角色。

aws iam create-role --role-name CWAgentECSExecutionRole \ --assume-role-policy-document "{\"Version\": \"2012-10-17\",\"Statement\": [{\"Sid\": \"\",\"Effect\": \"Allow\",\"Principal\": {\"Service\": \"ecs-tasks.amazonaws.com\"},\"Action\": \"sts:AssumeRole\"}]}"

輸入上一個命令後,請將命令輸出Arn中的值記下為 "ExecutionRoleArn」。稍後建立任務定義時需要使用此值。然後輸入下列命令以連接必要的政策。

aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy \ --role-name CWAgentECSExecutionRole aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy \ --role-name CWAgentECSExecutionRole

建立任務定義並啟動常駐程式服務

建立作業定義,並使用它來啟動 CloudWatch 代理程式做為精靈服務。若要建立任務定義,請輸入下列命令。在第一行中,將預留位置取代為部署的實際值。logs-region 是 CloudWatch 日誌所在的區域,以及 cluster-region 是叢集所在的區域。task-role-arn 是您正在使用的ECS任務角色的 Arn,且 execution-role-arn 是工ECS作執行角色的 Arn。

TaskRoleArn=task-role-arn ExecutionRoleArn=execution-role-arn AWSLogsRegion=logs-region Region=cluster-region curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/daemon-service/cwagent-ecs-instance-metric/cwagent-ecs-instance-metric.json \ | sed "s|{{task-role-arn}}|${TaskRoleArn}|;s|{{execution-role-arn}}|${ExecutionRoleArn}|;s|{{awslogs-region}}|${AWSLogsRegion}|" \ | xargs -0 aws ecs register-task-definition --region ${Region} --cli-input-json

然後執行下列命令以啟動協助程式服務。Replace (取代) cluster-name 以及 cluster-region 使用您的 Amazon ECS 集群的名稱和區域。

重要

請先移除所有容量提供者策略,然後再執行此命令。否則,該命令將無法正常工作。

ClusterName=cluster-name Region=cluster-region aws ecs create-service \ --cluster ${ClusterName} \ --service-name cwagent-daemon-service \ --task-definition ecs-cwagent-daemon-service \ --scheduling-strategy DAEMON \ --region ${Region}

如果看到此錯誤訊息 An error occurred (InvalidParameterException) when calling the CreateService operation: Creation of service was not idempotent,即表示您已經建立名為 cwagent-daemon-service 的協助程式服務。您必須使用下列命令作為範例,先刪除該服務。

ClusterName=cluster-name Region=cluster-region aws ecs delete-service \ --cluster ${ClusterName} \ --service cwagent-daemon-service \ --region ${Region} \ --force

(選用) 進階組態

或者,您可以使SSM用在EC2執行個體上託管的 Amazon ECS 叢集中為 CloudWatch代理程式指定其他組態選項。選項如下:

  • metrics_collection_interval— CloudWatch 代理程式收集指標的頻率 (以秒為單位)。預設為 60。範圍介於 1–172,000 之間。

  • endpoint_override – (選用) 指定不同端點以傳送日誌。如果您要從中的叢集發佈,VPC並且希望記錄檔資料移至VPC端點,則可能需要執行此操作。

    的值endpoint_override必須是一個字串URL。

  • force_flush_interval – 指定日誌在傳送到伺服器之前停留在記憶體緩衝區內的最長時間 (以秒為單位)。不論此欄位的設定如何,如果緩衝區中的日誌大小達到 1 MB,系統會立即將日誌傳送到伺服器。預設值為 5 秒。

  • region— 根據預設,代理程式會將指標發佈到 Amazon ECS 容器執行個體所在的相同區域。若要覆寫此項目,您可在此指定不同的區域。例如 "region" : "us-east-1"

以下是自訂組態的範例:

{ "agent": { "region": "us-east-1" }, "logs": { "metrics_collected": { "ecs": { "metrics_collection_interval": 30 } }, "force_flush_interval": 5 } }
在 Amazon ECS 容器中自訂 CloudWatch 代理程式組態
  1. 確保 A mazonSSMRead OnlyAccess 政策已附加到您的 Amazon ECS 任務執行角色。您可以輸入以下命令來執行此操作。此範例假設您的 Amazon ECS 任務執行角色為CWAgentECSExecutionRole。如果使用不同的角色,請更換下列命令中的角色名稱。

    aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess \ --role-name CWAgentECSExecutionRole
  2. 建立類似上述範例的自訂組態檔案。將此檔案命名為 /tmp/ecs-cwagent-daemon-config.json

  3. 執行下列命令,將此組態放入參數存放區。Replace (取代) cluster-region 與您的 Amazon ECS 集群的區域。若要執行此命令,您必須登入具有 A mazonSSMFullAccess 原則的使用者或角色。

    Region=cluster-region aws ssm put-parameter \ --name "ecs-cwagent-daemon-service" \ --type "String" \ --value "`cat /tmp/ecs-cwagent-daemon-config.json`" \ --region $Region
  4. 將任務定義檔案下載至本機檔案,例如 /tmp/cwagent-ecs-instance-metric.json

    curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/daemon-service/cwagent-ecs-instance-metric/cwagent-ecs-instance-metric.json -o /tmp/cwagent-ecs-instance-metric.json
  5. 修改任務定義檔案。移除以下區段:

    "environment": [ { "name": "USE_DEFAULT_CONFIG", "value": "True" } ],

    以下列內容取代該區段:

    "secrets": [ { "name": "CW_CONFIG_CONTENT", "valueFrom": "ecs-cwagent-daemon-service" } ],
  6. 依照下列步驟重新啟動代理作為協助程式服務:

    1. 執行下列命令。

      TaskRoleArn=task-role-arn ExecutionRoleArn=execution-role-arn AWSLogsRegion=logs-region Region=cluster-region cat /tmp/cwagent-ecs-instance-metric.json \ | sed "s|{{task-role-arn}}|${TaskRoleArn}|;s|{{execution-role-arn}}|${ExecutionRoleArn}|;s|{{awslogs-region}}|${AWSLogsRegion}|" \ | xargs -0 aws ecs register-task-definition --region ${Region} --cli-input-json
    2. 執行下列命令以啟動協助程式服務。Replace (取代) cluster-name 以及 cluster-region 使用您的 Amazon ECS 集群的名稱和區域。

      ClusterName=cluster-name Region=cluster-region aws ecs create-service \ --cluster ${ClusterName} \ --service-name cwagent-daemon-service \ --task-definition ecs-cwagent-daemon-service \ --scheduling-strategy DAEMON \ --region ${Region}

      如果看到此錯誤訊息 An error occurred (InvalidParameterException) when calling the CreateService operation: Creation of service was not idempotent,即表示您已經建立名為 cwagent-daemon-service 的協助程式服務。您必須使用下列命令作為範例,先刪除該服務。

      ClusterName=cluster-name Region=Region aws ecs delete-service \ --cluster ${ClusterName} \ --service cwagent-daemon-service \ --region ${Region} \ --force