외부에서 본인이 만든 서비스에 접근하려면 24시간 작동하는 서버가 필수
24시간 작동하는 서버
비용은 호스팅 서비스나 집 PC를 이용하는 것이 저렴하지만, 만약 특정 시간에만 트래픽이 몰린다면 유동적으로 사양을 늘릴 수 있는 클라우드가 유리
📢 클라우드 서비스
인터넷(클라우드)을 통해 서버, 스토리지(파일 저장소), DB, 네트워크, 소프트웨어, 모니터링 등의 컴퓨터 서비스를 제공하는 것이다. 단순히 물리 장비를 대여하는 것이 아니다. 예를 들어 AWS의 EC2는 서버 장비를 대여하는 것이지만, 실제로는 그 안의 로그 관리, 모니터링, 하드웨어 교체, 네트워크 관리 등을 기본적으로 지원하고 있다. 개발자가 직접 해야 할 일을 AWS가 전부 지원하는 것이다.
📢 클라우드 종류
1. Infrastructure as s Service(IaaS, 아이아스, 이에스)
🔧 AWS 공식 사이트로 이동한 뒤 무료 계정 만들기를 선택
URL : https://aws.amazon.com/ko/
AWS 메인 화면
AWS 회원 가입 진행(계정 유형은 개인으로 했음)
가입 마지막 단계로, 1년 무료 사용을 위한 무료 플랜을 선택했다.
📢 EC2(Elastic Compute Cloud)
AWS에서 제공하는 성능, 용량 등을 유동적으로 사용할 수 있는 서버다. 보통 "AWS에서 리눅스 서버 혹은 윈도우 서버를 사용합니다"라고 하면 이 EC2를 이야기하는 것이다.
📝 (주의) 프리티어 플랜 EC2 제한
월 750시간의 제한이 있고, 초과하면 비용이 부과됨 😮
하지만, 1대의 t2.micro(사양)만 사용한다면 24시간 사용할 수 있다. 👍
리전이란 AWS의 서비스가 구동될 지역을 말한다. AWS는 도시별로 클라우드 센터를 지어 해당 센터에서 구축된 가상머신들을 사용할 수 있다. 이것을 리전이라고 한다.
🔧 AWS 콘솔 홈에서 리전을 확인 후 서울로 설정한다.
🔧 화면 중앙에 있는 검색창에서 ec2를 입력하여 EC2 서비스를 클릭
🔧 [인스턴스 시작] 버튼 클릭
인스턴스란 EC2 서비스에 생성된 가상머신을 말한다.
AMI는 EC2 인스턴스를 시작하는 데 필요한 정보를 이미지로 만들어 둔 것을 말한다. 인스턴스라는 가상 머신에 운영체제 등을 설치할 수 있게 구워 넣은 이미지로 생각하면 된다.
교재에서는 Amazon Linux AMI 1을 선택했으나, 해당 서비스는 이미 종료되어 있었다.
🔧 AMI 1과 2의 주요 차이점을 살펴보고, 문제되는 부분은 없는 것 같아 현재 서비스 중인 AMI 2를 선택하기로 했다.
🔧 인스턴스 유형을 t2.micro(프리티어 사용 가능)으로 했다. 다른 유형을 선택할 경우 비용이 청구된다고 한다.
📝 (참고) 크레딧
t2, t3와 같은 요금 타입을 T 시리즈라고 한다. 이들은 다른 서비스와 달리 크레딧이란 일종의 CPU를 사용할 수 있는 포인트 개념이 있다. 인스턴스 크기에 따라 정해진 비율로 CPU 크레딧을 계속 받게 되며, 사용하지 않을 때는 크레딧을 축적하고, 사용할 때 이 크레딧을 사용한다.
정해진 사양보다 더 높은 트래픽이 오면 크레딧을 좀 더 적극적으로 사용하면서 트래픽을 처리하지만, 크레딧이 모두 사용되면 더이상 EC2를 사용할 수 없다. 그래서 트래픽이 높은 서비스들은 T 시리즈를 쓰지 않고 다른 시리즈를 사용하기도 한다.
🔧 세부 정보 구성은 개인 사용 목적이므로 별다른 설정을 하지 않고 넘어간다.
스토리지는 흔히 하드디스크라고 부르는 서버의 디스크(SSD도 포함)를 이야기하며 서버의 용량을 얼마나 정할지 선택하는 단계다.
기본값은 8GB이고, 30GB까지 프리티어로 가능하다고 한다. 그 이상의 사이즈는 비용이 청구된다.
🔧 최대치인 30GB로 변경
태그에는 웹 콘솔에서 표기될 태그인 Name 태그를 등록한다. 태그는 해당 인스턴스를 표현하는 여러 이름으로 사용될 수 있다. EC2의 이름을 붙인다고 생각하고 넣으면 된다.
여러 인스턴스가 있을 경우 이를 태그별로 구분하면 검색이나 그룹 짓기 편하므로 여기서 본인 서비스의 인스턴스를 나타낼 수 있는 값으로 등록한다.
🔧 EC2의 이름을 지정(교재와 페이지 구성이 다르게 나옴)
보안 그룹은 방화벽을 말한다. 서버로 접속을 허용할 IP 및 포트를 지정할 수 있다. 기존에 생성된 보안 그룹이 없으므로 보안 그룹 이름엔 유의미한 이름으로 변경한다.
이 부분이 가장 중요하다. 유형 항목에서 SSH이면서 포트 항목에서 22인 경우는 AWS EC2에 터미널로 접속할 때를 말한다. pem 키가 없으면 접속이 안 된다고 해서 전체 오픈(0.0.0.0/0, ::/0)하면 이후 파일 공유 디렉토리나 깃허브 등에 실수로 pem 키가 노출되는 순간 보안 문제로 가상 화폐 채굴 등 다양한 문제가 발생한다고 한다.
보안은 언제나 높을수록 좋으니 pem 키 관리와 지정된 IP에서만 ssh 접속이 가능하도록 구성하는 것이 안전하다. 그래서 본인 집의 IP를 기본적으로 추가하고(내 IP를 선택하면 현재 접속한 장소의 IP가 자동 지정된다.) 집 외에 다른 장소에서 접속할 때는 해당 장소의 IP를 다시 SSH 규칙에 추가하는 것이 안전하다.
인스턴스로 접근하기 위해서는 pem 키(비밀키)가 필요하다. 인스턴스는 지정된 pem 키(비밀키)와 매칭되는 공개키를 가지고 있어, 해당 pem 키 외에는 접근을 허용하지 않는다. 일종의 마스터키이기 때문에 절대 유출하면 안된다. pem 키는 이후 EC2 서버로 접속할 때 필수 파일이니 잘 관리할 수 있는 디렉토리로 저장한다.
🔧 키 페어 생성
아래 링크를 참고하여 .ppk(putty용)와 RSA 암호 유형으로 키 페어를 생성했다.
ref : https://kitty-geno.tistory.com/72
🔧 인스턴스 시작을 클릭 후 생성된 인스턴스를 확인(생성 완료)
인스턴스도 결국 하나의 서버이기 때문에 IP가 존재한다. 인스턴스 생성 시에 항상 새 IP를 할당하는데, 한 가지 조건이 더 있다. 같은 인스턴스를 중지하고 다시 시작할 때도 새 IP가 할당된다. 즉, 요금을 아끼기 위해 잠깐 인스턴스를 중지하고 다시 시작하면 IP가 변경되는 것이다. 이렇게 되면 매번 접속해야 하는 IP가 변경돼서 PC에서 접근할 때마다 IP 주소를 확인해야 한다. 굉장히 번거로우므로 인스턴스의 IP가 매번 변경되지 않고 고정 IP를 가지게 해야 한다.
AWS의 고정 IP를 EIP라고 한다.
🔧 EC2 인스턴스 페이지의 왼쪽 카테고리에서 탄력적 IP를 눌러 선택하고 주소가 없으므로 [새 주소 할당] 버튼을 클릭
🔧 탄력적 IP 주소 할당을 클릭 후 기본 상태로 할당 버튼 클릭
🔧 방금 생성한 탄력적 IP와 방금 생성한 EC2 주소를 연결한다. 방금 생성한 탄력적 IP를 확인하고, 페이지 위에 있는 [작업] -> [주소 연결] 메뉴 선택
🔧 주소 연결을 위해 생성한 EC2 이름과 IP를 선택하고 [연결] 버튼을 클릭
🔧 연결이 완료되면 왼쪽 카테고리에 있는 [인스턴스]탭을 클릭해서 다시 인스턴스 목록 페이지로 이동한다.
🔧 해당 인스턴스의 퍼블릭, 탄력적 IP가 모두 잘 연결되었는지 확인한다.
여기까지 진행했으면 EC2 인스턴스 생성 과정은 끝났다!
📝 (주의점)
방금 생성한 탄력적 IP는 생성하고 EC2 서버에 연결하지 않으면 비용이 발생한다. 즉, 생성한 탄력적 IP는 무조건 EC2에 바로 연결해야 하며 만약 더는 사용할 인스턴스가 없을 때도 탄력적 IP를 삭제해야 한다. 마찬가지로 비용 청구가 되므로 꼭 잊지 않고 삭제해야 한다.
윈도우에서는 Mac과 같이 ssh 접속하기엔 불편한 점이 많아 별도의 클라이언트(putty)를 설치하도록 하겠다.
🔧 putty 사이트에 접속하여 실행 파일을 내려받는다.
URL : https://putty.org/
필요한 실행 파일은 다음 2가지다.
🔧 두 파일을 모두 내려받은 뒤, puttygen.exe 파일을 실행
putty는 pem 키로 사용이 안 되며 pem 키를 ppk 파일로 변환을 해야만 한다. puttygen은 이 과정을 진행해 주는 클라이언트다.
(앞서 키 페어 생성에서 .ppk파일을 내려받았으므로 생략)
🔧 putty.exe 파일 실행 후 다음과 같이 각 항목을 등록
HostName : username@public_ip를 등록한다. Amazon Linux는 ec2-user가 username이라서 ec2-user@탄력적 IP 주소로 등록하면 된다.
Port : ssh 접속 포트인 22를 등록한다.
Connection type : SSH를 선택한다.
🔧 왼쪽 사이드바에 있는 [Connection ➡ SSH ➡ Auth]를 차례로 클릭해서 ppk 파일을 로드할 수 있는 화면으로 이동 후 [Browse] 버튼을 클릭
🔧 로컬에서 자신이 생성한 .ppk 파일을 찾아 업로드
🔧 정상적으로 불러왔다면 다시 [Session] 탭으로 이동하여 [Saved Sessions]에 현재 설정들을 저장할 이름을 등록하고 [Save] 버튼을 클릭
🔧 저장한 뒤 [open] 버튼을 클릭한 후 SSH 접속 알림에서 Accept를 클릭
다음과 같이 SSH 접속이 성공한 것을 확인할 수 있다.
Java 8 설치 : 현재 해당 프로젝트의 버전은 Java 8이다.
타임존 변경 : 기본 서버의 시간은 미국 시간대이다. 한국 시간대가 되어야만 우리가 사용하는 시간이 모두 한국 시간으로 등록되고 사용된다.
hostname 변경 : 현재 접속한 서버의 별명을 등록한다. 실무에서는 한 대의 서버가 아닌 수십 대의 서버가 작동되는 데, IP만으로 어떤 서버가 어떤 역할을 하는지 알 수 없다. 이를 구분하기 위해 보통 호스트 네임을 필수로 등록한다.
🔧 다음 명령어를 통해 Java 8을 설치
sudo yum install -y java-1.8.0-openjdk-devel.x86_64
🔧 설치가 완료되었다면 인스턴스의 Java 버전을 8로 변경
🔧 현재 버전이 Java 8이 되었는지 확인
EC2 서버의 기본 타임존은 UTC다. 이는 세계 표준 시간으로 한국의 시간대가 아니다. 즉, 한국의 시간과는 9시간 차이가 발생한다. 이렇게 되면 서버에서 수행되는 Java 애플리케이션에서 생성되는 시간도 모두 9시간씩 차이가 나기 때문에 꼭 수정해야 할 설정이다. 따라서 서버의 타임존을 한국 시간(KST)로 변경하겠다.
🔧 다음 명령어를 차례로 수행
sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
🔧 정상적으로 수행되었다면 date 명령어로 타임존이 KST로 변경된 것을 확인
여러 서버를 관리 중일 경우 IP만으로 어떤 서비스의 서버인지 확인이 어렵다. 그래서 각 서버가 어느 서비스인지 표현하기 위해 HOSTNAME을 변경하겠다.
🔧 다음 명령어로 편집 파일을 Open (Amazon Linux 1)
sudo vim /etc/sysconfig/network
📝 (참고) swap 파일 에러
실수로 작성 도중에 변경 사항을 저장하지 않고 종료할 경우, swap 파일(.swp)이 생성되어 vim 편집기를 열 때마다 "E325: Attention ... swap file "/etc/sysconfig/.network.swp" is already exists"라는 에러 문구가 나온다. 이것을 해결하는 참고 링크 2개를 아래에 달아놓았다. 나의 경우에는 "sudo rm" 명령으로 해결했다. 참고로 sudo 없이 rm만하다가 무수한 구글링에 빠지기도 했다. 😓
ref : https://tiqndjd12.tistory.com/46
ref : https://linuxhint.com/rm-remove-write-protected-regular-file/
🔧 Amazon Linux 2의 경우, 호스트네임 설정 방법이 1과 달랐다. 다음 링크의 메뉴얼에 따라 명령을 실행했다.
ref : https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/set-hostname.html
아래 그림처럼 이제 IP주소가 아닌 호스트네임으로 putty 콘솔에 출력되는 것을 볼 수 있다. 😀
🔧 다음 명령어로 /etc/hosts 파일 open
sudo vim /etc/hosts
🔧 HOSTNAME 등록
잘 등록하였다면 다음과 같이 80 포트로 접근이 안 된다는 에러가 발생한다.
이것은 아직 80포트로 실행된 서비스가 없음을 의미한다. 즉, curl 호스트 이름으로 실행은 잘 되었음을 의미한다.
이것으로 EC2 설정이 완료되었다. 다음 챕터에서 AWS의 DB 서비스인 RDS를 생성하고 설정해 보겠다.
🖐🖐