AWS/Elastic Beanstalk

Elastic Beanstalk에 도메인 연동과 SSL

Dev갱이 2024. 8. 17. 21:16
728x90
먼저 도메인을 구입 해야한다. 찾아보니 도메인을 구매 해야 되는데 가장 저렴한곳이 가비아인것 같았다.

 

1. 도메인 구입

가비아에 회원가입 한 후 원하는 도메인을 입력하고 나는 shop으로 끝나는 도메인을 구입했다.
1년에 500밖에 하지 않는다.

 

2. SSL 연결을 위한 443 포트 인바운드 규칙 추가

 

VPC -> 보안그룹

443 https 인바운드 규칙을 추가 해주자

 

3. AWS Certificate Manager SSL 인증서 연동

인증서 요청 클릭

퍼블릭 인증서 요청 -> 다음

 

도메인이 만약에
naver.shop이면
*.naver.shop 도 추가 해준다.
서브 도메인들을 다 와일드카드로 추가 해준다는 뜻이다
도메인만 등록 한 후 쭉 아래로 내려서 요청을 누른다.
검증 요청 하는동안 Route 53 고고

4. AWS Route 53

 

호스팅 영역 생성 클릭!

 

도메인 이름에 구매했던 도메인을 넣고 쭉 아래로 내려서 -> 호스트 영역 생성 클릭

 

해당 트래픽 라우팅 대상의 주소를 가비아에 등록 해주어야함 !!

유형이 NS인 녀석의 주소 4개가 있을것이다.

 

My 가비아 페이지로 돌아가서, 위에서 확인한 NS 4개의 값을 구매한 도메인의 네임서버 설정에서 1~4차에 기입한다.

AWS Certificate Manager 에 다시 간 다음에 

CNAME을 발급하게 되는데 이 레코드를 가비아에 돌아가서 등록해줌으로써 도메인 검증 절차를 진행할 수 있게 된다.

 

 

 

호스트명을 cname 앞에 서브도메인을 넣고 값에는 값을 넣어준다.

 

인증서 DNS 레코드 생성 클릭

레코드 생성 클릭!

