본문 바로가기

카테고리 없음

[aws] Route53 등록 및 ec2 연동 (3)- ssl 인증서 발급하기

 

단순하게 인증서를 발급하는 건 아래 명령어만 실행하면 된다. 

docker-compose run --rm certbot certonly --webroot --webroot-path=/var/www/certbot -d ${domain_name} -d
www.${domain_name}

 

그러나 명령어를 실행하기 전에, 네트워크 면에서 사전작업이 많이 필요하다. 

나는 삽질을 하느라 인증서 발급 요청을 너무 많이 해서 락이 걸리기도 했다. 

(몇 분 뒤에 다시 시도해달라는 메시지...)

 

 

어떤 작업이 필요한지 차례대로 알아보자. 

 

1. ec2 방화벽 오픈 

80, 443 포트에 대한 방화벽이 열려있어야 한다. 그래야 certbot에서 인증서 발급받을 때 통신을 할 수 있는 것 같다. 

어차피 도메인을 사용하려면 열려있어야 하는 방화벽이니 인증서를 발급하기 전에 미리 열어준다. 

나는 80만 열고 443을 안 열어서 삽질을 했다. 

아래 순서대로 하면 된다. 

 

1) ec2 → instances 에서 내 서버의 보안그룹명을 확인 

 

2) Security Groups 탭 클릭

→ 리스트에서 보안그룹명을 찾아서, 왼쪽 체크박스를 클릭하면 하단에 상세 정보가 표시된다. 

Inbound rules 클릭한 뒤 Edit inbound rules 버튼 클릭 

 

 

3) 아래 그림처럼 80, 443 포트를 열어준다. 

 

2. Route53 에서 발급한 도메인과 ec2 서버 연결 

생각해보면 당연한 이야기인데, 내가 발급한 도메인과 ec2 서버를 연결해줘야 한다. 

나는 연결을 안 한 채 인증서 요청을 해서 계속 A레코드가 없다는 에러가 발생했다. 

 

1) Route 53 → Hosted zones 탭에 들어간다. 그리고 리스트에서 내가 만든 도메인명을 클릭한다. 

 

여담이지만, 나는 호스트 존에 www.${domain_name} 을 등록했는데, 지금 찾아보니까 꼭 그렇게 할 필요는 없는 것 같다.

www가 붙은 도메인 라우팅은 route53에서 자동으로 관리해준다고 한다. 

 

2) 도메인 상세 정보 창에서, 레코드 목록을 확인할 수 있다. 

+) DNS 레코드란? 

DNS 레코드는 DNS 서버 내에서 도메인 이름을 인터넷 프로토콜(IP) 주소와 연결하는 데 사용되는 일련의 지침이라고 한다. 

 

DNS = IP주소를 우리가 읽기 편한 도메인 형태로 변환해주는 시스템 

DNS 레코드 = IP주소와 도메인을 연결해주는 설정 

 

이렇게 이해하면 될 것 같다. 

 

A레코드, AAAA레코드, CNAME 레코드 등 다양한 종류가 있다. route53에서는 alias를 사용해서 ALB, S3등 컨테이너를 다이렉트로 연결할 수도 있는 모양이다. 

다양한 레코드 타입...

레코드 종류에 대해 설명하는 건 포스팅의 목적과 어긋나니 생략하도록 하겠다. 

나는 IPv4 주소를 도메인 이름과 연결해주는 A레코드 설정을 했다. 그런데 그러려면 ec2에 IPv4 주소가 있어야 한다. 

 

여기서 elastic IP를 사용하게 된다. 

 

3) elastic IP 발급하기 

설명을 하느라 순서가 조금 꼬이고 있다 ㅎㅎ; 레코드 설정은 잠시 멈추고 다시 ec2 대시보드로 돌아간다. 

좌측 탭에서 Elastic IPs를 클릭한다. 

나는 발급을 받아서 리스트에 목록이 있는데, 발급받은 적이 없다면 리스트가 0건으로 뜰 것이다. 

우측 상단의 Allocate Elastic IP address를 클릭한다. 

 

+) 그런데 elastic IP가 뭔가요? 

aws에서는 인스턴스 당 딱 1개의 고유ip를 무료로 제공한다. 이것을 elastic IP라고 한다. 

aws 인스턴스는 기본적으로 재시작할 때마다 private ip가 바뀌는데, private ip랑 관련없이 사용할 수 있는 고정 ip를 발급해주는 것이다. 

 

Allocate Elastic IP address 버튼을 클릭하면 아래와 같이 ip 할당하는 창이 나온다. 

나는 이미 발급받아서 창이 이렇게 뜨는 것 같은데, 발급받지 않은 상태라면 어떻게 뜨는지 잘 기억이 안 난다.

