

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在 Amazon ECS 上进行日志记录和监控
<a name="amazon-ecs-logging-monitoring"></a>

亚马逊弹性容器服务 (Amazon ECS) Service 为正在运行的容器[提供了两种启动](https://docs.aws.amazon.com//AmazonECS/latest/developerguide/launch_types.html)类型，它们决定了托管任务和服务的基础设施类型；这些启动类型 AWS Fargate 是和 Amazon EC2。两种启动类型均可集成， CloudWatch 但配置和支持各不相同。

以下各节可帮助您了解如何使用在 Amazon ECS 上 CloudWatch 进行日志记录和监控。

**Topics**
+ [使用 EC2 启动类型 CloudWatch 进行配置](configure-cloudwatch-ec2-launch-type.md)
+ [适用于 EC2 和 Fargate 启动类型的 Amazon ECS 容器日志](ec2-fargate-logs.md)
+ [在 Amazon ECS 中使用自定义日志路由 FireLens](firelens-custom-log-routing.md)
+ [亚马逊 ECS 的指标](ecs-metrics.md)

# 使用 EC2 启动类型 CloudWatch 进行配置
<a name="configure-cloudwatch-ec2-launch-type"></a>

使用 EC2 启动类型，您可以预置一个由 EC2 实例组成的 Amazon ECS 集群，这些实例使用 CloudWatch代理进行日志记录和监控。亚马逊 ECS 优化的 AMI 预装了[亚马逊 ECS 容器代理](https://docs.aws.amazon.com//AmazonECS/latest/developerguide/ECS_agent.html)，可提供亚马逊 ECS 集群的 CloudWatch 指标。

这些默认指标包含在 Amazon ECS 的成本中，但是 Amazon ECS 的默认配置不监控日志文件或其他指标（例如，可用磁盘空间）。您可以使用为 EC2 启动类型配置 Amazon ECS 集群，这将创建一个部署具有启动配置的 Amazon EC2 Auto Scaling 组的 CloudFormation 堆栈。 AWS 管理控制台 但是，这种方法意味着您无法选择自定义 AMI，也无法使用不同的设置或其他启动脚本自定义启动配置。

要监控其他日志和指标，您必须在 Amazon ECS 容器实例上安装 CloudWatch 代理。您可以使用本指南[使用 Systems Manager 分发服务器和状态管理器安装 CloudWatch 代理](install-cloudwatch-systems-manager.md)部分中的 EC2 实例安装方法。但是，Amazon ECS AMI 不包括所需的 Systems Manager 代理。在创建 Amazon ECS 集群时，您应该使用带有用户数据脚本的自定义启动配置，该脚本会安装 Systems Manager 代理。这允许您的容器实例向 Systems Manager 注册并应用状态管理器关联来安装、配置和更新 CloudWatch 代理。当 State Manager 运行并更新您的 CloudWatch 代理配置时，它还会应用您的 Amazon EC2 标准系统级 CloudWatch 配置。您还可以将 Amazon ECS 的标准化 CloudWatch 配置存储在 CloudWatch 配置的 S3 存储桶中，并使用状态管理器自动应用这些配置。

您应确保应用于您的 Amazon ECS 容器实例的 IAM 角色或实例配置文件包含必填项`CloudWatchAgentServerPolicy`和`AmazonSSMManagedInstanceCore`策略。你可以使用 ecs\$1cl [uster\$1with\$1cloudwatch\$1linux.yaml 模板来配置基于 Linux 的 Amazon EC](https://github.com/aws-samples/logging-monitoring-apg-guide-examples/blob/main/examples/ecs/ecs_cluster_with_cloudwatch_linux.yaml) CloudFormation S 集群。此模板创建具有自定义启动配置的 Amazon ECS 集群，该配置用于安装 Systems Manager，并部署自定义 CloudWatch 配置来监控特定于 Amazon ECS 的日志文件。

您应该为 Amazon ECS 容器实例捕获以下日志以及标准 EC2 实例日志：
+ **Amazon ECS 代理启动输出** — `/var/log/ecs/ecs-init.log`
+ **亚马逊 ECS 代理输出** — `/var/log/ecs/ecs-agent.log`
+ **IAM 凭证提供商请求日志 —** `/var/log/ecs/audit.log`

有关输出级别、格式和其他配置选项的更多信息，请参阅 [Amazon ECS 文档中的 Amazon ECS 日志文件位置](https://docs.aws.amazon.com//AmazonECS/latest/developerguide/logs.html)。

**重要**  
 Fargate 启动类型不需要安装或配置代理，因为您不运行或管理 EC2 容器实例。

Amazon ECS 容器实例应使用经过优化的最新亚马逊 ECS AMIs 和容器代理。 AWS 使用亚马逊 ECS 优化的 AMI 信息（包括 AMI ID）存储公共 Systems Manager 参数存储参数。您可以使用经优化的 Amazon ECS 的参数存储参数[格式从参数存储](https://docs.aws.amazon.com//AmazonECS/latest/developerguide/retrieve-ecs-optimized_AMI.html)中检索最新优化的 AMI AMIs。您可以在 CloudFormation 模板中引用公共参数存储参数，该参数引用最新的 AMI 或特定 AMI 版本。

AWS 在每个支持的区域中提供相同的参数存储参数。这意味着引用这些参数的 CloudFormation 模板可以跨区域和账户重复使用，而无需更新 AMI。您可以通过参考特定版本来控制将较新 Amazon ECS 部署 AMIs 到您的组织，这有助于您在测试之前防止使用经过优化 Amazon ECS 的新型 AMI。

# 适用于 EC2 和 Fargate 启动类型的 Amazon ECS 容器日志
<a name="ec2-fargate-logs"></a>

Amazon ECS 使用任务定义将容器作为任务和服务进行部署和管理。您可以在任务定义中配置要启动到 Amazon ECS 集群中的容器。使用容器级别的日志驱动程序配置日志记录。多个日志驱动程序选项为您的容器提供不同的日志系统（例如、、、、、`awslogs`、`fluentd`、`gelf`、、`json-file`、`journald`、`logentries``splunk``syslog`、或`awsfirelens`），具体取决于您使用的是 EC2 还是 Fargate 启动类型。Fargate 启动类型提供了以下日志驱动程序选项的子集：`awslogs``splunk`、和。`awsfirelens` AWS 提供`awslogs`日志驱动程序，用于捕获容器输出并将其传输到 CloudWatch Logs。日志驱动程序设置使您可以自定义日志组、区域和日志流前缀以及许多其他选项。

日志组的默认命名和上的 “**自动配置 CloudWatch 日志**” 选项使用的选项 AWS 管理控制台 是`/ecs/<task_name>`。Amazon ECS 使用的日志流名称的`<awslogs-stream-prefix>/<container_name>/<task_id>`格式为。我们建议您使用根据组织要求对日志进行分组的群组名称。在下表中，`image_name`和包含`image_tag`在日志流的名称中。


|  |  | 
| --- |--- |
| 日志组名称 | /<Business unit>/<Project or application name>/<Environment>/<Cluster name>/<Task name> | 
| 日志流名称前缀 |  `/<image_name>/<image_tag>`  | 

此信息也可在任务定义中找到。但是，任务会定期使用新的修订版进行更新，这意味着任务定义可能使用了`image_name``image_tag`与任务定义当前使用的不同的。有关更多信息和命名建议，请参阅本指南的[规划您的 CloudWatch 部署](planning-cloudwatch-deployment.md)部分。

如果您使用持续集成和持续交付（CI/CD) pipeline or automated process, you can create a new task definition revision for your application with each new Docker image build. For example, you can include the Docker image name, image tag, GitHub revision, or other important information in your task definition revision and logging configuration as a part of your CI/CD流程。

# 在 Amazon ECS 中使用自定义日志路由 FireLens
<a name="firelens-custom-log-routing"></a>

FireLens for Amazon ECS 可帮助您将日志路由到 [Fluentd](https://www.fluentd.org/) 或 Fluen [t Bit](https://docs.fluentbit.io/manual)，这样您就可以直接将容器日志发送到 AWS 服务和 AWS 合作伙伴网络 (APN) 目的地，并支持将日志传送到日志。 CloudWatch 

AWS 为 Fl [uent Bit 提供 Docker 镜像](https://docs.aws.amazon.com//AmazonECS/latest/developerguide/firelens-using-fluentbit.html)，其中预装了亚马逊 Kinesis Data Streams、Amazon Data Firehose 和日志的插件。 CloudWatch 您可以使用 FireLens 日志驱动程序代替日志驱动程序，以便对发送`awslogs`到 Logs 的 CloudWatch 日志进行更多自定义和控制。

例如，您可以使用 FireLens 日志驱动程序来控制日志格式输出。这意味着 Amazon ECS 容器的 CloudWatch 日志会自动格式化为 JSON 对象，并包含`ecs_cluster`、、、`ecs_task_arn``ecs_task_definition``container_id``container_name`、和 JSON 格式的属性。`ec2_instance_id`当您指定`awsfirelens`驱动程序时，Fluent 主机将通过`FLUENT_HOST`和`FLUENT_PORT`环境变量暴露给您的容器。这意味着你可以使用 fluent 的记录器库直接从代码中登录到日志路由器。例如，您的应用程序可能包含使用环境变量中提供的值登录到 Fluent Bit 的`fluent-logger-python`库。

如果您选择用 FireLens 于 Amazon ECS，则可以配置[与`awslogs`日志驱动程序相同的设置，也可以使用其他设置](https://github.com/aws/amazon-cloudwatch-logs-for-fluent-bit)。例如，您可以使用 [ecs-task-nginx-firelense.js](https://github.com/aws-samples/logging-monitoring-apg-guide-examples/blob/main/examples/ecs/ecs-task-nginx-firelense.json) on Amazon ECS 任务定义来启动配置为 FireLens 用于登录的 NGINX 服务器。 CloudWatch它还会启动一个 FireLens Fluent Bit 容器作为日志记录的边车。

# 亚马逊 ECS 的指标
<a name="ecs-metrics"></a>

[Amazon ECS 使用 Amazon ECS 容器代理在集群和服务级别为 EC2 和 Fargate 启动类型提供标准 CloudWatch 指标](https://docs.aws.amazon.com//AmazonECS/latest/developerguide/cloudwatch-metrics.html)（例如 CPU 和内存利用率）。您还可以使用 Container Insights 捕获服务、任务和 CloudWatch容器的指标，或者使用嵌入式指标格式捕获自己的自定义容器指标。

Container Insights 是一项 CloudWatch 功能，可提供集群、容器实例、服务和任务级别的 CPU 利用率、内存利用率、网络流量和存储等指标。Container Insights 还会创建自动仪表板，帮助您分析服务和任务，并查看容器级别的平均内存或 CPU 使用率。Container Insights 将`ECS/ContainerInsights`[自定义指标发布到自定义命名空间](https://docs.aws.amazon.com//AmazonECS/latest/developerguide/cloudwatch-metrics.html)，可用于绘制图表、警报和仪表板。

您可以通过为每个 Amazon ECS 集群启用容器洞察来开启容器洞察指标。如果您还想查看容器实例级别的指标，可以将[ CloudWatch 代理作为守护程序容器启动到您的 Amazon ECS 集群上](https://docs.aws.amazon.com//AmazonCloudWatch/latest/monitoring/deploy-container-insights-ECS-instancelevel.html)。您可以使用 [cwagent-ecs-instance-metric-cfn.yaml](https://github.com/aws-samples/logging-monitoring-apg-guide-examples/blob/main/examples/ecs/cwagent-ecs-instance-metric-cfn.yaml) CloudFormation 模板将代理部署 CloudWatch 为 Amazon ECS 服务。重要的是，此示例假设您创建了相应的自定义 CloudWatch代理配置，并将其与密钥一起存储在 Parameter Store 中`ecs-cwagent-daemon-service`。

作为 Container Insights 的守护程序 CloudWatch 容器部署的[CloudWatch代理](https://docs.aws.amazon.com//AmazonCloudWatch/latest/monitoring/Container-Insights-metrics-ECS.html)包括其他磁盘、内存和 CPU 指标，例如`instance_cpu_reserved_capacity`和`instance_memory_reserved_capacity``ClusterName`、`ContainerInstanceId`、`InstanceId`维度。容器实例级别的指标由 Container Insights 使用 CloudWatch 嵌入式指标格式实现。您可以使用本指南[为 CloudWatch 代理部署和配置设置状态管理器和分发服务器](install-cloudwatch-systems-manager.md#set-up-systems-manager-distributor)部分中的方法为 Amazon ECS 容器实例配置其他系统级指标。

## 在 Amazon ECS 中创建自定义应用程序指标
<a name="ecs-metrics-applications"></a>

您可以使用[CloudWatch嵌入式指标格式为应用程序创建自定义指标](https://docs.aws.amazon.com//AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format.html)。`awslogs`日志驱动程序可以解释 CloudWatch 嵌入式指标格式语句。

以下示例中的`CW_CONFIG_CONTENT`环境变量设置为 S `cwagentconfig` ystems Manager 参数存储参数的内容。您可以使用此基本配置运行代理，将其配置为嵌入式指标格式端点。但是，它已不再必要。

```
  {
  "logs": {
    "metrics_collected": {
      "emf": { }
    }
  }
}
```

如果您在多个账户和地区部署了 Amazon ECS，则可以使用 AWS Secrets Manager 密钥来存储您的 CloudWatch 配置，并将密钥策略配置为与您的组织共享。您可以使用任务定义中的 secrets 选项来设置`CW_CONFIG_CONTENT`变量。

您可以在应用程序中使用 AWS 提供的[开源嵌入式指标格式库](https://docs.aws.amazon.com//AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format_Libraries.html)，并指定`AWS_EMF_AGENT_ENDPOINT`环境变量以连接到充当嵌入式指标格式端点的 CloudWatch 代理 sidecar 容器。例如，您可以使用 [ecs\$1cw\$1emf\$1example 示例](https://github.com/aws-samples/logging-monitoring-apg-guide-examples/tree/main/examples/ecs/ecs_cw_emf_example) Python 应用程序将嵌入式指标格式的指标发送到配置为嵌入式指标格式端点的代理 CloudWatch sidecar 容器。

的 Flu [ent Bit 插件](https://github.com/aws/amazon-cloudwatch-logs-for-fluent-bit)还 CloudWatch 可用于发送嵌入式公制格式消息。你也可以使用 [ecs\$1firelense\$1emf\$1example 示例 Python 应用程序将嵌入式指标格式的指标发送到 F](https://github.com/aws-samples/logging-monitoring-apg-guide-examples/tree/main/examples/ecs/ecs_firelense_emf_example) irelens for Amazon ECS 边车容器。

如果您不想使用嵌入式指标格式，则可以通过 [AWS API](https://docs.aws.amazon.com//AmazonCloudWatch/latest/APIReference/Welcome.html) 或 [AWS SDK](https://aws.amazon.com/developer/tools/) 创建和更新 CloudWatch 指标。除非您有特定的用例，否则我们不建议使用这种方法，因为它会增加代码的维护和管理开销。