본문 바로가기
  • This is Russell - the most handsome and the smartest.
AWS/EC2

EC2 에 호스팅중인 아파치 웹서버에 ACM - SSL 적용하기

by sundelion 2022. 1. 12.

0. ACM 발급

AWS 에서 제공하는 무료 SSL 인증서를 발급 받는다. (만료된 인증서의 경우, 갱신한다)

1. 로드밸런서

EC2 에는 ACM 을 직접적으로 적용할 수 없다. 그래서 AWS 에서 제공하는 로드밸런서를 사용한다.

1-1. 로드밸런서 생성

1-1-0. EC2 > 왼쪽 메뉴 > 로드밸런서 선택 > 로드밸런서 생성하기 (Create Load Balancer)

 

이전 세대 (classic) 버전을 사용해도 되지만 웹사이트의 경우, http 와 https 을 사용할 예정이기 때문에 application 타입으로 생성한다.

1-1-1. Application Load Balancer 란의 Create 을 클릭

1-1-2. 기본정보 입력 - 로드밸런서 이름, IP 주소 타입, Scheme (인터넷 페이싱 선택)

1-1-3. 웹사이트, EC2 가 사용중인 VPC 를 선택한다. (vpc 설정을 한 적 없는 경우, default 로 선택하면 된다)

1-1-4. 최소 두개의 서브넷을 선택해야 한다. 단, Internet-Facing 의 경우, vpc subnet 이 private 이 아닌public 으로 설정한다. (웹서버를 위한 로드밸런서 이므로 Internet-facing)

vpc subnet 이 private 인 경우, 아래와 같은 경고문이 뜬다.

1-1-5. 보안그룹을 설정해준다. (웹서버가 돌아가고 있는 EC2 의 Security goup 을 확인 후 같게 설정한다)

  • Ec2 인스턴스의 디테일 페이지에서 보면 Security 탭에서 확인 가능하다

1-1-6. Listener 를 설정해준다. HTTP 와 HTTPS 모두 추가해준다.

  • classic 버전 이후, 새롭게 Target group 이란게 추가 되었다. 어떤 Instance 로 포워딩 할건지, 인스턴스와 포트들을 지정해주는 곳이다.
  • 아래의 이미지에서 Create target group 을 선택하면 이동할 수 있다.
  • 혹은 EC2 > 왼쪽 메뉴 > 로드밸런싱 > Target group 을 통해 관리할 수 있다.

1-1-7. Target group 생성

  • Instance 와 연결할 것이기 때문에 Instances 를 선택한다.
  • target group 의 명칭과 포트를 설정해준다. (본인은 아파치 웹서버의 80 포트로 연결할 것이기 때문에 80으로 설정해준다)
  • vpc 또한 위에서 설정한 같은 vpc 로 설정해준다
  • health check 는 해당 path (아래 이미지의 경우 / ) 의 페이지의 상태 코드를 확인한다
    • 실제로 회사의 서비스 모니터링을 위해 자주 사용되는 방법이다
    • 설정한 path 에서 받은 status code 값으로 상태를 확인한다
    • 실서비스에서 db connection 의 경우, domain.com/test/connTest 형식으로 많이 사용한다

 
  • 다음 페이지로 넘어간다
  • 같은 vpc 를 사용하는 모든 ec2 인스턴스들 중, 로드밸런서와 연결할 인스턴스를 선택한다. (이때, 다른 vpc 의 인스턴스들은 옵션으로 뜨지 않는다)
  • 인스턴스에서 받게 될 포트를 선택해준다. (8080 혹은 3001 등)
    현재 아파치는 80 포트로 띄우고 있기 때문에 80으로 적고 추가한다.
  • Include as pending below 까지 클릭 해야 정상적으로 추가된다
    • 주의) 인스턴스 security group 에서 inbound-rules 에서 해당 포트를 모든 ip (이번 경우는 웹사이트 이기에 모든 ip)에 대하여 접근 허용을 해두었는지 체크하기

 

 
  • 오른쪽 하단에 주황색 생성 버튼을 눌러 target group 을 추가한다.

1-1-8. Security policy 와 0번에서 만든 ACM 인증서 선택

 

1-1-9. 우측 하단의 생성버튼 클릭

2. 로드밸런서와 도메인서버 연결

2-0. DNS 설정 방법

네임서버, 도메인서버는 무료 사이트도 있다. 하지만 무료 사이트의 경우, 연결이 불안정할 수 있으므로 유료 도메인을 구매하는것을 추천한다.

  • 본인의 경우, AWS 가 아닌 도메인 서비스를 사용중이라서 장애가 있었다. 이후 다른 포스팅에서 다룰 예정이다.

 

만약 가능하다면 AWS 도메인 서비스를 이용하는것이 최고 좋겠지만 그렇지 않다면 네이버 클라우드 플랫폼 (NCP) 같은 외부 도메인 서비스를 사용할 수 있다. (공부 목적이라면 저렴할수록 좋다. 단, 무료는 비추)

2-1. 로드밸런서 관리 페이지에서 위에서 생성한 로드밸런서의 DNS name 을 복사한다

2-2. Ncloud (본인이 사용하는 도메인 서비스) 접속 후 연결이 필요한 도메인에 type 을 CNAME 으로 값을 로드밸런서 DNS name 으로 추가한다.

