Amazon EC2 Container Service
开发人员指南 (API Version 2014-11-13)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

将 CloudWatch Logs 用于容器实例

您可以将容器实例配置为向 CloudWatch Logs 发送日志信息。这使您能够在一个方便位置查看容器实例中的不同日志。本主题可帮助您在通过针对 Amazon ECS 优化过的 AMI 启动的容器实例上开始使用 CloudWatch Logs。

要将容器日志从您的任务发送到 CloudWatch Logs,请参阅使用 awslogs 日志驱动程序。有关 CloudWatch Logs 的更多信息,请参阅 Amazon CloudWatch 用户指南 中的监控日志文件

CloudWatch Logs IAM 策略

您必须先创建 IAM 策略以允许容器实例使用 CloudWatch Logs API 并将该策略附加到 ecsInstanceRole,然后您的容器实例才能将日志数据发送到 CloudWatch Logs。

创建 ECS-CloudWatchLogs IAM 策略

  1. 通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

  2. 在导航窗格中,选择 Policies

  3. 选择 Create Policy

  4. Create Policy 页面上,选择 Create Your Own Policy

  5. Review Policy 页面上,输入以下信息并选择 Create Policy

    1. Policy Name (策略名称) 字段中,输入 ECS-CloudWatchLogs

    2. Policy Document (策略文档) 字段中,粘贴以下策略。

      Copy
      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogStreams" ], "Resource": [ "arn:aws:logs:*:*:*" ] } ] }

ECS-CloudWatchLogs 策略附加到您的 ecsInstanceRole

  1. 通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

  2. 在导航窗格中,选择 Roles

  3. 选择 ecsInstanceRole。如果角色不存在,请按照 Amazon ECS 容器实例 IAM 角色中的过程操作来创建角色。

  4. 选择 Permissions 选项卡。

  5. Managed Policies 部分中,选择 Attach Policy

  6. Filter 框中,键入 ECS-CloudWatchLogs 以缩小要附加的可用策略的范围。

  7. 选中 ECS-CloudWatchLogs 策略左侧的框并选择 Attach Policy

安装 CloudWatch Logs 代理

在将 ECS-CloudWatchLogs 策略添加到您的 ecsInstanceRole 后,可以在容器实例上安装 CloudWatch Logs 代理。

注意

此过程是针对已针对 Amazon ECS 优化过的 AMI 编写的,可能不适用于其他操作系统。有关在其他操作系统上安装此代理的信息,请参阅 Amazon CloudWatch 用户指南 中的 CloudWatch Logs 入门

安装 CloudWatch Logs 代理

  • 运行以下命令安装 CloudWatch Logs 代理。

    Copy
    [ec2-user ~]$ sudo yum install -y awslogs

安装此代理后,继续下一部分以配置此代理。

配置并启动 CloudWatch Logs 代理

CloudWatch Logs 代理配置文件 (/etc/awslogs/awslogs.conf) 描述要发送到 CloudWatch Logs 的日志文件。代理配置文件的 [general] 部分定义适用于所有日志流的通用配置,并且您可以为要监控的容器实例上的每个文件添加单独的日志流部分。有关更多信息,请参阅 Amazon CloudWatch 用户指南 中的 CloudWatch Logs 代理参考

以下示例配置文件已针对为 Amazon ECS 优化过的 AMI 进行了配置,并且它为几个常见日志文件提供了日志流:

/var/log/dmesg

Linux 内核的消息缓冲区。

/var/log/messages

全局系统消息。

/var/log/docker

Docker 守护程序日志消息。

/var/log/ecs/ecs-init.log

来自 ecs-init upstart 作业的日志消息。

/var/log/ecs/ecs-agent.log

来自 Amazon ECS 容器代理的日志消息。

/var/log/ecs/audit.log

来自任务凭证提供程序的 IAM 角色的日志消息。

您可以对 Amazon ECS 容器实例使用以下示例文件,但必须将 {cluster}{container_instance_id} 条目替换为集群名称和每个容器实例的容器实例 ID,以便按集群名称对日志流进行分组,并为每个单独的容器实例分离这些日志流。遵循示例配置文件的过程介绍了替换集群名称和容器实例 ID 占位符的步骤。

