本文将介绍如何使用 AWS ECS Exec 功能访问运行在 AWS Fargate 上的容器,以便在容器中执行命令。 参考

步骤 1: 为任务角色添加必要权限

首先,需要为任务角色添加以下权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel",
                "ecs:ExecuteCommand"
            ],
            "Resource": "*"
        }
    ]
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

步骤 2: 在容器定义中启用 initProcessEnabled

在任务的 containerDefinitions 中添加以下内容,以启用 initProcessEnabled:

"linuxParameters": {
    "initProcessEnabled": true
}
  • 1.
  • 2.
  • 3.

步骤 3: 更新任务定义

使用更新后的任务角色和容器定义,更新任务定义。您可以使用 AWS 管理控制台或 AWS CLI 来更新任务定义。

使用 AWS CLI 更新任务定义的命令如下:

aws ecs register-task-definition --cli-input-json file://<task-definition-file-path>
  • 1.

请将 <task-definition-file-path> 替换为您自己的任务定义文件路径。

步骤 4: 更新 ECS 服务

如果您有正在运行的 ECS 服务,可以使用以下命令强制部署新的任务定义:

aws ecs update-service--cluster <cluster-name> --force-new-deployment --service <service-name> --task-definition <task-definition-name>
  • 1.

请将 <cluster-name><service-name> 和 <task-definition-name> 替换为您自己的集群名称、服务名称和任务定义名称。

步骤 5: 运行新任务

使用以下命令运行新任务,并启用执行命令功能:

aws ecs run-task--cluster <cluster-name> --task-definition <task-definition-name> --network-configuration awsvpcConfiguration="{subnets=[<subnet-id-1>,<subnet-id-2>],securityGroups=[<security-group-id>],assignPublicIp=DISABLED}" --enable-execute-command --launch-type FARGATE --tags key=environment,value=dev --platform-version '1.4.0' --region <aws-region>
  • 1.

请将 <cluster-name><task-definition-name><subnet-id-1><subnet-id-2><security-group-id> 和 <aws-region> 替换为您自己的集群名称、任务定义名称、子网 ID、安全组 ID 和 AWS 区域,记录返回的taskArn值给后续使用。

步骤 6: 安装 Session Manager 插件

为了在本地计算机上使用 aws ecs execute-command,您需要安装 Session Manager 插件。对于 macOS,可以执行以下命令进行安装:

curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
unzip sessionmanager-bundle.zip
sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin
  • 1.
  • 2.
  • 3.

步骤 7: 执行容器命令

安装完成后,您可以使用以下命令在容器中执行命令:

aws ecs execute-command--region <aws-region> --cluster <cluster-name> --task <task-arn> --container <container-name> --command "/bin/sh" --interactive
  • 1.

请将 <aws-region><cluster-name><task-arn> 和 <container-name> 替换为您自己的 AWS 区域、集群名称、任务 ARN 和容器名称。

执行上述命令后,您将进入容器的交互式 shell,可以在其中执行各种命令。

通过这些步骤,您已经成功使用 AWS ECS Exec 功能访问了运行在 AWS Fargate 上的容器,并可以在容器中执行命令。这对于调试和故障排查非常有用。