在 Amazon ECS 上部署 CloudWatch 代理和 X-Ray 守护进程
在 Amazon ECS 上,您可以将 CloudWatch 代理作为附加项部署到应用程序容器来收集指标。您可以通过 SSM 参数仓库来配置 CloudWatch 代理。
创建 IAM 角色
您必须创建两个 IAM 角色。如果您已创建这些角色,则可能需要向其添加权限。
-
ECS 任务角色 – 容器使用此角色运行。权限应是您的应用程序所需的任何权限,以及 CloudWatchAgentServerPolicy 和 AWSXRayDaemonWriteAccess。
-
ECS 任务执行角色— Amazon ECS 使用此角色启动和执行您的容器。如果您已创建此角色,请将 AmazonSSMReadOnlyAccess、AmazonECSTaskExecutionRolePolicy 和 CloudWatchAgentServerPolicy 策略附加到此角色。
如果您需要存储更敏感的数据以供 Amazon ECS 使用,请参阅指定敏感数据以了解更多信息。
有关创建 IAM 角色的更多信息,请参阅创建 IAM 角色。
将代理配置存储在 SSM 参数仓库中
您需要确保您的代理配置文件具有以下部分,然后将它上载到 SSM 参数仓库。
{ "logs": { "metrics_collected": { "emf": {} } } }
将代理配置上载到 SSM 参数仓库中
-
将代理配置内容放入本地文件
/tmp/ecs-cwagent.json
中 -
输入以下命令。将
region
替换为集群的区域。aws ssm put-parameter \ --name "ecs-cwagent" \ --type "String" \ --value "`cat /tmp/ecs-cwagent.json`" \ --region "
region
"
创建任务定义及启动任务
此任务的步骤取决于您要使用的是 EC2 启动类型还是 Fargate 启动类型。
EC2 启动类型
首先,创建任务定义。在此示例中,容器“demo-app”向 CloudWatch 代理发送 X-Ray 开发工具包指标,并向 X-Ray 守护进程发送跟踪信息。
将以下任务定义复制到本地 JSON 文件,例如 /tmp/ecs-cwagent-ec2.json
。替换以下占位符:
将
{{ecs-task-role}}
替换为 ECS 任务角色的 ARN。将
{{ecs-task-execution-role}}
替换为 ECS 任务执行角色的 ARN。将
{{demo-app-image}}
替换为已启用 X-Ray 开发工具包集成的应用程序镜像。将名称从 demo-app 更改为您自己的应用程序名称。将
{{region}}
替换为要发送容器日志的 Amazon 区域的名称。例如:us-west-2
。
{ "family": "ecs-cwagent-ec2", "taskRoleArn": "
{{ecs-task-role}}
", "executionRoleArn": "{{ecs-task-execution-role}}
", "networkMode": "bridge", "containerDefinitions": [ { "name": "demo-app", "image": "{{demo-app-image}}
", "links": [ "cloudwatch-agent", "xray-daemon" ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-create-group": "True", "awslogs-group": "/ecs/ecs-cwagent-ec2", "awslogs-region": "{{region}}
", "awslogs-stream-prefix": "ecs" } } }, { "name": "xray-daemon", "image": "public.ecr.aws/xray/aws-xray-daemon:latest", "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-create-group": "True", "awslogs-group": "/ecs/ecs-cwagent-ec2", "awslogs-region": "{{region}}
", "awslogs-stream-prefix": "ecs" } } }, { "name": "cloudwatch-agent", "image": "public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest", "secrets": [ { "name": "CW_CONFIG_CONTENT", "valueFrom": "ecs-cwagent" } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-create-group": "True", "awslogs-group": "/ecs/ecs-cwagent-ec2", "awslogs-region": "{{region}}
", "awslogs-stream-prefix": "ecs" } } } ], "requiresCompatibilities": [ "EC2" ], "cpu": "256", "memory": "256" }
输入以下命令以创建任务定义。将 {{region}}
替换为集群的区域。
aws ecs register-task-definition \ --cli-input-json file:///tmp/ecs-cwagent-ec2.json \ --region
{{region}}
输入以下命令以启动任务。将 {{cluster-name}}
和 {{region}}
分别替换为集群的名称和区域。
aws ecs run-task \ --cluster
{{cluster-name}}
\ --task-definition ecs-cwagent-ec2 \ --region {{region}} \ --launch-type EC2
Fargate 启动类型
首先,创建任务定义。在此示例中,容器“demo-app”向 CloudWatch 代理发送 X-Ray 开发工具包指标,并向 X-Ray 守护进程发送跟踪信息。
将以下任务定义复制到本地 JSON 文件,例如 /tmp/ecs-cwagent-ec2.json
。替换以下占位符:
将
{{ecs-task-role}}
替换为 ECS 任务角色的 Amazon Resource Name (ARN)。将
{{ecs-task-execution-role}}
替换为 ECS 任务执行角色的 ARN。将
{{demo-app-image}}
替换为已启用 X-Ray 开发工具包集成的应用程序镜像。将名称从 demo-app 更改为您自己的应用程序名称。将
{{region}}
替换为要发送容器日志的 Amazon 区域的名称。例如:us-west-2
。
{ "family": "ecs-cwagent-fargate", "taskRoleArn": "
{{ecs-task-role}}
", "executionRoleArn": "{{ecs-task-execution-role}
}", "networkMode": "awsvpc", "containerDefinitions": [ { "name": "demo-app", "image": "{{demo-app-image}}
", "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-create-group": "True", "awslogs-group": "/ecs/ecs-cwagent-fargate", "awslogs-region": "{{region}}
", "awslogs-stream-prefix": "ecs" } } }, { "name": "xray-daemon", "image": "public.ecr.aws/xray/aws-xray-daemon:latest", "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-create-group": "True", "awslogs-group": "/ecs/ecs-cwagent-fargate", "awslogs-region": "{{region}}
", "awslogs-stream-prefix": "ecs" } } }, { "name": "cloudwatch-agent", "image": "public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest", "secrets": [ { "name": "CW_CONFIG_CONTENT", "valueFrom": "ecs-cwagent" } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-create-group": "True", "awslogs-group": "/ecs/ecs-cwagent-fargate", "awslogs-region": "{{region}}
", "awslogs-stream-prefix": "ecs" } } } ], "requiresCompatibilities": [ "FARGATE" ], "cpu": "512", "memory": "1024" }
输入以下命令以创建任务定义。将 {{region}}
替换为集群的区域。
aws ecs register-task-definition \ --cli-input-json file:///tmp/ecs-cwagent-fargate.json \ --region
{{region}}
如果您已设置 Fargate 集群,则可使用刚刚创建的任务定义来启动任务。如果您尚不具有任何 Fargate 集群,请参阅配置服务以了解有关设置 Fargate 的其余步骤的更多信息。