AWS EC2 인스턴스를 외부 DNS에 연결하기 (탄력적 IP)

Explanation

저는 오드로이드라는 마이크로 원보드 컴퓨터를 구매해서 Ubuntu를 설치하고 집 인터넷 공유기로 연결해서 개인 서버로 사용하고 있었는데요.
오드로이드의 사양은 크기에 비해 정말 좋지만, 집에 인터넷이 느려서 그런지 폴시랩 블로그에 접속하면 캐시가 되지 않은 첫번째 연결은 4초 이상의 대기 시간이 생긴답니다.
요즘은 블로그에 방문자도 쪼~금~ 늘어나기도 했고, 조금 더 쾌적한 환경을 만들고자 지난 주말에 폴시랩 블로그를 AWS의 EC2로 이전하였답니다.
그리고 오늘은 그 과정으로 아마존 웹 서비스(AWS)의 EC2의 인스턴스를 외부 DNS에 연결하여 사용하는 방법에 대해 적어 보려합니다.

결과만 먼저 이야기하면 사실 글은 아주 간단하답니다. EC2의 인스턴스를 ‘탄력적 IP’에 연결하고 ‘탄력적 IP’로 받은 IP주소를 DNS에가서 A호스트로 연결하면 끝입니다.

1. 인스턴스 생성

EC2 인스턴스를 만드는 내용을 적으려고 한건 아니여서 생략.

이제 개인 서버로도 AWS를 사용하게 되었으니 AWS의 프리티어로 제공하는 서비스들 중에서 몇가지 사용법에 대해서도 앞으로 조금씩 포스팅하려 합니다.

대략 위와 같이 인스턴스가 있겠죠??

지금은 이미 ‘탄력적 IP’ 설정을 해놓아서 ‘52.79.86.65’라는 탄력적 IP가 출력되어 있는데요. 원래는 인스턴스의 IPv4 퍼블릭 IP를 따로 가지고 있습니다.
저는 그전까지는 EC2를 ELB(엘라스틱 로드 밸런싱)에 연결해서 로드 밸런서의 IP주소를 DNS에 연결해서 사용했었는데요. 그래서 당연히 그냥 로드밸런서를 사용하지 않으면 그냥 EC2의 퍼블릭 IP 값을 DNS에 연결해서 사용하면 될 줄 알았는데. 왠걸 하루종일 기다려도 연결이 되지 않더라고요.

이유를 생각해보자면 아마도 EC2 인스턴스의 퍼블릭 IP 값은 인스턴스를 재시작하면 변하는, 고정값이 아니기 때문에 안되는게 아닐까 싶어요.
그리고 탄력적 IP라는건 연결된 EC2 인스턴스가 실행되었을때 연결되어 항상 고정된 IP를 유지해주는 일을 한답니다.
그래서 DNS에 연결하려면 EC2의 인스턴스를 ‘탄력적 IP’로 연결해서 탄력적 IP를 받아야해요.

로드밸런서를 사용하면 그냥 되는건 로드밸런서 자체적으로 탄력적 IP 기능을 해주기 때문이겠죠??

로드 밸런싱도 프리티어에 포함되어 있지만, 굳이 사용하지 않은 이유는… 이번에는 프리티어 기간이 끝나도 nano로 계속 쓸까 생각하고 있어서 EC2 인스턴스 하나만으로 구성하려고 합니다. (가난한 중생이기에..)

2. 탄력적 IP 생성

EC2 왼쪽 메뉴에서 ‘네트워크 및 보안’의 ‘탄력적 IP’ 메뉴를 선택합니다.
전 이미 있지만, 없다고 가정하고 왼쪽 위에 ‘새 주소 할당’ 버튼을 누릅니다.

그리고 ‘할당’을 누른 후 할당이 완료되면 ‘닫기’를 누릅니다.

3. 탄력적 IP 연결

그러면 저 같은 경우에는 ‘15.164.53.45’ 라는 탄력적 IP가 생겼는데요. 저곳을 마우스 우클릭 한 후 ‘주소 연결’을 선택합니다.

다음 인스턴스 인풋박스에 마우스를 포커스하면 현재 실행 인스턴스를 볼 수 있는데요, 그곳에서 연결한 인스턴스를 선택해 준 후 ‘연결’ 버튼을 누릅니다.

그러면 끝!
간단하죠?

