[AWS] DescribeInstanceTypes from Java
Cloud&Container/AWS 2020. 7. 13. 18:06본 API 가 삭제 되었기 때문에 그냥 아래와 같이 단순하게 구성해 보았습니다.
@Service
@Log4j2
@RequiredArgsConstructor
public class Ec2Service {
public ResponseEntity<String> describeInstanceTypes() {
ProcessBuilder builder = new ProcessBuilder();
String instances = "{}";
try {
builder.command("bash", "-c", "aws ec2 describe-instance-types");
Process process = builder.start();
instances = new BufferedReader(
new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8)).lines()
.collect(Collectors.joining("\n"));
int exitCode = process.waitFor();
JSONObject jsonObject = new JSONObject(instances);
JSONArray jsonArray = jsonObject.getJSONArray("InstanceTypes");
JSONArray sortedJsonArray = new JSONArray();
List list = new ArrayList();
for(int i = 0; i < jsonArray.length(); i++) {
list.add(jsonArray.getJSONObject(i));
}
Collections.sort(list, new Comparator<JSONObject>() {
@Override
public int compare(JSONObject a, JSONObject b) {
String source = new String();
String target = new String();
try {
source = (String)a.get("InstanceType");
target = (String)b.get("InstanceType");
} catch(Exception e) {
}
return source.compareTo(target);
}
});
for(int i = 0; i < jsonArray.length(); i++) {
sortedJsonArray.put(list.get(i));
}
instances = "{\"InstanceTypes\": " +sortedJsonArray.toString()+ "}";
} catch(Exception e) {
e.printStackTrace();
}
return ResponseEntity.ok(instances);
}
}
코드 자체는 AWS CLI 를 ProcessBuilder 를 이용해서 외부 파일을 실행 시켜 데이터를 받아와서 처리 하는 내용입니다.
AWS CLI 로 데이터를 가져 오게 되면 정렬이 안된 상태로 데이터가 넘어 와서 별도 sort 기능 구현이 필요 합니다.
그냥 CLI 에서도 JSON Sort 옵션 하나 넣어 주면 좋았을 걸 아쉽더라고요.
근데 왜 이 API 를 없앴는지 차암....
1.x 에서 삭제 되어서 2.x 로 변경해서 사용 하시면 됩니다.
Ec2Client ec2Client = Ec2Client.builder().build();
DescribeInstanceTypesRequest request = DescribeInstanceTypesRequest.builder()
.maxResults(100)
.build();
DescribeInstanceTypesResponse response = ec2Client.describeInstanceTypes(request);
log.debug("{}", response.instanceTypes());
한번에 100개 씩 밖에 못 가져 오기 때문에 nextToken 으로 끝까지 요청 하셔야 합니다.