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

时间:2017-09-06 18:25:28

标签: java xml amazon-web-services amazon-ec2 aws-java-sdk

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

4 个答案:

答案 0 :(得分:2)

通过添加请求处理程序创建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():

答案 1 :(得分:1)

您可以使用 JAXB .marshal,如下所示。 JAXB (用于XML绑定的Java体系结构)可以将Java对象转换为XML文件或从XML文件转换。

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

答案 2 :(得分:1)

如果你有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响应,以便您可以在大多数时间仍使用SDK的同时保留原始XML。但我不会那么容易,因为它需要相当多的编码。

答案 3 :(得分:0)

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