本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 ECS Exec 監控 Amazon ECS 容器
使用 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 時,請考慮下列事項:
-
在 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 CLI 。 AWS 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 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
若要使用 ECS Exec,您必須先開啟任務和服務的功能,然後在容器中執行命令。
可選任務定義變更
如果您將任務定義參數設定為 initProcessEnabled true,這會啟動容器內的初始化程序。這會移除找到的任何殭屍 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-service、start-task、 update-service或 run-task。
例如,如果您執行下列命令,則會針對在 Fargate 上執行的新建立服務開啟 ECS Exec 功能。如需建立服務的詳細資訊,請參閱 create-service。
aws ecs create-service \ --clustercluster-name\ --task-definitiontask-definition-name\ --enable-execute-command \ --service-nameservice-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 \ --clustercluster-name\ --taskstask-id
以下輸出程式碼片段為您可能會看到的內容範例。
{ "tasks": [ { ... "containers": [ { ... "managedAgents": [ { "lastStartedAt": "2021-03-01T14:49:44.574000-06:00", "name": "ExecuteCommandAgent", "lastStatus": "RUNNING" } ] } ], ... "enableExecuteCommand": true, ... } ] }
使用 ECS Exec 執行命令
使用 ECS Exec 記錄
您可以設定 ECS Exec 工作階段的記錄,以擷取命令及其輸出,以供稽核和故障診斷之用。
開啟記錄您的任務和服務
重要
如需了解有關 CloudWatch 定價的詳細資訊,請參閱 CloudWatch 定價
Amazon ECS 為使用 ECS Exec 執行的記錄命令提供預設組態。預設值是使用任務定義中設定的日誌驅動程式,將awslogs日誌傳送至 CloudWatch Logs。如果您想要提供自訂組態, AWS CLI 支援 create-cluster和 update-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-namecluster-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 而有所不同。
使用您自己的加密所需的 IAM 許可 AWS KMS key (KMS 金鑰)
根據預設,本機用戶端與容器之間傳輸的資料會使用 AWS 提供的 TLS 1.2 加密。若要使用您自己的 KMS 金鑰進一步加密資料,您必須建立 KMS 金鑰並新增 kms:Decrypt 許可至您的任務 IAM 角色。您的容器使用此許可來解密資料。如需建立 KMS 金鑰的詳細資訊,請參閱建立金鑰。
您可以將下列內嵌政策新增至需要 AWS KMS 許可的任務 IAM 角色。如需詳細資訊,請參閱ECS Exec 許可。
若要使用您自己的 KMS 金鑰加密資料,則必須向使用 execute-command 動作的使用者或群組授予 kms:GenerateDataKey 許可。
下列使用者或群組的範例政策包含使用您自己的 KMS 金鑰的必要許可。您必須指定 KMS 金鑰的 Amazon Resource Name (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 的叢集中。
在下列 IAM 政策範例中,當容器名稱為 production-app 時,使用者無法使用 execute-command API。
使用下列 IAM 政策,使用者只能在 ECS Exec 關閉時啟動任務。
注意
由於 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
以下為範例 IAM 政策,它會針對所有具有標籤鍵 Task-Tag-Key 和標籤值 Exec-Task 的區域中的資源,拒絕對 ssm:start-session 動作的存取。
對 ECS Exec 進行故障診斷
如需其他故障診斷說明,請參閱針對 Exec 的問題進行故障診斷。