DDNS를 장기간 사용하지 않아오던 중 개인적인 필요로 다시 DDNS를 찾게 되었습니다. 생각보다 견고한 DDNS 프로그램을 찾을 수 없어 고민하던 중 AWSCLI를 활용하여 AWS Route53을 DDNS로서 사용하는 방법을 떠올릴 수 있었습니다. 개인 도메인 사용 가능, 거의 무료, 직관성, 견고성으로 판단하였을 때 가장 탁월한 선택이었다고 판단되어 블로그를 통하여 공유합니다.


간단한 구조 설명

AWSCLI는 AWS 서비스를 CLI에서 편리하게 엑세스할 수 있게 합니다. 또한 AWS Route53의 RecordSet 업데이트는 AWS API Limit만 지킨다면 과금 등의 제약 사항이 없습니다.(AWS API를 추가 이용하기 위해서는 추가 비용을 지불해야 한다는 뜻이 아닙니다.) CRON 등을 통하여 내 IP 주소를 AWS Route53에 1분마다 업데이트하는 구조입니다.

Windows OS에서는 작업 스케줄러를 통하여 WSL에서 Bash 스크립트를 동작시키는 형태로 사용할 수 있도록 가이드하였습니다.


Bash 스크립트

먼저 Bash 스크립트를 살펴보면 4, 5, 6번 줄에는 각각 AWS Route53 Hosted Zone ID, Domain Name, 그리고 TTL 값을 초 단위로 명시할 수 있도록 되어있습니다. 앞서 1분마다 업데이트하는 구조라고 설명하였는데 TTL을 1분을 초과하도록 설정하면 업데이트가 늦지 않냐고요? 늦습니다. 그렇게 설정한 이유는 일반적으로 IP 주소가 변경되는 상황보다는 변경되지 않는 상황이 더 많고, TTL이 길 수록 Query 비용을 절감할 수 있기 때문입니다. 만약 IP 주소가 정말 빈번하게 변경된다면 TTL을 짧게 설정해도 됩니다. 저는 TTL 값을 30분(1800)으로 설정했습니다.

이제 7, 8번 줄을 살펴보겠습니다. 7번 줄에서는 IPv4를 ifconfig.me에서 CURL으로 가져오고 있습니다. ifconfig.me는 HTTP에서 클라이언트의 IP 주소를 반환해주는 웹 서비스입니다. 만약 ifconfig.me의 가용성이 우려된다면 AWS API Gateway와 AWS Lambda를 이용하여 이를 대체할 수 있습니다. 8번 줄은 AWSCLI로 AWS Route53에 RecordSet을 업데이트하도록 합니다. 결과는 JSON으로 반환됩니다.

참고로 2번 줄은 AWSCLI의 결과가 Page 형태로 나오는 것을 방지합니다.

#!/bin/bash
export AWS_PAGER=""

hostedzoneid="Hosted Zone ID goes here!"
name="Name goes here!(Example: mypc1.example.com)"
ttl=300

ipv4=$(curl ifconfig.me)
aws route53 change-resource-record-sets --hosted-zone-id $hostedzoneid --change-batch "{\"Changes\":[{\"Action\":\"UPSERT\",\"ResourceRecordSet\":{\"Name\":\"$name\",\"Type\":\"A\",\"TTL\":$ttl,\"ResourceRecords\":[{\"Value\":\"$ipv4\"}]}}]}" --output json

사용자화

다음과 같이 맨 아래 줄에 > 파일 이름을 추가하면 지정된 파일에 작업 수행 결과를 덮어씁니다. 만약 덮어쓰는 대신 아래 줄에 로그를 덧 붙이는 형태가 필요하다면 >> 파일 이름을 사용하면 됩니다.

aws route53 change-resource-record-sets --hosted-zone-id $hostedzoneid --change-batch "{\"Changes\":[{\"Action\":\"UPSERT\",\"ResourceRecordSet\":{\"Name\":\"$name\",\"Type\":\"A\",\"TTL\":$ttl,\"ResourceRecords\":[{\"Value\":\"$ipv4\"}]}}]}" --output json > latest.log

Windows 작업 스케줄러에 등록하기

Windows 작업 스케줄러에는 다음과 같이 등록하면 됩니다. 아래 예는 Bash 스크립트를 upsert.sh라고 저장한 경우에 유효합니다.


마치며

Cloudflare API를 CURL로 사용하면 완전한 무료 DDNS를 만들 수 있습니다. 하지만 AWSCLI가 더 간단하면서도 견고하기 때문에 AWSCLI를 선택하였으니 참고되시기 바랍니다.