[英]How do I use the results of an SSM port forwarding session started with ruby?
我無法協調使用 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]
該工具將暫停,因為它打開一個端口,將 session 從目標實例上的端口 3000 轉發到我本地計算機上的端口 13000。 然后我可以在我的機器上打開一個 web 瀏覽器並將其指向http://localhost:13000
以瀏覽遠程實例上運行的應用程序。 此外,我可以查看 AWS 控制台 UI 並看到有一個活動的 session 直到我 Ctrl-C
我遇到的麻煩是當我嘗試使用 ruby sdk 做同樣的事情時:
result = ssm.start_session(
target: 'i-abc123',
document_name: 'AWS-StartPortForwardingSession',
parameters: {
'portNumber' => %w[3000],
'localPortNumber' => %w[13000]
}
)
result
object 是一個如下所示的結構:
=> #<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 中看到有一個活動的 session。 但是,如果我嘗試在我的機器上瀏覽到http://localhost:13000
,瀏覽器將無法訪問任何內容。 如何使用生成的 stream url 和令牌來實際創建到 ec2 實例的連接?
額外細節:
您從 API 得到的是對 web 套接字的引用。 因此,您要么需要為本地偵聽器代理創建自己的 web 套接字,要么像 aws cli 實用程序那樣使用 session-manager-plugin。
我最近想出了如何使用 session-manager-plugin,下面的代碼片段是 Python 但應該很明顯可以弄清楚。
def start_aws_ssm_plugin(self, create_session_response, parameters, profile, region):
print('start_aws_ssm_plugin() called: ' + str( create_session_response))
arg0 = '"' + self.config.get_ssm_plugin() + '"'
arg1 = '"' + str(create_session_response).replace('\'', '\\"') + '"'
arg2 = region
arg3 = 'StartSession'
arg4 = profile
arg5 = '"' + str(parameters).replace('\'', '\\"') + '"'
arg6 = 'https://ssm.{region}.amazonaws.com'.format(region=region)
command = arg0 + ' ' + arg1 + ' ' + arg2 + ' ' + arg3 + ' ' + arg4 + ' ' + arg5 + ' ' + arg6
print(command)
# print('session-manager-plugin', arg1, arg2, arg3, arg4, arg5, arg6)
pid = subprocess.Popen(command).pid
return pid
# end def
(是的,這只是一個快速而骯臟的原型。;))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.