如何使用 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 角色创建
- IAM > 角色 > 创建角色
- 自定义信任策略>复制+粘贴
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ecs-tasks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
- 添加权限 > 创建策略
- 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:*"
}
]
}
- 给它起个名字
- 返回添加权限 > 按名称搜索 > 检查 > 下一步
- 输入角色名称 > 创建角色
ECS新任务
- 返回 ECS > 转到任务定义并创建新修订
- select“任务角色”的新角色(不同于“任务执行角色”)> 更新任务定义
- 转到您的服务 > 更新 > 确保修订设置为最新 > 完成服务更新
- 当前任务,它应该会自动为您的新任务提供新角色。
- 再试一次
我曾经执行过的命令
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
如果我在 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 角色创建
- IAM > 角色 > 创建角色
- 自定义信任策略>复制+粘贴
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ecs-tasks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
- 添加权限 > 创建策略
- 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:*"
}
]
}
- 给它起个名字
- 返回添加权限 > 按名称搜索 > 检查 > 下一步
- 输入角色名称 > 创建角色
ECS新任务
- 返回 ECS > 转到任务定义并创建新修订
- select“任务角色”的新角色(不同于“任务执行角色”)> 更新任务定义
- 转到您的服务 > 更新 > 确保修订设置为最新 > 完成服务更新
- 当前任务,它应该会自动为您的新任务提供新角色。
- 再试一次
我曾经执行过的命令
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