본문 바로가기

Tech/AWS Route53

AWS JAVA SDK를 사용하여 Route53에 도메인 설정 요청하기



AWS JAVA SDK를 사용하여 Route53에 도메인 설정 요청하기



AWS Route53에 등록된 혹은 등록할 도메인을 컨트롤해야될 때가 있다. AWS에서 꽤 다양한 API를 JAVA SDK로 제공하는데 Route53에 대한 API 또한 제공한다. 그런데 막상 JAVA SDK를 제공은 하지만 코드 샘플등이 부실한 경우가 많다. 구글을 검색해 보아도 Route53의 신규 도메인 등록, 갱신 등에 대한 코드 샘플이 없어서 한번 정리해보았다. 요구사항은 아래와 같다.



요구사항

- 신규 도메인을 등록할 수 있다.

- 등록한 도메인의 설정값을 갱신할 수 있다.

- 등록한 도메인을 삭제할 수 있다.



Route53에 임시로 Hosted Zone은 "example.com"으로 생성하였다고 보자. Hosted Zone의 ID는 "1A2B3C4D5E6F"라고 임의로 설정했다.



도메인 설정 요청

- pom.xml 설정


	com.amazonaws
	aws-java-sdk-route53
	1.11.132

 

AWS JAVA SDK는 Route53에 대한 라이브러리만 임포트한다.



- 샘플 코드 (신규 도메인 등록 요청)

public ModelAndView registerDomain(
		HttpServletRequest request
		, HttpServletResponse response
		) {
	
	
	ModelAndView mv = new ModelAndView();
	
	
	// 파라미터 설정
	// HOSTED_ZONE_ID: 1A2B3C4D5E6F ("example.com")
	String HOSTED_ZONE_ID = "1A2B3C4D5E6F";
	String domainName = "alexkim.example.com";
	String domainType = "A";
	long domainTTL = 300;
	String domainValue = "127.0.0.1";
	ChangeAction changeAction = ChangeAction.UPSERT;
	
	
	boolean isSuccess = requestDomain(HOSTED_ZONE_ID, domainName, domainType, domainTTL, domainValue, changeAction);
	
	
	mv.addObject("responseResult", isSuccess);
	return mv;
}
 

신규 도메인 등록 요청을 하는 샘플코드이다. Spring MVC 프로젝트를 이용하였기에 컨트롤러 형식으로 구현되어 있고 설정되어 있는 파라미터들을 잘 보기 바란다. "domainType"을 "A"로 설정할 경우 "domainValue"는 IP 형태로만 가능하고, "CNAME"인 경우 "domainValue"는 도메인 형태로만 가능하다. 그리고 "ChangeAction" 객체 설정을 통해 도메인을 등록할 것인지, 삭제할 것인지, 갱신할 것인지 조절할 수 있다. "ChangeAction"은 "CREATE", "DELETE", "UPSERT"로 구성된다. 아래는 Route53에 실질적으로 도메인을 등록하는 코드이다.



- 샘플 코드 (Route53에 신규 도메인 등록 요청)

private String REGION = "ap-northeast-2";


/**
 * requestDomain
 * 
 * AWS Route53의 해당 Hosted Zone에 대해 해당 도메인의 등록, 삭제, 갱신을 수행한다.
 * 도메인 삭제시 도메인 조건들이 기존 정보와 모두 일치해야 한다. (domainName, domainType, domainTTL, domainValue)
 * 도메인 갱신시 domainType은 변경되지 않는다.
 * 
 * @param String HOSTED_ZONE_ID: 도메인 요청을 보낼 hosted Zone ID
 * @param String domainName: 대상 도메인명
 * @param String domainType: 대상 도메인의 타입 (A, CNAME, ...)
 * @param long domainTTL: 도메인 TTL (Time to Live) (초)
 * @param String domainValue: 도메인에 매핑되는 IP (A type) or 도메인 (CNAME type)
 * @param ChangeAction changeAction: 도메인에 대한 액션을 정의한다. (CREATE, DELETE, UPSERT)
 *      CREATE: 해당 Hosted Zone에 해당 도메인을 등록한다.
 *      DELTE: 해당 Hosted Zone에 해당 도메인을 삭제한다.
 *      UPSERT: 해당 Hosted Zone에 도메인이 없을 경우 해당 도메인을 등록하며, 도메인이 있을 경우 해당 요청 정보로 갱신한다.
 *
 * @modified 2017. 6. 2. by Alex Kim
 */
