이번엔 AWS라는 클라우드 서비스를 이용해 본격적으로 서버 배포를 진행해 보겠습니다.
클라우드 서비스를 이용하는 이유 중 하나는 만든 서비스를 24시간 아무때나 외부에서 접근하려면 24시간동안 서버가 켜져있어야합니다.
24시간 작동하는 서버에는 3가지의 선택지가 있습니다.
- 집에 PC를 24시간 구동시킨다.
- 호스팅 서비스(Cafe 24, 코리아호스팅 등)을 이용한다.
- 클라우드 서비스(AWS, AZURE, GCP. NAVER CLOUD PLATFORM 등)을 이용한다.
일반적으로 비용은 호스팅 서비스나 집 PC를 이용하는 것이 저렴합니다. 만약 특정 시간에만 트래픽이 몰린다면 유동적으로 사양을 늘릴 수 있는 클라우드가 유리합니다.
클라우드에 대해서 잠깐 이야기하자면, 클라우드 서비스는 쉽게 말하면 인터넷(클라우드)를 통해 서버, 스토리지(파일 저장소), 데이터베이스, 네트워크, 소프트웨어, 모니터링 등의 컴퓨팅 서비스를 제공하는 것 입니다.
AWS의 EC2는 서버 장비를 대여하는 것이지만, 실제로는 그 안의 로그 관리, 모니터링, 하드웨어 교체, 네트워크 관리 등을 기본적으로 지원하고 있습니다. 개발자가 직접 해야 할 일을 AWS가 전부 지원하는 것 입니다.
이런 클라우드에는 몇 가지의 형태가 있습니다.
- Infrastructure as a Service (IaaS, 아이아스, 이에스)
- 기존 물리 장비를 미들웨어와 함께 묶어둔 추상화 서비스입니다.
- 가상머신, 스토리지, 네트워크, 운영체제 등의 IT 인프라를 대여해 주는 서비스라고 보면 됩니다.
- AWS의 EC2, S3 등
- Platform as a Service (PaaS, 파스)
- 앞에서 언급한 IaaS에서 한 번 더 추상화한 서비스입니다.
- 한 번 더 추상화 했기 때문에 많은 기능이 자동화되어 있습니다.
- AWS의 Beanstalk(빈스톡), Heroku(헤로쿠) 등
- Software as a Service (SaaS, 사스)
- 소프트웨어 서비스를 이야기합니다.
- 구글 드라이브, 드랍박스, 네이버 클라우드 등
여러 클라우드 서비스 중 AWS를 선택합니다. 이유는 아래와 같습니다.
- 첫 가입 시 1년간 대부분 서비스가 무료입니다. 단, 서비스마다 제한이 있는데 이는 각 서비스를 설정할 때 설명하겠습니다.
- 클라우드에서는 기본적으로 지원하는 기능(모니터링, 로그관리, 백업, 복구, 클러스터링 등등)이 많아 개인이나 소규모일 때 개발에 좀 더 집중할 수 있습니다.
- 많은 기업이 AWS로 이전 중이기 때문에 이직할 때 AWS 사용 경험이 도움이 됩니다. 국내에서는 쿠팡, 우아한형제들, 리멤버 등 클라우드를 사용할 수 있는 회사에서는 대부분 AWS를 사용한다고 합니다.
- 사용자가 많아 국내 자료와 커뮤니티가 활성화되어 있습니다.
이 책에서 진행하는 모든 AWS 서비스는 IaaS를 사용합니다. AWS의 PaaS 서비스인 빈스톡을 사용하면 대부분 작업이 간소화되지만, 프리티어로 무중단 배포가 불가능합니다.
배포할 때마다 서버가 다운되면 제대로된 서비스를 만들 수 없으니 무중단 배포는 필수이고 빈스톡은 사용할 수 없습니다. 그리고 AWS 초보자인 저로서는 직접 하나씩 다 다뤄보는 것이 공부하는 데 도움이 될거라고 합니다.
AWS 회원가입
AWS 고식 사이트(https://aws.amazon.com/ko/)로 이동한 뒤 무료 계정을 만들어 줍시다. 무료로 개정을 만들고, 영문 주소와 신용 카드 정보를 입력한 뒤 가입하면 됩니다. 선택사항은 개인, 무료를 골라주시면 됩니다.
EC2 인스턴스 생성하기
EC2는 AWS에서 생성하는 성능, 용량 등을 유동적으로 사용할 수 있는 서버입니다.
AWS에서 무료로 제공하는 프리티어 플랜에서는 EC2 사용에 다음과 같은 제한이 있습니다.
- 사양이 t2.micro만 가능합니다.
- vCPU(가상 CPU) 1Core, 메로리 1GB 사양입니다.
- 보통 vCPU는 물리 CPU 사양의 절반 정도의 성능을 가집니다.
- 월 750 시간의 제한이 있습니다. 초과하면 비용이 부과됩니다.
- 24시간 * 31일 = 744시간 입니다.
- 즉, 1대의 t2.micro만 사용한다면 24시간 사용할 수 있습니다.
앞의 제한 사항을 주의하면서 AWS를 사용하면 1년간 재미나게 써볼 수 있습니다. 자 그럼 EC2를 만들기 전에, 본인의 리전을 확인해 봅시다. 리전은 우측상단에 있습니다. 서울로 되어있지 않다면 서울로 바꿔줍시다.
그 후 검색창에 EC2를 검색해줍시다. AWS 서비스에 있는 EC2를 선택해 줍시다. EC2 대스보드가 나오는데, 중앙에 있는 인스턴스 시작 버튼을 클릭합니다. 인스턴스란 EC2 서비스에 생성된 가상 머신을 이야기합니다.
인스턴스를 생성하는 첫 단계는 AMI(Amazon Machine Image)를 선택하는 것 입니다. AMI는 EC2 인스턴스를 시작하는데 필요한 정보를 이미지로 만들어 둔 것을 이야기합니다. 인스턴스라는 가상 머신에 운영체제 등을 설치할 수 있게 구워 넣은 이미지로 생각하면 됩니다.
예를들어 아마존 리눅스 2 AMI를 사용한다면 Amazon Linux 2 OS가 인스턴스에 설치되어 개발자가 사용할 수 있음을 의미합니다. 여기서는 Amazon Linux AMI를 선택합니다. 책에서는 Amazon Linux AMI를 선택했지만 저는 없어서 Amazon Linux 2 AMI를 선택했습니다.
Amazon Linux 2는 센토스(Centos) 7버전 자료들을 그대로 사용할 수 있다고 합니다. 그럼 굳이 센토스 AMI를 사용하지 않고 아마존 리눅스 AMI를 사용한 이유가 무엇일까요?? 이유는 아래와 같습니다.
- 아마존이 개발하고 있기 때문에 지원받기가 쉽다.
- 레드햇 베이스이므로 레드햇 계열의 배포판을 많이 다뤄본 사람일수록 문제없이 사용할 수 있다.
- AWS의 각종 서비스와의 상성이 좋다
- Amazon 독자적인 개발 리포지터리를 사용하고 있어 yum이 매우 빠르다.
Amazon Linux 2 AMI를 선택 한 뒤 프리티어로 표기된 t2.micro를 선택하고 다음버튼을 누릅니다. 다음단계는 세부정보 구성입니다. 혼자서 1대의 서버만 사용하니 별다른 설정없이 다음을 눌러 넘어가줍시다.
다음 단계는 스토리지 선택입니다. 스토리지는 흔히 하드디스크라고 불리는 서버의 디스크를 이야기하며 서버의 용량을 얼마나 정할지 선택하는 단계입니다. 기본값은 8GB이지만, 30GB까지 프리티어로 가능하니 30GB으로 수정한 후, 다음버튼을 눌러줍시다.
다음 단계는 태그입니다. 웹 콘솔에서 표기될 태그인 Name 태그를 등록합시다. 여러 인스턴스가 있을 경우 이를 태그별로 구분하면 검색이나 그룹 짓기 편하므로 여기서 본인의 서비스의 인스턴스를 나타낼 수 있는 값으로 등록해준 뒤, 다음버튼을 눌러줍시다.
다음은 보안 그룹입니다. 보안 그룹은 방화벽을 이야기합니다. '서버로 80 포트 외에는 허용하지 않는다'는 역할을 하는 방화벽이 AWS에서는 보안 그룹으로 사용됩니다. 기존에 생성된 보안 그룹이 없으므로 보안 그룹 이름엔 유의미한 이름으로 변경합니다. 아래와 같이 변경해주시면 됩니다.
이 보안 그룹이 굉장히 중요한 부분입니다. 유형 항목에서 SSH이면서 포트 항목에서 22인 경우는 AWS EC2에 터미널로 접속할 때를 이야기합니다. pem 키가 없으면 접속이 안 되니 전체 오픈(0.0.0.0/0,::/0)하는 경우를 종종 발견합니다. 이렇게 되면 이후 파일 공유 디렉토리나 깃허브 등에 실수로 pem키가 노출되는 순간 서버에서 가상화폐가 채굴되는 것을 볼 수 있습니다.
보안은 언제나 높을수록 좋으니 pem 키 관리와 지정된 IP에서만 ssh 접속이 가능하도록 구성하는 것이 안전합니다. 그래서 본인의 집 IP를 기본적으로 추가하고 카페와 같이 집 외에 다른 장소에서 접속할 때는 해당 장소의 IP를 다시 SSH 규칙에 추가하는 것이 안전합니다. 그 후 검토 및 시작 버튼을 눌러줍시다. 그렇게 되면 검토 화면에서 보안 그룹을 경고하는데, 이는 8080포트가 전체 오픈이 되어서 발생합니다. 8080을 열어 놓는 것은 위험한 일이 아니니 바로 시작해줍시다.
인스턴스로 접근하기 위해서는 pem 키(비밀키)가 필요합니다. 그래서 인스턴스 마지막 단계는 할당할 pem키를 선택하는 것 입니다. 인스턴스는 지정된 pem 키(비밀키)와 매칭되는 공개키를 가지고 있어, 해당 pem 키 외에는 접근을 허용하지 않습니다. 일종의 마스터키이기 때문에 절대 유출되면 안 됩니다. pem 키는 이후 EC2 서버로 접속할 때 필수 파일이니 잘 관리할 수 있는 디렉토리로 저장합니다. 그 후 인스턴스를 시작해줍시다.
생성이 다 되었다면 IP와 도메인이 할당된 것을 확인할 수 있습니다. 인스턴스도 결국 하나의 서버이기 때문에 IP가 존재합니다. 인스턴스 생성 시에 항상 새 IP를 할당하는데, 같은 인스턴스를 중지하고 다시 시작할 때도 새 IP가 할당됩니다.
즉, 요금을 아끼기 위해 잠깐 인스턴스를 중지하고 다시 시작하면 IP가 변경되는 것 입니다. 이렇게되면 매번 접속해야 하는 IP가 변경되서 PC에서 접근할 때마다 IP주소를 확인해야 합니다. 굉장히 번거로우므로 인스턴스의 IP가 매번 변경되지 않고 고정 IP를 가지게 해야합니다.
EIP 할당
AWS의 고정 IP를 Elastic IP(EIP, 탄력적 IP)라고 합니다. EC2 인스턴스 페이지 왼쪽 카테고리에서 탄력적 IP를 눌러 선택하고 주소가 없으므로 탄력적 IP주소 할당을 클릭해서할당 해준 뒤, 인스턴스와 연결해줍니다.
여기까지 진행했으면 EC2 인스턴스 생성 과정은 끝났지만 주의할 점이 있습니다. 방금 생성한 탄력적 IP는 생성하고 EC2 서버에 연결하지 않으면 비용이 발생합니다. 즉, 생성한 탈력적 IP는 무조건 EC2에 바론 연결해야 하며 만약 더는 사용할 인스턴스가 없을 때도 탄력적 IP를 삭제해야 합니다.
EC2 서버에 접속하기
여기서는 Mac과 Window가 다른데, 저는 Mac을 사용하므로 Mac으로의 방법만 설명하겠습니다. Mac & Linux는 터미널에서 작업합니다.
AWS와 같은 외부 서버로 SSH 접속을 하려면 터미널에 매번 아래와 같이 긴 명령어를 입력해야 합니다.
ssh -i (pem 키 위치) (EC2의 탄력적 IP 주소)
이렇게 하라고 하는데 전 잘 되지않아서 검색해보니
ssh -i (pem 키 위치 & 확장자를 포함한 파일명) ec-user@(EC2의 탄력적 IP 주소)
로 하니까 연결이 되었습니다.
연결할 때마다 위의 코드를 적기는 힘듭니다. 아래와 같은 작업을 해줍시다.
cp (pem 키 위치 & 확장자를 포함한 파일명) ~/.ssh/
cd ~/.ssh/
ls
chmod 600 ~/.ssh/(pem 키 이름 & 확장자를 포함한 파일명)
vim ~/.ssh/config
이렇게 입력하면 입력할 수 있는 공간이 생깁니다. i 버튼을 눌러 수정할 수 있게 해준 후 아래의 코드를 입력합니다.
# 주석
Host (본인이 원하는 서비스명)
HostName (ec2의 탄력적 IP 주소)
User ec2-user
IdentityFile ~/.ssh/(pem 키 이름 확장자 명 포함)
를 입력한 뒤 esc 버튼을 누르고 :wq를 입력하면 저장됩니다. 후 실행 권한이 필요하므로 아래의 권할 설정을 해줍시다.
chmod 700 ~/.ssh/config
이렇게 하면, 아래의 코드를 입력하면 ec2 서버와 연결이 가능해집니다.
ssh (config에 등록한 서비스명)
아마존 리눅스 서버 생성 시 꼭 해야할 설정들
java 8 설치
sudo yum install -y java-1.8.0-openjdk-devel.x86_64
타임존 변경
sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
date
Hostname 변경
sudo hostnamectl set-hostname freelec-springboot2-webservice
sudo reboot
sudo vim /etc/hosts
에러 뜨는지 test(에러 뜨면 성공)
curl freelec-springboot2-webservice
출처
'spring > 스프링 부트와 AWS로 혼자 구현하는 웹 서비스' 카테고리의 다른 글
[Spring] 8. EC2 서버에 프로젝트 배포 (0) | 2022.01.01 |
---|---|
[Spring] 7. AWS RDS (0) | 2022.01.01 |
[Spring] 5. 스프링시큐리티와 OAuth 2.0으로 로그인 기능 구현하기 (0) | 2021.12.29 |
[Spring] 4. 머스테치로 화면 구성하기 (0) | 2021.12.28 |
[Spring] 3. JPA (0) | 2021.12.28 |