(Spring) AWS 서버 환경 생성 – AWS EC2 (EC2 연결 창)

이 글은 “스프링부트와 AWS로 혼자 구현한 웹서비스 – 이동욱(조졸두)”을 공부하면서 쓴 글이다.
누락된 콘텐츠를 구매하여 검토하는 것이 좋습니다.

참조 소스 코드 github https://github.com/jojoldu/freeelec-springboot2-webservice

http://www.yes24.com/Product/Goods/83849117

Spring Boot와 AWS만으로 웹 서비스 구현 – YES24

웹서비스의 모든 과정을 가장 빠르고 쉽게 경험해보세요. 제목에서 알 수 있듯이 이 책은 Spring Boot와 AWS를 사용하여 웹 서비스를 구현합니다.
JPA 및 JUnit 테스트, Gradle, Mustech 및 Spring

www.yes24.com

책 6장에 해당하는 내용 아래 AWS 서버 환경 구축을 요약하고자 합니다.

당신이 만들고 있는 서비스를 외부에서 접근하기 위해서는 24시간 서버가 필수적입니다.

선택할 수 있는 3개의 서버, 연중무휴 실행

1. 집에서 PC를 24시간 가동하세요.

2. 호스팅 서비스(카페24, 코리아호스팅 등)를 이용하세요.

3. 클라우드 서비스(AWS, Azure, GCP 등)를 사용합니다.

일반적으로 1번과 2번이 비용을 생각하면 저렴하지만 특정 시간에만 트래픽이 몰린다면 탄력적으로 사양을 높일 수 있는 클라우드가 유리하다.

구름

– 클라우드 서비스는 인터넷(클라우드)을 통해 서버, 스토리지(파일 스토리지), 데이터베이스, 네트워크, 소프트웨어 및 모니터링과 같은 컴퓨팅 서비스를 제공합니다.
실제 장비를 대여하는 것만이 아닙니다.

예) AWS의 EC2는 서버 장비를 임대하지만 기본적으로 그 안에서 로그 관리, 모니터링, 하드웨어 교체, 네트워크 관리를 지원합니다.

구름 모양

  • 서비스형 인프라(IaaS, Aias, ES)
    • 기존 물리적 장치를 미들웨어에 연결하는 추상화 서비스
    • 가상머신, 스토리지, 네트워크, 운영체제 등 IT 인프라를 대여해주는 서비스
    • AWS EC2, S3 등
  • 서비스형 플랫폼(PaaS, Pas)
    • IaaS에서 다시 추상화된 서비스이므로 더 많은 기능이 자동화됩니다.
    • AWS의 Beanstalk, Heroku 등
  • 서비스형 소프트웨어(SaaS)
    • 소프트웨어 서비스
    • 구글 드라이브, 드립박스, 와탭 등

이 프로젝트를 위해 AWS를 선택했습니다.

-> 대부분의 서비스는 최초 등록 후 1년간 무료로 제공됩니다.
단계. 각 서비스에는 제한이 있습니다.

-> 클라우드에는 기본적으로 지원되는 기능이 많아 개인이나 소규모 기업이 개발에 더욱 집중할 수 있습니다.

-> 많은 기업들이 AWS를 사용하고 있으며 국내 AWS 점유율은 압도적입니다.

-> 유저가 많아 토종자료와 커뮤니티가 활발하다.

이 프로젝트의 모든 AWS 서비스는 IaaS를 사용합니다.
AWS의 PaaS 서비스인 Beanstock은 많은 작업을 단순화하지만 프리 티어는 무중단 제공을 허용하지 않습니다.

배포할 때마다 서버가 다운되어서는 안 되므로 중단 없는 배포가 필수적이기 때문에 IaaS 서비스를 사용합니다.

AWS에 가입

1. 마스터 또는 비자 카드 준비 https://aws.amazon.com/en/ 로 이동하여 계정을 만드십시오.

2. 절차를 따르고 마지막에 기본 지원 – 무료를 선택합니다.


AWS에 등록

3. 등록 후 콘솔에 로그인합니다.

EC2 인스턴스 생성

EC2(Elastic Compute Cloud)는 AWS에서 제공하는 성능과 용량을 유연하게 사용할 수 있는 서버입니다.
“AWS에서 Linux 서버 또는 Windows 서버를 사용하고 있습니다”라고 말할 때 일반적으로 이 EC2를 의미합니다.

* EC2라는 이름은 ECC의 약자이고, C가 두 번 반복되므로 EC2라는 이름을 붙였습니다.
AWS에서 첫 글자가 반복되면 숫자로 표현됩니다.

AWS에서 제공하는 프리 티어 계획에 대한 EC2 사용 제한

  • 사양은 t2.micro에만 사용할 수 있습니다.
    • vCPU(가상 CPU) 1코어, RAM 1GB
    • 일반적으로 vCPU는 물리적 CPU 사양의 절반 정도 성능을 제공합니다.
  • 월 750시간 제한 – 초과 시 요금이 부과됩니다.
    • 24시간 * 31일 = 744시간 -> t2.micro 하나만 사용하면 24시간 사용 가능

