如何使用 Fargate 在 AWS ECS 的 运行ning 容器中 运行 命令

How can I run commands in a running container in AWS ECS using Fargate

如果我在 AWS ECS 中使用 EC2 运行ning 容器,那么我可以访问 运行ning 容器并执行任何命令。

即。 docker exec -it <containerid> <command>

如何使用 Fargate 运行 在 AWS ECS 中的 运行ning 容器或访问容器中执行命令?

更新(2021 年 3 月 16 日):

Amazon 的 AWS announced a new feature called ECS Exec which provides the ability to exec into a running container on Fargate or even those running on EC2. This feature makes use of AWS Systems Manager(SSM) to establish a secure channel between the client and the target container. This detailed blog post 描述了如何使用此功能以及所有先决条件和配置步骤。

原答案:

使用 Fargate 您无法访问底层基础设施,因此 docker exec 似乎不可能。该文档没有明确提及这一点,但在 Amazon Deep Dive into AWS Fargate presentation 幻灯片 19 中提到了这一点:

Some caveats: can’t exec into the container, or access the underlying host (this is also a good thing)

在 ECS CLI github 项目中对此 open issue 也有一些讨论。

您可以尝试 运行 容器内的 SSH 服务器来获取访问权限,但我没有尝试过,也没有遇到任何人这样做。这似乎也不是一个好方法,所以你在那里受到限制。

AWS Fargate 是一项托管服务,不允许访问容器是有道理的。 如果您需要对容器进行故障排除,您可以随时提高容器中应用 运行 的日志级别。使用容器的最佳实践说

"Docker containers are in fact immutable. This means that a running container never changes because in case you need to update it, the best practice is to create a new container with the updated version of your application and delete the old one."

希望对您有所帮助。

自 2021 年 3 月 16 日起,AWS 推出了 ECS Exec,可用于在 EC2 或 Fargate 中的容器 运行 上执行 运行 命令。 URL 将在 https://aws.amazon.com/about-aws/whats-new/2021/03/amazon-ecs-now-allows-you-to-execute-commands-in-a-container-running-on-amazon-ec2-or-aws-fargate/

您需要为任务定义提供“任务角色”(这与“任务执行角色”不同)。这可以通过首先转到 IAM

来完成

IAM 角色创建

  1. IAM > 角色 > 创建角色
  2. 自定义信任策略>复制+粘贴
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ecs-tasks.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
  1. 添加权限 > 创建策略
  2. JSON > 替换 YOUR_REGION_HERE & YOUR_ACCOUNT_ID_HERE & CLUSTER_NAME > 复制+粘贴
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:DescribeLogGroups"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:DescribeLogStreams",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:YOUR_REGION_HERE:YOUR_ACCOUNT_ID_HERE:log-group:/aws/ecs/CLUSTER_NAME:*"
        }
    ]
}
  1. 给它起个名字
  2. 返回添加权限 > 按名称搜索 > 检查 > 下一步
  3. 输入角色名称 > 创建角色

ECS新任务

  1. 返回 ECS > 转到任务定义并创建新修订
  2. select“任务角色”的新角色(不同于“任务执行角色”)> 更新任务定义
  3. 转到您的服务 > 更新 > 确保修订设置为最新 > 完成服务更新
  4. 当前任务,它应该会自动为您的新任务提供新角色。
  5. 再试一次

我曾经执行过的命令

enables execute command

aws ecs update-service --cluster CLUSTER_NAME --service SERVICE_NAME --region REGION --enable-execute-command --force-new-deployment

adds ARN to environment for easier cli. Does assume only 1 task running for the service, otherwise just manually go to ECS and grab arn and set them for your cli

TASK_ARN=$(aws ecs list-tasks --cluster CLUSTER_NAME --service SERVICE_NAME --region REGION --output text --query 'taskArns[0]')

see the task,

aws ecs describe-tasks --cluster CLUSTER_NAME --region REGION --tasks $TASK_ARN

exec in

aws ecs execute-command --region REGION --cluster CLUSTER_NAME --task $TASK_ARN --container CONTAINER --command "sh" --interactive