본문 바로가기
AWS

SpringBoot API 개발팀을 위한 aws 세팅

by wwns 2022. 7. 30.
반응형

AWS에서 EC2를 생성해, 개발팀이 공동으로 작업할 수 있는 서버를 만드는 과정

SpringBoot, Nginx, Tomcat, Mysql

AWS : EC2, Route53(Domain), Certificate Manager, SSL, ELB(ALB)


 

EC2를 먼저 생성한다.

AWS에 로그인을 한 후, EC2 서비스에 들어가 인스턴스 시작을 누른다.

인스턴스 설정

그러면 Quick Start라며 AMI를 보여준다. AMI는 쉽게 말하면 AWS에서 미리 구축해놓은 서버를 이미지(컨테이너)로 만들어 제공을 해주는 것이다.

나는 우분투를 선택하였고, 인스턴스 유형은 CPU와 메모리를 선택하는 것인데, t2.small을 선택했다.

나중에 CPU나 메모리가 부족하면 AMI 서비스를 이용해 내가 구축해놓은 서버를 이미지로 복사해서 트래픽을 분산해서 처리할 수 있기 때문에 일단은 별 걱정 없이 선택했다..

 

그 다음은 키 페어를 생성하는 것이다. ssh 접속을 하기 위해 필요하며, ssh 접속이 정확히 무슨 뜻인지 모른다면 꼭 알아보도록 하자. 너무 많이 사용되고 흔하게 사용됨.

이전에 다른 프로젝트에서 사용하던 키가 있으면 그걸 공용으로 사용해도 된다. 나는 새로 생성해서 각 인스턴스를 분리해 사용하였다.

키 페어 생성

보안 그룹 설정, 스토리지 구성을 하고 인스턴스를 생성하였다.

보안 그룹을 통해 인바운드 규칙을 설정했는데, 우리가 사용할 tomcat, mysql, ssh, web에서 사용되는 포트를 열어주었다.

tomcat 8080, mysql 3306 ssh 22(나는 ec2에서 config를 변경해 다른 포트를 사용했다), web 80(HTTP), 443(HTTPS)

스토리지는 하드웨어라고 생각하면 된다! 최대 30GB까지 무료?라는 것 같다. 나중에 금액 청구에 문제가 있으면 낮추면 된다..


EC2를 생성하고, 우린 개발을 진행하면서 고정 IP를 사용할 것이기 때문에 탄력적IP를 생성하여 EC2에 할당된 IP주소를 연결해주었다. 이 과정은 간단하니 생략하겠다.

 

EC2를 생성하고, running 상태가 되면 EC2에 ssh접속해서 필요한 라이브러리들을 설치한다.

ssh 접속

ssh -i your_key.pem ubuntu@your_ip_or_dns -p 22222

인증서가 있는 위치에서 위의 명령어를 호출하면 ssh 연결이 될 것이다.

ssh 연결

위에서 보안그룹의 ssh를 22번 포트로 했다면 -p옵션을 22로 해도 좋다. 만약 나처럼 22222 포트로 변경하고 접속을 하고 싶다면 aws에 다시 가서 생성한 ec2로 들어가면 "연결" 버튼이 있을 것이다. 

EC2 연결

AWS에서 EC2에 접속하여 터미널창을 켤 수 있다. 여기서 ssh config파일을 수정해주면 포트를 변경할 수 있다.

만약 접속이 안된다면 22번 포트를 인바운드 규칙에 추가하고 ssh 접속을 한 후 config파일을 수정하고 다시 인바운드 규칙에서 22번 포트를 없애줘도 된다.

22번 포트가 아닌 다른 포트를 사용하는 이유는 무선 Wifi 환경이나 유선랜(공유기)을 사용할 때 보안 문제로 22번 포트가 막혀있는 경우가 많기 때문에 다른 포트를 사용한다. 포트는 다른 프로토콜에서 사용하는 포트가 많기 때문에 10000번 이상의 포트를 사용하는 것을 추천한다.

sudo vi /etc/ssh/sshd_config
# #Port 22를 찾아 주석을 해제한 후 사용할 포트번호로 변경한다.
sudo systemctl restart sshd
# 혹은
sudo service sshd restart

