AWS는 아마존에서 개발한 클라우드 서비스 플랫폼이다. 여기서 클라우드 서비스란, IT 리소스(CPU, 메모리 등의 자원)를 인터넷으로 빌려주고 사용한 만큼의 비용을 받는 것을 의미한다. EC2는 Elastic Computer Cloud → ECC → EC2로, 클라우드에서 컴퓨팅 파워의 규모를 자유자재로 변경할 수 있는 웹서비스이다. EC2는 탄력적인 특성을 갖고 있어 개발자들이 트래픽의 스파이크 또는 수요에 맞춰 즉시 용량을 조정할 수 있다. EC2에 대해 궁금하다면 아래 FAQ를 확인해보자.
https://aws.amazon.com/ko/ec2/faqs/
AWS EC2를 이용하면 로컬에서뿐만 아니라, 다른 사람들이 내가 개발한 웹 애플리케이션을 이용할 수 있도록 서버를 쉽게 띄울 수 있다. 물론 트래픽이 몰릴 수록, IT 리소스를 많이 사용하게 되므로 요금도 그에 비례하게 된다.
이번 포스팅에선 내가 틈틈이 볼 용도로, 우아한테크코스에서 배운 스프링 웹 애플리케이션을 aws ec2로 배포하는 방법을 간단하게 적어보려 한다. 참고로, EC2 인스턴스는 이미 생성했다는 가정 하에 작성한다.
1. AWS에 로그인하여 인스턴스 정보 확인
아래 링크로 들어가서 로그인하자.
https://aws.amazon.com/ko/console/
로그인 후, 인스턴스 정보를 확인해주자.
퍼블릭 IPv4 주소랑 다운받은 pem 확장자의 키페어 위치를 알고 있어야 배포를 할 수 있다.
2. EC2를 이용한 웹 애플리케이션 구동
1. 키페어(ex. key-kay.pem)를 저장받은 폴더에서 아래 명령어 실행
ssh -i {키페어} {ubuntu}@{자동 할당된 퍼블릭 IP 주소} // ubuntu 서버 사용중일 때에
- 만약 WARNING: UNPROTECTED PRIVATE KEY FILE! 경고가 발생할 경우 chmod 400 {키페어} 입력 후 재실행
- chmod: 리눅스 파일 사용 권한 설정 명령어. (chmod rwx (read write execute))
- ex. chmod 400 {키페어}: 파일 소유 사용자에게만 read 허용. 파일 사용 그룹 및 그 외에게는 아무 권한도 부여하지 않음. → ec2 키페어 보안성이 높아져 WARNING이 뜨지 않게 됨. (보통 chmod 755, chmod 700을 많이 사용한다고 함.)
- 명령어가 어떤 역할을 하는지 모른다면 man {명령어} 를 입력하면 그 명령어에 대한 설명을 해준다.
아래와 같이 초록색으로 표시된 인스턴스에서 입력을 받을 수 있으면 성공적으로 명령어가 실행된 것이다.
1-1. 실행 후에 java —version을 입력했을 때 아래와 같이 not found일 경우 추가로 명령어를 입력해주자.
wget -O- https://apt.corretto.aws/corretto.key |
sudo apt-key add -sudo add-apt-repository 'deb https://apt.corretto.aws stable main'
sudo apt-get update; sudo apt-get install -y java-11-amazon-corretto-jdk
위 명령어를 차례대로 입력해주자.
- JAVA 11 버전을 설치하는 명령어이다.
- | 커맨드를 이용하여, corretto jdk 키를 출력 스트림으로 보내고, 그 결과를 입력 스트림으로 받아 add-apt-repository에 접속하여 jdk를 설치한다.
2. 웹 애플리케이션을 clone 받은 후, 아래 명령어를 입력해준다.
./gradlew bootJar
예시
1. git clone -b kth990303 --single-branch https://github.com/kth990303/jwp-shopping-cart.git 입력
2. cd jwp-shopping-cart
3. ./gradlew bootJar
3. build/libs 폴더로 이동하여 jar 파일명을 확인하고 java -jar {해당 jar 파일} & 또는 nohup java -jar {해당 jar 파일} &명령어로 웹 애플리케이션을 실행
참고로 위 PID (2618)은 나중에 프로세스를 안전하게 종료 (kill)할 때 사용된다. 그렇다고 외워둘 필요는 없다. 명령어를 이용하면 언제든 조회할 수 있기 때문이다.
- & 명령어를 맨 뒤에 붙이지 않아도 실행 가능하지만, 붙일 경우에 터미널에서 서버를 실행시킨 상태로 유지하여 추가적인 명령을 내려줄 수 있음. & 을 붙이지 않으면 프로세스 실행 시에, 터미널에서 명령어를 내려줄 수 없음.
- nohub 명령어는 프로세스 실행 터미널의 세션 연결이 끊어지더라도 지속적으로 동작할 수 있게 해주는 명령어.
- 종료 시에는 kill 명령어로 프로세스를 종료해주어야 한다.
- (ex. curl -X POST "localhost:8080/api/products" -H 'Content-Type: application/json' -d '{"name": "치킨", "price": 10000,"imageUrl": "test"}'명령어를 터미널에 실행시켜 CREATE 작업 가능
4. 웹 애플리케이션 종료하기
아래 명령어를 이용하여 종료할 수 있다.
ps -ef | grep [프로세스명] // 실행 프로세스 PID 식별용
kill -15 [PID] // 종료
kill -9 [PID] // 강제종료
참고.
AWS EC2 작동원리 그림을 한눈에 볼 수 있는 그림이다.
AWS 포스팅은 보안 때문에 IP 주소를 가리는 등, 그림 편집을 많이 해야돼서 너무 힘들다...
리눅스 커맨드 명령어, 운영체제, 네트워크 지식들을 함께 공부하면 학습 효율을 높일 수 있을 듯 하다 :)
'Infra > Aws' 카테고리의 다른 글
[AWS] AWS Educate에서 더 이상 무료 프리티어 기능을 제공해주지 않는 것 같다 (0) | 2022.08.08 |
---|---|
[AWS] Mysql + 웹 애플리케이션 AWS에 자동 배포하기 (0) | 2022.06.08 |
[AWS][Spring] Aws 우분투 인스턴스 웹 애플리케이션 자동 배포 스크립트 만들기 (0) | 2022.06.08 |
[AWS] 인텔리제이에서 AWS 인스턴스에 접속하기 (0) | 2022.06.03 |
[ERROR][AWS] Database may be already in use: null. Possible solutions: close all other connection(s); use the server mode [90020-200] 해결 (2) | 2022.06.03 |