portforwarding - 如何通过 Java SDK 使用 AWS 端口转发 session

标签 portforwarding aws-java-sdk

我正在使用 AWSSimpleSystemsManagementAsync 开始 session 如下:

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 执行此类操作,因为在启动 session 后打开浏览器似乎不起作用就像手动操作一样。

希望我只是错过了一些东西。

最佳答案

假设您已经按照 https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html 安装了 session 管理器插件

下一步是通过生成一个新的 session-manager-plugin 进程来将它附加到您新创建的 session 中。

...
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.

关于portforwarding - 如何通过 Java SDK 使用 AWS 端口转发 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60658044/

相关文章:

java - 如何使用 aws-java-sdk 获取亚马逊网络服务中某个区域的所有可用图像的列表?

tcp - 通过 HTTP/s 传输任何类型的 TCP 流量

kubernetes - 您如何将 Pachyderm 与正确的 Kubernetes 上下文联系起来?

amazon-web-services - 在 AW Athena 中以批处理方式执行一组查询

java - 当返回类型为项目的PaginatedList时,如何模拟mapper.query方法

amazon-web-services - AWS Java SDK Cloudformation 无法按名称或 ID 描述堆栈

docker端口转发bind/dns/udp没有响应

linux - 确定我可以向文件句柄写入多少;将数据从一个 FH 复制到另一个

virtualbox - 从主机端口 80 到 VirtualBox 端口 80 的端口转发不起作用

java - 用于创建 Lambda 的 AWS Java SDK 版本