이제 ssh 접속을 한 후 필요한 라이브러리들을 다운로드 한다.

 

자바 설치

sudo apt-get update
sudo apt install openjdk-11-jdk
java -version # 설치 확인

톰캣 설치

cd /usr/local
sudo wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.65/bin/apache-tomcat-9.0.65.tar.gz
sudo tar xvf apache-tomcat-9.0.65.tar.gz

Mysql 설치

sudo apt update # MySQL 설치를 위해 업데이트
sudo apt install mysql-server # MySQL 서버 설치
sudo mysql -u root -p # MySQL 접속

사용자 생성 및 외부 접속 허용

use mysql; CREATE USER '{username}'@'%' IDENTIFIED BY '{password}'; # 생성할 사용자 비밀번호 설정
GRANT ALL PRIVILEGES ON *.* TO '{username}'@'%'; # 외부 접속이 가능하도록 설정
FLUSH PRIVILEGES;
exit;
# 외부 접속 허용
cd /etc/mysql/mysql.conf.d;
sudo vi mysqld.cnf;
## bind-address = 0.0.0.0
sudo service mysql restart

내 로컬 pc에서 접속이 되는지 테스트

MySQL 외부 접속

Nginx 설치

sudo apt-get install nginx

배포하기 위한 준비는 끝난 것 같다. 이제 nignx, tomcat을 구동시켜서 스프링 부트 API를 빌드하여. war파일을 올리면 된다. 또한, tomcat은 포트가 8080인데 우리는 보통 naver에 들어가거나 할 때 포트를 적지 않는다. 이렇게 되면 80번 포트에 기본적으로 접근이 되는데 nginx를 설정을 통해 80번 포트로 들어오는 요청을 8080 포트로 들어가게 설정을 해준다.

직접 실행해 보면 이해가 빠르다.

 

우선 Nginx, tomcat을 실행한다.

sudo nginx
sudo service nginx status # active인지 확인
sudo /usr/local/apache-tomcat-9.0.65/bin/startup.sh     # tomcat 구동 
ps -ef | grep tomcat     # tomcat 구동 확인

웹페이지를 켜서 EC2의 아이피 주소를 친다.

그냥 IP주소만 입력하게 되면 nginx 디폴트 화면이 나오고, IP:8080으로 8080 포트를 지정해주면 tomcat 디폴트 화면이 나온다.  따라서 우리는 tomcat에 war파일을 올릴 것이기 때문에 80 포트로 들어오는 요청은 8080으로 리다이렉션 해주어야 한다. 

 

80번 포트를 8080 포트로 리다이렉션 하기

sudo vi /etc/nginx/nginx.conf

http 괄호 안에 추가로 기입한다.

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name ____; # ip or dns
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header HOST $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8080;
        proxy_redirect off;
    }
}

작성 후 잘 적용됐는지 확인하고 IP주소만으로 접근했을 때 tomcat이 뜨는지 확인한다.

sudo nginx -t     # config 파일에 오류가 없는지 확인
sudo service nginx restart

기존 nginx 화면이 tomcat으로 변경되었는지 확인.

nginx, tomcat default page


하지만 서비스를 준비하는 개발에서 이런 식의 배포는 좋지 않다. DNS도 없이 IP로 접근해야 하고, uri도 예쁘게 나오지 않을 것이며 https를 지원하지도 않는다. 따라서 AWS의 서비스를 이용해 도메인을 사용하여 mydomain.com의 형태로 접속할 수 있게 하고, SSL 인증을 통해 https 보안 연결을 하도록 구성하겠다.

대략적인 시나리오는 다음과 같다.

aws 서비스를 이용한 트래픽 처리

설정에 앞서 어떤 방식으로 트래픽이 흘러들어 가는지 알아야 한다. 이걸 모르면 엄청난 삽질을 하게 된다.

우선 위의 그림에 나타난 서비스들에 대해 간단히 설명하면,

Route53은 AWS에서 도메인을 등록할 수 있는 서비스이다. 1년 약$10~ 12 정도 비용

빨간색으로 된 인증서 모양은 SSL 인증서를 발급하여 https 연결을 할 수 있게 해주는 AWS Certificate Manager이다.