- ( https://repost.aws/knowledge-center/acm-certificate-pending-validation )

검증이 안되면 위의 글을 확인 해보기 나는 30분 있으니까 검증으로 바뀌었다.

 

 

5. Elastic Beanstalk 연결

 

Elastic Beanstalk -> 구성으로 가서  -> 인스턴스 트래픽 및 크기 조정 구성 -> 편집

 

단일 인스턴스 -> 로드 밸런싱 수행 으로 변경하고 나머지 설정은 그대로 둔채 적용 클릭 적용을 누른다

 

그다음 Route53으로 이동하여 레코드 생성 클릭

별칭 을 꼭 눌려줘야함!!!! 한참 찾았다.

 

Application/Classic Load Balencer에 대한 별칭
한국 선택
로드 밸런서 선택
-> 레코드 생성

로드 밸런서로 443 포트 열어주기

Elastic Beanstalk -> 구성으로 가서  -> 인스턴스 트래픽 및 크기 조정 구성 -> 편집

 

쭉 내리면 리스너가 있는데 여기서 리스너 추가

저장 후에 -> 밑으로 쭉 내려서 적용을 클릭해준다!

찾아보니 nginx에서 ssl 인증서에 접근 할 수 없는것 같다.
ACM 인증서를 사용하는 경우, Elastic Load Balancer에서 SSL 처리하고 로드 밸런서의 SSL 리스너를 설정하고, NGINX는 내부에서 HTTP로만 통신하도록 설정하는 것이 일반적
정리

 

  • Route53을 이용해서 도메인을 연결
  • AWS Certificate Manager SSL 을 이용해서 무료 SSL 인증서 발급
  • docker 환경으로 배포 했기 때문에 나한테는 nginx was가 존재하는데 nginx에서는 ACM 인증서에 접근 할 수 없음.
  • 그래서 ACM 인증서는 Elastic Load Balancer와 위에서 연결 해주었기 때문에 해당 로드 밸런서에 443포트 리스너를 추가 해준것.
  • 그래서 로드밸런서에서 SSL 처리를 하고 nginx 내부에서는 http 통신 80 포트로 통신하도록 설정

사용자가 도메인을 검색하고 접속 했을때

  1. Route 53: 사용자가 https://도메인.com에 접속하면, 먼저 DNS 요청이 발생하여 도메인에 대한 IP 주소를 조회하고 이를 Route 53에서 설정된 DNS 레코드에 따라 요청이 적절한 Application Load Balancer (ALB)로 전달한다.
  2. Application Load Balancer (ALB):
    • ALB는 ACM(AWS Certificate Manager)에서 발급받은 SSL 인증서를 사용하여 HTTPS(포트 443) 연결을 처리합니다. 이게 가능한 이유는 내가 로드 밸런서 리스너에 인증서와 443 포트를 설정 해주었기 때문이다. 이 단계에서 SSL 인증서가 유효한지 검증되고, 클라이언트와 로드 밸런서 간의 통신이 암호화됩니다.
    • ALB는 HTTPS로 받은 요청을 해독한 후, NGINX 서버로 트래픽을 전달합니다.
  3. NGINX docker환경 was서버
    • ALB에서 HTTP(포트 80)로 요청을 전달받습니다. 이 시점에서 로드 밸런서가 이미 SSL 해독을 완료했으므로, NGINX는 내부적으로 HTTP를 통해 통신합니다.
    • NGINX는 받은 요청을 기반으로 적절한 프록시 규칙에 따라 백엔드 서비스(frontend, backend)로 요청을 전달합니다.
    • 핵심: docker 환경에서의 nginx에서는 ACM 인증서위치에 접근 할 수 없다. 다시 말해 nginx에 443 설정을 하면 안된다.

 

 

 

---- 아래 부터는 에러 잡아가는 과정 ------

에러 발생!!!!!!

Environment health has transitioned from Ok to Warning. One or more TargetGroups associated with the environment are in a reduced health state: - awseb-AWSEB-TBPD3ZS9NQRH - Warning

 

- ( https://repost.aws/ko/knowledge-center/elastic-beanstalk-https-configuration )

Application Load Balancer 고정으로 수정 안되니까 해당 부분 읽어보면
1. 리스너 추가를 선택합니다.
2. Port의 경우 수신 트래픽 포트(일반적으로 443)를 입력합니다.
3. 프로토콜에서는 HTTPS를 선택합니다.
4. SSL 인증서의 경우 인증서를 선택한 다음 드롭다운 목록에서 SSL 정책을 선택합니다.
5. 추가를 선택한 다음 적용을 선택합니다.
위에서 내가 SSL 정책 선택 안해서 설마 접속 안되는건가 그건 아니였던것 같다.

 

- (https://repost.aws/ko/knowledge-center/acm-certificate-error-https)

 

위의 글을 읽어보니까 내가 https를 와일드 카드로 지정해주어서 그런것 같기도 하다.

 

에러 발생

 

Environment health has transitioned from Ok to Severe. ELB processes are not healthy on all instances. ELB health is failing or not available for all instances.

 

docker 환경에 배포 했음으로 nginx 에서 SSL연결을 사용하기 위해 443 연결 설정을 등록 해주었는데 eb로그를 보면 아래와 같은 에러가 발생했다.

 

----------------------------------------
/var/log/eb-docker/containers/eb-current-app/eb-stdouterr.log
----------------------------------------
nginx-1     | 2024/08/19 06:23:25 [emerg] 1#1: host not found in upstream "backend:5001" in /etc/nginx/conf.d/default.conf:6
nginx-1     | nginx: [emerg] host not found in upstream "backend:5001" in /etc/nginx/conf.d/default.conf:6
아무래도 nginx에서 backend:5001을 찾을 수 없다는 에러이고 이것은 nginx 설정이 무언가 잘못 됬음을 의미한다.

 

 

찾아보니 nginx에서 ssl 인증서에 접근 할 수 없는것 같다.
ACM 인증서를 사용하는 경우, Elastic Load Balancer에서 SSL 처리하고 로드 밸런서의 SSL 리스너를 설정하고, NGINX는 내부에서 HTTP로만 통신하도록 설정하는 것이 일반적

즉, Application 로드 밸런서를 사용 하고 있으니까 해당 로드 밸런서에서 리스너를 443을 등록한후

Nginx에서는 HTTP 로만 통신 하는게 일반적

 

배포에 성공 했다. 

 

 

Reference

- ( https://velog.io/@jonghyun3668/EC2-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%97%B0%EB%8F%99-%EB%B0%8F-https-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0 )

- ( https://kiwi-wiki.tistory.com/30 )

- (https://velog.io/@wldns2577/AWS-Route-53-ACM-%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%82%AC%EC%84%A4-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%97%B0%EA%B2%B0-%EB%B0%8F-HTTPS-%EC%A0%81%EC%9A%A9)

-( https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/environments-cfg-alb.html)

- (https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-beanstalk-environment.html#routing-to-beanstalk-environment-deploy )

- (https://repost.aws/ko/knowledge-center/elastic-beanstalk-https-configuration)

728x90