AWS를 사용하여 서버리스 동적 DNS 시스템 구축

이 콘텐츠는 어떠셨나요?

이 게시물은 원래 2015년 12월에 게시되었습니다. 솔루션을 보다 비용경제적이며 효율적으로 만들기 위해 2023년 7월 업데이트되었습니다. 이 게시물은 Amazon API Gateway  AWS Lambda 함수 URL로,  Amazon Simple Storage Service(S3)  Amazon DynamoDB로 대체하도록 업데이트되었습니다. Lambda 함수 URL을 사용하면 솔루션의 전체적인 비용을 줄일 수 있습니다. 이 기능은 Lambda 서비스를 사용할 때 추가 비용 없이 제공되며, 클라이언트가 상호작용하는 RESTful HTTPs 엔드포인트를 제공합니다. Amazon S3를 DynamoDB로 교체하면 솔루션의 효율성이 향상되며, 데이터 쿼리 시 전반적인 지연 시간이 줄어듭니다.

초기 단계의 신생 기업, 소규모 기업 및 홈 네트워크에는 사전 통지 없이 변경될 수 있는 동적 퍼블릭 IP 주소가 있는 경우가 많습니다. 이러한 주소 변경으로 인해 외부에서 이러한 네트워크의 시스템에 안정적으로 액세스할 수 없습니다. 라이프사이클 초기 단계에 위치한 startup의 경우 첫 고객으로부터 신뢰를 얻으려면 안정적이고 가용성이 높은 서비스를 제공하는 것이 중요합니다.

동적 DNS 시스템은 네트워크 내에서 소프트웨어 에이전트를 실행하여 DNS 레코드를 최신 퍼블릭 IP 주소로 업데이트함으로써 이 문제를 해결합니다. DNS 레코드가 최신 상태이면 네트워크를 찾을 수 있으며, 고객은 서비스에 안정적으로 액세스할 수 있습니다.

이 게시물에서는 서버리스 AWS 서비스를 사용하여 자체 동적 DNS 시스템을 구축하는 방법을 설명합니다. Amazon Web Services(AWS) 서비스와 코드 몇 줄만 사용하여 서버리스 시스템을 구축하는 것은 간단하고 비용 효율적이며 확장 가능합니다. 따라서 기본 인프라의 확장 및 유지 관리에 대해 걱정할 필요 없이 startup의 핵심 비즈니스 로직에 집중할 수 있습니다.

동적 DNS 시스템에서 사용하는 AWS 서비스

다음 섹션에서는 다음 AWS 서비스를 사용하여 동적 DNS 솔루션을 구축하는 방법을 보여드리겠습니다.

  • AWS Lambda 서비스를 사용하면 기본 서버를 관리할 필요 없이 코드를 실행할 수 있습니다. 코드는 언제든지 실행할 수 있지만 함수 호출당 1밀리초 단위로 요금이 부과됩니다. Lambda 서비스는 AWS SDK를 통해 다른 AWS 서비스와 상호 작용할 수 있습니다.
  • Lambda 함수 URL은 Lambda 함수를 위한 전용 HTTPS 엔드포인트를 제공합니다. 따라서 AWS SDK를 사용하거나 추가 프록시 서비스를 통해 함수를 호출할 필요 없이 클라이언트 애플리케이션에서 함수를 직접 호출할 수 있습니다. 이 기능은 Lambda 서비스에 추가 비용 없이 제공됩니다.
  • Amazon Route 53 글로벌 DNS 서버 네트워크에서 도메인과 DNS 영역을 등록하고 호스팅할 수 있는 관리형 DNS 서비스입니다. 모든 AWS 서비스와 마찬가지로 Route 53도 API를 통해 관리할 수 있습니다.
  • DynamoDB는 완전관리형의 서버리스 키-값 NoSQL 데이터베이스 모든 규모에서 고성능 애플리케이션을 실행하도록 설계되었습니다. DynamoDB는 보안, 지속적인 백업, 자동 다중 리전 복제, 인 메모리 캐칭, 데이터 가져오기 및 내보내기 기능을 기본적으로 제공합니다.

동적 DNS 시스템의 논리적 플로우

그림 1은 클라이언트가 Lambda 함수와 여기에 연결된 함수 URL을 사용해 구축된 서비스에 API 요청을 형성해서 자체 IP 주소를 찾는 방법을 보여줍니다.

그림 2에서 볼 수 있듯이 클라이언트는 퍼블릭 IP를 알게 되었으므로 서비스에 DNS 레코드 설정을 다시 요청합니다. Lambda 함수는 먼저 DynamoDB 테이블에 저장된 레코드를 참조하여 요청을 검증합니다. 검사를 통과하면 Lambda 함수는 API 직접 호출을 통해 Route 53에 DNS 항목을 설정합니다. 이제 네트워크의 현재 IP는 퍼블릭 DNS에 있으며 표준 DNS 쿼리를 통해 찾을 수 있습니다.

