【问题标题】:SSM connection from local to AWS ECS with Port Forwarding使用端口转发从本地到 AWS ECS 的 SSM 连接
【发布时间】:2020-05-28 06:00:38
【问题描述】:

我的 java 应用程序在 AWS ECS 容器中运行,并且 8000 作为公开端口

我的 ECS 在私有子网下运行

我想通过会话管理器连接到我的 ECS,如下所示:

aws ssm start-session --target My-ECS-Instance-ID --document-name AWS-StartPortForwardingSession --parameters '{"portNumber":["8000"], "localPortNumber":["8000"]}' --region My-Region

而且连接似乎没有任何问题:

Starting session with SessionId: botocore-session-1******-09cf*********8
Port 8000 opened for sessionId botocore-session-1******-09cf*********8.

但不幸的是,当我卷曲这个网址时:

curl -X GET "http://localhost:8000/api/user/9"

它生成以下输出:

curl: (52) 来自服务器的空回复

【问题讨论】:

  • 您是否验证了端口 8000 是否正确暴露在 EC2 主机中?
  • 是的,它在我的容器定义中得到了很好的展示:PortMappings: - ContainerPort: 8000
  • 哦,你没有指定主机端口,所以它将映射到EC2主机中的不同端口。您可能需要 ssh 到该框(通过 SSM 会话管理器)并运行 docker ps 以获取实际的主机端口。然后用这个值更新你上面的命令。

标签: amazon-web-services docker amazon-ec2 devops amazon-ecs


【解决方案1】:

正如您在评论中提到的,您指定了 ContainerPort: 8000 没有 HostPort。因此,EC2 框中的实际端口号会有所不同。更多详情可查看here

请使用 SSM 会话管理器 ssh 到 EC2 主机,然后运行 ​​sudo docker ps 以找出正确的端口号。然后,在您的 aws ssm start-session 命令中使用此值。

【讨论】:

  • 我检查了 EC2 框中的实际端口号:2e86df16889a My-Java-App "/bin/sh -c 'java -j…" 3 hours ago Up 3 hours 0.0.0.0:32769->8000/tcp ecs-My-Java-App 它映射为 32769 我创建了新的 SSM 会话:aws ssm start-session --target My-ECS-Instance-ID --document-name AWS-StartPortForwardingSession --parameters '{"portNumber":["32769"], "localPortNumber":["32769"]}' --region My-Region 然后卷曲:curl -X GET "http://localhost:32769/api/user/9" ==> 我的卷曲随着时间的推移完成出
  • 你能用 telnet 或类似工具测试连接吗?
【解决方案2】:

对于其他来这里寻找将端口转发到在 Fargate(而不是 EC2 节点)中运行的任务的方法的其他人,方法如下:

aws ssm start-session--target 参数的文档说您需要 EC2 实例 ID,但它也可以采用 ecs:<cluster-name>_<task-id>_<container-runtime_id> 格式的值

请注意,ECS 任务角色需要以下权限才能工作

{
   "Version": "2012-10-17",
   "Statement": [
       {
       "Effect": "Allow",
       "Action": [
            "ssmmessages:CreateControlChannel",
            "ssmmessages:CreateDataChannel",
            "ssmmessages:OpenControlChannel",
            "ssmmessages:OpenDataChannel"
       ],
      "Resource": "*"
      }
   ]
}

【讨论】:

  • 我正在寻找这个!但不幸的是不能让它工作。在这种情况下如何调试未找到的错误的任何提示......? “调用 StartSession 操作时发生错误(TargetNotConnected)”编辑:让它工作,使用了错误的参数,但仍然好奇如何调试 :)
  • 我把它做成了一个方便的包装器:github.com/alastairmccormack/ecs-tunnel 它还增加了对连接到远程主机(如 SSH -L)和充当 HTTP 代理(类似于 SSH -D)的支持。
猜你喜欢
  • 2017-04-27
  • 2022-12-11
  • 2020-12-17
  • 2018-07-01
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多