Получить XML-описание экземпляра EC2 с помощью AWS Java SDK?
У нас есть сценарий, в котором нам нужно получить информацию описания для экземпляров EC2, работающих на AWS. Для этого мы используем AWS Java SDK. В 90% случаев использования com.amazonaws.services.ec2.model.Instance
класс это именно то, что нам нужно. Однако есть также небольшой вариант использования, где было бы полезно получить необработанный XML, описывающий экземпляр. То есть данные XML перед их преобразованием в Instance
объект. Есть ли способ получить как Instance
объект и строка XML, используя AWS Java SDK? Есть ли способ вручную конвертировать из одного в другой? Или мы были бы вынуждены сделать отдельный звонок, используя HttpClient
или что-то подобное, чтобы получить данные XML?
4 ответа
Если у вас есть xml (например, от использования AWS rest API напрямую), вы можете использовать com.amazonaws.services.ec2.model.transform.*
классы для преобразования XML в Java-объекты. К сожалению, он предоставляет только классы, необходимые для самого SDK. Так, например, вы можете преобразовать необработанный XML в экземпляр, используя InstanceStaxUnmarshaller, но не можете преобразовать экземпляр в 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():
Вы можете использовать JAXB.marshal следующим образом. JAXB (Java Architecture для привязки XML) может конвертировать Java-объект в / из XML-файла.
StringWriter sw = new StringWriter();
JAXB.marshal(instance, sw);
String xmlString = sw.toString();
Вы можете использовать AWS rest API для замены Java SDK. Бонусом будет небольшой прирост производительности, поскольку вы не будете отправлять статистические данные в Amazon, как это делает SDK.