Lambda 및 Route 53을 통한 동적 DNS의 이점

서버리스 동적 DNS 시스템을 실행하여 얻을 수 있는 몇 가지 이점은 다음과 같습니다.

  • 더 쉽게 설정할 수 있습니다. 자체 AWS 계정에 샘플 클라이언트와 이를 설정하는 데 필요한 모든 코드, 구성 및 지침이 갖춰져 있습니다.
  • 얇거나 클라이언트가 없습니다. API를 업데이트하려면 세 가지 명령이 필요합니다. 대부분의 언어로 자체 클라이언트를 작성하고 Windows, Linux, macOS, Raspberry Pi, Chrome OS, 및 DD-WRT/Tomato USB  라우터 펌웨어를 비롯한 플랫폼에서 실행할 수 있습니다.
  • 임의의 수의 클라이언트, 호스트 이름 및 도메인을 지원합니다. Route 53 서비스 제한 및 할당량은 Route 53 개발자 가이드의 “할당량” 섹션에서 확인할 수 있습니다.
  • 비용 효율적–월 1~2달러. Route 53 영역의 각 비용은 월 0.50USD, DNS 쿼리 1,000,000개의 비용은 0.40USD, DNS 업데이트를 위한 10,000개의 Lambda 함수 요청 비용은 0.01USD 미만입니다.
  • 서버리스 아키텍처. 서버리스 기술은 Auto Scaling, 고가용성 및 사용량에 따른 결제 모델을 기본적으로 제공하여 민첩성을 개선하고 비용을 최적화합니다.
  • 세분화된 권한을 통해 인증된 클라이언트만 자신의 호스트 이름을 업데이트할 수 있습니다. 클라이언트는 DNS에 추가된 주소에서만 시스템을 업데이트할 수 있습니다.
  • 현재 DNS 설정을 사소하게 변경해야 합니다. 현재 사용하는 DNS 공급자에서 primary .com을 유지할 수 있으며 보조 dynamic.example.com 영역을 AWS에서 사용할 수 있습니다. Route 53에서 호스팅 영역을 생성하는 방법에 대한 자세한 내용은 Route 53 개발자 안내서의 “퍼블릭 호스팅 영역”을  참조하십시오.

사전 요구 사항

이 솔루션을 구축하려면 다음 두 가지가 필요합니다.

  1. AWS 계정.신규 계정은 AWS 프리 티어를 이용할 수 있습니다.
  2. Route 53 또는 다른 공급자에 호스팅된 사용자 소유 도메인입니다.필요한 경우 최저 $3.00부터 Route 53을 통해 도메인을 등록할 수 있습니다. 전체 가격 범위는 Amazon Route 53 도메인 등록 요금 참조하세요.

계정에 동적 DNS 시스템을 구축하는 방법

이제 충분한 정보를 얻었으므로 자체 시스템 사본 구축을 시작할 수 있습니다. 작동 방식에 대해 자세히 알아보려면 계속 읽어보십시오.

구축을 시작하려는 경우 Lambda가 포함된 Route 53 동적 DNS GitHub에서 사용할 수 있습니다. 설명이 포함된 지침과, 필요한 모든 코드 및 구성을 제공합니다.

새 시스템의 작동 방식

먼저 클라이언트는 네트워크에 할당된 공용 IP를 찾아야 합니다. 네트워크에서 인터넷 상의 서비스에 대한 요청을 수행하면 해당 서비스는 외부 IP 주소에서 오는 요청을 확인합니다.

그런 다음 클라이언트는HTTP POST요청을 {"execution_mode":"get"}의 요청 본문을 갖춘 Lambda 함수 URL을 대상으로 생성하며, 현재 퍼블릭 IP 주소가 포함된 응답을 받습니다.

HTTP POST
> https://.....lambda-url.eu-west-1.on.aws

{“return_message”:
“176.32.100.36”, “return_status”: “success”}

이 프로세스 동안 Lambda 함수 URL은 모든 요청 파라미터를 포함하여 HTTP 요청을 JSON으로 변환하고, 요청자의 소스 IP 주소를 Python Lambda 함수에 전달합니다. 그러면 Lambda 함수는 IP와 함께 JSON 응답을 다시 클라이언트에 전송합니다.

그림 3은 퍼블릭 IP 가져오기 요청을 보여줍니다.

이제 클라이언트는 HTTP POST 요청에서 반환된 퍼블릭 IP 주소, DNS 호스트 이름 및 공유 암호를 연결하여 요청 토큰을 구축합니다. 예를 들어 IP 주소가 176.32.100.36이고 호스트 이름이 host1.dyn.example.com, 공유 암호가 shared_secret_1인 경우 연결된 문자열은 다음과 같습니다.

176.32.100.36host1.dyn.example.comshared_secret_1

