選取您的 Cookie 偏好設定

我們使用提供自身網站和服務所需的基本 Cookie 和類似工具。我們使用效能 Cookie 收集匿名統計資料,以便了解客戶如何使用我們的網站並進行改進。基本 Cookie 無法停用,但可以按一下「自訂」或「拒絕」以拒絕效能 Cookie。

如果您同意,AWS 與經核准的第三方也會使用 Cookie 提供實用的網站功能、記住您的偏好設定,並顯示相關內容,包括相關廣告。若要接受或拒絕所有非必要 Cookie,請按一下「接受」或「拒絕」。若要進行更詳細的選擇,請按一下「自訂」。

使用 ECS Exec 監控 Amazon ECS 容器

焦點模式
使用 ECS Exec 監控 Amazon ECS 容器 - Amazon Elastic Container Service

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

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

使用 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 文件

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

考量事項

在本主題中,您應該熟悉下列使用 ECS Exec 的相關方面:

  • 目前不支援使用 ECS Exec AWS Management Console。

    叢集詳細資訊頁面會顯示用於加密本機用戶端和容器之間資料的日誌記錄和 AWS KMS 客戶受管金鑰。

  • 在 Systems Manager 不支援的作業系統上執行時,ECS Exec 可能無法如預期般運作。如需支援的作業系統相關資訊,請參閱AWS Systems Manager 《 使用者指南》中的作業系統類型

  • 對於在下列基礎設施上執行的任務支援 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 代理,請將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 端點

    • 如果您將界面 Amazon VPC 端點與 Amazon ECS 搭配使用,並將 AWS KMS key 用於加密,則必須為 AWS KMS key建立界面 Amazon VPC 端點。如需詳細資訊,請參閱《AWS Key Management Service 開發人員指南》中的透過 VPC 端點連線至 AWS KMS key

    • 當您有任務在 Amazon EC2 執行個體上執行時,請使用awsvpc聯網模式。如果您沒有網際網路存取,例如未設定為使用 NAT 閘道),您必須為 Systems Manager Session Manager () 建立界面 Amazon VPC 端點ssmmessages。如需有關 awsvpc 網路模式考量事項的詳細資訊,請參閱考量事項。如需 Systems Manager VPC 端點的詳細資訊,請參閱AWS Systems Manager 《 使用者指南》中的使用 AWS PrivateLink 為 Session Manager 設定 VPC 端點

  • ECS Exec 和 SSM

    • 當使用者使用 ECS Exec 在容器上執行命令時,這些命令會以 root 使用者執行。即使您指定容器的使用者 ID,SSM 代理程式及其子處理程序也會以根身分執行。

    • SSM 代理程式需要將容器檔案系統寫入 ,才能建立所需的目錄和檔案。因此,不支援使用 readonlyRootFilesystem 任務定義參數或任何其他方法將根檔案系統設為唯讀。

    • 可以啟動 execute-command 動作以外的 SSM 工作階段時,這會導致工作階段未被記錄,會計入工作階段限制。建議您限制此存取,方法是使用 IAM 政策拒絕 ssm:start-session 動作。如需詳細資訊,請參閱限制存取「啟動工作階段」動作

  • 下列功能會以附屬容器的形式執行。因此,您必須指定容器名稱才能執行命令。

    • 執行期監控

    • Service Connect

  • 使用者可以執行容器內容中所有可用的命令。下列動作可能會導致孤立和廢止程序:終止容器的主要程序、終止命令代理程式,以及刪除相依性。為了清理廢止程序,建議將 initProcessEnabled 旗標新增至您的任務定義。

  • ECS Exec 使用一些 CPU 和記憶體。在任務定義中指定 CPU 和記憶體資源配置時,您需要適應這一點。

  • 您必須使用 AWS CLI 版本 1.22.3 或更新版本,或是 AWS CLI 版本 2.3.6 或更新版本。如需如何更新 的資訊 AWS CLI,請參閱《 使用者指南第 2 版》中的安裝或更新最新版本的 AWS CLIAWS Command Line Interface

  • 每個程序 ID (PID) 命名空間僅能有一個 ECS Exec 工作階段。如果您在任務中共享 PID 命名空間,則僅能在一個容器中啟動 ECS Exec 工作階段。

  • ECS Exec 工作階段的閒置逾時值為 20 分鐘。此值無法變更。

  • 您無法針對現有任務開啟 ECS Exec。只能針對新任務開啟。

  • 當您使用 在叢集上run-task啟動任務時,無法使用 ECS Exec,該叢集使用具有非同步置放的受管擴展 (在沒有執行個體的情況下啟動任務)。

  • 您無法針對 Microsoft Nano Server 容器執行 ECS Exec。

先決條件

