클라우드 서비스

AWS ELB 생성 및 ACM 인증서 EC2에 적용하기

여러 목적으로 구축된 서버가 HTTPS 통신이 가능하게 하려면 SSL 인증서 파일이 필요합니다.

일반적으로 SSL 인증서는 취급하는 기관에서 유료 인증서를 구매하여 직접 설치하거나, 호스팅 서비스에서 제공하는 설치 서비스를 사용합니다. 무료 인증서(Let’s Encrypt)를 사용하여 설치할 수도 있는데 이와 관련해서는 아래 포스트를 참고해보시기 바랍니다.

여기서는 Amazon Web Services (이하 AWS)에서 제공하는 SSL 인증서 서비스인 ACM(Amazon Certificate Manager)을 사용하여 인증서를 발급하고, EC2와 같은 서비스에 적용해보도록 하겠습니다.

ACM 인증서 발급받기

ACM 인증서는 아마존 웹 서비스의 각종 서비스를 연동해 사용할 경우 무료로 발급 받을 수 있습니다. 인증서 발급 시 유의해야 할 점은 ACM 인증서는 EC2 인스턴스가 위치한 리전과 동일한 리전이어야 한다는 것입니다. EC2에 적용하기 위해서 다른 리전의 ACM 인증서 리스트를 불러올 수 없기 때문에 주의해야 합니다.

AWS CDN 서비스인 CloudFront를 사용했었다면, CloudFront용 ACM 인증서가 버지니아 북부에서만 발급 및 사용할 수 있기 때문에 이미 같은 도메인의 인증서가 버지니아 북부 리전에 발급되었을 수 있습니다. 그러나 이와는 별개로 다른 리전에 동일한 도메인에 대한 ACM 인증서를 추가로 발급할 수 있으므로 CloudFront로 인해 생성된 인증서를 무시하고 EC2 인스턴스 리전과 같은 리전에서 다시 발급받아야 합니다.

이제 본격적으로 인증서를 발급해보겠습니다. AWS 메뉴상에서 ‘Certificate Manager’를 검색하거나 직접 찾아서 클릭합니다.

Certificate Manager 메인 페이지에 들어왔다면 인증서 프로비저닝 항목에 있는 ‘시작하기’ 버튼을 눌러줍니다.

그러면 인증서 요청 페이지가 나타날 것입니다. 여기서 ‘공인 인증서 요청’을 선택한 후 하단의 ‘인증서 요청’ 버튼을 클릭합니다.

다음으로 도메인 이름 추가 페이지가 나타납니다. 여기서 인증서가 필요한 도메인을 입력해주어야 합니다. 일반적으로 example.com의 도메인이라면 www.example.com과 같이 www를 붙여서 기입해줍니다.

만약 여러 서브 도메인에 대한 인증서가 필요한 경우 하단의 ‘이 인증서에 다른 이름 추가’를 클릭하여 진행해주시면 됩니다. 서브 도메인이 많아질 것을 고려해서 와일드카드(*)를 사용한 도메인 인증서 또한 만들 수 있습니다. *.example.com과 같이 입력하면 이후에 인증서를 추가 발급받지 않고 모든 서브 도메인을 하나의 인증서로 처리할 수 있습니다. 단 와일드 카드 인증서를 사용할 때에는 기존 도메인인 example.com을 추가해야 합니다. (*.example.comexample.com, 총 2개가 되겠죠.)

아래 사진의 예시에서는 현재 사이트 도메인을 입력했지만 실제로는 각자의 사이트 도메인을 입력해주셔야 합니다.

이제는 발급 받을 인증서 도메인이 자신이 소유하고 있는 도메인임을 인증해야 합니다. 검증 방법을 선택해야 하는데, 해당 도메인이 Route 53 서비스로 DNS를 관리하고 있다면 ‘DNS 검증’을 선택하는 것을 권장합니다. 그렇지만 DNS를 자신이 관리하지 못하거나 다른 DNS 서비스를 사용 중이라면 ‘이메일 검증’을 사용하셔야 합니다. 여기서는 DNS 검증으로 진행해보겠습니다.

다음으로 이 인증서에 대한 태그를 추가합니다. 이는 선택사항이며 아래는 Name 태그를 사용한 예시입니다. Name 태그는 인증서를 구분하기 쉽게 라벨을 부여하는 역할을 합니다. 모든 것이 완료되었다면 ‘검토’를 클릭합니다.

검토 페이지에서는 자신이 설정한 내용을 확인한 후 ‘확인 및 요청’을 클릭하면 됩니다.

마지막으로 방금 전 선택한 검증을 진행할 것입니다. DNS 검증의 경우 기존에 등록한 Route 53 호스트 영역에 그대로 아래의 CNAME만 추가하면 됩니다. 수동으로 추가하는 것도 가능하지만 하단의 ‘Route 53에서 레코드 생성’ 버튼을 클릭하면 자동으로 CNAME을 추가해 줄 것입니다. 이후 검증 상태가 ‘성공’이 되면 하단 버튼의 ‘계속’을 클릭합니다.

