aws - EC2

» BE

인프런 JSCODE 박재성님 비전공자도 이해할 수 있는 AWS 입문/실전 강의를 듣고 정리한 내용입니다
https://www.inflearn.com/course/%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90-%EC%9D%B4%ED%95%B4%ED%95%A0%EC%88%98%EC%9E%88%EB%8A%94-aws-%EC%9E%85%EB%AC%B8%EC%8B%A4%EC%A0%84/dashboard

EC2

EC2(Elastic Compute Cloud)

컴퓨터를 빌려서 원격으로 접속해 사용하는 서비스

EC2가 필요한 이유

내가 가진 컴퓨터를 이용해 배포하려면 컴퓨터를 24시간 동안 커놔야 하고 보안 상 문제도 있을 수 있음 → aws 컴퓨터를 빌려서 사용하는 것

리전(Region) 선택하기
  • 리전이란 인프라를 지리적으로 나누어 배포한 각각의 데이터 센터
  • 사용자의 컴퓨터와 멀수록 속도 느려짐 → 사용자 많은 리전 선택
  • 늘 EC2 들어갈 때마다 리전 확인하기


EC2 셋팅
  • 이름 및 태그
    • 이름은 컴퓨터가 어떤 역할 하는지 직관적으로 설정 ex. practice-server
  • Application and OS Images (Amazon Machine Image)
    • OS 선택하는 단계
    • 윈도우나 맥os는 용량도 크고 성능도 많이 잡아먹으므로 우분투 사용
  • 인스턴스 유형
    • 인스턴스란 AWS EC2에서 빌리는 컴퓨터 한 대를 의미
    • 인스턴스 유형이란 컴퓨터 사양을 의미, 사양이 좋을수록 무거운 서버나 프로그램 돌릴 수 있고 많은 요청 처리 가능
    • 프리티어에선 t2.micro 사용
  • 키 페어 (로그인)
    • 키 페어(key pair)란 EC2 컴퓨터에 접근할 때 사용하는 비밀번호
    • 키 페어 이름도 직관적으로 설정
    • 키 페어 생성 시 파일이 하나 다운로드되는데 이거 잃어버리지 말기
  • 네트워크 설정
    • VPC는 나중에…
    • Security Group(보안 그룹)
      • 보안 그룹이란 AWS 클라우드에서의 네트워크 보안
      • EC2 인스턴스를 지키는 울타리이자 보안 요원
      • 보안 그룹에 규칙을 지정
      • 인바운드 트래픽(외부에서 EC2 인스턴스로 보내는 트래픽)과 아웃바운드 트래픽(EC2 인스턴스에서 외부로 나가는 트래픽)에서 어떤 트래픽만 허용할 지 설정 가능
      • 보안 그룹 설정 시 허용할 IP 범위와 PORT 설정
      • 소스 유형 - 위치 무관 시 어떤 IP 에서든 접근 가능
  • 스토리지(Storage) 구성
    • 볼륨(Volume)이라고도 함
    • 저장 공간이나 마찬가지
    • EBS(Elastice Block Storage)는 EC2 안 저장 공간, 하드디스크
    • 프리티어에선 30GiB까지 설정 가능
    • 스토리지는 gp3가 가성비 좋음


EC2 접속
  • 세부 정보
    • 퍼블릭 IPv4 주소는 EC2 인스턴스가 생성되면서 부여받은 IP 주소, EC2 인스턴스에 접근하려면 이 IP 주소로 접근하면 됨
    • 인스턴스 상태는 중지, 시작, 재부팅, 종료 등이 있음
    • EC2 인스턴스가 실행 중이라는 뜻은 컴퓨터가 켜져있다는 뜻
  • 모니터링
    • 실제 서버 운영 시 자주 보게 될 것
  • 인스턴스 연결
    • 사용자 이름을 설정 가능 → 보통 그냥 os 이름
    • 연결 버튼 클릭 시 연결


탄력적 IP 연결
  • EC2 인스턴스 생성 시 IP를 할당 받음 but 이렇게 할당 받은 IP는 임시 IP

  • 인스턴스를 중지시켰다 재실행하면 IP 바뀌어있음 → 바뀌지 않는 고정 IP = 탄력적 IP 할당받아야 함

    • 네트워크 및 보안에서 탄력적 IP 들어가기
    • 탄력적 IP 주소 할당
    • 탄력적 IP 주소 연결 → 생성한 인스턴스랑 IP 선택 후 연결


서버 배포
  • 인스턴스 선택 후 연결
  • 원격의 EC2 서버에 접속
  • 깃허브 주소 연결
  • node.js 설치 되어있어야 함
$ node -v
  • 필수 패키지 설치
$ npm i

https://cherishvert.tistory.com/107

  • .env 파일 만들기 → :wq 입력 후 나가기
$ vim .env
  • background process 사용하기 : pm2
    • node는 foreground process이기 때문에 터미널이 종료되면 원격 서버도 함께 종료됨
    • 만약 실수로 원격으로 접속해 놓은 shell을 끄면 로컬 경로(C:)로 돌아가고 원격에 접속해 있던 shell이 종료되기 때문에 원격 서버도 함께 종료
    • background process를 사용하면 shell의 종료 여부와 관계없이 원격 서버 계속 실행 가능 → pm2 라이브러리를 사용
      $ sudo npm i -g pm2
      $ sudo pm2 start app.js
    


EC2 종료
  • EC2 인스턴스 종료
  • 중지되면 탄력적 IP 릴리즈


(보충) IP와 PORT
  • IP란 네트워크 상에서의 특정 컴퓨터를 가리키는 주소
  • PORT란 한 컴퓨터 내에서 실행되고 있는 특정 프로그램 주소
    • 기본적으로 80번 포트로 연결
    • well-known-port란 0~1023번까지 주요 통신을 위한 규약에 따라 정해진 포트번호(꼭 지킬 필요는 없음, 권장)
      • 22번 (SSH, Secure Shell Protocol) : 원격 접속을 위한 포트 번호 → EC2 인스턴스에 연결할 때 22번 포트를 사용한다.
      • 80번 (HTTP) : HTTP로 통신을 할 때 사용
      • 443번 (HTTPS) : HTTPS로 통신을 할 때 사용
  • 특정 서버와 통신 시 IP와 PORT번호를 다 알고 있어야 함


Spring Boot 서버를 EC2에 배포하기
  • Spring Boot는 3.x.x 버전 사용, JDK는 17버전 사용

      $ sudo apt update && /
      sudo apt install openjdk-17-jdk -y
    
      $ java -version 
    

    으로 확인

  • Spring Boot 프로젝트 clone하기

    GitHub가 2021년 8월 13일부터 비밀번호 인증을 지원하지 않음 -> 대신 Personal Access Token (PAT) 또는 SSH Key를 사용해야 함

    • GitHub에서 Personal Access Token (PAT) 발급
    • Settings > Developer settings > Personal access tokens > Generate new token (classic)
    • Expiration (만료 기간): No expiration (무제한) 또는 1년
    • Scopes (권한 설정): repo (모든 리포지토리 접근), workflow (GitHub Actions 사용 시 필요), read:packages, write:packages (필요한 경우)
      $ git clone https://your-github-username:your-personal-access-token@github.com/username/repository-name.git
      $ cd repository-name
    
  • application.properties 수정

    백엔드 서버를 80번 포트로 열기로 보안그룹을 정해놔서

      nano src/main/resources/application.properties
    
      spring.datasource.url=jdbc:mysql://your-rds-endpoint:3306/DB-name?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
      spring.datasource.username=your-db-username
      spring.datasource.password=your-db-password
      spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
      server.port=80
    
  • 서버 실행

      $ ./gradlew clean build # 기존 빌드된 파일을 삭제하고 새롭게 JAR로 빌드
      $ ls -lh build/libs/ # jar 파일이 있는지 확인
      $ cd build/libs
      $ sudo java -jar ~-0.0.1-SNAPSHOT.jar
    

    public ip로 접속해서 확인