쉽게 말하면 이 웹페이지는 AWS에서 인증한 안전한 페이지이다라고 인증을 해주는 서비스이다.

트래픽이 분산되는 듯한 아이콘은 로드밸런서이다 로드밸런서는 트래픽이 많으면 여러 인스턴스로 트래픽을 분산시켜주는 기능도 있지만 여기선 HTTP 연결에 대한 요청을 HTTPS로 리다이렉션 하는 데 사용할 것이다.

 

  사용자 -> dns접근(mydomain.com) 기본적으로 80 포트기 때문에 HTTP 접근이다 -> 로드밸런서에서 80포트 Listen -> 443 포트로 리다이렉트 -> SSL 인증서 붙여서 (HTTPS 인증) EC2 80 포트로 -> nginx에서 80포트 Listen -> tomcat 8080 포트로 리다이렉트

아직은 어떻게 포트가 변환되는지 모를 것이다. aws에서 로드밸런서나 SSL 인증서나 생성하지 않았으므로 모를 것이다. 위의 트래픽 흐름을  기억하고 다음 실습을 따라오면 이해될 것이다.


AWS 설정으로 다시 들어간다. 우선 도메인을 구매한다. Route53 서비스로 이동하면 도메인 등록 칸이 있는데 여기에 자기가 사용하고 싶은 도메인을 입력하고 확인을 누른다.

route53 도메인 구매

도메인 이름이 사용 가능한지 체크를 하고 원하는 도메인을 장바구니에 추가하고 진행하면 된다.

구매를 하고 나면 며칠 이내 이메일로 등록확인 메일이 올 것인데 등록확인을 해놓지 않으면 2주? 정도 뒤에 도메인 이용 중지가 될 수 있다고 함. 이 과정은 아마 aws에서 도메인 구매 대행 서비스? 혹은 도메인 등록소에 요청을 하고 등록이 성공하면 메일로 등록확인을 받는 것 같음.

+ 도메인 등록절차는 검색해서 알아보는 것도 좋을 것 같다.


이제 SSL 인증서를 받기 위해 AWS Certificate Manager로 이동한다. 

인증서 발급 현황

이미 여러 인증서를 발급받아 사용 중이다. 요청을 눌러서 새로 생성한 도메인에 맞는 인증서를 발급받아보겠다.

인증서 요청 과정

이렇게 하면 간단히 인증서를 발급받을 수 있다. 발급받은 인증서를 가지고 Route53에서 등록한 도메인의 네임서버에 대한 레코드를 생성하면 mydomainttt.com 유로의 요청은 https 인증이 가능해진다. (아마존에서 인증한 인증서)

발급받은 인증서에 들어와 보면

도메인에 대한 인증이 성공했다고 나타나는데 Route 53에서 레코드 생성을 눌러 이전에 등록했던 도메인 호스팅 영역에 네임서버 레코드를 추가해야 한다. 네임서버 레코드의 유형은 A, NS, SOA, CNAME등 다양한데 이에 대한 정리는 다음 블로그를 참고하길.. 

https://inpa.tistory.com/entry/WEB-%F0%9F%8C%90-DNS-%EB%A0%88%EC%BD%94%EB%93%9C-%EC%A2%85%EB%A5%98-%E2%98%85-%EC%95%8C%EA%B8%B0-%EC%89%BD%EA%B2%8C-%EC%A0%95%EB%A6%AC

 

[WEB] 🌐 DNS 레코드 종류 ★ 완벽 정리

DNS 레코드 DNS 상에서 도메인에 관한 설정을 하기 위해 사용되는 일련의 문자들을 DNS 레코드라고 통칭하는데, DNS Record는 DNS 서버가 해당 패킷을 받았을 때 어떤식으로 처리할지를 나타내는 지

inpa.tistory.com

다시 route53으로 이동해서 호스팅 영역에 들어와 보면

네임서버 레코드

NS, SOA, CNAME 유형의 레코드들이 생성되어있을 것이다. 그중 CNAME을 보면 aws에서 검증한 ACM이라는 식으로 레코드가 하나 생성되어있음을 볼 수 있다. NS, SOA유형의 레코드는 aws에서 도메인을 등록하게 되면 알아서 자동으로 등록해주는 레코드이다. 왜 등록해주는지는 NS, SOA유형이 무엇인지 알면 이해될 것이다.