그리고 추가적으로 검색해보니까, AWS의 프리티어를 사용하는 경우? ‘탄력적 IP’를 만들고 프리티어의 EC2 인스턴스를 연결하지 않으면 과금이 발생한다고 하네요.

4. DNS에 탄력적 IP 연결

AWS에서도 ‘Route 53’이라는 DNS 서비스를 제공하는데요. 저는 개인적으로는 사용하지 않습니다. 왜냐면 AWS 프리티어에 포함되어 있지 않기 때문에, 도메인을 하나만 연결해도 매달에 무려 거금 550원이 과금되기 때문입니다.

그렇기 때문에 제가 주로 도메인을 구매하는 Hosting.kr에서 제공하는 DNS 서비스를 이용합니다. 아마 대부분 도메인을 구매하셨다면 도메인을 구매한 웹 사이트에서 DNS 서비스를 무료로 제공해주는 것 같습니다.

짜잔, 저는 이렇게 DNS를 연결하였습니다. 그럼 끝!

네임서버 및 서브 도메인 설정은 보통 길게는 적용되는데 하루까지 걸린다고 하는데, 개인적으로는 대부분 늦어도 한시간이면 적용이 되는 거 같습니다. 만약 한시간이 지났는데 안된다면..

5. 추가 (보안그룹 설정)

혹시 아까 설정했던 ‘탄력적 IP’ 메뉴 위에 있는 ‘보안 그룹’ 메뉴로 이동해서 인스턴스를 만들때 선택했던 보안 그룹을 선택한 후 아래 설정 화면에 ‘인바운드’ 란에 ‘편집’ 버튼을 눌러서 ‘HTTP’, ‘포트번호(기본 80)’, ‘소스(접근 허용 IP 설정)’를 설정 하셨는지 확인해보시면 좋을 것 같습니다.

Leave a Reply

  1. sofkaints

    웹앱에서 본인인증을해야 캘린더 정보를 볼수 있는데
    퀵스타터는 실행하면 주는 url접속후 인증하고 뱉어내는 code를 입력해야 정보가 나옵니다.
    다른 유저가 이 기능을 쓰려면 어떻게 해야하죠?
    url을 클라한테 보내줘서 인증하게 해야하나요?

    간단히 말해 응용방법을 모르겠습니다 ㅠ

    • 안녕하세요, sofkaints님.
      실제로 서비스에서 사용하시려면 몇가지 수정이 필요할 것 같습니다. sofkaints님이 말씀하신 것처럼 구글 사용자 인증을 위해서 (문서상 변수)’authUrl’로 클라이언트에서 새로 페이지를 띄우거나 리다이렉션 시켜서 사용자가 인증절차를 걸칠 수 있게 해야 합니다. 그리고 인증이 완료되면 구글 API 프로젝트에서 사용자 인증에서 ‘승인된 리디렉션 URI’부분에 등록된 URI로 리다이렉션이 되는데 이때 스트링 파라미터로 ?code=… 라는 값이 함께 옵니다.
      ‘승인된 리디렉션 URI’에 등록된 URI의 로직에서는 스트링 파라미터로 code가 있는지 확인하고, 있다면 code를 이용해서 ‘getToken’ 하여 토큰을 만들어서 ‘storeToken’ 토큰을 등록하고 다음 이벤트 로직을 실행하면 됩니다.
      짧게 글로만 적으려니, 더 복잡하게 느껴지는거 같네요. 조금이나마 도움이 되었을지 모르겠습니다…
      댓글 감사합니다 :)

  2. 잘봤습니다!!

    글 정말 잘봤습니다 근데… 한대로 그대로 따라했는데
    Error: ENOENT: no such file or directory, mkdir

    이런오류가 계속 나네요.. 혹시 왜그런지 아세요 ?ㅠㅠ

    • 안녕하세요? 댓글 확인이 늦었네요.
      파일이나 디렉토리를 찾을 수 없다는 것으로 보아, 예제에서 디렉토리 파일을 읽어오는 부분.
      ‘ var TOKEN_DIR= ‘ 토큰을 저장할 디렉토리를 선언하는 부분이나
      ‘ client_secret.json ‘ 파일의 위치에서 문제가 생긴게 아닐까 싶습니다.
      ‘client_secret.json’ 파일을 올바른 디렉토리에 넣었는지, 또는 파일 디렉토리 경로를 수정하시거나
      생성하신 서버의 환경에 맞게 토큰을 저장할 디렉토리(‘TOKEN_DIR’)를 새로 지정하시면 되지 않을까 싶습니다.