

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

# 使用 ECS Exec 監控 Amazon ECS 容器
<a name="ecs-exec"></a>

使用 Amazon ECS Exec，您可以直接與容器互動，而無需先與主機容器作業系統互動、開啟傳入連接埠或管理 SSH 金鑰。您可以使用 ECS Exec 執行命令，或為在 Amazon EC2 執行個體或 AWS Fargate上執行的容器取得 shell。如此一來就可以更輕鬆地收集診斷資訊並快速對錯誤進行故障診斷。例如，在開發環境中，您可以使用 ECS Exec 輕鬆地與容器中的各種程序互動，並對應用程式進行故障診斷。在生產環境中，則可藉此取得緊急存取權，直接進入容器進行問題偵錯。

您可以從 Amazon ECS API、 AWS Command Line Interface (AWS CLI)、 AWS SDKs或 AWS Copilot CLI，使用 ECS Exec 在執行中的 Linux 或 Windows 容器中執行命令。如需使用 ECS Exec 的詳細資訊，以及使用 AWS Copilot CLI 的影片逐步解說，請參閱 [Copilot GitHub 文件](https://aws.github.io/copilot-cli/docs/commands/svc-exec/)。

您也可以使用 ECS Exec 來維護更嚴格的存取控制政策。透過選擇性地開啟此功能，您可以控制執行命令的人員，以及他們可以執行這些命令的任務。透過每個命令及其輸出的日誌，您可以使用 ECS Exec 檢視執行的任務，並可以使用 CloudTrail 稽核存取容器的人員。

## 考量事項
<a name="ecs-exec-considerations"></a>

使用 ECS Exec 時，請注意下列事項：
+ 在 Systems Manager 不支援的作業系統上執行時，ECS Exec 可能無法如預期般運作。如需有關支援的作業系統的詳細資訊，請參閱《AWS Systems Manager 使用者指南》**中的[作業系統類型](https://docs.aws.amazon.com/systems-manager/latest/userguide/operating-systems-and-machine-types.html#prereqs-os-linux)。
+ 對於在下列基礎設施上執行的任務支援 ECS Exec：
  + 任何 Amazon ECS 最佳化 AMI 中 Amazon EC2 上的 Linux 容器，包括 Bottlerocket
  + 外部執行個體上的 Linux 與 Windows 容器 (Amazon ECS Anywhere)
  +  AWS Fargate 上的 Linux 和 Windows 容器
  + 下列 Windows Amazon ECS 最佳化 AMI 中 Amazon EC2 上的 Windows 容器 (使用容器代理程式版本 `1.56` 或更新版本)：
    + Amazon ECS 最佳化 Windows Server 2022 Full AMI
    + Amazon ECS 最佳化 Windows Server 2022 Core AMI
    + Amazon ECS 最佳化 Windows Server 2019 Full AMI
    + Amazon ECS 最佳化 Windows Server 2019 Core AMI
    + Amazon ECS 最佳化 Windows Server 20H2 Core AMI
+ 如果為任務設定了 HTTP Proxy，請將 `NO_PROXY` 環境變數設定為 `"NO_PROXY=169.254.169.254,169.254.170.2"`，使 EC2 執行個體中繼資料與 IAM 角色流量繞過代理伺服器。如果您未設定 `NO_PROXY` 環境變數，則從容器內的中繼資料端點擷取執行個體中繼資料或 IAM 角色憑證時可能會失敗。將 `NO_PROXY` 環境變數設定為建議值可篩選中繼資料與 IAM 流量，因此對 `169.254.169.254 and 169.254.170.2` 的請求不會通過 `HTTP` 代理。
+ ECS Exec 與 Amazon VPC
  + 如果您將界面 Amazon VPC 端點與 Amazon ECS 搭配使用，則必須為 Systems Manager 工作階段管理工具 (`ssmmessages`) 建立界面 Amazon VPC 端點。如需 Systems Manager VPC 端點的詳細資訊，請參閱*AWS Systems Manager 《 使用者指南*》中的[使用 AWS PrivateLink 為 Session Manager 設定 VPC 端點](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started-privatelink.html)。
  + 如果您將界面 Amazon VPC 端點與 Amazon ECS 搭配使用，且使用 AWS KMS key 進行加密，則必須為 建立界面 Amazon VPC 端點 AWS KMS key。如需詳細資訊，請參閱《AWS Key Management Service 開發人員指南》**中的[透過 VPC 端點連線至 AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/kms-vpc-endpoint.html)。
  + 當您有任務在 Amazon EC2 執行個體上執行時，請使用 `awsvpc` 聯網模式。如果您沒有網際網路存取權 (例如未設定為使用 NAT 閘道)，則必須為 Systems Manager Session Manager (`ssmmessages`) 建立介面 Amazon VPC 端點。如需有關 `awsvpc` 網路模式考量事項的詳細資訊，請參閱[考量事項](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking-awsvpc.html#linux)。如需 Systems Manager VPC 端點的詳細資訊，請參閱*AWS Systems Manager 《 使用者指南*》中的[使用 AWS PrivateLink 為 Session Manager 設定 VPC 端點](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started-privatelink.html)。
+ Amazon ECS Exec 不支援以純 IPv6 組態執行的任務。如需有關以純 IPv6 組態執行任務的詳細資訊，請參閱 [Fargate 的 Amazon ECS 任務聯網選項](fargate-task-networking.md)與 [EC2 的 Amazon ECS 任務聯網選項](task-networking.md)。
+ ECS Exec 與 SSM
  + 當使用者使用 ECS Exec 在容器上執行命令時，這些命令會以 `root` 使用者執行。即使您指定容器的使用者 ID，SSM 代理程式及其子處理程序也會以根身分執行。
  + SSM 代理程式要求容器檔案系統必須具寫入權限，方能建立必要的目錄與檔案。因此，不支援使用 `readonlyRootFilesystem` 任務定義參數或任何其他方法將根檔案系統設為唯讀。
  + 可以啟動 `execute-command` 動作以外的 SSM 工作階段時，這會導致工作階段未被記錄，會計入工作階段限制。建議您限制此存取，方法是使用 IAM 政策拒絕 `ssm:start-session` 動作。如需詳細資訊，請參閱[限制存取「啟動工作階段」動作](#ecs-exec-limit-access-start-session)。
+ 下列功能會以邊車容器的形式執行。因此，您必須指定要在其上執行命令的容器名稱。
  + 執行時期監控
  + Service Connect
+ 使用者可以執行容器內容中所有可用的命令。下列動作可能會導致孤立和廢止程序：終止容器的主要程序、終止命令代理程式，以及刪除相依性。為了清理廢止程序，建議將 `initProcessEnabled` 旗標新增至您的任務定義。
+ ECS Exec 會占用部分 CPU 與記憶體。在任務定義中指定 CPU 和記憶體資源配置時，您需要適應這一點。
+ 您必須使用 AWS CLI 版本 `1.22.3`或更新版本，或是 AWS CLI 版本 `2.3.6` 或更新版本。如需如何更新 的資訊 AWS CLI，請參閱《 使用者指南[第 2 版》中的安裝或更新最新版本的 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) 。 *AWS Command Line Interface *
+  每個程序 ID (PID) 命名空間僅能有一個 ECS Exec 工作階段。如果您在[任務中共享 PID 命名空間](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#other_task_definition_params)，則僅能在一個容器中啟動 ECS Exec 工作階段。
+ ECS Exec 工作階段的閒置逾時值為 20 分鐘。此值無法變更。
+ 您無法針對現有任務開啟 ECS Exec。只能針對新任務開啟。
+ 如果您使用 `run-task` 在採用受管擴展與非同步置放 (啟動沒有執行個體的任務) 的叢集上啟動任務，則無法使用 ECS Exec。
+ 您無法針對 Microsoft Nano Server 容器執行 ECS Exec。

## Architecture
<a name="ecs-exec-architecture"></a>

ECS Exec 使用 AWS Systems Manager (SSM) Session Manager 與執行中的容器建立連線，並使用 AWS Identity and Access Management (IAM) 政策控制對執行中容器中命令的存取。將必要的 SSM 代理程式二進位檔繫結掛載至容器，即可達成此目的。Amazon ECS 或 AWS Fargate 代理程式負責啟動容器內的 SSM 核心代理程式以及您的應用程式程式碼。如需詳細資訊，請參閱 [ Systems Manager 工作階段管理員](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html)。

您可以使用 中的`ExecuteCommand`事件稽核存取容器的使用者， AWS CloudTrail 並將每個命令 （及其輸出） 記錄到 Amazon S3 或 Amazon CloudWatch Logs。若要使用您自己的加密金鑰加密本機用戶端和容器之間的資料，您必須提供 AWS Key Management Service (AWS KMS) 金鑰。



## 設定 ECS Exec
<a name="ecs-exec-enabling-and-using"></a>

若要使用 ECS Exec，必須先為任務與服務啟用該功能，然後才能在容器中執行命令。

### 可選任務定義變更
<a name="ecs-exec-task-definition"></a>

如果您將任務定義參數 `initProcessEnabled` 設定為 `true`，則會啟動容器內的 init 程序。這會移除所有偵測到的殭屍 SSM 代理程式子程序。以下是範例。

```
{
    "taskRoleArn": "ecsTaskRole",
    "networkMode": "awsvpc",
    "requiresCompatibilities": [
        "EC2",
        "FARGATE"
    ],
    "executionRoleArn": "ecsTaskExecutionRole",
    "memory": ".5 gb",
    "cpu": ".25 vcpu",
    "containerDefinitions": [
        {
            "name": "amazon-linux",
            "image": "amazonlinux:latest",
            "essential": true,
            "command": ["sleep","3600"],
            "linuxParameters": {
                "initProcessEnabled": true
            }
        }
    ],
    "family": "ecs-exec-task"
}
```

### 為您的任務和服務開啟 ECS Exec
<a name="ecs-exec-enabling"></a>

您可以在使用下列其中一個 AWS CLI 命令時指定 `--enable-execute-command`旗標，以開啟服務和獨立任務的 ECS Exec 功能：[https://docs.aws.amazon.com/cli/latest/reference/ecs/create-service.html](https://docs.aws.amazon.com/cli/latest/reference/ecs/create-service.html)、[https://docs.aws.amazon.com/cli/latest/reference/ecs/start-task.html](https://docs.aws.amazon.com/cli/latest/reference/ecs/start-task.html)、 [https://docs.aws.amazon.com/cli/latest/reference/ecs/update-service.html](https://docs.aws.amazon.com/cli/latest/reference/ecs/update-service.html)或 [https://docs.aws.amazon.com/cli/latest/reference/ecs/run-task.html](https://docs.aws.amazon.com/cli/latest/reference/ecs/run-task.html)。

例如，若您執行以下命令，則會為在 Fargate 上執行的新建立服務啟用 ECS Exec 功能。如需建立服務的詳細資訊，請參閱 [create-service](https://docs.aws.amazon.com/cli/latest/reference/ecs/create-service.html)。

```
aws ecs create-service \
    --cluster cluster-name \
    --task-definition task-definition-name \
    --enable-execute-command \
    --service-name service-name \
    --launch-type FARGATE \
     --network-configuration "awsvpcConfiguration={subnets=[subnet-12344321],securityGroups=[sg-12344321],assignPublicIp=ENABLED}" \
    --desired-count 1
```

為任務開啟 ECS Exec 之後，您可以執行下列命令來確認任務已可供使用。如果 `ExecuteCommandAgent` 的 `lastStatus` 屬性會列為 `RUNNING` 且 `enableExecuteCommand` 屬性會設為 `true`，則您的任務已準備就緒。

```
aws ecs describe-tasks \
    --cluster cluster-name \
    --tasks task-id
```

以下輸出程式碼片段為您可能會看到的內容範例。

```
{
    "tasks": [
        {
            ...
            "containers": [
                {
                    ...
                    "managedAgents": [
                        {
                            "lastStartedAt": "2021-03-01T14:49:44.574000-06:00",
                            "name": "ExecuteCommandAgent",
                            "lastStatus": "RUNNING"
                        }
                    ]
                }
            ],
            ...
            "enableExecuteCommand": true,
            ...
        }
    ]
}
```

### 使用 ECS Exec 執行命令
<a name="ecs-exec-running-commands"></a>

## 使用 ECS Exec 記錄
<a name="ecs-exec-logging"></a>

您可以設定 ECS Exec 工作階段的記錄，擷取命令及其輸出，以達稽核與故障診斷之目的。

### 在任務與服務中啟用記錄
<a name="ecs-exec-enabling-logging"></a>

**重要**  
如需了解有關 CloudWatch 定價的詳細資訊，請參閱 [CloudWatch 定價](https://aws.amazon.com/cloudwatch/pricing/)。Amazon ECS 還提供免費的監控指標。如需詳細資訊，請參閱[使用 CloudWatch 監控 Amazon ECS](cloudwatch-metrics.md)。

Amazon ECS 為透過 ECS Exec 執行的命令，提供了預設的記錄組態。依預設，日誌會透過任務定義中設定的 `awslogs` 日誌驅動程式傳送至 CloudWatch Logs。如果您想要提供自訂組態， AWS CLI 支援 `create-cluster`和 `update-cluster`命令的`--configuration`旗標。容器映像需要安裝 `script` 與 `cat`，以便將命令日誌正確上傳至 Amazon S3 或 CloudWatch Logs。如需建立叢集的詳細資訊，請參閱 [create-cluster](https://docs.aws.amazon.com/cli/latest/reference/ecs/create-cluster.html)。

**注意**  
此組態只會處理 `execute-command` 工作階段的日誌記錄。它不會影響應用程式的日誌記錄。

下列範例會建立叢集，然後將輸出記錄至名為 `cloudwatch-log-group-name` 的 CloudWatch Logs LogGroup 和名為 `s3-bucket-name` 的 Amazon S3 儲存貯體。

當您將 `CloudWatchEncryptionEnabled`選項設定為 時，必須使用 AWS KMS 客戶受管金鑰來加密日誌群組`true`。如需有關如何加密日誌群組的資訊，請參閱*Amazon CloudWatch Logs 《 使用者指南*》中的[使用 在 CloudWatch Logs 中加密日誌資料 AWS Key Management Service](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/encrypt-log-data-kms.html#encrypt-log-data-kms-policy)。

```
aws ecs create-cluster \
    --cluster-name cluster-name \
    --configuration executeCommandConfiguration="{ \
        kmsKeyId=string, \
        logging=OVERRIDE, \
        logConfiguration={ \
            cloudWatchLogGroupName=cloudwatch-log-group-name, \
            cloudWatchEncryptionEnabled=true, \
            s3BucketName=s3-bucket-name, \
            s3EncryptionEnabled=true, \
            s3KeyPrefix=demo \
        } \
    }"
```

`logging` 屬性決定 ECS Exec 的日誌記錄功能行為：
+ `NONE`：已關閉記錄。
+ `DEFAULT`：日誌會傳送至設定的 `awslogs` 驅動程式。如果未設定驅動程式，則不會儲存日誌。
+ `OVERRIDE`：日誌會傳送至提供的 Amazon CloudWatch Logs LogGroup 和/或 Amazon S3 儲存貯體。

### Amazon CloudWatch Logs 或 Amazon S3 日誌記錄所需的 IAM 許可
<a name="ecs-exec-required-logging-permissions"></a>

若要啟用日誌記錄，任務定義中參考的 Amazon ECS 任務角色需要有額外的許可。這些額外的許可可以作為政策新增至任務角色。根據您將日誌導向 Amazon CloudWatch Logs 或 Amazon S3 的不同，所需許可也會有所差異。

------
#### [ Amazon CloudWatch Logs ]

下列政策範例會新增必要 Amazon CloudWatch Logs 許可。

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:DescribeLogGroups"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
               "logs:CreateLogStream",
               "logs:DescribeLogStreams",
               "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:us-east-1:111122223333:log-group:/aws/ecs/cloudwatch-log-group-name:*"
        }
   ]
}
```

------
#### [ Amazon S3 ]

下列政策範例會新增必要 Amazon S3 許可。

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
        {
            "Effect": "Allow",
            "Action": [
               "s3:GetBucketLocation"
            ],
            "Resource": "*"
        },
        {
           "Effect": "Allow",
           "Action": [
               "s3:GetEncryptionConfiguration"
           ],
           "Resource": "arn:aws:s3:::s3-bucket-name"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::s3-bucket-name/*"
        }
    ]
   }
```

------

### 使用您自己的加密所需的 IAM 許可 AWS KMS key (KMS 金鑰）
<a name="ecs-exec-required-kms-permissions"></a>

根據預設，本機用戶端與容器之間傳輸的資料會使用 AWS 提供的 TLS 1.2 加密。若要使用您自己的 KMS 金鑰進一步加密資料，您必須建立 KMS 金鑰並新增 `kms:Decrypt` 許可至您的任務 IAM 角色。您的容器使用此許可來解密資料。如需建立 KMS 金鑰的詳細資訊，請參閱[建立金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。

您可以將以下內嵌政策新增至任務 IAM 角色，該角色需要 AWS KMS 許可。如需詳細資訊，請參閱[ECS Exec 許可](task-iam-roles.md#ecs-exec-required-iam-permissions)。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
        }
    ]
}
```

------

若要使用您自己的 KMS 金鑰加密資料，則必須向使用 `execute-command` 動作的使用者或群組授予 `kms:GenerateDataKey` 許可。

下列使用者或群組的範例政策包含使用您自己的 KMS 金鑰的必要許可。您必須指定 KMS 金鑰的 Amazon Resource Name (ARN)。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:GenerateDataKey"
            ],
            "Resource": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
        }
    ]
}
```

------

## 使用 IAM 政策限制 ECS Exec 的存取
<a name="ecs-exec-best-practices-limit-access-execute-command"></a>

您可以使用下列一或多個 IAM 政策條件索引鍵，限制使用者對執行命令 API 動作的存取：
+ `aws:ResourceTag/clusterTagKey`
+ `ecs:ResourceTag/clusterTagKey`
+ `aws:ResourceTag/taskTagKey`
+ `ecs:ResourceTag/taskTagKey`
+ `ecs:container-name`
+ `ecs:cluster`
+ `ecs:task`
+ `ecs:enable-execute-command`

使用下列範例 IAM 政策，使用者可以在任務內執行的容器中執行命令，任務標籤具有 `environment` 鍵和 `development` 值，並位於名為 `cluster-name` 的叢集中。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:ExecuteCommand",
                "ecs:DescribeTasks"
            ],
            "Resource": [
                   "arn:aws:ecs:us-east-1:111122223333:task/cluster-name/*",
                   "arn:aws:ecs:us-east-1:111122223333:cluster/cluster-name"
            ],
            "Condition": {
                "StringEquals": {
                    "ecs:ResourceTag/environment": "development"
                }
            }
        }
    ]
}
```

------

在下列 IAM 政策範例中，當容器名稱為 `production-app` 時，使用者無法使用 `execute-command` API。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "ecs:ExecuteCommand"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {                    
                    "ecs:container-name": "production-app"
                }
            }
        }
    ]
}
```

------

使用下列 IAM 政策，使用者只能在 ECS Exec 關閉時啟動任務。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:RunTask",
                "ecs:StartTask",
                "ecs:CreateService",
                "ecs:UpdateService"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {                    
                    "ecs:enable-execute-command": "false"
                }
            }
        }
    ]
}
```

------

**注意**  
由於 `execute-command` API 動作只包含請求中的任務和叢集資源，所以只會評估叢集和任務標籤。

如需有關 IAM 政策條件索引鍵的詳細資訊，請參閱《服務授權參考》**中的 [Amazon Elastic Container Service 的動作、資源與條件索引鍵](/service-authorization/latest/reference/list_amazonelasticcontainerservice.html)。

### 限制存取「啟動工作階段」動作
<a name="ecs-exec-limit-access-start-session"></a>

雖然可以在 ECS Exec 之外的容器上啟動 SSM 工作階段，但這可能會導致工作階段未被記錄。在 ECS Exec 以外啟動的工作階段也會計入工作階段配額。建議您透過直接拒絕針對使用 IAM 政策之 Amazon ECS 任務的 `ssm:start-session` 動作來限制此存取。您可以根據使用的標籤拒絕存取所有 Amazon ECS 任務或特定任務。

以下為範例 IAM 政策，它會針對具有特定叢集名稱之所有區域中的任務，拒絕存取 `ssm:start-session` 動作。您可以選擇包含具有 `cluster-name` 的萬用字元。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "ssm:StartSession",
            "Resource": [
                   "arn:aws:ecs:us-east-1:111122223333:task/cluster-name/*"
            ]
        }
    ]
}
```

