能否SSH到FARGATE托管的容器实例?

67
5个回答

41

从2021年3月中旬开始,在AWS Fargate上运行容器时,可以执行ECS容器中的命令。请查阅博客文章“使用Amazon ECS Exec访问您在AWS Fargate和Amazon EC2上的容器”

快速检查清单:

  1. 启用服务中的命令执行。
  2. 确保在服务中使用最新的平台版本。
  3. ssmmessages:..权限添加到任务执行角色中。
  4. 强制为服务进行新部署以运行已启用命令执行的任务。

在实例内运行bash的AWS CLI命令:

aws ecs execute-command  \
    --region eu-west-1 \
    --cluster [cluster-name] \
    --task [task id, for example 0f9de17a6465404e8b1b2356dc13c2f8] \
    --container [container name from the task definition] \
    --command "/bin/bash" \
    --interactive

上述设置应允许运行/bin/bash命令,并获得在运行于AWS Fargate的容器中获取交互式shell。有关详细信息,请查看文档“使用 Amazon ECS Exec 进行调试”


有人知道 ecs exec 是否应该能够访问在 Fargate 上运行的任何容器,甚至那些部署到 EKS 集群(而不是 ECS)的容器吗?ecs exec 的文档根本没有提到 EKS,并且对这个问题非常模糊。 - timblaktu
我发现这个页面更加直观易懂,比上面链接的页面更好:https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html - jlhasson
@jlhasson,感谢您提供的参考资料。我已将其包含在答案中。 - Victor Smirnov

30

4
谢谢!我打算尝试这个:https://github.com/aws/amazon-ecs-cli/issues/143#issuecomment-414415329 (如果您需要在生产之前在开发环境中调试某些内容,那这并不是好或坏的想法) - Stefano Messina
7
我可以确认,是的,您可以通过运行sshd并正确配置安全组来SSH进入Fargate容器。 - bluescores
3
@bluescores - 你能否详细说明一下你的解决方案? - Ilya
2
你只需要一个启用了SSH的Docker镜像或者修改一个镜像。如何进行修改将取决于初始镜像中包含什么。请记住,您可以在容器中运行任何东西,而SSHD只是另一个服务。在容器中运行一个东西的整个过程是使用它们的一种方式,但这不一定是正确或唯一的方式,它只是适用于CI / Devops环境的特定用例。看看lxc / lxd,freebsd jails或solaris zones。它们都是容器,但设置得更像完整的机器,即多个进程,服务,用户帐户等。 - krad
1
这个有帮助吗?https://github.com/aws/containers-roadmap/issues/187#issuecomment-490347856 - Jan Richter
显示剩余4条评论

10

这是可能的,但不太容易。简单来说:安装SSH,不要将SSH端口暴露在VPC之外,添加堡垒机主机,通过堡垒机进行SSH。

稍微详细一点:

  • 使用无需密码身份验证的SSHD。 Docker说明
  • Fargate任务:暴露端口22
  • 配置您的VPC,说明
  • 创建EC2堡垒机主机
  • 从堡垒机主机中SSH到您的任务IP地址

如果Web服务器的PortMapping已经映射到了80端口,怎么办?https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PortMapping.html#ECS-Type-PortMapping-hostPort - Jack Chi

10

如果出现错误 "$ bash <( curl -Ls https://raw.githubusercontent.com/aws-containers/amazon-ecs-exec-checker/main/check-ecs-exec.sh ) <Cluster> <taskId>" - tumbudu

3

以下是将SSH/sshd添加到容器中以获得直接访问的示例:

# Dockerfile
FROM alpine:latest

RUN apk update && apk add --virtual --no-cache \
  openssh

COPY sshd_config /etc/ssh/sshd_config

RUN mkdir -p /root/.ssh/
COPY authorized-keys/*.pub /root/.ssh/authorized_keys
RUN cat /root/.ssh/authorized-keys/*.pub > /root/.ssh/authorized_keys
RUN chown -R root:root /root/.ssh && chmod -R 600 /root/.ssh

COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
RUN ln -s /usr/local/bin/docker-entrypoint.sh /

# We have to set a password to be let in for root - MAKE THIS STRONG.
RUN echo 'root:THEPASSWORDYOUCREATED' | chpasswd

EXPOSE 22
ENTRYPOINT ["docker-entrypoint.sh"]

# docker-entrypoint.sh
#!/bin/sh

if [ "$SSH_ENABLED" = true ]; then
  if [ ! -f "/etc/ssh/ssh_host_rsa_key" ]; then
    # generate fresh rsa key
    ssh-keygen -f /etc/ssh/ssh_host_rsa_key -N '' -t rsa
  fi
  if [ ! -f "/etc/ssh/ssh_host_dsa_key" ]; then
    # generate fresh dsa key
    ssh-keygen -f /etc/ssh/ssh_host_dsa_key -N '' -t dsa
  fi

  #prepare run dir
  if [ ! -d "/var/run/sshd" ]; then
    mkdir -p /var/run/sshd
  fi

  /usr/sbin/sshd

  env | grep '_\|PATH' | awk '{print "export " $0}' >> /root/.profile
fi

exec "$@"

更多细节请参考:https://github.com/jenfi-eng/sshd-docker


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接