使用 AWS Java SDK 获取 EC2 实例 XML 描述?

Get EC2 Instance XML Description using AWS Java SDK?

我们有一个场景需要检索 AWS 上 EC2 实例 运行 的描述信息。为此,我们使用 AWS Java SDK。在我们 90% 的用例中,com.amazonaws.services.ec2.model.Instance class 正是我们所需要的。但是,还有一个小用例,获取描述实例的原始 XML 是有益的。即转换为Instance对象前的XML数据。有什么方法可以使用 AWS Java SDK 获取 Instance 对象 XML 字符串?有没有办法手动从一个转换为另一个?或者,我们是否会被迫使用 HttpClient 或类似的东西进行单独调用以获取 XML 数据?

您可以像下面这样使用 JAXB.marshal。 JAXB(Java XML 绑定的体系结构)可以将 Java 对象与 XML 文件相互转换。

StringWriter sw = new StringWriter();
JAXB.marshal(instance, sw);
String xmlString = sw.toString();

您可以使用 AWS rest API 替换 Java SDK。奖励是轻微的性能提升,因为您不会像 SDK 那样将统计数据发送到亚马逊。

如果您有 xml(例如直接使用 AWS rest API),那么您可以使用 com.amazonaws.services.ec2.model.transform.* 类 将 xml 转换为 java 对象。不幸的是,它只提供了 SDK 本身所需的 类。因此,例如,您可以使用 InstanceStaxUnmarshaller 将原始 XML 转换为实例,但除非您编写此类转换器,否则不能将实例转换为 XML。

这是一个如何解析实例的例子XML:

XMLEventReader eventReader = XMLInputFactory.newInstance().createXMLEventReader(new StringReader(instanceXml));
StaxUnmarshallerContext suc = new StaxUnmarshallerContext(eventReader, new TreeMap<>());
InstanceStaxUnmarshaller isu = new InstanceStaxUnmarshaller();
Instance i = isu.unmarshall(suc);
System.out.println(i.toString());

您可能可以尝试拦截原始 AWS 响应,这样您就可以保持原始 XML,同时大部分时间仍使用 SDK。但我不会这么简单,因为它需要相当多的编码。

通过添加请求处理程序创建 EC2Client 并重写 beforeUnmarshalling() 方法,如下所示

AmazonEC2ClientBuilder.standard().withRegion("us-east-1")
    .withRequestHandlers(
            new RequestHandler2() {
                  @Override
                    public HttpResponse beforeUnmarshalling(Request<?> request, HttpResponse httpResponse) {
                        // httpResponse.getContent() is the raw xml response from AWS
                        // you either save it to a file or to a XML document
                        return new HTTPResponse(...);
                        // if you consumed httpResponse.getContent(), you need to provide new HTTPResponse
                    }
                }
        ).build():