------

以下為範例 IAM 政策，它會針對所有具有標籤鍵 `Task-Tag-Key` 和標籤值 `Exec-Task` 的區域中的資源，拒絕對 `ssm:start-session` 動作的存取。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "ssm:StartSession",
            "Resource": "arn:aws:ecs:*:*:task/*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/Task-Tag-Key": "Exec-Task"
                }
            }
        }
    ]
}
```

------

## ECS Exec 疑難排解
<a name="ecs-exec-troubleshooting-overview"></a>

如需其他疑難排解協助，請參閱 [Exec 問題疑難排解](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec-troubleshooting.html)。

# 使用 ECS Exec 執行命令
<a name="ecs-exec-run"></a>

您可以使用 Amazon ECS Exec 收集與容器相關的診斷資訊，並對整個容器生命週期中遇到的錯誤進行故障診斷。

## 先決條件
<a name="ecs-exec-run-prerequisites"></a>

開始使用 ECS Exec 之前，請確定您已完成下列動作：
+ 檢閱考量事項。如需詳細資訊，請參閱[考量事項](ecs-exec.md#ecs-exec-considerations)
+ 為任務與服務設定 ECS Exec。如需詳細資訊，請參閱[設定 ECS Exec](ecs-exec.md#ecs-exec-enabling-and-using)
+ **安裝和設定 AWS CLI**。如需詳細資訊，請參閱 [Get started with the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)。
+ **安裝 的 Session Manager 外掛程式 AWS CLI**。如需詳細資訊，請參閱[為 AWS CLI安裝工作階段管理工具外掛程式](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html)。
+ **設定具備適當許可的任務角色**。您必須使用具有 ECS Exec 適當許可的任務角色。如需詳細資訊，請參閱[任務 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)。
+ **驗證版本需求**。ECS Exec 具有版本要求，取決於您的任務是否託管於 Amazon EC2 或 AWS Fargate：
  + 如果您使用的是 Amazon EC2，則必須使用在 2021 年 1 月 20 日之後發行的 Amazon ECS 最佳化 AMI，且代理程式版本為 1.50.2 或更高版本。如需詳細資訊，請參閱 [Amazon ECS 最佳化 AMI](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html)。
  + 如果您使用的是 AWS Fargate，則必須使用平台版本 `1.4.0`或更新版本 (Linux) 或 `1.0.0`(Windows)。如需詳細資訊，請參閱 [AWS Fargate 平台版本](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform-fargate.html)。

## 透過主控台操作服務任務
<a name="ecs-exec-run-using-console"></a>

您可以透過主控台使用 ECS Exec 執行指令。

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

1. 在**叢集**頁面上，選擇叢集。

1. 在「叢集詳細資訊」頁面上的**服務**區段中，選擇所需服務。

   服務詳細資訊頁面隨即顯示。

1. 在服務詳細資訊頁面上，選擇**任務**。然後，選擇所需任務。

1. 在**容器**下選擇要在其中使用 ECS Exec 的容器。

1. 若要執行命令，請執行下列任一操作：
   + 選擇**連線**。

     CloudShell 工作階段會顯示您可以在其中執行命令的位置。
   + 選擇箭頭，再選擇**複製 AWS CLI 命令**。

     然後，您便可以在本機執行命令。

**預期的結果**

如果連線成功，您應該會看到來自容器的互動式 Shell 提示。您現在可以直接在容器環境中執行命令。若要退出工作階段，請選擇**結束工作階段**。

## 使用主控台操作獨立任務
<a name="ecs-exec-run-using-console-standalone-tasks"></a>

您可以透過主控台使用 ECS Exec 執行指令。

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

1. 在**叢集**頁面上，選擇叢集。

1. 在「叢集詳細資訊」頁面上的**任務**區段中，選擇所需任務。

   任務詳細資訊頁面隨即顯示。

1. 在**容器**下選擇要在其中使用 ECS Exec 的容器。

1. 若要執行命令，請執行下列任一操作：
   + 選擇**連線**。

     CloudShell 工作階段會顯示您可以在其中執行命令的位置。
   + 選擇箭頭，再選擇**複製 AWS CLI 命令**。

     然後，您便可以在本機執行命令。

**預期的結果**

如果連線成功，您應該會看到來自容器的互動式 Shell 提示。您現在可以直接在容器環境中執行命令。若要退出工作階段，請選擇**結束工作階段**。

## 使用命令 Shell
<a name="ecs-exec-run-using-command-shell"></a>

您可透過命令 Shell 使用 ECS Exec 執行命令。

在確認 `ExecuteCommandAgent` 正在執行後，您可以使用以下命令在容器上開啟交互式 Shell。如果您的任務包含多個容器，您必須使用 `--container` 旗標指定容器名稱。Amazon ECS 僅支援啟動互動式工作階段，因此您必須使用 `--interactive` 旗標。

若任務 ID 為 *task-id*，下面的命令會針對名為 **container-name** 的容器執行交互式 `/bin/sh` 命令。

*task-id* 是任務的 Amazon Resource Name (ARN)。

```
aws ecs execute-command --cluster cluster-name \
    --task task-id \
    --container container-name \
    --interactive \
    --command "/bin/sh"
```

**預期的結果**

如果命令執行成功，您應該會看到來自容器的互動式 Shell 提示。您現在可以直接在容器環境中執行命令。若要退出工作階段，請輸入 `exit` 或按 `Ctrl+D`。