

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

# 在 Amazon ECS 上設定 Container Insights
<a name="deploy-container-insights-ECS"></a>

您可以使用下列選項之一或兩個都用，啟用 Amazon ECS 叢集上的 Container Insights：
+ 使用 AWS 管理主控台 或 AWS CLI 開始收集叢集層級、任務層級和服務層級指標。
+ 將 CloudWatch 代理程式部署為常駐程式服務，開始收集 Amazon EC2 執行個體上託管之叢集的執行個體層級指標。

**Topics**
+ [在 Amazon ECS 上設定 Container Insights](deploy-container-insights-ECS-cluster.md)
+ [使用 AWS Distro for OpenTelemetry 在 Amazon ECS 上設定 Container Insights](deploy-container-insights-ECS-adot.md)
+ [部署 CloudWatch 代理程式以收集 Amazon ECS 上的 EC2 執行個體層級指標](deploy-container-insights-ECS-instancelevel.md)
+ [部署 AWS Distro for OpenTelemetry 以收集 Amazon ECS 叢集上的 EC2 執行個體層級指標](deploy-container-insights-ECS-OTEL.md)
+ [設定 FireLens 以將日誌傳送至 CloudWatch Logs](deploy-container-insights-ECS-logs.md)

# 在 Amazon ECS 上設定 Container Insights
<a name="deploy-container-insights-ECS-cluster"></a>

可使用 Amazon ECS 主控台或 AWS CLI，在新的或現有的 Amazon ECS 叢集上設定具有增強可觀測性的 Container Insights 或 Container Insights。Container Insights 會收集叢集、任務和服務層級的指標。具有增強可觀測性的 Container Insights 可提供額外的維度和指標，讓您深入了解容器層級的可見性。

如果在 Amazon EC2 執行個體上使用 Amazon ECS，請使用包含 Amazon ECS 代理程式 1.29 版或更新版本的 AMI 來啟動該執行個體。如需更新代理程式版本的相關資訊，請參閱[更新 Amazon ECS 容器代理程式](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-update.html)。

**注意**  
如果您用於 Amazon ECS Container Insights 指標的客戶受管 AWS KMS 金鑰尚未設定為與 CloudWatch 搭配使用，您必須更新金鑰政策，以允許在 CloudWatch Logs 中加密日誌。您也必須將自己的 AWS KMS 金鑰與 中的日誌群組建立關聯`/aws/ecs/containerinsights/ClusterName/performance`。如需詳細資訊，請參閱[使用 AWS Key Management Service在 CloudWatch Logs 中加密日誌資料](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/encrypt-log-data-kms.html)。

我們建議您使用具有增強可觀測性的 Container Insights，而不是 Container Insights，因其可在容器環境中提供詳細的可見性，進而縮短解析的平均時間。

## 設定具有增強可觀測性的 Container Insights
<a name="set-container-insights-ECS-cluster-enhanced"></a>

可以使用 Amazon ECS 主控台或 AWS CLI來開啟具有增強可觀測性的 Container Insights。

------
#### [ AWS CLI ]

使用以下命令開啟具有增強可觀測性 Container Insights。

 將 `containerInsights` 帳戶設定設為 `enhanced`

```
aws ecs put-account-setting --name containerInsights --value enhanced
```

範例輸出

```
{
    "setting": {
        "name": "containerInsights",
        "value": "enhanced",
        "principalArn": "arn:aws:iam::123456789012:johndoe",
         "type": user
    }
}
```

**注意**  
根據預設，`put-account-setting` 僅適用於目前已驗證的使用者。若要為所有使用者和角色啟用帳戶範圍的設定，請使用根使用者，如下列範例所示。  

```
aws ecs put-account-setting --name containerInsights --value enhanced --principal-arn arn:aws:iam::accountID:root
```

設定此帳戶設定後，所有新叢集會自動使用具有增強可觀測性的 Container Insights。使用 `update-cluster-settings` 命令將具有增強可觀測性的 Container Insights 新增至現有叢集，或將目前使用 Container Insights 的叢集升級至具有增強可觀測性的 Container Insights。

```
aws ecs update-cluster-settings --cluster cluster-name --settings name=containerInsights,value=enhanced
```

------
#### [ Amazon ECS console ]

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 在頂部導覽列中，選取要檢視帳戶設定的區域。

1. 在導覽頁面中，選擇 **Account Settings** (帳戶設定)。

1. 選擇**更新**。

1. 若要使用具有增強可觀測性的 Container Insights，請選擇**具有增強可觀測性的 Container Insights**。

1. 選擇**儲存變更**。

1. 在確認畫面，選擇**確認**以儲存選項。

