개발자

AWS 로드밸런서 504 오류

2024년 02월 07일조회 814

안녕하세요. 혼자 해보다가 도저히 해결이 되지않아 도움을 구하고자 글을 작성합니다. Express로 구축한 서버를 배포하기위해 AWS EC2를 이용해 ubuntu 인스턴스를 생성한 후 Nginx를 인스턴스 내에 설치하고 Express를 pm2로 구동한 후 Nginx와 proxy를 연결하여 정상적으로 작동됨을 확인했습니다. (Curl 확인 및 퍼블릭 ip주소 접근) 그런데 ACM을 통해 발급받은 SSL인증서를 연동하여 HTTPS연결이 가능하게하려고 로드밸런서를 생성하였는데 cdn접속시 504 오류가 나옵니다. 또, 대상그룹도 아래 사진과 같이 Unhealthy, Request timed out이라 나옵니다 (인스턴스 퍼블릭 IP주소는 정상적으로 접근이 가능함) 어떻게해야 ssl인증서를 연동하여 https연결이 가능하게 할까요 ㅜㅜ 제발 살려주세요 12시간 넘게 삽질중입니다.ㅑ

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 3

장훈님의 프로필 사진

timed out이 나왔다는 것은 일반적으로 방화벽 문제로 봅니다. nginx로 서빙중인 포트에 대해 방화벽을 확인해 보시고 해당 포트에 접근이 모든 ip에 대해서 가능한 상태라면 로드밸런싱의 타겟 그룹 설정에서 인스턴스 포트가 제대로 설정되었는지 확인해보세요. 만약 방화벽 접근이 특정 ip로만 소스 설정이 되었다면 로드밸런서를 소스로 하여 방화벽 설정을 추가해주시면 될 것 같습니다

profile picture

익명

작성자

2024년 02월 08일

