Amazon Elastic Container Service
开发人员指南 (API 版本 2014-11-13)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

将 CloudWatch Logs 用于容器实例

您可以将容器实例配置为向 CloudWatch Logs 发送日志信息。这使您能够在一个方便位置查看容器实例中的不同日志。本主题可帮助您在通过 Amazon ECS-optimized Amazon Linux 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. 依次选择创建策略JSON

  4. 输入以下策略:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogStreams" ], "Resource": [ "arn:aws:logs:*:*:*" ] } ] }
  5. 选择查看策略

  6. 查看策略页面上,为名称输入 ECS-CloudWatchLogs,然后选择创建策略

ECS-CloudWatchLogs 策略附加到 ecsInstanceRole

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

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

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

  4. 依次选择权限附加策略

  5. 要缩小要附加的可用策略的范围,请为筛选条件键入 ECS-CloudWatchLogs

  6. 选中 ECS-CloudWatchLogs 策略左侧的框并选择附加策略

安装 CloudWatch Logs 代理

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

注意

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

安装 CloudWatch Logs 代理

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

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

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

配置并启动 CloudWatch Logs 代理

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

以下示例配置文件已针对 Amazon ECS-optimized Amazon Linux 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 占位符的步骤。

[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 代理配置文件。

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

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

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

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

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

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

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

    [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 代理。

    • Amazon Linux

      [ec2-user ~]$ sudo service awslogs start
    • Amazon Linux 2

      [ec2-user ~]$ sudo systemctl start awslogsd
  2. 使用 chkconfig 命令确保 CloudWatch Logs 代理在每次系统启动时启动。

    • Amazon Linux

      [ec2-user ~]$ sudo chkconfig awslogs on
    • Amazon Linux 2

      [ec2-user ~]$ sudo systemctl enable awslogsd.service

查看 CloudWatch Logs

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

注意

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

查看您的 CloudWatch Logs 数据

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

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

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

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

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

    
                        CloudWatch 控制台指标视图