如何使用以 ruby​​ 启动的 SSM 端口转发会话的结果?

问题描述

我无法协调使用 aws cli 和 ruby​​ sdk 与实例建立 ssm 连接之间的差异。例如,如果我尝试使用这样的命令:

aws ssm start-session \
  --target 'i-abc123' \
  --document-name AWS-StartPortForwardingSession \
  --parameters '{
    "portNumber": ["3000"],"localPortNumber": ["13000"]
  }'
Starting session with SessionId: username-def456
Port 13000 opened for sessionId username-def456.
Waiting for connections...

Connection accepted for session [username-def456]

该工具将暂停,因为它会打开从目标实例上的端口 3000 到本地计算机上的端口 13000 的端口转发会话。然后,我可以在我的机器上打开一个网络浏览器并将其指向 http://localhost:13000 以浏览在远程实例上运行的应用程序。此外,我可以查看 AWS 控制台 UI 并看到有一个活动会话,直到我按下 Ctrl-C

我遇到的问题是当我尝试使用 ruby​​ sdk 来做同样的事情时:

result = ssm.start_session(
  target: 'i-abc123',document_name: 'AWS-StartPortForwardingSession',parameters: {  
    'portNumber' => %w[3000],'localPortNumber' => %w[13000]    
  }    
)  

result 对象是一个如下所示的结构:

=> #<struct Aws::SSM::Types::StartSessionResponse
 session_id="username-def456",token_value="...",stream_url="wss://ssmmessages.us-east-1.amazonaws.com/v1/data-channel/username-def456? 
 role=publish_subscribe">

同样,我可以在控制台 UI 中看到有一个活动会话。但是,如果我尝试在我的机器上浏览到 http://localhost:13000,浏览器将无法访问任何内容。如何使用生成的流 url 和令牌实际创建到 ec2 实例的连接?

其他细节:

  • ruby sdk 的核心 gem 版本:3.109.2
  • aws cli 版本 - aws-cli/2.1.16
  • aws ssm 代理版本 - amazon-ssm-agent-3.0.356.0-1.x86_64

解决方法

您从 API 返回的是对网络套接字的引用。 因此,您要么需要创建自己的 Web 套接字到本地侦听器代理,要么像 aws cli 实用程序一样使用 session-manager-plugin。

我最近想出了如何使用 session-manager-plugin,以下代码段是 Python,但应该足够明显了。

constexpr auto x = Space::bar(10,20);

(是的,这只是一个快速而肮脏的原型。;))

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...