https:// 로 정상적으로 접속이 안된다. 설정이 뭔가 잘못되었다. [작성중!!
]
배포 단계에서 https 설정을 위해서 SSL 인증서를 발급받았는데 방법은 두가지가 있었다.
1.
아마존 AWS 서비스 중 Aws Certificate Manager (ACM) 을 통해서 무료로 SSL 발급 받기.
2.
도메인 및 호스팅 업체(ex: cafe24, 가비아 등)으로 부터 SSL 유료 발급 받기.
이번에 적용시켜 본 것은 ACM을 통해서 SSL을 발급 받고, 아마존 인프라 환경 내에서 적용시키는 방법이었다. 배포 컴퓨터 자체가 EC2의 인스턴스이기 때문에, 뭔가 자동으로 적용시켜 주는 것 같았다. 하지만 뭔가 생소하긴하다. 아마존 서비스는 뭔가 호스팅 이런 용어를 사용하지 않아서 약간의 혼동이 있었다. 그리고 대부분 클라우드 환경으로 조금 예전부터 한국에서 사용되오는 cafe24같은 호스팅업체의 방식들이 들어있긴 하지만 뭔가 햇갈린다..
하지만 cafe24, 가비아 같은 한국 업체들의 서비스 형태는 대부분 비슷하게 느껴졌다.
어찌 되었든, AWS 서비스 내에서 해결되는 문제로 보여져서 내가 전체적으로 어설프게 알고 있는 부분과 좋은 가이드를 비교하며 차이점을 보면서, 가이드를 천천히 다시 따라가서 문제를 찾아보고자 한다.
내가 각 서비스마다 해야할 것과 그 서비스의 핵심 내용은 다음과 같다.
•
ACM에서, 인증서발급 및 구매한 특정 도메인에 SSL 적용
•
Route 53에서, 인스턴스의 서버 실행 시 연결되는 포트
◦
EC2 콘솔의 입장에서는 localhost지만,
◦
그 컴퓨터는 EC 인스턴스 서비스에서 해당 컴퓨터의 내부, 외부 IP의 8080포트와 연결된다.
◦
그 중 외부에서 접근 할 수 있는 외부 IP에 :8080 포트로 접속 하면 실행되고 있는 웹서버(스프링프로젝트)의 프론트 페이지에 접근(요청)하게 된다.
◦
그럼, 포트 번호 규칙에 따라 일반적으로 80번 포트는 생략 가능하므로,
◦
EC2 인스턴스의 외부 IP주소를 다른 컴퓨터에서 브라우저를 통해 접속하면, 80번포트를 요청하게 된다.
◦
명시적으로 EC2 인스턴스의 외부 IP주소 + :8080 포트를 입력하게 된다면,
◦
해당 EC2 인스턴스가 웹서버를 실행중이라면 해당 프로젝트의 메인 페이지를 볼 수 있다.(…:8080/ 이란 요청에 대한 응답 홈컨트롤러의 “/”와 맵핑된 API)
◦
그럼, 해당 홈페이지를 들어가기 위해서는 8080포트를 항상 써줄 수 없기 때문에, 포트포워딩으로 8080포트를 80번로 연결하면, 외부 ip주소:80포트로 해당 홈페이지를 볼 수 있다.
◦
더해서 브라우저의 기능과 일반적인 포트에 대한 규칙에서는 “ :80 “ 포트는 생략하면 80번 포트를 찾아가도록 되어있기 때문에 이말은 곧 해당 IP외부 아이피만으로 그 서버 컴퓨터가 실행하고 있는 홈페이지로 들어갈 수 있다는 말이다.
◦
따라서, 해당 외부 IP를 구매한 도메인 등 과 연결 시키면,
◦
도메인 주소만으로도 해당 홈페이지를 접속 하게 된다는 것이다.
•
EC2에서, 인스턴스 외부아이피와 연결
◦
로드 밸런서의 역할, 구성을 다시 살펴봐야 한다.
◦
EC2에서의 방화벽 설정도 다시 확인해야 한다.
위 과정은 글로는 좀 복잡해보이지만 그냥 계속돌아가는 컴퓨터 한대에 인터넷이 연결되어있고 홈네트워크가 아닌(192.168.0.1~255 : xxxx) 외부 다른 위치에서 저 PC에 접속(외부 ip를 통해)하면 된다는 내용으로 이해하고 있는데, 잘못되거나 부족한 부분이 많다. 거기에 SSL 인증서가 추가되어 조금 혼동이 있다. 어떻게 적용되는지 조금 정리가 잘 된 가이드, 또는 나의 환경과 목표와 유사한 사례를 찾아내는 것이 우선이다.
참고 개발 블로그들
우선 참고하고 있는 가이드들을 찾아보고 있다. 일부 was부분이 다르기도하다. 나는 스프링 내장 Apache Tomcat으로 되어있지만, 다른 개발자분들은 nginx를 사용하기도 한다. 이 부분은 Spring 자체에서 제공되는 내장 was로도 대체되기 때문에 추가적인 설정없이 그대로 사용하고자 한다. 아마 다른 was를 쓰려면 미들웨어가 필요한 경우도있었고, 내 프로젝트의 목적과 조금 달라 질 수 있어서 우선 내장 서버를 통해서 해결해보고자 한다. 예전에 flask의 경우 uwsgi와 같은 미들웨어와 nginx를 도커를 통해 배포해야 했지만, 그러한 기능이 모두 압축된 것이 spring의 apache tomcat이라는 생각이 든다.
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
좀 더 구체적인 방법을 위해 다시 ChatGPT와의 대화
나는 지금 spring boot 프로젝트를 아마존의 ec2를 통해서 배포하려는데, HTTPS를 위해서 ACM서비스에서 인증서를 그 ec2의 인스턴스에 적용하려 하고있어. 이러면 프로젝트에 별도로 설정해야하는것이 있는거야? 아니면 ec2, route53, acm의 연결과 ec2에서 로드밸런서 부분만 설정하면될까?
HTTPS를 위해 ACM(AWS Certificate Manager)에서 인증서를 사용하는 경우, Spring Boot 프로젝트 자체에는 일반적으로 추가적인 설정이 필요하지 않습니다. 인증서를 적용하는 주요 부분은 웹 서버(예: Apache, Nginx)나 로드 밸런서의 설정에 해당합니다.
여러 컴포넌트 간의 연결과 설정은 다음과 같이 이루어질 수 있습니다:
1.
ACM에서 SSL/TLS 인증서 생성:
•
AWS Certificate Manager 콘솔에서 SSL/TLS 인증서를 생성하고 인증서를 검증합니다.
2.
EC2 인스턴스에 인증서 적용:
•
생성한 인증서를 사용하여 로드 밸런서(Load Balancer) 또는 직접 EC2 인스턴스에 SSL/TLS를 적용합니다.
3.
로드 밸런서 설정:
•
로드 밸런서를 사용한다면, 로드 밸런서에서 HTTPS 리스너를 구성하고 생성한 ACM 인증서를 연결합니다.
4.
Route 53 설정:
•
ACM에서 발급한 도메인에 대한 DNS 레코드를 설정합니다. 이를 통해 도메인을 사용하여 애플리케이션에 접근할 수 있게 됩니다.
5.
Spring Boot 프로젝트 설정:
•
Spring Boot 애플리케이션에서는 주로 HTTPS 프로토콜을 사용하는 데 필요한 특별한 설정이 필요하지 않습니다. 다만, Spring Security를 사용하는 경우, HTTPS를 강제로 사용하도록 설정할 수 있습니다.
주의할 점은, EC2 인스턴스에서 직접 ACM 인증서를 적용하는 것이 아니라면, 로드 밸런서 등에서 올바른 인증서를 선택하고 설정해야 합니다. 또한, 방화벽 설정 등에도 주의가 필요할 수 있습니다.
프로젝트 특정 설정이 필요한지는 프로젝트의 세부 사항 및 사용하는 라이브러리에 따라 다를 수 있습니다. 일반적으로는 위의 단계들을 따르면 대부분의 경우에 HTTPS를 구성할 수 있습니다.
로드밸런서 대상그룹 unhealthy 해결이 필요해
로드밸런서에서 unhealthy가 나타나고있어
i-092a8110b97d62297 myweb 80 ap-northeast-2c unhealthy Health checks failed
i-092a8110b97d62297 myweb 443 ap-northeast-2c unhealthy Health checks failed
HTTPS를 적용했더니 이래
로드 밸런서에서 "unhealthy" 상태가 나타나면 로드 밸런서의 헬스 체크에 실패했다는 의미입니다. HTTPS를 적용한 후에 이 문제가 발생한다면, 주로 다음과 같은 이유로 발생할 수 있습니다:
1.
보안 그룹 또는 방화벽 설정: 로드 밸런서에서 인스턴스로의 트래픽을 허용하기 위해 보안 그룹 또는 방화벽 규칙을 제대로 구성하지 않았을 수 있습니다. 로드 밸런서가 인스턴스로 트래픽을 라우팅할 때 필요한 포트를 열어주는지 확인하십시오.
2.
SSL/TLS 인증서 구성: HTTPS를 사용하려면 SSL/TLS 인증서를 올바르게 구성해야 합니다. 로드 밸런서에 연결된 인스턴스에서 사용하는 SSL/TLS 인증서가 올바른지 확인하고, 인증서의 만료일자를 확인하여 만료되지 않았는지도 확인하십시오.
3.
Health Check 설정: 로드 밸런서의 헬스 체크 엔드포인트가 올바르게 구성되었는지 확인하십시오. 헬스 체크 엔드포인트는 로드 밸런서가 각 인스턴스의 상태를 확인하는 데 사용됩니다. 헬스 체크가 실패할 경우 "unhealthy" 상태로 표시될 수 있습니다.
4.
보안 그룹 또는 NACL에서 인바운드 및 아웃바운드 규칙 설정: 로드 밸런서와 인스턴스 간의 통신을 가능하게 하는 보안 그룹 및 NACL(Network Access Control List) 규칙을 올바르게 구성하십시오.
5.
인스턴스 상태: 로드 밸런서 헬스 체크가 실패하는 인스턴스의 상태를 확인하십시오. 인스턴스가 올바르게 실행 중이고 헬스 체크 엔드포인트에 응답해야 합니다.
6.
로드 밸런서 구성: 로드 밸런서의 리스너 및 대상 그룹 설정을 확인하십시오. 대상 그룹에 연결된 인스턴스가 올바른지 확인하고, 로드 밸런서 리스너의 포트 및 프로토콜 설정이 올바른지 확인하십시오.
7.
로드 밸런서 로그 확인: 로드 밸런서의 로그를 확인하여 구체적인 오류 메시지나 문제를 식별하십시오. 로드 밸런서 로그는 CloudWatch Logs 또는 로드 밸런서 콘솔에서 확인할 수 있습니다.
우선 내가 준비된 것을 살펴보자.
프로젝트 - jar파일(로컬에서 테스트됨)
EC2 인스턴스(고칠 때 새로 생성해야 할 수도 있음)
ACM 인증서
도메인 citefred.store(가비아에서 구매)
혹시몰라서 구매한 SSL유료 인증서(cafe24에서 구매)
이것을 통해서 기초 CS지식이 부족함을 느끼고 있다. 해결도 해결인데, 전체 흐름 자체에 애매하게 알고있는 부분이 너무 많다. 이런 부분들을 정리할 필요를 느끼게 되었다.
도메인을 route53에서 직접 구매해보고 확인해봐야겠다.
https://velog.io/@tyjk8997/%EB%B0%B0%ED%8F%AC-EC2-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4%EC%97%90-HTTPS-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0-with-Route53-ALB