開始使用 ECS Exec 之前,請確定您已完成下列動作:

  • 安裝及設定 AWS CLI。如需詳細資訊,請參閱 入門 AWS CLI

  • 安裝 的 Session Manager 外掛程式 AWS CLI。如需詳細資訊,請參閱為 AWS CLI安裝工作階段管理工具外掛程式

  • 您必須使用具有 ECS Exec 適當許可的任務角色。如需詳細資訊,請參閱任務 IAM 角色

  • ECS Exec 具有版本要求,取決於您的任務是否託管於 Amazon EC2 或 AWS Fargate:

    • 如果您使用的是 Amazon EC2,則必須使用在 2021 年 1 月 20 日之後發行的 Amazon ECS 最佳化 AMI,且代理程式版本為 1.50.2 或更高版本。如需詳細資訊,請參閱 Amazon ECS 最佳化 AMI

    • 如果您使用的是 AWS Fargate,則必須使用平台版本 1.4.0或更新版本 (Linux) 或 1.0.0(Windows)。如需詳細資訊,請參閱 AWS Fargate 平台版本

架構

ECS Exec 會使用 AWS Systems Manager (SSM) Session Manager 與執行中的容器建立連線,並使用 AWS Identity and Access Management (IAM) 政策來控制對執行中容器中執行中命令的存取。將必要的 SSM 代理程式二進位檔繫結掛載至容器,即可達成此目的。Amazon ECS 或 AWS Fargate 代理程式負責在您的應用程式程式碼中啟動容器內的 SSM 核心代理程式。如需詳細資訊,請參閱 Systems Manager 工作階段管理員

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

使用 ECS Exec

可選任務定義變更

如果您將任務定義參數initProcessEnabled設定為 true,這會啟動容器內的初始化程序。這會移除找到的任何 zombie 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

您可以在使用下列其中一個 AWS CLI 命令時指定 --enable-execute-command旗標,以開啟服務和獨立任務的 ECS Exec 功能:create-servicestart-taskupdate-servicerun-task

例如,如果您執行下列命令,則會針對在 Fargate 上執行的新建立服務開啟 ECS Exec 功能。如需建立服務的詳細資訊,請參閱 create-service

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 之後,您可以執行下列命令來確認任務已可供使用。如果 ExecuteCommandAgentlastStatus 屬性會列為 RUNNINGenableExecuteCommand 屬性會設為 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 執行命令

在確認 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"

使用 ECS Exec 記錄

開啟記錄您的任務和服務

重要

如需了解有關 CloudWatch 定價的詳細資訊,請參閱 CloudWatch 定價。Amazon ECS 還提供免費的監控指標。如需詳細資訊,請參閱使用 CloudWatch 監控 Amazon ECS

Amazon ECS 提供使用 ECS Exec 執行之記錄命令的預設組態。預設為使用任務定義中設定的日誌驅動程式,將awslogs日誌傳送至 CloudWatch Logs。如果您想要提供自訂組態, AWS CLI 支援 create-clusterupdate-cluster命令的--configuration旗標。容器映像需要安裝 cat script和 ,才能將命令日誌正確上傳至 Amazon S3 或 CloudWatch Logs。如需建立叢集的詳細資訊,請參閱 create-cluster

注意

此組態只會處理 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

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 許可

若要啟用日誌記錄,任務定義中參考的 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:region:account-id: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/*" } ] }

下列政策範例會新增必要 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:region:account-id:log-group:/aws/ecs/cloudwatch-log-group-name:*" } ] }

使用您自己的加密所需的 IAM 許可 AWS KMS key (KMS 金鑰)

根據預設,本機用戶端與容器之間傳輸的資料會使用 AWS 提供的 TLS 1.2 加密。若要使用您自己的 KMS 金鑰進一步加密資料,您必須建立 KMS 金鑰並新增 kms:Decrypt 許可至您的任務 IAM 角色。您的容器使用此許可來解密資料。如需建立 KMS 金鑰的詳細資訊,請參閱建立金鑰

您可以將下列內嵌政策新增至需要 AWS KMS 許可的任務 IAM 角色。如需詳細資訊,請參閱ECS Exec 許可

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": "kms-key-arn" } ] }

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

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

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:GenerateDataKey" ], "Resource": "kms-key-arn" } ] }

使用 IAM 政策限制 ECS Exec 的存取

您可以使用下列一或多個 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 的叢集中。

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

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

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

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

{ "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 的動作、資源與條件索引鍵

限制存取「啟動工作階段」動作

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

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

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ssm:StartSession", "Resource": [ "arn:aws:ecs:region:aws-account-id:task/cluster-name/*" } ] }

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

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

如需使用 Amazon ECS Exec 時可能遇到的任何問題的說明,請參閱針對 Exec 的問題進行故障診斷

隱私權網站條款Cookie 偏好設定
© 2025, Amazon Web Services, Inc.或其附屬公司。保留所有權利。