이제 ACM 인증서 발급이 완료되었습니다! 현재는 사용 중도 아니고 갱신도 불가능하다고 나타날 것입니다. (이후 사용 중인 상태가 되면 아래 상태는 자동으로 갱신됩니다.)

발급된 ACM 인증서를 EC2에 적용하기

이제 발급받은 ACM 인증서EC2 인스턴스로드 밸런싱 서비스(ELB)를 사용하여 적용해보도록 하겠습니다.

먼저 AWS EC2 대시보드 페이지로 이동하겠습니다. EC2 대시보드 페이지의 좌측 메뉴를 살펴보면 ‘로드 밸런싱’ 메뉴 그룹이 보일 것입니다. 여기에 ‘로드 밸런서’ 메뉴가 있을텐데 이를 클릭합니다.

로드 밸런서 페이지로 이동하였다면 상단 버튼의 ‘로드 밸런서 생성’을 클릭합니다.

로드 밸런서 유형은 아래와 같이 세가지가 있습니다.

  • Application Load Balancer: 애플리케이션 계층에서 라우팅을 합니다. HTTP 및 HTTPS 트래픽에 대한 로드 밸런싱에 유리합니다. Layer 7에서 동작합니다.
  • Network Load Balancer: TCP/UDP 트래픽을 중심으로 낮은 지연 시간을 가진 로드 밸런서입니다.
  • Classic Load Balancer: AWS에서 가장 먼저 서비스된 기존 로드 밸런서입니다. 하나의 서버 주소를 가지며 Layer 4에서 동작합니다.

이 내용에 대해서는 아래 문서에 자세히 설명되어있습니다: https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/load-balancer-types.html

웹 서비스를 사용하는 경우 첫번째 선택지가 유리하므로 여기서는 Application Load Balancer를 선택하겠습니다.

이제 단계별 구성 내용 입력이 필요합니다. 여기서는 인스턴스 운영 상황에 따라 달라질 수 있으므로 반드시 이 과정 그대로 따라가기 전 검토해보시고 진행하시기 바랍니다.

먼저 구축할 로드 밸런서 이름을 자유롭게 입력하고 IP 주소 유형을 ipv4로 선택하겠습니다.

이후 리스너 그룹의 로드 밸런서 프로토콜을 HTTP HTTPS 모두 추가해줍니다. HTTP는 처음에 추가되어 있기 때문에 하단의 리스너 추가 버튼을 클릭하여 HTTPS (보안 HTTP)를 선택하고 로드 밸런서 포트는 443으로 지정하여 HTTPS 프로토콜만 등록해줍니다.

다음은 가용 영역을 설정하는 화면입니다. 여기서 선택해야 하는 가용 영역 중 하나는 반드시 EC2 인스턴스에서 사용하는 VPC, 가용 영역의 서브넷과 일치해야 합니다. 적어도 두개 이상을 선택해야 하기 때문에 여기서는 EC2 인스턴스에서 사용하는 ap-northease-2c 영역을 포함한 ap-northeast-2aap-northeast-2c를 선택하였습니다.

다음으로 보안 설정을 구성해야 합니다. 인증서 유형은 ‘ACM에서 인증서 선택 (권장)’을 선택한 후, 인증서 이름은 상단에서 만들었던 ACM 인증서를 찾아서 선택해줍니다. (없다면 우측 새로고침을 이용해보세요.) 보안 정책은 그대로 두어도 됩니다.

다음으로 보안 그룹을 구성할 수 있는 화면이 나오는데요, EC2 인스턴스를 설정할 때 만들었던 보안 그룹과 동일합니다. 새로 만들거나 기존의 보안 그룹을 선택해서 인바운드/아웃바운드 규칙을 설정합니다. 이 보안 그룹의 인바운드 규칙에서도 80/tcp443/tcp 포트는 개방되어있어야 합니다.

다음으로 라우팅 구성 화면에서 아래와 같이 각 항목을 입력해줍니다. 여기서는 로드 밸런서가 EC2 인스턴스와 통신할 것이므로 대상 유형인스턴스로, HTTP(TCP 80번 포트) 통신 프로토콜로 선택합니다. 상태 검사는 필요에 따라 사용자 지정하거나, 그대로 둔 채 다음으로 넘어갑니다. (기본값으로 최상단 index 페이지에 대한 Health Check를 진행할 것입니다. Health Check에 대한 응답 코드가 20X가 아닌 경우 라우팅이 원활하지 못할 수 있습니다. 이럴 때는 Health Check가 가능한 URL 경로와 프로토콜을 입력해야 할 수 있습니다.)

마지막 대상 등록 화면에서는 로드 밸런싱을 수행할 인스턴스를 지정합니다. 이 도메인과 관련된 인스턴스만 찾아서 하나 이상 선택해줍니다. 선택한 후 ‘등록된 항목에 추가’ 버튼을 눌러야만 제대로 등록되니 체크만 했다면 이점 꼭 확인해주세요.

