Вы можете использовать номеронабиратель по умолчанию с ssm.StartSessionOutout.StreamUrl
, без каких-либо заголовков авторизации:
conn, _, err := websocket.DefaultDialer.Dial(*ssmStartSessionOutput.StreamUrl,
nil)
if err != nil {
log.Fatal(err)
}
defer conn.Close()
Затем отправьте токен ssm.StartSessionOutput
через соединение через веб-сокет.Это поможет вам избежать ошибки, о которой идет речь:
v := struct {
TokenValue string `json:"TokenValue"`
}{
TokenValue: ssmStartSessionOutput.TokenValue,
}
err := conn.WriteJSON(v)
if err != nil {
return err
}
Но , реализация веб-сокета SSM StartSession практически не документирована и изобилует таинственными ответами.Мне посчастливилось запустить session-manager-plugin в качестве подпроцесса, передав JSON-ified ssm.StartSessionOutput:
v := struct {
SessionID string `json:"SessionId"`
StreamURL string `json:"StreamUrl"`
TokenValue string `json:"TokenValue"`
}{
SessionID: ssmSessionOutput.SessionId,
StreamURL: ssmSessionOutput.StreamUrl,
TokenValue: ssmSessionOutput.TokenValue,
}
j, err := json.Marshal(v)
if err != nil {
return nil, err
}
cmd := exec.Command("session-manager-plugin", string(j), region, "StartSession")
cmd.Stdout = os.Stdout
cmd.Stdin = os.Stdin
cmd.Stderr = os.Stderr
err = cmd.Run()