設定它之後，所有新叢集會自動使用具有增強可觀測性的 Container Insights。可將具有增強可觀測性的 Container Insights 新增至現有叢集，或將目前使用 Container Insights 的叢集更新為具有增強可觀測性的 Container Insights。如需詳細資訊，請參閱 *Amazon Elastic Container Service 開發人員指南*中的[更新 Amazon ECS 叢集](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/update-cluster-v2.html)。

------

## 設定 Container Insights
<a name="set-container-insights-ECS-cluster"></a>

可以使用 Amazon ECS 主控台或 AWS CLI開啟 Container Insights。

------
#### [ AWS CLI ]

若要使用 Container Insights，請將 `container Insights` 帳戶設定設為 `enabled`。使用下列命令來啟用 Container Insights。

```
aws ecs put-account-setting --name containerInsights --value enabled
```

範例輸出

```
{
    "setting": {
        "name": "container Insights",
        "value": "enabled",
        "principalArn": "arn:aws:iam::123456789012:johndoe",
         "type": user
    }
}
```

當您將 `container Insights` 帳戶設定設為 `enabled` 時，所有新叢集都會預設啟用 Container Insights。使用 `update-cluster-settings` 命令，將 Container Insights 新增至現有叢集。

```
aws ecs update-cluster-settings --cluster cluster-name --settings name=containerInsights,value=enabled
```

------
#### [ Amazon ECS console ]

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 在頂部導覽列中，選取要檢視帳戶設定的區域。

1. 在導覽頁面中，選擇 **Account Settings** (帳戶設定)。

1. 選擇**更新**。

1. 若要使用 Container Insights，請選擇 **Container Insights**。

1. 選擇**儲存變更**。

1. 在確認畫面，選擇**確認**以儲存選項。

設定它之後，所有新叢集會自動使用 Container Insights。更新現有叢集以新增 Container Insights。如需詳細資訊，請參閱 *Amazon Elastic Container Service 開發人員指南*中的[更新 Amazon ECS 叢集](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/update-cluster-v2.html)。

------

# 使用 AWS Distro for OpenTelemetry 在 Amazon ECS 上設定 Container Insights
<a name="deploy-container-insights-ECS-adot"></a>

