Get EC2 Instance XML Description using AWS Java SDK?

431 views Asked by At

We have a scenario in which we need to retrieve the description info for EC2 instances running on AWS. To accomplish this, we are using the AWS Java SDK. In 90% of our use case, the com.amazonaws.services.ec2.model.Instance class is exactly what we need. However, there is also a small use-case where it would be beneficial to get the raw XML describing the instance. That is, the XML data before it is converted into the Instance object. Is there any way to obtain both the Instance object and the XML string using the AWS Java SDK? Is there a way to manually convert from one to the other? Or, would we be forced to make a separate call using HttpClient or something similar to get the XML data?

4

There are 4 answers

1
Seva On BEST ANSWER

If you have xml (e.g. from using AWS rest API directly), then you can use com.amazonaws.services.ec2.model.transform.* classes to convert xml to java objects. Unfortunately, it only provides classes required for SDK itself. So you, for example, can convert raw XML to an Instance using InstanceStaxUnmarshaller, but can't convert Instance to XML unless you write such converter.

Here is an example how to parse an Instance 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());

You probably can try to intercept raw AWS response, so that you can keep raw XML while still using SDK most of the time. But I wouldn't call that easy as it will require quite a bit of coding.

0
Thomas On

You could use JAXB.marshal like following. JAXB (Java Architecture for XML Binding) could convert Java object to / from XML file.

StringWriter sw = new StringWriter();
JAXB.marshal(instance, sw);
String xmlString = sw.toString();
1
Frank R. On

You can use AWS rest API to replace Java SDK. A bonus will be slight performance gain because you'll not send statistic data to Amazon as the SDK does.

0
Rodel On

Make an EC2Client by adding request handler and override the beforeUnmarshalling() method like below

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():