이후 검토 화면에서는 자신이 작성한 내용을 검토한 뒤에 하단의 ‘생성’을 클릭합니다.

이제 시간이 지난 후 로드 밸런서가 활성화되었는지 확인해봅니다. EC2 대시보드에서 좌측 메뉴 ‘로드 밸런싱’ 그룹의 ‘로드밸런서’를 클릭한 후 생성한 로드 밸런서의 상태가 ‘active’인지 확인합니다.

Route 53에 로드 밸런서를 연결하기

이제 마지막 과정만 남았습니다. Route 53에서 기존 도메인에 연결된 호스팅 대상 서버의 IP 주소를 로드 밸런서의 IP로 설정해야 합니다.

Route 53 대시보드로 들어간 후, 좌측 메뉴의 ‘호스팅 영역’을 클릭한 뒤 연결할 도메인을 클릭합니다.

이제 연결이 필요한 도메인(또는 서브 도메인) 이름에 대한 A 레코드를 수정합니다. 수정해야 할 도메인이 여러개라면(예: example.com, www.example.com, *.example.com…), 이를 모두 로드 밸런서에 연결해야 한다면 각각 A 레코드를 모두 수정해주어야 합니다. 만약 아직 설정된 A 레코드 규칙이 없다면 상단의 ‘레코드 생성’으로 만들어주겠습니다.

모든 내용이 편집되었다면 ‘레코드 세트 저장’을 클릭합니다. 레코드 세트 규칙이 반영되는 데에는 최대 1일이 소요될 수 있습니다.

이제 모든 과정이 완료되었습니다. 해당 도메인으로 접속하여 로드 밸런서가 문제 없이 연결되어 웹페이지가 잘 나타나는지 확인해봅니다.

또한 ACM 인증서적용되었는지도 확인해봅니다.

JooTC

안녕하세요. 테크놀로지에 관심이 많은 블로거입니다.

View Comments

      • 앗, 답변 남기자마자 해결하셨군요, 다행이네요! 아무튼 읽어주셔서 감사합니다 ㅎㅎ

    • 안녕하세요. 해당 문제에 대해 여러가지 가능성이 존재할 수 있으니 아래 사항을 체크해보세요.

      1. 인스턴스 연결 확인: ELB 서비스가 하나 이상의 인스턴스에 연결되어있는지 확인하시기 바라며, Health Check에 실패하는지 점검해보세요. (로드 밸런싱 - 대상 그룹 - 그룹 선택 후 하단 '대상' 탭에서 확인) 또한 인스턴스 보안 그룹에는 TCP/80, TCP/443번 인바운드 포트가 열려있어야 합니다.

      2. 웹 서버 소프트웨어(Apache, Nginx)의 설정 파일 점검: 80번 포트에 대한 연결이 올바른지 확인합니다. 기존 443 포트가 다른 인증서를 가리키고 있다면 인증서 오류가 발생할 수 있습니다.

      3. ELB 구성 후 시간이 조금 지나야할 수도 있습니다.

      자세한 내용은 다음 문서를 참고해보세요.
      https://docs.aws.amazon.com/ko_kr/elasticloadbalancing/latest/classic/ts-elb-error-message.html

      도움이 되었으면 하는 바램이네요. 감사합니다.

Recent Posts

[iOS] Xcode ‘You do not have required contracts to perform an operation’ 해결

Xcode에서 iOS 애플리케이션을 빌드(Archive)하고 App Store Connect에 앱을 업로드하는 도중, 아래와 같은 에러가 발생하면서 더…

1개월 ago

[안드로이드] INSTALL_FAILED_INSUFFICIENT_STORAGE 해결

INSTALL_FAILED_INSUFFICIENT_STORAGE 문제 안드로이드 스튜디오에서 에뮬레이터를 실행하고 개발중인 애플리케이션을 실행하려 하면 로그 창에 아래와 같이 표시되면서…

7개월 ago

Zalgo 텍스트와 이를 방지하는 방법

인터넷 커뮤니티 사이트에서 게시글이나 댓글에 간혹 장난을 목적으로 작성된 특이한 글자를 볼 수 있습니다. 위…

9개월 ago

리눅스 kill, killall 명령어 – 특정 프로세스 종료하기

리눅스 명령어 - kill, killall 리눅스 kill 명령어는 특정 프로세스를 종료해주는 명령어입니다. 백그라운드에서 실행되고 있는…

9개월 ago

JavaScript typeof null이 ‘object’인 이유

JavaScript는 역사가 긴 스크립트 프로그래밍 언어입니다. 세월이 흐르면서 많은 자바스크립트 표준이 만들어졌고, 현재는 많은 문법적…

9개월 ago

Mocha Error: Resolution method is overspecified. 해결 방법

NodeJS 테스트 프레임워크인 Mocha는 비동기 테스트를 지원합니다. 간혹 특정 테스트 스크립트를 작성하고 실행하면 아래와 같이…

9개월 ago