如何通过 Java SDK 使用 AWS 端口转发会话
Posted
技术标签:
【中文标题】如何通过 Java SDK 使用 AWS 端口转发会话【英文标题】:How to use an AWS Port Forwarding session via Java SDK 【发布时间】:2020-06-24 17:40:32 【问题描述】:我正在使用AWSSimpleSystemsManagementAsync
开始一个会话,如下所示:
Map<String, List<String>> parameters = new HashMap<>();
parameters.put("portNumber", Arrays.asList("80"));
parameters.put("localPortNumber", Arrays.asList("8080"));
StartSessionResult result =
getSsmClient()
.startSession(
new StartSessionRequest()
.withTarget(sb.toString())
.withDocumentName("AWS-StartPortForwardingSession")
.withParameters(parameters));
sessionId = result.getSessionId();
这似乎工作并模仿了我可以手动执行的操作:
aws ssm start-session --target "Your Instance ID" --document-name AWS-StartPortForwardingSession --parameters "portNumber"=["80"],"localPortNumber"=["8080"]
当我手动运行时,我会在 localhost:8080 打开我的浏览器以根据需要与我的应用程序进行交互,但我正在努力通过 SDK 做这种类型的事情,因为在启动会话后打开浏览器不会似乎像手动一样工作。
希望,我只是错过了一些东西。
【问题讨论】:
【参考方案1】:假设您已经按照https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html 安装了会话管理器插件
下一步是通过像这样生成一个新的 session-manager-plugin 进程将其附加到您新创建的会话中。
...
StartSessionResult result = ssmClient.startSession(ssRequest);
StringBuilder responseJson = new StringBuilder("");
responseJson.append("\"SessionId\":");
responseJson.append("\"");
responseJson.append(result.getSessionId());
responseJson.append("\"");
responseJson.append(",\"TokenValue\":");
responseJson.append("\"");
responseJson.append(result.getTokenValue());
responseJson.append("\"");
responseJson.append(",\"StreamUrl\":");
responseJson.append("\"");
responseJson.append(result.getStreamUrl());
responseJson.append("\"");
responseJson.append("");
List<String> arguments = new ArrayList<>();
arguments.add("session-manager-plugin");
arguments.add(responseJson.toString());
arguments.add(AWS_REGION); // Whatever region you use
arguments.add("StartSession");
arguments.add(AWS_PROFILE_NAME); // Whatever profile you use
arguments.add("\"Target\":\"i-xxxx\",\"DocumentName\":\"AWS-StartPortForwardingSession\",\"Parameters\":\"portNumber\":[\"xx\"],\"localPortNumber\":[\"yyyy\"]");
arguments.add("https://ssm.us-east-1.amazonaws.com/"); // SSM regional endpoint
try
ProcessBuilder pb = new ProcessBuilder(arguments.toArray(new String[] ));
pb.redirectErrorStream(true);
Process p = pb.start();
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while (true)
line = r.readLine();
if (line == null) break;
System.out.println(line);
catch (IOException e)
e.printStackTrace();
片段应该在您的控制台中产生以下内容
Starting session with SessionId: aws-sdk-java-zzzz
Port yyyy opened for sessionId aws-sdk-java-zzzz.
【讨论】:
以上是关于如何通过 Java SDK 使用 AWS 端口转发会话的主要内容,如果未能解决你的问题,请参考以下文章
将 Docker 部署到 AWS Elastic Beanstalk——如何将端口转发到主机? (端口绑定)
aws-cpp-sdk:如何通过 Web Socket 使用 MQTT 发布物联网(c++ 中)
如何使用 IAM 角色通过 aws sdk (java) 从 ECS 容器调用 s3 存储桶