3. Zone apex 에 CNAME 적용 불가 - 임시조치

  • AWS 도메인 서비스를 사용하는 경우, 이 장애는 발생하지 않는다.
  • 장애 발생하는 경우는 도메인 서비스들마다 다르다.
  • Naver cloud platform 의 경우, @.domain.co.kr 형식으로 지원하지만 만약 CNAME 타입의 레코드라면 다른 중복 레코드값을 가지면 안된다.
    • 본인의 경우, 해당 레코드를 메일 서버를 포함한 다른 용도로도 사용중이라서 생긴 장애였다.

3-1. Zone Apex ?

  • zone apex 는 도메인 그 자체, 예를 들어 domain.co.kr 부분을 의미한다.

3-2. 로드밸런서의 IP ?

AWS 의 로드밸런서는 DNS name 으로만 엔드포인트를 제공한다. 그리고 해당 도메인의 ip 는 주기적으로 변한다.

  • round-robin 적용되어있다.
  • 실제로 host {로드밸런서 도메인 네임} 혹은 nslookup {로드밸런서 도메인 네임} 을 터미널창에 치면 ip 가 두개가 나오는 것을 알 수 있다.

3-3. 임시 해결책

3-3-1. 실행했던 해결책 1번

  • AWS 의 로드밸런서의 ip 주소들이 유동적이라서 도메인 네임 엔드포인트로 제공하지만 zone apex 에 cname 타입의 레코드를 설정할 수 없게 되어있어서 임시로 로드밸런서 ip 들을 A 레코드 타입으로 설정해두었다.
  • Naver Cloud 공식문서에 따르면 Global DNS 의 A 타입 레코드는 기본적으로 round-robin 을 제공한다.
    • 다른 도메인서비스는 찾아봐야 한다.
    • 레코드 타입들은 인터넷에 찾아보기를...
    • NCP 는 엔터 (줄바꿈) 이후 ip 를 적용함으로써 한개 이상의 ip 를 입력할 수 있다.
    • 예시)
      123.123.123.123
      234.234.234.234​

3-3-2. 실행하고 있는 해결책 2번

  • 위에서 사용했던 Application load balancer 와 언급했던 Classic load balancer 와 달리, Network load balancer 는 고정 아이피 설정이 가능하다.
  • Choose a Network Load Balancer when you need ultra-high performance, TLS offloading at scale, centralized certificate deployment, support for UDP, and static IP addresses for your applications. Operating at the connection level, Network Load Balancers are capable of handling millions of requests per second securely while maintaining ultra-low latencies.

    [장점] 
    • 로드밸런서 타입들 중 Elastic ip 를 이용하여 static ip 를 갖을 수 있다
    • TCP/TLS 지원한다
      • ACM 적용 가능
      • TCP 80 포트와 443 포트로 EC2 연결 가능
    [ 단점 ]
    • DNS caching can make AZ fail over indeterministic and unreliable
      • Availability Zone fail

 

다만, 이것까지 설명하기엔 글이 너무 길어질 것 같음으로 다음 포스팅에서 설정 방법들을 다뤄보겠다 (만약 포스팅을 하게 된다면)

 

참고 문서

4. Wordpress SSL Plugin 적용 (워드프레스 사용자이고 Mixed content error 있다면)

  • 로드밸런서 적용 후 mixed content error 가 떴다. ( 워드프레스의 http 콘텐츠를 가져오려고 해서 생긴 현상 )
  • Really Simple SSL 이라는 워드프레스 ssl plugin 을 설치 및 사용하고 있다.
  • 워드프레스 사용자의 경우, domain.co.kr/wp-login.php 로 들어가서 플러그인 부분에서 추가 및 설정 할 수 있다.

5. 해결되었다. 2022-02-16

결론은.. 언제나 허무하다.

 

Really Simple SSL 플러그인을 사용해서 생인, too many redirects 현상이었다.

 

My website is in a redirect loop - Really Simple SSL

1) 원인

The WPMU domain mapping plugin in combination with Really Simple SSL can cause redirect loops. In the cases that I investigated, this was caused by load balancing on some domains on the network. WordPress depends on the is_ssl() function to detect SSL. The is_ssl() function in turn only looks at the $_SERVER[‘https’] = ‘on’ variable. When a domain is served load balanced, or behind a CDN, this variable is not passed by the server. WordPress should instead look at another variable. A brute force fix is to just copy the $_SERVER[‘https’] = ‘on’; in the wp-config.php, but if you still have some sites on your network which are not https, this won’t work.

  • 워드프레스 built-in 이 아닌 domain mapping 기능을 사용할 경우 redirect loop 이 발견되어 해결한 상황
    • 본 서버는 apache domain mapping 기능을 사용한다. → 원인으로 추정된다.

  • 위의 Article-Really Simple SSL 에서 예시 코드로 작성하면 Application Load Balancer 에서는 작동되지만 Network Load Balancer 에서는 if 문을 통과하지 못한다.
    • $_SERVER ‘Forwarded-proto’ 를 https 로 못 해주기 때문에,
    • $_SERVER ‘HTTPS’ 를 무조건을 ‘on’ 해주면 문제가 해결된다.
      • wp-config.php 파일 내부에 $_SERVER['HTTPS'] = ‘on' 을 설정해주는 솔루션이었다.

댓글