

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

# 在 Amazon ECS 上記錄和監控
<a name="amazon-ecs-logging-monitoring"></a>

Amazon Elastic Container Service (Amazon ECS) 提供[兩種啟動類型](https://docs.aws.amazon.com//AmazonECS/latest/developerguide/launch_types.html)，用於執行容器，並決定託管任務和服務的基礎結構類型；這些啟動類型為 AWS Fargate 和 Amazon EC2。這兩種啟動類型都與 CloudWatch 整合，但組態和支援會有所不同。

下列各節可協助您了解如何使用 CloudWatch 在 Amazon ECS 上記錄和監控。

**Topics**
+ [使用 EC2 啟動類型設定 CloudWatch](configure-cloudwatch-ec2-launch-type.md)
+ [EC2 和 Fargate 啟動類型的 Amazon ECS 容器日誌](ec2-fargate-logs.md)
+ [搭配 FireLens for Amazon ECS 使用自訂日誌路由](firelens-custom-log-routing.md)
+ [Amazon ECS 的指標](ecs-metrics.md)

# 使用 EC2 啟動類型設定 CloudWatch
<a name="configure-cloudwatch-ec2-launch-type"></a>

使用 EC2 啟動類型，您可以佈建使用 CloudWatch 代理程式記錄和監控的 EC2 執行個體 Amazon ECS 叢集。Amazon ECS 最佳化 AMI 已預先安裝 [Amazon ECS 容器代理](https://docs.aws.amazon.com//AmazonECS/latest/developerguide/ECS_agent.html)程式，並為 Amazon ECS 叢集提供 CloudWatch 指標。

這些預設指標包含在 Amazon ECS 的成本中，但 Amazon ECS 的預設組態不會監控日誌檔案或其他指標 （例如，可用磁碟空間）。您可以使用 AWS 管理主控台 來佈建具有 EC2 啟動類型的 Amazon ECS 叢集，這會建立 CloudFormation 堆疊，以部署具有啟動組態的 Amazon EC2 Auto Scaling 群組。不過，這種方法表示您無法選擇自訂 AMI，也無法使用不同的設定或其他開機指令碼來自訂啟動組態。

若要監控其他日誌和指標，您必須在 Amazon ECS 容器執行個體上安裝 CloudWatch 代理程式。您可以從本指南的 [使用 Systems Manager Distributor 和 State Manager 安裝 CloudWatch 代理程式](install-cloudwatch-systems-manager.md)區段使用 EC2 執行個體的安裝方法。不過，Amazon ECS AMI 不包含必要的 Systems Manager 代理程式。當您建立 Amazon ECS 叢集時，您應該使用自訂啟動組態搭配安裝 Systems Manager 代理程式的使用者資料指令碼。這可讓您的容器執行個體向 Systems Manager 註冊，並套用 State Manager 關聯來安裝、設定和更新 CloudWatch 代理程式。當 State Manager 執行和更新 CloudWatch 代理程式組態時，也會套用 Amazon EC2 的標準系統層級 CloudWatch 組態。您也可以將 Amazon ECS 的標準化 CloudWatch 組態存放在 CloudWatch 組態的 S3 儲存貯體中，並使用狀態管理員自動套用。

您應該確保套用至 Amazon ECS 容器執行個體的 IAM 角色或執行個體描述檔包含必要的 `CloudWatchAgentServerPolicy`和 `AmazonSSMManagedInstanceCore`政策。您可以使用 [ecs\$1cluster\$1with\$1cloudwatch\$1linux.yaml](https://github.com/aws-samples/logging-monitoring-apg-guide-examples/blob/main/examples/ecs/ecs_cluster_with_cloudwatch_linux.yaml) CloudFormation 範本來佈建 Linux 型 Amazon ECS 叢集。此範本會建立具有自訂啟動組態的 Amazon ECS 叢集，該組態會安裝 Systems Manager 並部署自訂 CloudWatch 組態，以監控 Amazon ECS 特定的日誌檔案。

您應該擷取 Amazon ECS 容器執行個體的下列日誌，以及標準 EC2 執行個體日誌：
+ **Amazon ECS 代理程式啟動輸出** – `/var/log/ecs/ecs-init.log`
+ **Amazon 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 容器執行個體應使用最新的 Amazon ECS 最佳化 AMIs 和容器代理程式。 會將公有 Systems Manager 參數存放區參數與 Amazon ECS 最佳化 AMI 資訊一起 AWS 存放，包括 AMI ID。您可以使用 Amazon ECS 最佳化 AMI 的參數存放區[參數格式，從參數存放區](https://docs.aws.amazon.com//AmazonECS/latest/developerguide/retrieve-ecs-optimized_AMI.html)擷取最新的最佳化 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 叢集中啟動的容器。記錄是在容器層級使用日誌驅動程式設定。視您使用的是 EC2 或 Fargate 啟動類型而定，多個日誌驅動程式選項為您的容器提供不同的日誌系統 （例如 `syslog`、、`splunk`、`awslogs``fluentd``gelf``json-file``journald``logentries`、、 或 `awsfirelens`)。Fargate 啟動類型提供下列日誌驅動程式選項的子集：`awslogs`、 `splunk`和 `awsfirelens`。 AWS 提供`awslogs`日誌驅動程式，以擷取容器輸出並將其傳輸至 CloudWatch Logs。日誌驅動程式設定可讓您自訂日誌群組、區域和日誌串流字首，以及許多其他選項。

日誌群組的預設命名，以及 上**自動設定 CloudWatch Logs** 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) 管道或自動化程序，您可以使用每個新的 Docker 映像組建為您的應用程式建立新的任務定義修訂。例如，您可以在任務定義修訂和記錄組態中包含 Docker 映像名稱、映像標籤、GitHub 修訂版或其他重要資訊，做為 CI/CD 程序的一部分。

# 搭配 FireLens for Amazon ECS 使用自訂日誌路由
<a name="firelens-custom-log-routing"></a>

FireLens for Amazon ECS 可協助您將日誌路由到 [Fluentd](https://www.fluentd.org/) 或 [Fluent Bit](https://docs.fluentbit.io/manual)，以便您可以將容器日誌直接傳送到 AWS 服務和 AWS 合作夥伴網路 (APN) 目的地，以及支援將日誌運送到 CloudWatch Logs。

AWS [為 Fluent Bit 提供 Docker 映像](https://docs.aws.amazon.com//AmazonECS/latest/developerguide/firelens-using-fluentbit.html)，其中包含 Amazon Kinesis Data Streams、Amazon Data Firehose 和 CloudWatch Logs 的預先安裝外掛程式。您可以使用 FireLens 日誌驅動程式，而不是`awslogs`日誌驅動程式，以進一步自訂和控制傳送至 CloudWatch Logs 的日誌。

例如，您可以使用 FireLens 日誌驅動程式來控制日誌格式輸出。這表示 Amazon ECS 容器的 CloudWatch 日誌會自動格式化為 JSON 物件`container_name`，並包含 `ecs_cluster`、`ecs_task_arn`、`ecs_task_definition``container_id`、 和 的 JSON 格式屬性`ec2_instance_id`。當您指定`awsfirelens`驅動程式時，流利的主機會透過 `FLUENT_HOST`和 `FLUENT_PORT`環境變數公開到您的容器。這表示您可以使用流暢的日誌程式庫，從程式碼直接登入日誌路由器。例如，您的應用程式可能包含程式`fluent-logger-python`庫，使用環境變數提供的值來記錄到 Fluent Bit。

如果您選擇使用 FireLens for Amazon ECS，您可以設定與`awslogs`日誌驅動程式相同的設定[，也可以使用其他設定](https://github.com/aws/amazon-cloudwatch-logs-for-fluent-bit)。例如，您可以使用 [ecs-task-nginx-firelense.json](https://github.com/aws-samples/logging-monitoring-apg-guide-examples/blob/main/examples/ecs/ecs-task-nginx-firelense.json) Amazon ECS 任務定義，啟動設定為使用 FireLens 記錄至 CloudWatch 的 NGINX 伺服器。它也會啟動 FireLens Fluent Bit 容器做為記錄的附屬項目。

# Amazon 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 和記憶體使用率）。 EC2 您也可以使用 CloudWatch Container Insights 擷取服務、任務和容器的指標，或使用內嵌指標格式擷取您自己的自訂容器指標。

Container Insights 是一種 CloudWatch 功能，可在叢集、容器執行個體、服務和任務層級提供 CPU 使用率、記憶體使用率、網路流量和儲存空間等指標。Container Insights 也會建立自動儀表板，協助您分析服務和任務，並查看容器層級的平均記憶體或 CPU 使用率。Container Insights 會將自訂指標發佈到自訂`ECS/ContainerInsights`[命名空間](https://docs.aws.amazon.com//AmazonECS/latest/developerguide/cloudwatch-metrics.html)，可用於繪製圖形、警示和儀表板。

您可以為每個個別 Amazon ECS 叢集啟用 Container Insights，以開啟 Container Insight 指標。如果您也想要在容器執行個體層級查看指標，您可以[啟動 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 代理程式組態，並將其存放在具有金鑰 的參數存放區中`ecs-cwagent-daemon-service`。

部署為 [CloudWatch Container Insights 協助程式容器的 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`維度。 CloudWatch Container Insights 會使用 CloudWatch 內嵌指標格式來實作容器執行個體層級的指標。您可以使用本指南 [設定 CloudWatch 代理程式部署和組態的 State Manager 和 Distributor](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`的環境變數設定為 `cwagentconfig` Systems Manager 參數存放區參數的內容。您可以使用此基本組態執行代理程式，將其設定為內嵌指標格式端點。不過，已不再需要。

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

如果您有跨多個帳戶和區域的 Amazon ECS 部署，您可以使用 AWS Secrets Manager 秘密來存放 CloudWatch 組態，並設定秘密政策以與您的組織共用。您可以使用任務定義中的秘密選項來設定`CW_CONFIG_CONTENT`變數。

您可以在應用程式中使用 AWS 提供的[開放原始碼內嵌指標格式程式庫](https://docs.aws.amazon.com//AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format_Libraries.html)，並指定 `AWS_EMF_AGENT_ENDPOINT`環境變數，以連接至做為內嵌指標格式端點的 CloudWatch 代理程式附屬容器。例如，您可以使用 [ecs\$1cw\$1emf\$1example](https://github.com/aws-samples/logging-monitoring-apg-guide-examples/tree/main/examples/ecs/ecs_cw_emf_example) 範例 Python 應用程式，將內嵌指標格式的指標傳送至設定為內嵌指標格式端點的 CloudWatch 代理程式附屬容器。

適用於 CloudWatch 的 [Fluent Bit 外掛程式](https://github.com/aws/amazon-cloudwatch-logs-for-fluent-bit)也可用於傳送內嵌指標格式訊息。您也可以使用 [ecs\$1firelense\$1emf\$1example](https://github.com/aws-samples/logging-monitoring-apg-guide-examples/tree/main/examples/ecs/ecs_firelense_emf_example) 範例 Python 應用程式，將內嵌指標格式的指標傳送至 Amazon ECS 附屬容器的 Firelens。

如果您不想使用內嵌指標格式，您可以透過 [AWS API](https://docs.aws.amazon.com//AmazonCloudWatch/latest/APIReference/Welcome.html) 或 [AWS SDK](https://aws.amazon.com/developer/tools/) 建立和更新 CloudWatch 指標。除非您有特定的使用案例，否則我們不建議使用此方法，因為它會為您的程式碼增加維護和管理開銷。