책이 2019년 11월 말에 나왔기 때문에 현재 AWS 인스턴스 생성 과정과 다른 부분이 있습니다.

1. 지역을 서울로 변경


* 지역: AWS 서비스가 운영되는 지역을 의미합니다.
AWS는 도시별로 클라우드 센터를 구축하고 센터에서 생성된 가상머신을 활용해 한국에서 서비스할 때 서울 리전을 선택한다.

2. EC2를 검색하고 선택합니다.


3. EC2 대시보드에서 인스턴스 시작 버튼을 클릭합니다.

* 인스턴스: EC2 서비스에서 생성되는 가상머신


4. 인스턴스 이름을 입력하고 AMI를 선택합니다.

EC2의 이름 만들기

여기에 추가 태그를 추가할 필요가 없어서 그냥 하나 작성했습니다.

Amazon Linux AMI 선택

* AMI(Amazon Machine Image): EC2 인스턴스 실행에 필요한 정보를 담고 있는 이미지.


5. 인스턴스 유형 선택 및 키 페어 생성

인스턴스 유형으로 t2.micro를 선택합니다.

새 키 쌍 생성 -> 키 쌍 이름, 키 쌍 유형-RSA, 개인 키 파일 형식-.pem

펨 버튼

  • 인스턴스에 접근하려면 pem 키(프라이빗 키)가 필요하고 인스턴스는 제공된 pem 키와 일치하는 퍼블릭 키를 가지고 있으므로 pem 키 이외의 접근은 허용되지 않습니다.
  • 절대 유출되어서는 안되는 일종의 마스터키입니다.
  • EC2에 액세스할 때 필요한 파일
  • 한 번 생성된 파일은 다시 다운로드할 수 없으므로 관리할 수 있는 디렉터리에 저장하세요.


6. 네트워크 설정

보안 그룹은 방화벽을 말하며 “서버에 80번 이외의 포트를 허용하지 않는” 역할을 하는 방화벽을 AWS에서 보안 그룹으로 사용합니다.
이전에 만든 보안 그룹이 없으면 적절한 이름으로 새 보안 그룹을 만듭니다.


다음과 같이 보안 그룹 규칙을 추가합니다.



  • SSH 및 포트 번호 22의 경우: 터미널로 AWS EC2에 연결하는 경우
    • pem 키가 없으면 연결할 수 없습니다.
      따라서 전체 파일을 열면 pem 키가 실수로 파일 공유 디렉터리나 github에 노출되면 서버에서 암호화폐를 채굴할 수 있습니다.
  • 홈 IP 추가 (내 IP를 선택하면 현재 연결된 사이트의 IP가 추가됩니다.
    )
    • 다른 위치에서 연결하는 경우 해당 위치의 IP를 SSH 규칙에 다시 쉽게 추가할 수 있습니다.
  • 현재 프로젝트의 기본 포트인 8080 추가

7. 스토리지 선택 후 인스턴스 시작 클릭

스토리지: 하드 드라이브라고 하는 서버의 하드 드라이브(SSD 포함)를 나타냅니다.

서버의 용량을 결정할 때 프리티어는 30GB까지 가능하므로 30으로 변경한다.

인스턴스 시작을 클릭하여 인스턴스를 생성합니다.

8. 인스턴스의 고정 IP 할당

인스턴스는 서버이기도 하므로 IP가 있습니다.
인스턴스를 생성할 때 항상 새로운 IP가 할당되지만 한 가지 조건이 더 있습니다.

동일한 인스턴스를 중지했다가 다시 시작해도 새 IP가 할당됩니다.

-> 돈을 아끼기 위해 잠시 멈추었다가 다시 시작하면 IP가 변경됩니다.

이 경우 PC에서 접속할 때마다 IP 주소를 확인해야 합니다.

이 문제를 해결하기 위해서는 인스턴스의 IP가 매번 바뀌지 않도록 고정 IP를 가져야 합니다.

탄력적 IP(EIP, 탄력적 IP): AWS 고정 IP.

탄력적 IP -> 탄력적 IP 주소 할당 -> 할당


작업 오른쪽 상단 -> 탄력적 IP 주소 매핑


접속 후 인스턴스로 이동하여 인스턴스의 퍼블릭 IP와 탄력적 IP가 잘 연결되어 있는지 확인합니다.

* 생성 직후 EC2에 접속하지 않거나 인스턴스를 사용할 수 없는 경우 EIP가 과금됩니다.

인스턴스를 삭제할 때 탄력적 IP를 삭제하는 것을 잊지 마세요!

EC2 서버에 연결 – Windows

Mac은 터미널로 쉽게 접근할 수 있지만 Windows는 Mac과 같이 SSH 연결에 불편한 점이 많습니다.

별도의 클라이언트를 설치하여 연결합니다.