private boolean requestDomain(String HOSTED_ZONE_ID, String domainName, String domainType, long domainTTL, String domainValue, ChangeAction changeAction) {
	
	
	// AWS S3 접근 권한을 부여받기 위해, "credentials" 파일이 로컬PC의 '~/.aws/credentials' 경로에 있어야 한다.
	// 도메인 등록시 매번 인증할 필요가 없다면 함수 밖으로 빼도 될 것 같다. 혹은, Context에서 Singleton 처리.
	AmazonRoute53 route53Client = AmazonRoute53ClientBuilder.standard()
															.withRegion(REGION)
															.build();
	
	
	// 본 함수는 파라미터로 전달받은 도메인 정보를 이용하여 1회 도메인 요청하는 예제이다.
	// 1개의 대상 Hosted Zone에 대해서 다수의 도메인 요청 또한 가능하다.
	List<Change> changeList = new ArrayList<Change>();
	
	
	// 도메인 정보 설정
	ResourceRecordSet rrs = new ResourceRecordSet().withName(domainName)
													.withType(domainType)
													.withTTL(domainTTL)
													.withResourceRecords(new ResourceRecord().withValue(domainValue))
													;
	
	
	// 도메인 정보 및 액션 설정
	changeList.add(new Change().withAction(changeAction)
								.withResourceRecordSet(rrs))
								;
	
	
	ChangeBatch cb = new ChangeBatch().withChanges(changeList);
	
	
	// Hosted Zone 지정
	ChangeResourceRecordSetsRequest crrsr = new ChangeResourceRecordSetsRequest().withHostedZoneId(HOSTED_ZONE_ID)
																				.withChangeBatch(cb);
	
	
	boolean isSuccess = false;
	
	// 신규 도메인 등록
	try {
		route53Client.changeResourceRecordSets(crrsr);
		isSuccess = true;
	} catch (RuntimeException e) {
		e.printStackTrace();
		isSuccess = false;
	}
	return isSuccess;
}
 

대부분의 파라미터와 객체 및 함수들에 대해서는 주석을 달아 놓았다. 그리고 해당 요청은 1개의 Hosted Zone을 대상으로만 가능하다. 대신 1개의 Hosted Zone에 대해서는 여러개의 도메인 등록, 삭제, 갱신 요청등이 가능하다. 해당 코드 샘플의 "Change"객체가 ArrayList로 정의되어있는데 (changeList) 해당 부분에 여러개의 도메인 요청을 설정하면 된다.


전달받은 파라미터 중 "ChangeAction"의 값에 따라 도메인의 생성, 삭제, 갱신을 조절할 수 있다. 참고로 도메인 삭제는 "domainName", "domainType", "domainTTL", "domainValue" 정보가 모두 기존 도메인 정보와 일치해야 제대로 삭제해주는 것 같다. 그렇지 않으면 익셉셥을 발생시킨다. 그리고 "UPSERT"라는 합성어?같은 단어가 있는데 도메인 등록 + 도메인 갱신을 합친것으로 보면 될 것 같다. 도메인이 없으면 등록해주고, 도메인이 있다면 설정한 도메인 정보로 갱신한다.


그리고 항상 AWS JAVA SDK를 사용할 때는 인증정보를 설정해주어야 하는데, 코드내에 ACCESS KEY, SECRET KEY 설정등을 입력해줄 수도 있고 credentials 파일을 로컬 PC의 "[사용자경로]/.aws/credentials"에 놓아두어도 된다. 보통 credentials 파일을 설정해 놓는것이 조금더 안전할 것 같다. KEY를 설정한 코드를 외부에 업로드하거나 오픈된 공간의 git repository에 업로드하면 30분내에 누군가가 가져갈 수 있다고 한다. 그리고 해당 credentials에 상응하는 IAM의 user는 당연히 Route53을 조절할 수 있는 권한을 가지고 있어야 한다.



마무리

해외 블로그와 AWS JAVA SDK를 직접 보면서 해당 샘플 코드를 만들어 보았다. 아마 EC2나 S3 말고 사용률이 덜한 서비스들에 대해서는 샘플 코드가 다 제공되지 않는 것 같다. 하긴 AWS 서비스가 워낙 많으니.... 그런데 AWS SDK를 따라가기만 해도 충분히 활용할 수 있으니 SDK를 직접 보는것도 좋을 것 같다. 다음번엔 대량의 도메인을 Route53으로 마이그레이션하는 전과정에 대해서 포스팅을 할까한다. 그리고 AWS에서 제공하는 SDK가 여러가지 언어로 제공되는데 JAVA, javascript, C# 등.... 하지만 내부에서 사용하는 객체명 활용법등은 모두 동일한것 같으니 다른 언어의 코드 샘플을 찾아보아도 많은 도움이 될 것 같다.



참조

https://codeblocks.in/aws-route53-with-java

http://derpturkey.com/amazon-route53-c-examples