使用 ECS 執行監控 Amazon ECS 容器 - Amazon Elastic Container Service

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

使用 ECS 執行監控 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 開發套件或副駕駛 CLI 的 ECS Exec,在執行中的 Linux 或視窗容器中執行命令。 AWS 如需使用 ECS Exec 的詳細資訊,以及使用 C AWS opilot CLI 的影片逐步解說,請參閱 Copilot 文件。GitHub

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

使用 ECS Exec 的考量

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

  • 目前不支援 ECS 執行器使用. AWS Management Console

  • 對於在下列基礎設施上執行的任務支援 ECS Exec:

    • 任何 Amazon ECS 最佳化 AMI 中 Amazon EC2 上的 Linux 容器,包括 Bottlerocket

    • 外部執行個體上的 Linux 和視窗容器 (Amazon ECS Anywhere)

    • AWS Fargate 上的 Linux 和視窗容器

    • 下列 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

  • ECS 執行和 Amazon VPC

  • ECS 執行及 SSM

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

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

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

  • 以下功能作為邊車容器運行。因此,您必須指定要在其上執行命令的容器名稱。

    • 執行期監控

    • Service Connect

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

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

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

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

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

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

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

  • 您無法針對 Microsoft 納米服務器容器運行 ECS Exec。如需有關 Nano Server 容器的詳細資訊,請參閱 Docker 網站上的 Nano Server

使用 ECS Exec 的先決條件

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

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

  • 安裝的工作階段管理員外掛程式 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 (視窗)。如需詳細資訊,請參閱 AWS Fargate 平台版本

架構

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

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

使用 ECS Exec

可選任務定義變更

如果您將工作定義參數設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

您可以在使用下列指 AWS CLI 令之一時指定--enable-execute-command旗標,為服務和獨立工作開啟 ECS Exec 功能:create-serviceupdate-servicestart-task、或。run-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 的任務的名為容器名稱的容器運行交互式/bin/sh命令。

任務 ID 是任務的 Amazon 資源名稱(ARN)。

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

使用 ECS Exec 進行日誌記錄和稽核

在任務和服務中開啟日誌記錄和稽核

重要

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

Amazon ECS 為使用 ECS Exec 執行的記錄命令提供預設組態,方法是使用任務定義中設定的 CloudWatch 日awslogs誌驅動程式將日誌傳送至日誌。如果您想要提供自訂組態, AWS CLI 支援 create-clusterupdate-cluster 命令的 --configuration 旗標。同樣重要的是要知道容器映像需catscript並安裝,以便將命令日誌正確上傳到 Amazon S3 或 CloudWatch 日誌。如需建立叢集的詳細資訊,請參閱 create-cluster

注意

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

下列範例會建立叢集,然後將輸出記錄到名為的 CloudWatch 日誌cloudwatch-log-group-name和 LogGroup 名為的 Amazon S3 儲存貯體s3-bucket-name

CloudWatchEncryptionEnabled選項設定為時,您必須使用 AWS KMS 客戶管理金鑰來加密記錄群組true。如需如何加密記錄群組的詳細資訊,請參閱《使用 AWS Key Management Service指南》中的〈 CloudWatch 記錄檔方式〉中的〈加密記錄檔資料。Amazon CloudWatch Logs

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 日誌 LogGroup,Amazon S3 存儲桶或兩者。

Amazon CloudWatch 日誌或 Amazon S3 日誌所需的 IAM 許可

若要啟用日誌記錄,任務定義中參考的 Amazon ECS 任務角色需要有額外的許可。這些額外的許可可以作為政策新增至任務角色。根據您是否將日誌導向到亞馬遜日 CloudWatch 誌或 Amazon S3,它們會有所不同。

Amazon CloudWatch Logs

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

{ "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/*" } ] }

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

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

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

{ "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 政策範例中,當容器名稱為 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/*", "arn:aws:ecs:region:aws-account-id:cluster/*" ] } ] }

以下為範例 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 的疑難排解問題