如果您想要使用 AWS Distro for OpenTelemetry 在 Amazon ECS 叢集上設定 CloudWatch Container Insights，請使用本節。如需 AWS Distro for Open Telemetry 的詳細資訊，請參閱 [AWS Distro for OpenTelemetry](https://aws.amazon.com/otel/)。

這些步驟假設您已經有一個執行 Amazon ECS 的叢集。如需將 AWS Distro for Open Telemetry 與 Amazon ECS 搭配使用並為此設定 Amazon ECS 叢集的詳細資訊，請參閱在 [Amazon Elastic Container Service 中設定 AWS Distro for OpenTelemetry Collector](https://aws-otel.github.io/docs/setup/ecs)。

## 步驟 1：建立任務角色
<a name="deploy-container-insights-ECS-adot-CreateTaskRole"></a>

第一步是在 AWS OpenTelemetry Collector 將使用的叢集中建立任務角色。

**為 AWS Distro for OpenTelemetry 建立任務角色**

1. 前往 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在導覽窗格中，選擇 **Policies (政策)**，然後選擇 **Create policy (建立政策)**。

1. 選擇 **JSON** 標籤，並複製下列政策：

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "logs:PutLogEvents",
                   "logs:CreateLogGroup",
                   "logs:CreateLogStream",
                   "logs:DescribeLogStreams",
                   "logs:DescribeLogGroups",
                   "ssm:GetParameters"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 選擇**檢閱政策**。

1. 對於名稱，輸入 **AWSDistroOpenTelemetryPolicy**，然後選擇 **Create policy** (建立政策)。

1. 在左側導覽窗格中，選擇 **Roles** (角色)，然後選擇 **Create role** (建立角色)。

1. 在服務清單中，選擇 **Elastic Container Service**。

1. 在頁面下方，選擇 **Elastic Container Service Task** (Elastic Container Service 任務)，然後選擇 **Next: Permissions** ((下一步：許可))。

1. 在政策清單中，搜尋 **AWSDistroOpenTelemetryPolicy**。

1. 選取 **AWSDistroOpenTelemetryPolicy** 旁的核取方塊。

1. 選擇 **Next: Tags** (下一步：標籤)，然後選擇 **Next: Review** (下一步：檢閱)。

1. 針對 **Role name** (角色名稱)，輸入 **AWSOpenTelemetryTaskRole**，然後選擇 **Create role** (建立角色)。

## 步驟 2：建立任務執行角色
<a name="deploy-container-insights-ECS-adot-CreateTaskExecutionRole"></a>

下一個步驟是為 AWS OpenTelemetry Collector 建立任務執行角色。

**為 AWS Distro for OpenTelemetry 建立任務執行角色**

1. 前往 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在左側導覽窗格中，選擇 **Roles** (角色)，然後選擇 **Create role** (建立角色)。

1. 在服務清單中，選擇 **Elastic Container Service**。

1. 在頁面下方，選擇 **Elastic Container Service Task** (Elastic Container Service 任務)，然後選擇 **Next: Permissions** ((下一步：許可))。

1. 在政策清單中，搜尋 **AmazonECSTaskExecutionRolePolicy**，然後選取 **AmazonECSTaskExecutionRolePolicy** 旁的核取方塊。

1. 在政策清單中，搜尋 **CloudWatchLogsFullAccess**，然後選取 **CloudWatchLogsFullAccess** 旁的核取方塊。

1. 在政策清單中，搜尋 **AmazonSSMReadOnlyAccess**，然後選取 **AmazonSSMReadOnlyAccess** 旁的核取方塊。

1. 選擇 **Next: Tags** (下一步：標籤)，然後選擇 **Next: Review** (下一步：檢閱)。

1. 針對 **Role name** (角色名稱)，輸入 **AWSOpenTelemetryTaskExecutionRole**，然後選擇 **Create role** (建立角色)。

## 步驟 3：建立任務定義
<a name="deploy-container-insights-ECS-adot-CreateTaskDefinition"></a>

下一步是建立任務定義。

**為 AWS Distro for OpenTelemetry 建立任務定義**

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 在導覽窗格中，選擇 **Task Definitions** (任務定義)。

1. 選擇 **Create new task definition** (建立新任務定義)，以及 **Create new task definitionN** (建立新任務定義)。

1. 在**任務定義系列**中，請為任務定義指定唯一名稱。

1. 設定您的容器，然後選擇**下一步**。

1. 在**指標和日誌記錄**下，選取**使用指標集合**。

1. 選擇**下一步**。

1. 選擇**建立**。

如需搭配使用 AWS OpenTelemetry 收集器與 Amazon ECS 的詳細資訊，請參閱在 [Amazon Elastic Container Service 中設定 AWS Distro for OpenTelemetry 收集器](https://aws-otel.github.io/docs/setup/ecs)。

## 步驟 4：執行任務
<a name="deploy-container-insights-ECS-adot-CreateTaskDefinition"></a>

最後一個步驟是執行您建立的任務。

**執行 AWS Distro for OpenTelemetry 的任務**

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 在左側導覽窗格，選擇 **Task Definitions** (任務定義)，然後選取您剛建立的任務。

1. 選擇**動作**、**部署**、**執行任務**。

1. 選擇 **Deploy** (部署)、**Run task** (執行任務)。

1. 在**運算選項**區段中，從**現有叢集**中選擇叢集。

1. 選擇**建立**。

1. 接下來，您可以在 CloudWatch 主控台中檢查新的指標。

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在左側導覽窗格中，選擇 **Metrics (指標)**。

   您應該會看到 **ECS/ContainerInsights** 命名空間。選擇該命名空間，然後您應該會看到八個指標。

# 部署 CloudWatch 代理程式以收集 Amazon ECS 上的 EC2 執行個體層級指標
<a name="deploy-container-insights-ECS-instancelevel"></a>

若要部署 CloudWatch 代理程式以從 EC2 執行個體託管之 Amazon ECS 叢集中收集執行個體層級指標，請使用具有預設組態的 Quick Start 設定，或手動安裝代理以便能自訂代理。

這兩種方法都需要您至少有一個已部署了 EC2 啟動類型的 Amazon ECS 叢集，並要求 CloudWatch 代理程式容器可以存取 Amazon EC2 執行個體中繼資料服務 (IMDS)。如需有關 IMDS 的詳細資訊，請參閱[執行個體中繼資料與使用者資料](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)。

這些方法也假設您 AWS CLI 已安裝 。此外，若要執行下列程序中的命令，您必須登入具有 **IAMFullAccess** 和 **AmazonECS\$1FullAccess** 政策的帳戶或角色。

**重要**  
在任務定義中定義 CloudWatch Agent 容器時，請設定 `essential: false`。這可防止整個 Amazon ECS 服務在 CloudWatch Agent 容器發生故障時停止。即使代理程式暫時無法使用，其他重要的應用程式容器仍會繼續執行。

**Topics**
+ [使用 快速設定 CloudFormation](#deploy-container-insights-ECS-instancelevel-quickstart)
+ [手動和自訂設定](#deploy-container-insights-ECS-instancelevel-manual)

## 使用 快速設定 CloudFormation
<a name="deploy-container-insights-ECS-instancelevel-quickstart"></a>

若要使用快速設定，請輸入下列命令以使用 CloudFormation 來安裝代理程式。將 *cluster-name* 和 *cluster-region* 替換成您 Amazon ECS 叢集的名稱和區域。

此命令會建立 IAM 角色 **CWAgentECSTaskRole** 和 **CWAgentECSExecutionRole**。如果您的帳戶中已存在這些角色，請在輸入命令時改用 `ParameterKey=CreateIAMRoles,ParameterValue=False`，而不是使用 `ParameterKey=CreateIAMRoles,ParameterValue=True`。否則命令會失敗。

```
ClusterName=cluster-name
Region=cluster-region
curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/daemon-service/cwagent-ecs-instance-metric/cloudformation-quickstart/cwagent-ecs-instance-metric-cfn.json
aws cloudformation create-stack --stack-name CWAgentECS-${ClusterName}-${Region} \
    --template-body file://cwagent-ecs-instance-metric-cfn.json \
    --parameters ParameterKey=ClusterName,ParameterValue=${ClusterName} \
                 ParameterKey=CreateIAMRoles,ParameterValue=True \
    --capabilities CAPABILITY_NAMED_IAM \
    --region ${Region}
```

**(替代) 使用您自己的 IAM 角色**

如果您想要使用自己自訂的 ECS 任務角色和 ECS 任務執行角色，不使用 **CWAgentECSTaskRole** 和 **CWAgentECSExecutionRole** 角色，請先確定要作為 ECS 任務角色使用的角色連接了 **CloudWatchAgentServerPolicy**。此外，亦請確定要作為 ECS 任務執行角色使用的角色同時連接了 **CloudWatchAgentServerPolicy** 和 **AmazonECSTaskExecutionRolePolicy** 政策。然後輸入下列命令。在命令中，以您自訂 ECS 任務角色的 ARN 取代 *task-role-arn*，以您自訂 ECS 任務執行角色的 ARN 取代 *execution-role-arn*。

```
ClusterName=cluster-name
Region=cluster-region
TaskRoleArn=task-role-arn
ExecutionRoleArn=execution-role-arn
curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/daemon-service/cwagent-ecs-instance-metric/cloudformation-quickstart/cwagent-ecs-instance-metric-cfn.json
aws cloudformation create-stack --stack-name CWAgentECS-${ClusterName}-${Region} \
    --template-body file://cwagent-ecs-instance-metric-cfn.json \
    --parameters ParameterKey=ClusterName,ParameterValue=${ClusterName} \
                 ParameterKey=TaskRoleArn,ParameterValue=${TaskRoleArn} \
                 ParameterKey=ExecutionRoleArn,ParameterValue=${ExecutionRoleArn} \
    --capabilities CAPABILITY_NAMED_IAM \
    --region ${Region}
```

**故障診斷快速設定**

若要檢查 CloudFormation 堆疊的狀態，請輸入下列命令。

```
ClusterName=cluster-name
Region=cluster-region
aws cloudformation describe-stacks --stack-name CWAgentECS-$ClusterName-$Region --region $Region
```

如果您看到的 `StackStatus` 不是 `CREATE_COMPLETE` 或 `CREATE_IN_PROGRESS`，請檢查堆疊事件以找出錯誤。輸入以下命令。

```
ClusterName=cluster-name
Region=cluster-region
aws cloudformation describe-stack-events --stack-name CWAgentECS-$ClusterName-$Region --region $Region
```

若要檢查 `cwagent` 常駐程式服務的狀態，請輸入以下命令。在輸出中，您應該會看到 `runningCount` 等於 `deployment` 區段的 `desiredCount`。如果不相等，請檢查輸出的 `failures` 區段。

```
ClusterName=cluster-name
Region=cluster-region
aws ecs describe-services --services cwagent-daemon-service --cluster $ClusterName --region $Region
```

您也可以使用 CloudWatch Logs 主控台檢查代理程式日誌。尋找 **/ecs/ecs-cwagent-daemon-service** 日誌群組。

**刪除 CloudWatch 代理程式的 CloudFormation 堆疊**

如果您需要刪除 CloudFormation 堆疊，請輸入下列命令。

```
ClusterName=cluster-name
Region=cluster-region
aws cloudformation delete-stack --stack-name CWAgentECS-${ClusterName}-${Region} --region ${Region}
```

## 手動和自訂設定
<a name="deploy-container-insights-ECS-instancelevel-manual"></a>

依本節的步驟手動部署 CloudWatch 代理，以從 EC2 執行個體託管的 Amazon ECS 叢集中收集執行個體層級指標。

### 必要的 IAM 角色和政策
<a name="deploy-container-insights-ECS-instancelevel-IAMRoles"></a>

需要兩個 IAM 角色。如果角色不存在，即必須建立角色。如需這些角色的詳細資訊，請參閱 [IAM 任務角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)和 [Amazon ECS 任務執行角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_execution_IAM_role.html)。
+ *ECS 任務角色*，CloudWatch 代理程式用來發布指標的角色。如果此角色已經存在，您必須確定它連接了 `CloudWatchAgentServerPolicy` 政策。
+ *ECS 任務執行角色*，CloudWatch 代理用來啟動 Amazon ECS 代理程式的角色。如果此角色已經存在，您必須確定它連接了 `AmazonECSTaskExecutionRolePolicy` 和 `CloudWatchAgentServerPolicy` 政策。

如果您尚未擁有這些角色，您可以使用下列命令建立它們並連接必要的政策。第一個命令會建立 ECS 任務角色。

```
aws iam create-role --role-name CWAgentECSTaskRole \
    --assume-role-policy-document "{\"Version\": \"2012-10-17\",		 	 	 \"Statement\": [{\"Sid\": \"\",\"Effect\": \"Allow\",\"Principal\": {\"Service\": \"ecs-tasks.amazonaws.com\"},\"Action\": \"sts:AssumeRole\"}]}"
```

輸入上一個命令後，請記下命令輸出中作為 "TaskRoleArn" 的 `Arn` 值。稍後建立任務定義時需要使用此值。然後輸入下列命令以連接必要的政策。

```
aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy \
    --role-name CWAgentECSTaskRole
```

下一個命令會建立 ECS 任務執行角色。

```
aws iam create-role --role-name CWAgentECSExecutionRole \
    --assume-role-policy-document "{\"Version\": \"2012-10-17\",		 	 	 \"Statement\": [{\"Sid\": \"\",\"Effect\": \"Allow\",\"Principal\": {\"Service\": \"ecs-tasks.amazonaws.com\"},\"Action\": \"sts:AssumeRole\"}]}"
```

輸入上一個命令後，請記下命令輸出中作為 "ExecutionRoleArn" 的 `Arn` 值。稍後建立任務定義時需要使用此值。然後輸入下列命令以連接必要的政策。

```
aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy \
    --role-name CWAgentECSExecutionRole
          
aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy \
    --role-name CWAgentECSExecutionRole
```

### 建立任務定義並啟動常駐程式服務
<a name="deploy-container-insights-ECS-instancelevel-taskdefinition"></a>

建立任務定義並用它啟動 CloudWatch 代理程式作為常駐程式服務。若要建立任務定義，請輸入下列命令。在前幾行中，將預留位置更換為您部署的實際值。*logs-region* 是 CloudWatch Logs 所在的區域，*cluster-region* 則是您叢集所在的區域。*task-role-arn* 是您所用之 ECS 任務角色的 Arn，*execution-role-arn* 則是 ECS 任務執行角色的 Arn。

```
TaskRoleArn=task-role-arn
ExecutionRoleArn=execution-role-arn
AWSLogsRegion=logs-region
Region=cluster-region
curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/daemon-service/cwagent-ecs-instance-metric/cwagent-ecs-instance-metric.json \
    | sed "s|{{task-role-arn}}|${TaskRoleArn}|;s|{{execution-role-arn}}|${ExecutionRoleArn}|;s|{{awslogs-region}}|${AWSLogsRegion}|" \
    | xargs -0 aws ecs register-task-definition --region ${Region} --cli-input-json
```

然後執行下列命令以啟動協助程式服務。將 *cluster-name* 和 *cluster-region* 替換成您 Amazon ECS 叢集的名稱和區域。

**重要**  
在執行此命令之前，請先移除所有容量提供者策略。否則，該命令將無法運作。

```
ClusterName=cluster-name
Region=cluster-region
aws ecs create-service \
    --cluster ${ClusterName} \
    --service-name cwagent-daemon-service \
    --task-definition ecs-cwagent-daemon-service \
    --scheduling-strategy DAEMON \
    --region ${Region}
```

如果看到此錯誤訊息 `An error occurred (InvalidParameterException) when calling the CreateService operation: Creation of service was not idempotent`，即表示您已經建立名為 `cwagent-daemon-service` 的協助程式服務。您必須使用下列命令作為範例，先刪除該服務。

```
ClusterName=cluster-name
Region=cluster-region
aws ecs delete-service \
    --cluster ${ClusterName} \
    --service cwagent-daemon-service \
    --region ${Region} \
    --force
```

### (選用) 進階組態
<a name="deploy-container-insights-ECS-instancelevel-advanced"></a>

或者，您可以選擇使用 SSM 為 EC2 執行個體託管之 Amazon ECS 叢集中的 CloudWatch 代理程式，指定其他組態選項。選項如下：
+ `metrics_collection_interval` – CloudWatch 代理程式收集指標的頻率 (秒)。預設為 60。範圍介於 1–172,000 之間。
+ `endpoint_override` – (選用) 指定不同端點以傳送日誌。如果從 VPC 中的叢集發布，且想要在 VPC 端點記錄資料，建議您這麼做。

  `endpoint_override` 的值必須是 URL 字串。
+ `force_flush_interval` – 指定日誌在傳送到伺服器之前停留在記憶體緩衝區內的最長時間 (以秒為單位)。不論此欄位的設定如何，如果緩衝區中的日誌大小達到 1 MB，系統會立即將日誌傳送到伺服器。預設值為 5 秒。
+ `region` – 根據預設，代理會將指標發布至 Amazon ECS 容器執行個體所在的同一區域。若要覆寫此項目，您可在此指定不同的區域。例如 `"region" : "us-east-1"`

以下是自訂組態的範例：

```
{
    "agent": {
        "region": "us-east-1"
    },
    "logs": {
        "metrics_collected": {
            "ecs": {
                "metrics_collection_interval": 30
            }
        },
        "force_flush_interval": 5
    }
}
```

**若要在 Amazon ECS 容器中自訂 CloudWatch 代理程式組態**

1. 確定 **AmazonSSMReadOnlyAccess** 政策已連接至您的 Amazon ECS 任務執行角色。您可以輸入以下命令來執行此操作。此範例假設您的 Amazon ECS 任務執行角色是 CWAgentECSExecutionRole。如果使用不同的角色，請更換下列命令中的角色名稱。

   ```
   aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess \
           --role-name CWAgentECSExecutionRole
   ```

1. 建立類似上述範例的自訂組態檔案。將此檔案命名為 `/tmp/ecs-cwagent-daemon-config.json`。

1. 執行下列命令，將此組態放入參數存放區。將 *cluster-region* 替換成您 Amazon ECS 叢集的區域。若要執行此命令，您必須登入具有 **AmazonSSMFullAccess** 政策的使用者或角色。

   ```
   Region=cluster-region
   aws ssm put-parameter \
       --name "ecs-cwagent-daemon-service" \
       --type "String" \
       --value "`cat /tmp/ecs-cwagent-daemon-config.json`" \
       --region $Region
   ```

1. 將任務定義檔案下載至本機檔案，例如 `/tmp/cwagent-ecs-instance-metric.json`

   ```
   curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/daemon-service/cwagent-ecs-instance-metric/cwagent-ecs-instance-metric.json -o /tmp/cwagent-ecs-instance-metric.json
   ```

1. 修改任務定義檔案。移除以下區段：

   ```
   "environment": [
                   {
                       "name": "USE_DEFAULT_CONFIG",
                       "value": "True"
                   }
               ],
   ```

   以下列內容取代該區段：

   ```
   "secrets": [
                   {
                       "name": "CW_CONFIG_CONTENT",
                       "valueFrom": "ecs-cwagent-daemon-service"
                   }
               ],
   ```

1. 依照下列步驟重新啟動代理作為協助程式服務：

   1. 執行下列命令。

      ```
      TaskRoleArn=task-role-arn
      ExecutionRoleArn=execution-role-arn
      AWSLogsRegion=logs-region
      Region=cluster-region
      cat /tmp/cwagent-ecs-instance-metric.json \
          | sed "s|{{task-role-arn}}|${TaskRoleArn}|;s|{{execution-role-arn}}|${ExecutionRoleArn}|;s|{{awslogs-region}}|${AWSLogsRegion}|" \
          | xargs -0 aws ecs register-task-definition --region ${Region} --cli-input-json
      ```

   1. 執行下列命令以啟動協助程式服務。將 *cluster-name* 和 *cluster-region* 替換成您 Amazon ECS 叢集的名稱和區域。

      ```
      ClusterName=cluster-name
      Region=cluster-region
      aws ecs create-service \
          --cluster ${ClusterName} \
          --service-name cwagent-daemon-service \
          --task-definition ecs-cwagent-daemon-service \
          --scheduling-strategy DAEMON \
          --region ${Region}
      ```

      如果看到此錯誤訊息 `An error occurred (InvalidParameterException) when calling the CreateService operation: Creation of service was not idempotent`，即表示您已經建立名為 `cwagent-daemon-service` 的協助程式服務。您必須使用下列命令作為範例，先刪除該服務。

      ```
      ClusterName=cluster-name
      Region=Region
      aws ecs delete-service \
          --cluster ${ClusterName} \
          --service cwagent-daemon-service \
          --region ${Region} \
          --force
      ```

# 部署 AWS Distro for OpenTelemetry 以收集 Amazon ECS 叢集上的 EC2 執行個體層級指標
<a name="deploy-container-insights-ECS-OTEL"></a>

使用本節中的步驟，使用 AWS Distro for OpenTelemetry 在 Amazon ECS 叢集上收集 EC2 執行個體層級指標。如需 AWS Distro for OpenTelemetry 的詳細資訊，請參閱 [AWS Distro for OpenTelemetry](https://aws.amazon.com/otel/)。

這些步驟假設您已經有一個執行 Amazon ECS 的叢集。必須使用 EC2 啟動類型來部署此叢集。如需將 AWS Distro for Open Telemetry 與 Amazon ECS 搭配使用並為此設定 Amazon ECS 叢集的詳細資訊，請參閱在 [Amazon Elastic Container Service for ECS EC2 執行個體層級指標中設定 AWS Distro for OpenTelemetry Collector](https://aws-otel.github.io/docs/setup/ecs#3-setup-the-aws-otel-collector-for-ecs-ec2-instance-metrics)。

**Topics**
+ [使用 快速設定 CloudFormation](#container-insights-ECS-OTEL-quicksetup)
+ [手動和自訂設定](#container-insights-ECS-OTEL-custom)

## 使用 快速設定 CloudFormation
<a name="container-insights-ECS-OTEL-quicksetup"></a>

下載 CloudFormation 範本檔案，以在 EC2 上安裝適用於 Amazon ECS 的 AWS Distro for OpenTelemetry 收集器。執行下列 curl 命令。

```
curl -O https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/ecs/aws-otel-ec2-instance-metrics-daemon-deployment-cfn.yaml
```

下載範本檔案後，將其開啟並將 *PATH\$1TO\$1CloudFormation\$1TEMPLATE* 替換為您儲存範本檔案的路徑。然後匯出下列參數並執行 CloudFormation 命令，如下列命令所示。
+ **Cluster\$1Name**– Amazon ECS 叢集名稱
+ **AWS\$1Region**– 將傳送資料的區域
+ **PATH\$1TO\$1CloudFormation\$1TEMPLATE** – 儲存 CloudFormation 範本檔案的路徑。
+ **command** – 若要讓 AWS Distro for OpenTelemetry 收集器收集 Amazon ECS on Amazon EC2 的執行個體層級指標，您必須`--config=/etc/ecs/otel-instance-metrics-config.yaml`為此參數指定 。

```
ClusterName=Cluster_Name
Region=AWS_Region
command=--config=/etc/ecs/otel-instance-metrics-config.yaml
aws cloudformation create-stack --stack-name AOCECS-${ClusterName}-${Region} \
--template-body file://PATH_TO_CloudFormation_TEMPLATE \
--parameters ParameterKey=ClusterName,ParameterValue=${ClusterName} \
ParameterKey=CreateIAMRoles,ParameterValue=True \
ParameterKey=command,ParameterValue=${command} \
--capabilities CAPABILITY_NAMED_IAM \
--region ${Region}
```

執行此命令後，請使用 Amazon ECS 主控台查看任務是否正在執行。

### 故障診斷快速設定
<a name="container-insights-ECS-OTEL-quicksetup-troubleshooting"></a>

若要檢查 CloudFormation 堆疊的狀態，請輸入下列命令。

```
ClusterName=cluster-name
Region=cluster-region
aws cloudformation describe-stack --stack-name AOCECS-$ClusterName-$Region --region $Region
```

如果 `StackStatus` 的值不是 `CREATE_COMPLETE` 或 `CREATE_IN_PROGRESS`，請檢查堆疊事件以找出錯誤。輸入以下命令。

```
ClusterName=cluster-name
Region=cluster-region
aws cloudformation describe-stack-events --stack-name AOCECS-$ClusterName-$Region --region $Region
```

若要檢查 `AOCECS` 常駐程式服務的狀態，請輸入以下命令。在輸出中，您應該會看到 `runningCount` 等於 deployment (部署) 區段的 `desiredCount`。如果不相等，請檢查輸出的 failures (失敗) 區段。

```
ClusterName=cluster-name
Region=cluster-region
aws ecs describe-services --services AOCECS-daemon-service --cluster $ClusterName --region $Region
```

您也可以使用 CloudWatch Logs 主控台檢查代理程式日誌。尋找 **/aws/ecs/containerinsights/\$1ClusterName\$1/performance** 日誌群組。

## 手動和自訂設定
<a name="container-insights-ECS-OTEL-custom"></a>

請依照本節中的步驟手動部署 AWS Distro for OpenTelemetry，以從託管於 Amazon EC2 執行個體的 Amazon ECS 叢集收集執行個體層級指標。

### 步驟 1：必要的角色和政策
<a name="container-insights-ECS-OTEL-custom-iam"></a>

需要兩個 IAM 角色。如果角色不存在，即必須建立角色。如需這些角色的詳細資訊，請參閱[建立 IAM 政策](https://aws-otel.github.io/docs/setup/ecs/create-iam-policy)和[建立 IAM 角色](https://aws-otel.github.io/docs/setup/ecs/create-iam-role)。

### 步驟 2：建立任務定義
<a name="container-insights-ECS-OTEL-custom-task"></a>

建立任務定義，並使用它來啟動 AWS Distro for OpenTelemetry 做為協助程式服務。

若要使用任務定義範本來建立任務定義，請遵循[使用 AWS OTel Collector 建立 EC2 執行個體的 ECS EC2 任務定義](https://aws-otel.github.io/docs/setup/ecs/task-definition-for-ecs-ec2-instance)中的指示。

若要使用 Amazon ECS 主控台建立任務定義，請遵循 [ Install AWS OTel Collector 中的指示，方法是透過 Amazon ECS EC2 執行個體指標的 AWS 主控台建立任務定義](https://aws-otel.github.io/docs/setup/ecs/create-task-definition-instance-console)。

### 步驟 3：啟動常駐程式服務
<a name="container-insights-ECS-OTEL-custom-launch"></a>

若要啟動 AWS Distro for OpenTelemetry 做為協助程式服務，請遵循[使用協助程式服務在 Amazon Elastic Container Service (Amazon ECS) 上執行任務](https://aws-otel.github.io/docs/setup/ecs/run-daemon-service)中的指示。

### (選用) 進階組態
<a name="container-insights-ECS-OTEL-custom-advancdeconfig"></a>

或者，您可以選擇使用 SSM 為 Amazon EC2 執行個體託管之 Amazon ECS 叢集中的 AWS Distro for OpenTelemetry，指定其他組態選項。如需有關建立組態檔案的詳細資訊，請參閱[自訂 OpenTelemetry 組態](https://aws-otel.github.io/docs/setup/ecs#5-custom-opentelemetry-configuration)。如需有關您在組態檔案中可使用之選項的詳細資訊，請參閱 [AWS Container Insights Receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/awscontainerinsightreceiver/README.md)。

# 設定 FireLens 以將日誌傳送至 CloudWatch Logs
<a name="deploy-container-insights-ECS-logs"></a>

FireLens for Amazon ECS 可讓您使用任務定義參數，將日誌路由至 Amazon CloudWatch Logs，以儲存和分析日誌。FireLens 可與 [Fluent Bit](https://fluentbit.io/) 和 [Fluentd](https://www.fluentd.org/) 搭配使用。我們為 AWS Fluent Bit 映像提供 ，或者您可以使用自己的 Fluent Bit 或 Fluentd 映像。使用 AWS SDKs AWS CLI和 支援使用 FireLens 組態建立 Amazon ECS 任務定義 AWS 管理主控台。如需 CloudWatch Logs 的詳細資訊，請參閱[什麼是 CloudWatch Logs？](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html)。

使用 FireLens for Amazon ECS 時有一些關鍵考量事項。如需詳細資訊，請參閱[考量](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_firelens.html#firelens-considerations)。

若要尋找 AWS 適用於 Fluent Bit 映像的 ，請參閱[使用 AWS 適用於 Fluent Bit 映像](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/firelens-using-fluentbit.html)。

若要建立使用 FireLens 組態的任務定義，請參閱[建立使用 FireLens 組態的任務定義](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/firelens-taskdef.html)。

**範例**

下列任務定義範例示範如何指定將日誌轉送至 CloudWatch Logs 日誌群組的日誌組態。如需詳細資訊，請參閱*《Amazon CloudWatch Logs 使用者指南》*中的[什麼是 Amazon CloudWatch Logs？](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html)。

在日誌組態選項中，指定日誌群組名稱及其所在的區域。若要讓 Fluent 位元代表您建立日誌群組，請指定 `"auto_create_group":"true"`。您也可以將任務 ID 指定為日誌串流字首，以幫助篩選。如需詳細資訊，請參閱 [適用於 CloudWatch Logs 的流利位元外掛程式](https://github.com/aws/amazon-cloudwatch-logs-for-fluent-bit/blob/mainline/README.md)。

```
{
	"family": "firelens-example-cloudwatch",
	"taskRoleArn": "arn:aws:iam::123456789012:role/ecs_task_iam_role",
	"containerDefinitions": [
		{
			"essential": true,
			"image": "906394416424.dkr.ecr.us-west-2.amazonaws.com/aws-for-fluent-bit:latest",
			"name": "log_router",
			"firelensConfiguration": {
				"type": "fluentbit"
			},
			"logConfiguration": {
				"logDriver": "awslogs",
				"options": {
					"awslogs-group": "firelens-container",
					"awslogs-region": "us-west-2",
					"awslogs-create-group": "true",
					"awslogs-stream-prefix": "firelens"
				}
			},
			"memoryReservation": 50
		 },
		 {
			 "essential": true,
			 "image": "nginx",
			 "name": "app",
			 "logConfiguration": {
				 "logDriver":"awsfirelens",
				 "options": {
					"Name": "cloudwatch_logs",
					"region": "us-west-2",
					"log_key": "log",
                                 "log_group_name": "/aws/ecs/containerinsights/my-cluster/application",
					"auto_create_group": "true",
					"log_stream_name": "my-task-id"
				}
			},
			"memoryReservation": 100
		}
	]
}
```