Amazon Route 53: 탄력적 IP를 사용하지 않고 IP 주소를 자동으로 업데이트하는 방법

6949 단어 dnscloudpythonaws
다음은 EC2 인스턴스가 IP 주소를 변경할 때마다 Amazon Route 53의 A-Record를 자동으로 업데이트하는 간편한 방법입니다.

시나리오: Amazon Route 53에 Amazon EC2 인스턴스를 가리키는 도메인 이름이 있습니다. 그러나 인스턴스가 중지되었다가 시작되면 퍼블릭 IP 주소가 변경됩니다. 이것은 잘못된 IP 주소를 가리키고 있기 때문에 A-레코드를 깨뜨립니다.

"기다리다!""단순히 탄력적 IP 주소를 사용하지 않는 이유는 무엇입니까?"라고 말할 수 있습니다.

(탄력적 IP 주소는 Amazon VPC의 리소스에 할당할 수 있는 고정 IP 주소입니다. 탄력적 IP 주소를 AWS에 반환할 때까지 IP 주소는 동일하게 유지됩니다.)

예, 인스턴스에서 탄력적 IP 주소를 사용하면 A-레코드가 손상되지 않습니다. 그러나 AWS는 리전당 탄력적 IP 주소를 기본적으로 5개로 제한합니다. 한도 증가를 요청할 수 있지만 많이 필요한 경우에는 어떻게 해야 합니까?

예를 들어 서비스는 데이터를 안전하게 분리하기 위해 고객별로 별도의 Amazon EC2 인스턴스를 제공할 수 있습니다. 각 고객에게는 서버에 액세스할 수 있는 도메인 이름이 제공됩니다( acme.example.com ). 필요한 탄력적 IP 주소 수가 엄청날 수 있습니다.

다행히 탄력적 IP 주소 없이 목표를 달성할 수 있는 상당히 간단한 방법이 있습니다.

건축물



아키텍처는 매우 간단합니다.
  • EC2 인스턴스가 시작되면 새 퍼블릭 IP 주소를 가져와서 Route 53에서 자체 레코드를 업데이트해야 합니다
  • .
  • 업데이트할 DNS 이름이 EC2 인스턴스의 태그에 저장됨
  • EC2 인스턴스가 시작될 때마다 스크립트가 실행되어야 합니다(즉, 처음 부팅할 때만이 아니라 시작할 때마다)
  • .

    구현

    먼저 기존 도메인 이름을 정의하는 레코드 세트가 Amazon Route 53에 있어야 합니다.



    현재 EC2 인스턴스의 퍼블릭 IP 주소를 가리키고 있습니다.

    다음으로 스크립트에서 사용할 EC2 인스턴스에 몇 가지 태그를 추가합니다.

  • DNS 이름: 인스턴스와 연결할 DNS 이름

  • 호스팅 영역 ID: 업데이트해야 하는 Route 53의 영역 레코드를 고유하게 식별합니다(Route 53 호스팅 영역 레코드에서 가져오기)
  • .



    EC2 인스턴스가 시작될 때마다 다음을 수행하는 스크립트를 실행합니다.
  • 위 태그에서 정보 가져오기
  • 인스턴스의 현재 퍼블릭 IP 주소 검색
  • Route 53 레코드 세트를 새 IP 주소로 업데이트합니다.

  • #!/bin/bash
    # Extract information about the Instance
    INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id/)
    AZ=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone/)
    MY_IP=$(curl -s http://169.254.169.254/latest/meta-data/public-ipv4/)
    
    # Extract tags associated with instance
    ZONE_TAG=$(aws ec2 describe-tags --region ${AZ::-1} --filters "Name=resource-id,Values=${INSTANCE_ID}" --query 'Tags[?Key==`AUTO_DNS_ZONE`].Value' --output text)
    NAME_TAG=$(aws ec2 describe-tags --region ${AZ::-1} --filters "Name=resource-id,Values=${INSTANCE_ID}" --query 'Tags[?Key==`AUTO_DNS_NAME`].Value' --output text)
    
    # Update Route 53 Record Set based on the Name tag to the current Public IP address of the Instance
    aws route53 change-resource-record-sets --hosted-zone-id $ZONE_TAG --change-batch '{"Changes":[{"Action":"UPSERT","ResourceRecordSet":{"Name":"'$NAME_TAG'","Type":"A","TTL":300,"ResourceRecords":[{"Value":"'$MY_IP'"}]}}]}'
    

    인스턴스가 시작될 때마다 스크립트를 자동으로 실행하려면(처음 부팅할 때만 실행되는 사용자 데이터 스크립트와 달리) 위의 스크립트를 이 디렉토리에 넣습니다.
    /var/lib/cloud/scripts/per-boot/
    마지막으로 EC2 인스턴스에는 위의 명령을 실행할 수 있는 권한이 있는 할당된 IAM 역할이 필요합니다.

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "ec2:DescribeTags",
                "Resource": "*"
            },
            {
                "Effect": "Allow",
                "Action": "route53:ChangeResourceRecordSets",
                "Resource": "arn:aws:route53:::hostedzone/HOSTED-ZONE-ID"
            }
        ]
    }
    

    테스트 방법

    스크립트를 테스트하려면 인스턴스를 중지한 다음 다시 시작하면 됩니다.

    그러면 새 퍼블릭 IP 주소가 인스턴스에 할당됩니다. 스크립트는 Amazon Route 53을 호출하여 레코드 세트를 업데이트합니다. 업데이트하는 데 1분 정도 걸릴 수 있습니다.

    그런 다음 Route 53으로 돌아가 A-Record에 할당된 IP 주소를 확인합니다. 새 IP 주소로 업데이트해야 합니다.

    좋은 웹페이지 즐겨찾기