nginx 설정이 이렇게 되어있는데.. 대상그룹설정에도 4000포트를 열어줘야할까요? .. 아직도 오류가 해결이 안되어 질문드립니다 server { listen 80; listen [::]:80; server_name server.example.com; location / { proxy_pass http://localhost:4000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_connect_timeout 300; proxy_send_timeout 300; proxy_read_timeout 300; send_timeout 300; } }

장훈님의 프로필 사진

장훈

Solution developer2024년 02월 08일

설정하신대로면 4000포트를 대상그룹 포트로 설정할 필요는 없습니다. 공유 ip로도 80포트에 접근하셨을 것 같고 정상이라고 하셨으니 대상그룹이 80포트를 보도록 설정하셨을 것 같습니다. elb는 alb인가요 nlb인가요?

profile picture

익명

작성자

2024년 02월 08일

alb 입니다. 로드밸런서를 사용하는 용도자체는 SSL인증서 연동인데, 인스턴스 1개로 로드밸런서를 연결하려해서 문제가 되진 않을까요?

장훈님의 프로필 사진

장훈

Solution developer2024년 02월 08일

인스턴스 한개만 붙여도 상관없습니다. 해당 인스턴스에 적용된 보안 그룹 인바운드가 80포트에 대해서도 열려 있나요? alb의 보안그룹을 소스로 지정한 후 해당 포트를 오픈하면 되는데 어차피 0:0:0:0/0으로 80포트 열어두신 것 아닌가요? ssl때문에 alb를 쓰시는거면 보통 443으로 들어온 트래픽을 인스턴스의 80포트로 보낼 것 같은데 인스턴스 보안 그룹 80만 열려있다면 문제가 없을 것 같습니다.

profile picture

익명

작성자

2024년 02월 08일

인바운드는 0:0:0:0/0으로 80포트, 443포트 다 열려 있고 해당 보안그룹을 인스턴스와 로드밸런서가 사용하고 있습니다.. 인스턴스 퍼블릭 ip로는 접속이 되는데 healthcheck에서 계속 막히네요.. 이전에 네트워크 매핑을 ap-northeast-2c 을 체크를 안해놨더니 503오류가 뜨던데 혹시 네트워크 매핑이 문제가되는걸까요 ㅜㅜ 현재 네트워크매핑을 4개 모두 체크해놨습니다..

장훈님의 프로필 사진

장훈

Solution developer2024년 02월 08일

대상 그룹 상태검사 설정은 어떻게 되어 있나요? 트래픽 포트로 설정된거죠? 대상 그룹 타겟 유형이 인스턴스라면 vpc가 다를 경우 등록 대상에 나타나지 않는 것으로 알고 있는데, 대상그룹과 인스턴스가 위치한 존이 다르면 보안 그룹 인바운드 IP가 아무리 0:0:0:0/0 이어도 private IP로 접근 시도할테니 타임아웃이 발생할 수는 있습니다. 혹시 모르니 로드밸런서(ALB)에 설정된 보안 그룹의 아웃바운드 규칙도 체크해 보세요. 보통 보안그룹 아웃바운드 규칙은 모든 포트에 대해 0:0:0:0/0 규칙으로 만들어 질텐데 아웃바운드 규칙에 특정 포트에 대해서만(예를 들어 443만 되어 있다면) 열려 있다면 ALB -> 인스턴스:80 으로 접근이 불가능할 거에요.

profile picture

익명

작성자

2024년 02월 08일

인스턴스입니다!

장훈님의 프로필 사진

장훈

Solution developer2024년 02월 08일

ALB VPC, 타겟그룹 VPC, 인스턴스 VPC 모두 동일한 VPC인가요? 동일한 보안 그룹을 썼을 때 해당 현상이 발생할 수 있는지는 제가 잘 모르겠습니다 보통은 분리를 하니까요. 몇시간째 고생하고 계시니 이것저것 다 시도해 보셔요

profile picture

익명

작성자

2024년 02월 08일

넵 모두 동일한 VPC입니다... express로 작성된 코드가 문제인지도 확인을 해봤는데 문제가 되지 않고.. 유휴 제한시간을 늘려보라는 글을 읽어서 nginx의 send_time_out 값을 300으로 늘리고 유휴제한시간도 300으로 늘려보았는데도 해결이 되지 않네요..ㅜㅜ

장훈님의 프로필 사진

장훈

Solution developer2024년 02월 08일

nginx 설정에 의해 안 됐다면 public ip로 접근했을 때도 타임아웃이 발생했어야 합니다. nginx(또는 방화벽)에서 source ip 에 대한 접근제한 설정을 별도로 하지 않았다면 private ip로 접근했을 때도 정상적으로 접근되어야 합니다. 내부적으로 문제가 있는지 보고자 한다면 우선 동일한 vpc에 위치한 다른 인스턴스를 통해 private ip로 접근(curl 등)해볼 수 있습니다. nginx와 별개로 보고자 한다면 sudo nc -l 80 명령으로 80 포트를 수신 상태로 만들고 다른 서버나 LB 헬스체크 트래픽 유입을 관찰하는 것도 방법입니다. 다른 원인이 있을 것 같은데 질문자님의 AWS 콘솔을 직접 보고 있는게 아니라서 한계가 있네요. 차근차근 짚어나가면서 해결해 보셔야 할 것 같습니다. 인스턴스만 남겨두고 모든 리소스(ALB, 타겟 그룹 등)를 삭제하고 다시 생성하여 절차를 진행해보시는 것도 좋을 것 같습니다.

profile picture

익명

작성자

2024년 02월 08일

친절한 답변 정말 감사드립니다. 말씀주신 내용들 고려하면서 수정해봤는데 해결했고 Route 53으로 도메인 연결까지 성공했습니다. 해결방법으론, 현재 인스턴스가 사용중인 보안그룹과 ALB의 보안그룹을 분리하여 생성하였습니다. 1. ALB의 보안그룹의 인바운드 규칙엔 0:0:0:0/0 으로 80포트, 443 포트가 열려있고 아웃바운드도 마찬가지로 모든 포트에 대해 0:0:0:0/0으로 열었습니다. 2. 인스턴스의 보안그룹의 인바운드 규칙엔 ALB의 보안그룹으로 80포트, 443포트를 열어두었고, 아웃바운드는 ALB의 보안그룹과 동일합니다. 덕분에 해결했습니다 바쁜시간 쪼개어 답변남겨주셔서 정말 감사합니다!!!

장훈님의 프로필 사진

장훈

Solution developer2024년 02월 08일

답변 드린 보람이 있었네요 좋은 하루 되세요 :)

profile picture

익명

작성자

2024년 02월 08일

트래픽포트로 설정되어있고, ALB 로그를 확인해봤는데 말씀해주신대로 target:port가 private IP : 80으로 되어있습니다. 인스턴스와 로드밸런서 둘 모두 같은 보안그룹을 사용하고 있고, 인바운드 : 0:0:0:0/0 으로 80포트, 443 포트가 열려있고 아웃바운드: 0:0:0:0/0 으로 모든포트가 열려있습니다. 보안그룹을 분리해서 설정해야될까요?..

장훈님의 프로필 사진

장훈

Solution developer2024년 02월 08일

타겟 그룹의 대상유형은 인스턴스인가요? IP 주소 인가요?

profile picture

익명

작성자

2024년 02월 08일

--

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!