하나. https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html 이동하여 환경에 적합한 파일을 다운로드하여 설치하십시오.


2. 설치 후 puttygen.exe 실행

Putty는 PEM 키와 함께 사용할 수 없으며 PEM 키를 PPK 파일로 변환해야 합니다.

puttygen은 PEM 키를 PPK 파일로 변환하는 클라이언트입니다.

1. 왼쪽 상단에서 Conversions -> Import Key -> Downloaded PEM Key 선택 -> Save Private Key를 선택하여 ppk 파일을 생성합니다.

개인 키 저장을 클릭할 때 경고 메시지가 나타나면 예를 클릭하고 계속합니다.

2. PPK 파일이 저장된 위치와 PPK 이름을 등록합니다.

3. putty.exe 실행

1. 호스트 이름, 포트, SSH 생성


호스트 이름 등록: username@public_Ip, 생성한 Amazon Linux 사용자 이름이 ec2-user이므로 IP 주소 ec2-user@elastic을 등록합니다.

포트: 레지스터 22, SSH 액세스 포트

연결 유형: SSH 선택

2. 연결 -> SSH -> 인증 -> 자격 증명으로 이동하고 찾아보기를 클릭하여 ppk 파일을 선택합니다.


3. Session으로 이동하여 이름(예: springboot-webservice)을 등록하여 SavedSessions에 현재 설정을 저장하고 저장합니다.

4. 저장 후 열기 후 SSH 연결 알림 팝업이 뜨면 수락을 클릭합니다.

그러면 다음과 같이 연결에 성공했는지 확인할 수 있습니다.


SSH 연결 성공

EC2 자바 설치

자바11 설치

sudo yum install java-11-amazon-corretto

설치 후 인스턴스의 Java 버전 변경

sudo /usr/sbin/alternatives --config java


자바 버전 선택

선택에 숫자 1을 입력합니다(Java 11 선택).

자바 버전 확인

java -version

시간대 변경

EC2 서버의 기본 시간대는 한국 시간보다 9시간 빠른 세계 표준시인 UTC입니다.

이 경우 서버에서 실행되는 Java 응용 프로그램에서 생성되는 시간도 9시간 차이가 나므로 수정해야 합니다.

한국 시간으로 전환

다음 명령을 하나씩 실행하십시오.

sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Seoul etc/localtime

시계를 확인

date

date 명령을 실행하면 한국 시간으로 전환된 것을 확인할 수 있습니다.

호스트 이름 변경

여러 서버를 관리할 때 IP 주소만으로 서버가 어떤 서비스를 사용하고 있는지 구분하기 어렵습니다.

서버가 어떤 서비스인지 쉽게 확인하려면 호스트 이름을 변경하십시오.

호스트 이름을 최신 상태로 유지Preserve_hostname의 경우 클라우드 초기화 구성은 다음과 같습니다.
진실~처럼 설정해야

설정하지 않으면 인스턴스가 중지되고 다시 시작될 때 호스트 이름이 이전 상태로 되돌아갑니다.

설정 확인

sudo vi /etc/cloud/cloud.cfg

위의 명령을 실행한 후 파일 끝에 다음 텍스트를 추가합니다.

1. Insert 또는 i를 눌러 입력 모드로 전환합니다.

2. 파일 끝에 “preserve_hostname: true”라고 씁니다.

3. esc를 눌러 명령 모드로 전환합니다.

4. :wq를 입력하고 엔터(wq: 저장 후 종료, 변경된 정보를 저장하고 vi 편집기 종료를 의미)를 입력합니다.

호스트 이름 변경

아마존 리눅스 2: hostnameectl 명령으로 호스트 이름 변경

sudo hostnamectl set-hostname springboot-webservice

변경 후 다음 명령으로 서버를 다시 시작하십시오.

sudo reboot

실행할 때 원격 측에 “네트워크 연결이 예기치 않게 종료되었습니다”라는 메시지가 나타납니다.

그런 다음 Putty에 다시 연결하면 호스트 이름이 변경된 것을 확인할 수 있습니다.


호스트 이름 변경 결과

변경된 호스트 이름으로 테스트 실행

호스트 주소를 찾을 때 가장 먼저 찾는 /etc/hosts에 변경된 호스트 이름을 등록합니다.

/etc/hosts 파일 열기

sudo vim /etc/hosts

방금 등록한 호스트 이름을 파일에 등록합니다.

1. Insert 또는 i를 눌러 입력 모드로 전환합니다.

2. 아래에 아래 텍스트 추가

127.0.0.1 springboot-webservice

3. esc를 눌러 명령 모드로 전환하고 :wq를 입력합니다.

정상적으로 등록되었는지 확인

curl springboot-webservice

실행 결과


이는 포트 80에서 실행 중인 서비스가 없음을 의미합니다.
즉, curl 호스트 이름으로 실행해도 문제가 없었습니다.

등록이 제대로 이루어지지 않으면 호스트 이름을 찾을 수 없다는 오류가 나타납니다.