aws 서비스를 이용한 트래픽 처리

이제 거의 다 왔다. 도메인을 등록했고, 도메인에 대한 SSL 인증서를 발급했고, 로드밸런서를 통해 80 포트로 들어오는 트래픽을 443포트로 리다이렉션시켜 SSL 인증을 한 후 EC2로 보내는 과정만 진행하면 우리가 등록한 도메인으로 HTTPS 접근이 가능해진다!

로드밸런서를 생성하기 위해 EC2 서비스로 이동한다. 좌측 탭을 내려보면 로드밸런싱이란 탭에 로드밸런서와 대상 그룹이 있는데, 우선 대상 그룹을 먼저 생성하자.

대상 그룹

Create target group을 누른다.

traget type은 Instance를 선택하고, 프로토콜과 Health checks를 보자.

프로토콜은 HTTP의 80번 포트로 지정한다. 대상 그룹은 로드밸런서를 통해 트래픽을 쏴줄 대상을 말하고 우리는 nginx의 기본 포트인 80번 포트로 listen을 해놨기 때문에 80포트로 해야 한다.

Health checks는 aws에서 대상 인스턴스가 제대로 작동하는지 체크를 해준다. 서버가 떨어질 수 있는데 그걸 확인할 수 있는 듯.. Health check path로 요청을 보내 응답이 제대로 오는지 체크를 하는 것. 나는 domain.com/ping에 HttpStatus.OK를 Response로 보내는 코드를 짜 놨기 때문에 /ping으로 설정했다. 대상그룹을 생성하고 이제 로드밸런서를 설정해야 하므로 로드밸런서로 이동해 로드밸런서를 생성한다.


로드밸런서 생성을 누르면 type을 결정할 수 있는데, HTTP, HTTPS에 대한 트래픽을 쏴줄 것이기 때문에 ALB를 선택한다.

로드밸런서 타입 결정

설정은 위와 같이 하고, Listeners and routing을 잘 봐야 한다.

프로토콜은 HTTP 80 포트와 HTTPS 443 포트를 설정하고, target group은 이전에 생성해준 -HTTP로 설정한다.

HTTPS 프로토콜을 선택하면 Secure setting이 나타나는데 이전에 발급받았던 인증서를 등록하면 된다. 로드밸런서 생성.


생성한 로드밸런서를 누르고 아래의 탭에 나타나는 리스너를 클릭해보자.

현재 규칙이 HTTP 부분이 다르게 나타날 것이다. 규칙 보기/편집을 클릭해서 위와 같게 수정한다.

규칙 편집

규칙 편집에 들어와서 수정을 위와 같이 수정하고 기존에 있던 규칙은 삭제한다.

이제 인터넷을 하나 켜서 도메인 주소를 한번 입력해보자.

도메인으로 https 접속

완성..

배포 테스트용 .war를 ec2의 apache-tomcat webapps에 옮겨놓으면 접속 가능하며 직접 테스트 해보길..

또한. war를 올리게 되면 war파일 이름을 통해 접근해야 하는데, server.xml을 수정하면 깔끔하게 지울 수 있다.

 sudo vi /usr/local/apache-tomcat-9.0.65/conf/server.xml

<Host name="localhost"... > 있는 부분을 찾아
<Context path="/" docBase="jpatest" reloadable="true" /> #추가

나의 경우는 jpatest.war였기 때문에 접속을 .com/jpatest/api로 해야 했는데 수정을 통해. com/api로 접근 가능해졌다. 대신 prefix가 jpatest로 고정되는 바람에. com을 쳤을 때 .com/jpatest로 가서 tomcat 기본 화면을 만날 수 없었다..

 


제 개인적인 생각을 담아 작성하기 때문에 틀린 부분이 있을 수 있습니다! 언제든 댓글로 알려주시면 감사하겠습니다.

 

다음 글은 jenkins를 활용해 빌드 & 배포 자동화에 관한 글로 오겠습니다. 서버 세팅을 해놨는데 계속. war를 옮길 순 없으니까요..

반응형

'AWS' 카테고리의 다른 글

jenkins & tomcat 빌드 & 배포 자동화 세팅  (0) 2022.08.03