问题描述
我无法协调使用 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);
(是的,这只是一个快速而肮脏的原型。;))