아마 리전과 ec2 인스턴스를 연결한 뒤 생성 버튼을 클릭하면 ip가 발급될 것이다. 

잘 모르겠다면 다른 블로그를 참고바란다. 

 

ip를 발급하면 Elastic IPs 페이지 리스트에서 확인할 수 있다. 이 ip주소를 잘 복사해두고 다시 레코드를 생성하러 가자. 

 

4) A 레코드 생성하기 

Route 53 → 도메인 별 상세 페이지 → create record 버튼 (본 포스팅 2번 내용 참고)

서브도메인은 비워둔다. 

레코드 타입을 A로 선택한 뒤, 하단 큰 textarea에 3번에서 생성한 Elastic IP 값을 입력한다. 

그리고 스크롤을 쭉 내려서 create record 버튼을 클릭한다. 

 

레코드 생성까지는 시간이 좀 걸리는 것으로 기억한다. 

 

 

3. 인증서 발급 

여기까지 하면 사전 네트워크 세팅은 끝이다. 

서버로 돌아가서 아래 명령어를 수행한다. 

docker-compose run --rm certbot certonly --webroot --webroot-path=/var/www/certbot -d ${domain_name} -d
www.${domain_name}

아래처럼 나오면 인증서 생성이 잘 된 것이다! 

만료일은 12월 10일이라고 한다. 

 

아직 끝나지 않았다. 로그에 표시된 인증서 키(fullchain.pem, privkey.pem) 위치를 잘 복사해둔다. 

nginx.conf에 인증서 위치를 등록해줘야 한다. 

 

 

4. nginx.conf 파일 변경 

443 포트에 대한 라우팅 설정을 추가하며, 인증서 경로도 함께 추가한다.

events {}

http {
        server {
                listen 80;
                ...
        }

        # 아래 부분 추가!! 
        server {
                listen 443 ssl;
                server_name ${domain_name}.com www.${domain_name}.com;

                # SSL 인증서 경로 (Certbot이 발급한 경로)
                ssl_certificate /etc/letsencrypt/live/${domain_name}.com/fullchain.pem;
                ssl_certificate_key /etc/letsencrypt/live/${domain_name}.com/privkey.pem;

                ssl_protocols TLSv1.2 TLSv1.3;
                ssl_prefer_server_ciphers on;
                ssl_ciphers HIGH:!aNULL:!MD5;

                # 로깅 
                access_log /var/log/nginx/access.log;
                error_log /var/log/nginx/error.log;

                location /.well-known/acme-challenge/ {
                        root /var/www/certbot;
                }

                location / {
                        proxy_pass http://app:8000;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                        proxy_set_header X-Forwarded-Proto $scheme;
                }
        }
}

 

 

nginx.conf 변경사항을 반영하기 위해 도커 컨테이너를 재실행한다. 

그리고 브라우저에서 도메인 주소로 접속했을 때 내 프로그램이 응답값을 잘 주는지 확인한다. 

잘 접속된다면 성공이다! 

 

인증서 유효기간이 지났을 때 재발급하는 것도 추가해야 하는데, 이건 천천히 하려고 한다. 

 

 

추가적으로, connection 에러가 계속 난다면 웹서버, nginx가 오류 없이 기동되고 있는지 docker-compose logs로 확인하길 추천한다. 

웹서버, nginx가 안 떠있다면 인증서 발급도 안 된다. 

 

 

 

- 참고자료 

https://olrlobt.tistory.com/82

 

[INFRA] Docker에서 Nginx 컨테이너 실행과 https 설정하기

[INFRA] Nginx를 사용하여 HTTPS 요청 처리하기 2024.02.19 - [Infra] - [INFRA] EC2 서버 기본 설정과, SWAP메모리 할당하기 [INFRA] EC2 서버 기본 설정과, SWAP메모리 할당하기 이번 프로젝트에서 인프라를 담당하

olrlobt.tistory.com

 

https://www.ibm.com/kr-ko/think/topics/dns-records

 

DNS 레코드란 무엇인가요? | IBM

도메인 이름 시스템(DNS) 레코드는 DNS 서버 내에서 도메인 이름을 인터넷 프로토콜(IP) 주소와 연결하는 데 사용되는 일련의 지침입니다.

www.ibm.com

https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html

 

탄력적 IP 주소 - Amazon Elastic Compute Cloud

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

https://docs.aws.amazon.com/ko_kr/Route53/latest/DeveloperGuide/routing-to-ec2-instance.html

 

Amazon EC2 인스턴스로 트래픽 라우팅 - Amazon Route 53

탄력적 IP를 릴리스하는 경우 탄력적 IP를 가리키는 DNS 레코드도 삭제해야 합니다. 그렇지 않으면 DNS 레코드가 손상되어 권한 없는 사용자가 레코드를 조작하게 될 수 있습니다.

docs.aws.amazon.com