Copy
[general] state_file = /var/lib/awslogs/agent-state [/var/log/dmesg] file = /var/log/dmesg log_group_name = /var/log/dmesg log_stream_name = {cluster}/{container_instance_id} [/var/log/messages] file = /var/log/messages log_group_name = /var/log/messages log_stream_name = {cluster}/{container_instance_id} datetime_format = %b %d %H:%M:%S [/var/log/docker] file = /var/log/docker log_group_name = /var/log/docker log_stream_name = {cluster}/{container_instance_id} datetime_format = %Y-%m-%dT%H:%M:%S.%f [/var/log/ecs/ecs-init.log] file = /var/log/ecs/ecs-init.log.* log_group_name = /var/log/ecs/ecs-init.log log_stream_name = {cluster}/{container_instance_id} datetime_format = %Y-%m-%dT%H:%M:%SZ [/var/log/ecs/ecs-agent.log] file = /var/log/ecs/ecs-agent.log.* log_group_name = /var/log/ecs/ecs-agent.log log_stream_name = {cluster}/{container_instance_id} datetime_format = %Y-%m-%dT%H:%M:%SZ [/var/log/ecs/audit.log] file = /var/log/ecs/audit.log.* log_group_name = /var/log/ecs/audit.log log_stream_name = {cluster}/{container_instance_id} datetime_format = %Y-%m-%dT%H:%M:%SZ

配置 CloudWatch Logs 代理

  1. 备份现有 CloudWatch Logs 代理配置文件。

    Copy
    [ec2-user ~]$ sudo mv /etc/awslogs/awslogs.conf /etc/awslogs/awslogs.conf.bak
  2. 创建空白配置文件。

    Copy
    [ec2-user ~]$ sudo touch /etc/awslogs/awslogs.conf
  3. 使用文本编辑器打开 /etc/awslogs/awslogs.conf 文件,然后将上面的示例文件复制到该文件中。

  4. 安装 jq JSON 查询实用程序。

    Copy
    [ec2-user ~]$ sudo yum install -y jq
  5. 查询 Amazon ECS 自检 API 以查找集群名称并其设置为环境变量。

    Copy
    [ec2-user ~]$ cluster=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .Cluster')
  6. 将文件中的 {cluster} 占位符替换为您在上一步中设置的环境变量的值。

    Copy
    [ec2-user ~]$ sudo sed -i -e "s/{cluster}/$cluster/g" /etc/awslogs/awslogs.conf
  7. 查询 Amazon ECS 自检 API 以查找容器实例 ID 并将其设置为环境变量。

    Copy
    [ec2-user ~]$ container_instance_id=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F/ '{print $2}' )
  8. 将文件中的 {container_instance_id} 占位符替换为您在上一步中设置的环境变量的值。

    Copy
    [ec2-user ~]$ sudo sed -i -e "s/{container_instance_id}/$container_instance_id/g" /etc/awslogs/awslogs.conf

配置 CloudWatch Logs 代理区域

默认情况下,CloudWatch Logs 代理将数据发送到 us-east-1 区域。如果您要将数据发送到其他区域 (例如,您的群集所在的区域),可以在 /etc/awslogs/awscli.conf 文件中设置该区域。

  1. 使用文本编辑器打开 /etc/awslogs/awscli.conf 文件。

  2. [default] 部分中,将 us-east-1 替换为要查看的日志数据所在的区域。

  3. 保存文件并退出您的文本编辑器。

启动 CloudWatch Logs 代理

  1. 使用以下命令启动 CloudWatch Logs 代理。

    Copy
    [ec2-user ~]$ sudo service awslogs start

    输出:

    Starting awslogs:                                          [  OK  ]
  2. 使用 chkconfig 命令确保 CloudWatch Logs 代理在每次系统启动时启动。

    Copy
    [ec2-user ~]$ sudo chkconfig awslogs on

查看 CloudWatch Logs

在向容器实例授予将日志发送到 CloudWatch Logs 的适当权限并配置和启动代理后,容器实例应将其日志数据发送到 CloudWatch Logs。您可以在 AWS 管理控制台中查看和搜索这些日志。

注意

新实例启动可能需要几分钟才能将数据发送到 CloudWatch Logs。

查看您的 CloudWatch Logs 数据

  1. 通过以下网址打开 CloudWatch 控制台:https://console.amazonaws.cn/cloudwatch/

  2. 在左侧导航窗格中选择 Logs

  3. 您应看到在配置并启动 CloudWatch Logs 代理中配置的日志组。

     CloudWatch 控制台指标视图
  4. 选择要查看的日志组。

  5. 选择要查看的日志流。这些流由已发送到日志的集群名称和容器实例 ID 标识。

     CloudWatch 控制台指标视图

