使用AWS SDK建立端口转发失败,已成功获取会话ID如何排查?
问题排查点
- SSM Endpoint硬编码错误
你代码中最后一个入参固定写死了美东1的SSM端点https://ssm.us-east-1.amazonaws.com/,如果你使用的AWS_REGION不是us-east-1,请求会直接发往错误区域,导致会话无法建立。需要把这个参数改成动态拼接:
arguments.add(String.format("https://ssm.%s.amazonaws.com/", AWS_REGION));
- 进程生命周期没有维持
session-manager-plugin是长驻进程,需要持续运行才能维持端口转发通道。你当前代码只读取了一次进程输出就结束了逻辑,如果主线程直接退出,JVM会销毁启动的plugin子进程,端口转发自然会中断。需要补充进程等待逻辑:
// 读取输出的逻辑保持不变 // 补充等待进程退出的逻辑 int exitCode = p.waitFor(); System.out.println("会话进程退出,退出码:" + exitCode);
如果需要在Java程序中同时做其他操作,可以把plugin进程的运行逻辑放在独立的后台线程中执行。
手动拼接JSON容易出现转义错误
自己用StringBuilder拼接JSON很容易出现特殊字符转义错误,比如密钥、实例ID包含特殊符号时就会导致参数解析失败。建议用Jackson、Gson等JSON序列化库生成标准JSON字符串,避免手动拼接的语法错误。前置环境校验失败
先做基础校验排除环境问题:
- 本地已正确安装session-manager-plugin,执行
session-manager-plugin --version能正常返回版本号 - 目标EC2实例的SSM Agent版本不低于2.3.672.0,旧版本不支持端口转发功能
- 调用SDK使用的AK/SK对应IAM用户,以及目标实例绑定的IAM角色,都已配置
ssm:StartSession和AWS-StartPortForwardingSession相关权限 - 本地
AWS_LOCALPORT端口没有被其他进程占用,目标实例安全组已放开AWS_REMOTEPORT的入站访问
- 调试方法
可以把构造完成的arguments完整打印出来,手动复制到终端执行,直接看session-manager-plugin的报错输出,就能快速定位是参数错误还是权限、环境问题。
内容的提问来源于stack exchange,提问作者Manasa
相关产品推荐
相关产品推荐

