簡體   English   中英

如何使用從 ruby 開始的 SSM 端口轉發 session 的結果?

[英]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 實例的連接?

額外細節:

  • 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 套接字的引用。 因此,您要么需要為本地偵聽器代理創建自己的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM