Group Study (2024-2025)/Spring 입문

[Spring 입문] 5주차 - AWS 서버 환경을 만들어보자 - AWS EC2

ruddmsleee 2024. 11. 3. 00:55

- EC2 인스턴스 생성하기
- EC2 서버에 접속하기
- 아마존 리눅스 1 서버 생성 시 꼭 해야하는 설정들

 

  • 외부에서 본인이 만든 서비스에 접근하려면 24시간 작동하는 서버 필수
       
  1. 집에 PC 24시간 구동
  2. 호스팅 서비스 이용
  3. 클라우드 서비스(AWS, AZURE, GCP) 이용
    - 인터넷(클라우드)를 통해 서버, 스토리지, 데이터베이스, 네트워크, 소프트웨어, 모니터링 등 컴퓨팅 서비스 제공

→ 비용은 호스팅 서비스나 집 PC를 이용하는 것이 저렴하지만
    특정 시간에만 트래픽이 몰릴 경우 유동적으로 사양을 늘릴 수 있는 클라우드 가 유리함

 

  • 클라우드의 형태

  1. Infrastructure as a Service (IaaS)
    - 기존 물리 장비를 미들웨어와 함께 묶어둔 추상화 서비스
    - 가상머신, 스토리지, 네트워크, 운영체제 등의 IT 인프라 대여

  2. Platform as a Service (PaaS)
    - IaaS를 한 번 더 추상화한 서비스 → 더 많은 기능 자동화
    ex) AWS의 빈스톡 (무료사용계층(free tier)로 무중단 배포 불가), 헤로쿠

  3. Software as a Service (SaaS)
    - 소프트웨어 서비스
    ex) 구글 드라이브, 드랍박스, 와탭

 


< EC2 인스턴스 생성하기 >

EC2 = AWS에서 제공하는 성능, 용량 등을 유동적으로 사용할 수 있는 서버

 

1. AWS 공식 사이트에서 무료 계정 만들기 https://aws.amazon.com/ko/

 

클라우드 서비스 | 클라우드 컴퓨팅 솔루션| Amazon Web Services

 

aws.amazon.com

 

2. 서울로 리전 설정

   리전 = AWS가 구동될 지역 (AWS는 도시별 클라우드 센터에 가상머신 구축)

 

3. EC2 인스턴스 생성

 

스크린 상단 검색창에 'EC2' 검색 > 인스턴스 시작
    - 인스턴스 = EC2 서비스에 생성된 가상머신

 

 

3-1) 이름 및 태그 설정

EC2에 freelec-springboot2-webservice라는 이름을 붙임

   여러 인스턴스가 있을 때 태그별로 구분하면 검색이나 그룹 짓기 편함

 

3-2) AMI(Amazon Machine Image) - Amazon Linux AMI 선택하기


AMI
= EC2 인스턴스를 시작하는 데 필요한 정보를 이미지로 만들어둔 것
→ 인스턴스라는 가상머신에 운영체제 등을 설치할 수 있도록 함


  •  Amazon Linux AMI를 선택한 이유?

   - 지원 받기 쉽고, AWS의 각종 서비스와의 상성이 좋음
   - 레드햇 베이스로, 레드햇 계열의 배포판을 다뤄본 사람일 수록 사용이 쉬움
   - 아마존 독자적인 개발 레포지토리를 사용하고 있어 yum이 빠름

 

3-3) 인스턴스 유형 - t2.micro 선택

t2 = 요금 타입 / micro = 사양

  • 인스턴스 크기에 따라 정해진 비율로 CPU 크레딧 받음
      ( 크레딧 = CPU를 사용할 수 있는 포인트 개념 )
  • 트래픽이 높을 경우 크레딧 적극적 사용 → 크레딧 모두 사용 시 EC2 사용 불가
      ⇒ 트래픽 높은 서비스는 T 시리즈(t2, t3../범용시리즈) 사용 △

 

3-4) 세부정보 구성

    기업에서 사용할 경우 세세하게 다루지만, 혼자서 1대의 서버만 사용할 경우 별다른 과정 생략

 

3-5) 키 페어 설정 > pem 키 다운로드

  •  pem 키 (비밀 키)
    = 서버와 클라이언트 간의 보안을 위해 사용되는 키 파일
    - 인스턴스에 접근하기 위해서는 pem 키 필요
    - 해당 pem키 외에는 접근 허용 X
    - 일종의 마스터키 - 유출되거나 잃어버리면 안됨 ⚠️

 

3-6) 방화벽(보안 그룹) 설정

  • 네트워크 설정 옆의 '편집' 버튼 > 보안 그룹 생성 > 보안 그룹 이름, 설명 설정 > 인바운드 보안 그룹 규칙 세 가지 추가

 

  •   유형이 ssh, 포트범위가 22인 경우
    = AWS EC2에 터미널로 접속할 경우
    (ssh = 네트워크를 통해 안전하게 원격서버에 접속할 수 있는 프로토콜)


   ㄴ pem키가 없을 경우 서버에 접속할 수 없기 때문에 편의상 전체오픈 (0.0.0.0/0,::/0)하는 경우 (모든 IP주소에서 서버에 접근 가능하도록 하는 경우) 발생
  -> 이후 실수로 pem 키가 외부로 노출되면 누구나 서버에 접근이 가능해져 서버에서 가상화폐가 채굴되기도 함 (서버 자원 악용)

⇒ 보안 높이기 위해 pem 키 관리지정된 IP에서만 ssh 접속이 가능하도록 구성하기

→ 유형이 ssh, 포트범위가 22인 경우의 소스 유형을 ‘내 IP’로 설정
(8080은 전체 오픈해도 괜찮음)

 

 

 

3-6) 스토리지 (서버 용량) 선택

프리티어에서는 30GB가 최대

 

4. '인스턴스 시작'  > 인스턴스 생성 완료!! ✅

도메인과 IP도 할당됨

 

EIP (탄력적 IP) 할당

  • 인스턴스 생성 시에 항상 새 IP를 할당 ( 같은 인스턴스를 중지 후 다시 시작할 때도 )
    → 매번 접속해야 하는 IP가 변경되므로 번거로움
    ⇒ 인스턴스 IP가 매번 변경되지 않고 고정 IP(EIP)를 가지도록 함

 

  • 좌측 카테고리의 ‘탄력적 IP’  >  ‘탄력적 IP 주소 할당’  >  ‘할당’

         >  탄력적 IP 생성(할당) 완료    >   ‘작업’ 버튼의 ‘탄력적 IP 주소 연결’

         >  인스턴스와 프라이빗 IP 선택 후 연결

         > 탄력적 IP와 인스턴스 연결 완료

  ⚠️ 탄력적 IP는 EC2 서버에 연결하지 않으면 비용 발생
        생성 후 EC2 서버에 바로 연결 / 사용할 인스턴스 없을 시 삭제 필요

 

 


< EC2 서버에 접속하기 >

-  Mac & Linux에서 접속하기 (터미널)

      AWS와 같은 외부서버로 SSH 접속을 하려면 매번 아래 명령어 입력해야 함 (불편함)

ssh -i pem [키 위치] [EC2의 탄력적 IP 주소]

    ⇒  쉽게 ssh에 접속하는 방법 💡

  1. 인스턴스 생성 시 받은 키페어 pem 파일을 ~/.ssh로 복사하기
cp pem [키 위치(키 다운로드 받은 위치)] ~/.ssh/

→ ssh 실행 시 pem 키 파일 자동으로 읽어 접속, 별도로 pem 키 위치 지정 필요 없음

  ( pem 키가 잘 복사되었는지 확인하고 싶다면  cd ~/.ssh/  명령어로 ~/.ssh 디렉토리로 이동한 후  ll  명령어로 파일 목록 확인해보기 )

2. pem 키 권한 변경

chmod 600 ~/.ssh/[pem키이름(pem키파일이름)]

 

 

3. pem키가 있는 ~/.ssh 디렉토리에 config 파일 생성

vim ~/.ssh/config

 

4. config 파일 수정

Host 본인이 원하는 서비스명
	HostName  [ec2의 탄력적 IP주소]
	User  ec2-user
	IdentityFile  ~/.ssh/[pem키이름]

Host = 앞으로 접속할 키 값
ex) Host abc로 등록할 경우 ssh abc로 해당 EC2 접속 가능
 :wq  명령어로 저장 종료

 

5. config 파일 권한 수정

chmod 700 ~/.ssh/config

 

⏩ 이제 터미널에서 아래 명령어만 입력하면 접속 가능 ✅

ssh [config에 등록한 서비스명(Host)]

   ‘Are you sure you want to continue connecting (yes/no)?’ 질문에  ‘yes’ 입력

 

 

-  Windows에서 접속하기 (Putty)

   ssh 접속하기는 불편 -> 별도 클라이언트인 putty 설치

1. putty 사이트에서 putty.exeputtygen.exe 모두 다운로드 후 puttygen.exe 실행
    https://www.putty.org/

 

Download PuTTY - a free SSH and telnet client for Windows

Is Bitvise affiliated with PuTTY? Bitvise is not affiliated with PuTTY. We develop our SSH Server for Windows, which is compatible with PuTTY. Many PuTTY users are therefore our users as well. From time to time, they need to find the PuTTY download link. W

www.putty.org

 

2. puttygen 화면의 상단 ‘Conversions’의 ‘Import Key’ 선택 후 다운로드 받았던 pem 키 파일 선택

  • puttygen - putty에서는 pem 키로 사용이 안되어 pem 키를 ppk 파일로 변환하는 과정을 진행해주는 클라이언트

 

3. 'Save private key' 클릭하여 ppk 파일 생성 후 저장

경고메세지가 뜰 경우 '예' 선택하기

 

4. putty.exe 실행 후 각 항목 등록

   HostName : [username]@[public_IP] 등록 (ec2-user@탄력적IP주소)
   Port : 22 (ssh 접속 포트)
   Connection type : SSH

 

5. 좌측의 'Connection' > 'SSH' > 'Auth' > 'Credentials'의 'Browse..' 클릭 -> ppk 파일 등록

 

6. 좌측의 'Session'의 'Saved Sessions'에 현재 설정을 저장할 이름 등록 > 'Save' > 'Open'

⏩ SSH 접속 성공 

 

 


< 아마존 리눅스 1 서버 생성 시 꼭 해야하는 설정들 >

1. Java 8 설치

  • 아마존 리눅스 1은 기본 자바 버전 7 -> 책의 내용에 따라 자바 8 설치
sudo yum install -y java-1.8.0-openjdk-amazon-corretto
  • 설치 후 인스턴스의 Java 버전을 8로 변경
sudo /usr/sbin/alternatives --config java

      (저는 해당 명령어를 따로 실행하지 않아도 Java 8로 바로 적용이 되었습니다)

  •  java -version  명령어로 현재 버전이 Java8인지 확인

  • 사용하지 않는 Java7 삭제
sudo yum remove java-1.7.0-openjdk

 

🚨 에러

책의 내용을 따라 'sudo yum install -y java-1.8.0-openjdk-devel.x86_64' 명령어로 설치 시 Amazon Linux 2023에서는  java-1.8.0-openjdk-devel를 지원하지 않기 때문에 아래의 오류가 발생함 -> amazon corretto 사용하기

 

2. 타임존 변경

기본 서버의 시간은 미국 시간대이기 때문에 한국 시간대로 변경해야만 우리가 사용하는 시간이 모두 한국 시간으로 등록/ 사용됨

sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
date       // 타임존이 KST로 변경되었는지 확인

타임존이 KST로 변경됨

 

3. HostName 변경

여러 서버를 관리 중이라면 IP만으로 어떤 서비스의 서버인지 확인 어려움

->  어떤 서비스인지 표현 하기 위해 HOSTNAME 변경

sudo hostnamectl set-hostname [설정할 호스트명]
hostnamectl

(책에는 /etc/sysconfig/network 편집파일을 열어서 수정하라고 나와있지만, Amazon Linux 2023 기준 해당 편집파일에 hostname 부분이 없으므로 위의 명령어를 사용합니다)

변경 전 - IP주소만 뜸

서버를 껐다가 재부팅하면 아래와 같이 변경됨

변경 후 - IP주소 부분이 설정한 호스트명으로 변경됨

 

3-1) /etc/hosts에 변경된 hostname 등록하기

sudo vim /etc/hosts       // 파일 열기

 >  i 키를 누른 후  127.0.0.1 [등록한 hostname]  등록 > esc +  :wq  명령어로 저장 후 종료

 >  curl 명령어로 정상적으로 등록되었는지 확인

curl [등록한 hostname]

  - 정상 등록된 경우 
     (7) Failed to connect to [hostname] port 80: ~~ 메세지
     = 아직 80포트로 실행된 서비스는 없지만 curl 호스트 이름으로 실행은 잘 되었음

  - 등록 실패한 경우
     (6) Could not resolve host:[hostname] 메세지 = 찾을 수 없는 주소임