다음으로 클라이언트는 SHA-256 해시 함수를 다음 함수로부터 생성합니다.

echo -n 176.32.100.36host1.dyn.example.comshared_secret_1 | shasum -a 256

해시: 96772404892f24ada64bbc4b92a0949b25ccc703270b1f6a51602a1059815535

그런 다음 클라이언트는 두 번째 HTTP POST 요청을 생성하여 DNS 업데이트를 요청합니다. 요청 본문 내에서 일반 텍스트 호스트 이름을 키로, 그리고 해시 함수를 인증 토큰으로 전달합니다.

HTTP POST > https://....lambda-url.eu-west-1.on.aws

{“execution_mode”:”set”, “ddns_hostname”:”host1.dyn.example.com”, “validation_hash”:”96772404892f24ada64bbc4b92a0949b25ccc703270b1f6a51602a1059815535”}

그러면 Lambda 함수 URL이 요청 파라미터를 Lambda 함수에 다시 전달합니다.

그런 다음 Lambda 함수는 AWS SDK for Python(Boto3)을 사용하여 DynamoDB에서 JSON 구성 리코드를 쿼리합니다. 이 시스템에서는 Lambda 서비스, DynamoDB 및 Route 53 간의 상호 작용이 Lambda 서비스 런타임 환경에 사전 구축된 Boto3를 사용합니다.

Lambda 함수가 DynamoDB에서 구성 레코드를 쿼리하면, 다음 예제 레코드와 마찬가지로 호스트 이름을 키로 사용해서 공유 암호 및 해당 레코드와 관련된 기타 구성을 찾습니다.

{
"host1.dyn.example.com.": {
"aws_region": "us-west-2",
"route_53_zone_id": "MY_ZONE_ID",
"route_53_record_ttl": 60,
"route_53_record_type": "A",
"shared_secret": "SHARED_SECRET_1"
},
"host2.dyn.example.com.": {.....

클라이언트가 host1.dyn.example.com 키로 전달했으므로 Lambda 함수는 SHARED_SECRET_1 구성에서 읽고, 호스트 이름, 요청자의 IP 주소 및 공유 암호를 사용하여 해시 함수 토큰을 재구축합니다. Lambda 함수가 계산한 해시 함수와 클라이언트에게서 받은 해시 함수가 일치하면 요청이 유효하다고 간주됩니다.

요청이 검증되면 Lambda 함수는 구성의 정보를 사용하여 Route 53에 대한 API 직접 호출을 수행하여 DNS 호스트 이름이 클라이언트 IP에 이미 설정되어 있는지 확인합니다. 변경이 필요하지 않은 경우 Lambda 함수는 클라이언트에 응답하고 종료합니다.

{“return_message”: “Your IP address matches the current Route53 DNS record.”,
 “return_status”: “success”}

레코드가 없거나 혹은 현재 레코드와 클라이언트 IP가 일치하지 않는 경우 Lambda 함수는 Route 53에 대한 API 직접 호출을 수행하여 레코드를 설정하고, 클라이언트에 응답하며, 종료합니다.

{“return_message”: “Your hostname record host1.dyn.example.com. has been set to 176.32.100.36”,
 “return_status”: “success”}

그림 4는 호스트 이름 설정 요청을 보여 줍니다.

이 시스템은 어떻게 보안을 유지하나요?

  • Lambda 함수 URL을 사용하는 모든 통신은 암호화됩니다.
  • 공유 암호는 인터넷을 통해 전송되지 않습니다.
  • Lambda 서비스의 예약된 동시성 기능을 사용하여 클라이언트 요청 속도를 조절할 수 있습니다.
  • 인증 메커니즘은 클라이언트가 공유 암호(“가지고 있는 것”)와 자체 공용 IP 주소(“있는 것”)를 제시하기 때문에 다중 요소입니다.
  • 구성 파일은 DynamoDB 서버 측 암호화를 통해 유휴 상태에서 암호화할 수 있습니다.
  • AWS 보안 인증은 사용되지 않으므로 유출될 수 없습니다.

결론

이 게시물에서 설명하는 동적 DNS 시스템은 실제 문제를 해결하기 위해 AWS에서 자체 서버리스 솔루션을 생성하는 방법을 보여줍니다. DNS는 변경되기 쉬우므로 사용자는 인식하지 못할 수도 있습니다!

이 솔루션을 사용하여 AWS에서 자체 동적 DNS를 실행할 수 있습니다. 또는 이 솔루션을 예제로 사용하여 AWS 서비스를 사용해서 규모에 관계없이 자체 서버리스 솔루션을 만드는 방법을 알아보십시오.

GitHub의 Lambda 리포지토리가 포함된 Route 53 동적 DNS 방문하여 배포 방법에 대한 전체 코드, 구성 및 지침을 확인하세요.

이 콘텐츠는 어떠셨나요?