本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 ECS Exec 監控 Amazon ECS容器
使用 Amazon ECS Exec,您可以直接與容器互動,而不需要先與主機容器作業系統、開放傳入連接埠或管理SSH金鑰互動。您可以使用 ECS Exec 在 中執行命令,或在 Amazon EC2執行個體或 上執行的容器取得 Shell AWS Fargate。如此一來就可以更輕鬆地收集診斷資訊並快速對錯誤進行故障診斷。例如,在開發環境中,您可以使用 ECS Exec 輕鬆與容器中的各種程序互動,並對應用程式進行疑難排解。在生產案例中,您可以使用它來取得容器的碎片存取權,以偵錯問題。
您可以從 Amazon ECS API、 AWS Command Line Interface (AWS CLI) 或 AWS Copilot 使用 ECS Exec,在執行中的 Linux AWS SDKs或 Windows 容器中執行命令CLI。如需使用 ECS Exec 的詳細資訊,以及使用 AWS Copilot 的影片逐步解說CLI,請參閱 Copilot GitHub 文件
您也可以使用 ECS Exec 來維護更嚴格的存取控制政策。透過選擇性地開啟此功能,您可以控制執行命令的人員,以及他們可以執行這些命令的任務。透過每個命令的日誌及其輸出,您可以使用 ECS Exec 檢視執行了哪些任務,並可使用 CloudTrail 來稽核誰存取了容器。
考量事項
對於本主題,您應該熟悉使用 ECS Exec 涉及的下列層面:
-
ECS 目前不支援使用 的 Exec AWS Management Console。
-
ECS 在 Systems Manager 不支援的作業系統上執行時,Exec 可能無法如預期般運作。如需支援作業系統的相關資訊,請參閱 AWS Systems Manager 使用者指南 中的作業系統類型。
-
ECS 在下列基礎設施上執行的任務支援 Exec:
-
Amazon 上任何 Amazon ECS最佳化 EC2上的 Linux 容器AMI,包括 Bottlerocket
-
外部執行個體上的 Linux 和 Windows 容器 (Amazon ECS Anywhere)
-
AWS Fargate 上的 Linux 和 Windows 容器
-
下列 Windows Amazon ECS最佳化EC2的 Amazon 上的 Windows 容器 AMIs(使用容器代理程式版本
1.56
或更新版本):-
Amazon ECS最佳化 Windows Server 2022 完整版 AMI
-
Amazon ECS最佳化 Windows Server 2022 核心 AMI
-
Amazon ECS最佳化 Windows Server 2019 完整版 AMI
-
Amazon ECS最佳化 Windows Server 2019 核心 AMI
-
Amazon ECS最佳化 Windows Server 20H2 核心 AMI
-
-
-
ECS Exec 和 Amazon VPC
-
如果您將界面 Amazon VPC端點與 Amazon 搭配使用ECS,則必須為 Systems Manager Session Manager () 建立界面 Amazon VPC端點
ssmmessages
。如需 Systems Manager VPC端點的詳細資訊,請參閱 AWS Systems Manager 使用者指南 中的使用 AWS PrivateLink 為 Session Manager 設定VPC端點。 -
如果您將界面 Amazon VPC端點與 Amazon 搭配使用ECS,且使用 AWS KMS key 進行加密,則必須為 建立界面 Amazon VPC端點 AWS KMS key。如需詳細資訊,請參閱 開發人員指南 中的AWS KMS key 透過VPC端點連線至 。 AWS Key Management Service
-
當您的任務在 Amazon EC2執行個體上執行時,請使用
awsvpc
聯網模式。如果您沒有網際網路存取權,例如未設定為使用NAT閘道),則必須為 Systems Manager Session Manager () 建立介面 Amazon VPC端點ssmmessages
。如需有關awsvpc
網路模式考量事項的詳細資訊,請參閱考量事項。如需 Systems Manager VPC端點的詳細資訊,請參閱 AWS Systems Manager 使用者指南 中的使用 AWS PrivateLink 為 Session Manager 設定VPC端點。
-
-
ECS 執行和 SSM
-
當使用者使用 ECS Exec 在容器上執行命令時,這些命令會以
root
使用者身分執行。即使您為容器指定使用者 ID,SSM代理程式及其子程序仍會作為根程序執行。 -
SSM 代理程式需要將容器檔案系統寫入 ,才能建立所需的目錄和檔案。因此,不支援使用
readonlyRootFilesystem
任務定義參數或任何其他方法將根檔案系統設為唯讀。 -
雖然可以在
execute-command
動作之外啟動SSM工作階段,這會導致工作階段未記錄,並計入工作階段限制。我們建議您使用 IAM政策拒絕ssm:start-session
動作,以限制此存取。如需詳細資訊,請參閱限制存取「啟動工作階段」動作。
-
-
下列功能會以 Sidecar 容器執行。因此,您必須指定要執行命令的容器名稱。
-
執行期監控
-
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執行工作階段。如果您要在任務 中共用PID命名空間,您只能在一個容器中啟動ECS執行工作階段。
-
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 日之後AMI發行的 Amazon ECS最佳化,代理程式版本為 1.50.2 或更新版本。如需詳細資訊,請參閱 Amazon ECS最佳化 AMIs。
-
如果您使用的是 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
,這會啟動容器內的初始化程序。這會移除找到的任何殭屍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執行功能:create-service
、start-task
、 update-service
或 run-task
。
例如,如果您執行下列命令,在 Fargate 上執行的新建立服務會開啟 ECS Exec 功能。如需建立服務的詳細資訊,請參閱 create-service。
aws ecs create-service \ --cluster
cluster-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 \ --cluster
cluster-name
\ --taskstask-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
旗標。
下列命令將針對名為 的容器執行互動式/bin/sh
命令
針對 ID 為 的任務 container-name
task-id
.
所以此 task-id
是任務的 Amazon Resource Name (ARN)。
aws ecs execute-command --cluster
cluster-name
\ --tasktask-id
\ --containercontainer-name
\ --interactive \ --command"/bin/sh"
使用 ECS Exec 記錄
開啟登入您的任務和服務
重要
如需 CloudWatch 定價的詳細資訊,請參閱CloudWatch 定價。
Amazon 透過使用任務定義中設定的日誌驅動程式將日誌傳送至 CloudWatch 日誌,為使用 ECS Exec 執行的awslogs
日誌命令ECS提供預設組態。如果您想要提供自訂組態, AWS CLI
支援 create-cluster
和 update-cluster
命令的 --configuration
旗標。也請務必了解容器映像需要安裝 cat
script
和 ,才能將命令日誌正確上傳至 Amazon S3 或 CloudWatch 日誌。如需建立叢集的詳細資訊,請參閱 create-cluster。
注意
此組態只會處理 execute-command
工作階段的日誌記錄。它不會影響應用程式的日誌記錄。
下列範例會建立叢集,然後將輸出記錄到 LogGroup 名為 的 CloudWatch 日誌cloudwatch-log-group-name
和名為 的 Amazon S3 儲存貯體s3-bucket-name
。
將 CloudWatchEncryptionEnabled
選項設定為 時,您必須使用 AWS KMS 客戶受管金鑰來加密日誌群組true
。如需有關如何加密日誌群組的資訊,請參閱 Amazon CloudWatch Logs 使用者指南 中的使用 在 CloudWatch 日誌中加密日誌資料 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 儲存貯體或兩者。
IAM Amazon CloudWatch Logs 或 Amazon S3 Logging 所需的許可
若要啟用記錄,在ECS任務定義中參考的 Amazon 任務角色需要具有其他許可。這些額外的許可可以作為政策新增至任務角色。視您是否將日誌導向 Amazon CloudWatch Logs 或 Amazon S3 而定,它們會有所不同。
IAM 使用您自己的 AWS KMS key (KMS 金鑰) 加密所需的許可
根據預設,本機用戶端與容器之間傳輸的資料會使用 AWS 提供的 TLS 1.2 加密。若要使用您自己的KMS金鑰進一步加密資料,您必須建立KMS金鑰並將kms:Decrypt
許可新增至任務IAM角色。您的容器使用此許可來解密資料。如需建立KMS金鑰的詳細資訊,請參閱建立金鑰 。
您可以將下列內嵌政策新增至需要 AWS KMS 許可的任務IAM角色。如需詳細資訊,請參閱ECS 執行許可。
{ "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/*" ], "Condition": { "StringEquals": { "ecs:ResourceTag/environment
": "development
" } } } ] }
透過下列IAM政策範例,當容器名稱為 execute-command
API時,使用者無法使用 production-app
。
{ "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/*", "arn:aws:ecs:region:aws-account-id:cluster/*" ] } ] }
下列範例IAM政策會拒絕對標記有標籤索引鍵 Task-Tag-Key
和標籤值 的所有區域中資源ssm:start-session
的動作進行存取Exec-Task
。
{ "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 的問題進行疑難排解。