在启动时使用用户数据配置 CloudWatch Logs

当您在 Amazon EC2 中启动 Amazon ECS 容器实例时,您可以选择将用户数据传递到可用于执行常见自动配置任务甚至在实例启动后运行脚本的实例。您可以将多种类型的用户数据传递到实例,包括外壳脚本、cloud-init 指令和 Upstart 作业。您还可以将这些数据以纯文本、文件(这非常适合通过命令行工具启动实例)或者 base64 编码文本(用于 API 调用)的形式传递到启动向导中。

以下示例用户数据块将执行以下任务:

  • 安装 awslogs 程序包,其中包含 CloudWatch Logs 代理

  • 安装 jq JSON 查询实用程序

  • 编写 CloudWatch Logs 代理的配置文件并配置数据将发送到的区域(容器实例所在的区域)

  • 在 Amazon ECS 容器代理启动并将这些值写入 CloudWatch Logs 代理配置文件日志流后,获取集群名称和容器实例 ID

  • 启动 CloudWatch Logs 代理

  • 将 CloudWatch Logs 代理配置为在每次系统启动时启动

Copy
Content-Type: multipart/mixed; boundary="==BOUNDARY==" MIME-Version: 1.0 --==BOUNDARY== Content-Type: text/x-shellscript; charset="us-ascii" #!/bin/bash # Install awslogs and the jq JSON parser yum install -y awslogs jq # Inject the CloudWatch Logs configuration file contents cat > /etc/awslogs/awslogs.conf <<- EOF [general] state_file = /var/lib/awslogs/agent-state [/var/log/dmesg] file = /var/log/dmesg log_group_name = /var/log/dmesg log_stream_name = {cluster}/{container_instance_id} [/var/log/messages] file = /var/log/messages log_group_name = /var/log/messages log_stream_name = {cluster}/{container_instance_id} datetime_format = %b %d %H:%M:%S [/var/log/docker] file = /var/log/docker log_group_name = /var/log/docker log_stream_name = {cluster}/{container_instance_id} datetime_format = %Y-%m-%dT%H:%M:%S.%f [/var/log/ecs/ecs-init.log] file = /var/log/ecs/ecs-init.log.* log_group_name = /var/log/ecs/ecs-init.log log_stream_name = {cluster}/{container_instance_id} datetime_format = %Y-%m-%dT%H:%M:%SZ [/var/log/ecs/ecs-agent.log] file = /var/log/ecs/ecs-agent.log.* log_group_name = /var/log/ecs/ecs-agent.log log_stream_name = {cluster}/{container_instance_id} datetime_format = %Y-%m-%dT%H:%M:%SZ [/var/log/ecs/audit.log] file = /var/log/ecs/audit.log.* log_group_name = /var/log/ecs/audit.log log_stream_name = {cluster}/{container_instance_id} datetime_format = %Y-%m-%dT%H:%M:%SZ EOF --==BOUNDARY== Content-Type: text/x-shellscript; charset="us-ascii" #!/bin/bash # Set the region to send CloudWatch Logs data to (the region where the container instance is located) region=$(curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region) sed -i -e "s/region = us-east-1/region = $region/g" /etc/awslogs/awscli.conf --==BOUNDARY== Content-Type: text/upstart-job; charset="us-ascii" #upstart-job description "Configure and start CloudWatch Logs agent on Amazon ECS container instance" author "Amazon Web Services" start on started ecs script exec 2>>/var/log/ecs/cloudwatch-logs-start.log set -x until curl -s http://localhost:51678/v1/metadata do sleep 1 done # Grab the cluster and container instance ARN from instance metadata cluster=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .Cluster') container_instance_id=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F/ '{print $2}' ) # Replace the cluster name and container instance ID placeholders with the actual values sed -i -e "s/{cluster}/$cluster/g" /etc/awslogs/awslogs.conf sed -i -e "s/{container_instance_id}/$container_instance_id/g" /etc/awslogs/awslogs.conf service awslogs start chkconfig awslogs on end script --==BOUNDARY==--

如果您已创建 ECS-CloudWatchLogs 策略并将其附加到您的 ecsInstanceRole(如 CloudWatch Logs IAM 策略中所述),则可以将上面的用户数据块添加到手动启动的任何容器实例,也可以将此用户数据块添加到 Auto Scaling 启动配置,并且使用此用户数据启动的容器实例一旦启动,就会开始将其日志数据发送到 CloudWatch Logs。有关更多信息,请参阅 启动 Amazon ECS 容器实例