(6) AWS 서버환경 구성 - AWS EC2

Yunes·2023년 5월 29일
0

Spring Boot

목록 보기
6/7

클라우드

  • Infrastructure as a Service(IaaS, 아이아스, 이에스)
    기존 물리 장비를 미들웨어와 함께 묶어둔 추상화 서비스
    • 가상머신, 스토리지, 네트워크, 미들웨어와 함께 묶어둔 추상화 서비스
    • AWS의 EC2, S3등
  • Platform as a Service(PaaS, 파스)
    - IaaS에서 한번 더 추상화한 서비스
    • 한 번 더 추상화 했기 때문에 더 많은 기능이 자동화되어 있다.
    • AWS의 Beanstalk, Heroku등
  • Software as a Service (SaaS, 사스)
    - 소프트웨어 서비스
    • 구글 드라이브, 드랍박스, 와탭 등

EC2 인스턴스 생성하기

EC2(Elastic Compute Cloud)는 AWS에서 제공하는 성능, 용량 등을 유동적으로 사용할 수 있는 서버이다.
프리티어 플랜에서는 사양이 t2.micro만 가능하다.

  • vCPU(가상 CPU) 1 Core, 메모리 1GB 사양이다.
  • 보통 vCPU는 물리 CPU 사양의 절반 정도의 성능을 가진다.
  • 월 750 시간의 제한, 초과시 비용 부과 (24시간 * 31일 = 744)

리전 변경

처음에 미국 동부 (버지니아 북부)로 되어있던 리전을 아시아 태평양 (서울)리전으로 변경한다.

리전 : AWS의 서비스가 구동될 지역.

EC2 생성

  1. EC2 검색후 인스턴스 시작 클릭

  2. 서버 이름 지정후 AMI 선택 (서버이름 aws-v1)

    AMI(Amazon Machine Image) : EC2 인스턴스를 시작하는데 필요한 정보를 이미지로 만들어 둔것. 인스턴스라는 가상 머신에 운영체제 등을 설치할 수 있게 구워 넣은 이미지

  3. 인스턴스 유형 - t2.micro

  4. 키 페어(로그인)

  • 새 키페어 생성

  1. 네트워크 설정
  • 기본적으로 내 집 IP 를 설정하고 다른 장소 이동시 IP를 ssh에 추가하는 방식이 안전하다.
  1. 스토리지 구성
  • 기본 8GB이나 프리티어는 30GB까지 가능하니 30으로 수정한다.
  1. 인스턴스 시작

보안그룹

AWS에서 제공하는 방화벽으로 인바운드 규칙, 아웃바운드 규칙이 존재한다.

  • 인바운드 규칙 : 외부에서 EC2나 RDS등의 내부로 접근시 사용되는 방화벽 규칙
  • 아웃바운드 규칙 : EC2나 RDS등의 내부에서 외부로 접근시 사용되는 방화벽 규칙
    EC2 사이드바의 네트워크 및 보안에서 보안 그룹 선택

인바운드 규칙 편집

만약 다른 장소 (다른 ip 사용) 에서 EC2에 접속하려 할 경우 인바운드 규칙 편집에서 규칙을 추가하여 SSH 에 냬IP를 추가한다.
물론 이 경우 접속은 ssh 파일이 있어야 접속할 수 있다.

EC2 인스턴스 생성 완료

EIP(Elastic IP) 할당

인스턴스도 하나의 서버이기 때문에 IP가 존재하는데 인스턴스 생성 시 항상 새 IP를 할당하며 같은 인스턴스를 중지하고 다시 시작할 때도 새 IP가 할당된다. 매번 IP 주소를 확인하는 것은 매우 번거로우니 인스턴스의 IP가 매번 변경되지 않고 고정 IP를 갖도록 해야 한다.

EIP : Elastic IP, 탄력적 IP, 고정 IP

  1. EC2 왼쪽 사이드바 메뉴중 네트워크 및 보안에서 탄력적 IP 선택

  2. 탄력적 IP 주소 할당

  3. 별다른 설정 없이 할당

  4. 탄력적 IP 주소 연결

  5. 탄력적 IP 주소 연결 설정
    인스턴스, 프라이빗 IP 주소 검색시 앞에서 생성한 인스턴스, 프라이빗 IP 주소 리스트가 나오니 그중에서 선택한다.

연결된 인스턴스 ID가 생성된 것을 볼 수 있다.

탄력적 IP 주소가 할당된 것을 볼 수 있다.

EC2 서버에 접근하기 (mac)

sshKey.pem 이 pem키파일이다.
먼저 pem 키파일이 있는 디렉토리로 이동한다.

cp pem키파일 ~/.ssh/

~/ 디렉토리에 .ssh 디렉토리가 없어서 mkdir .ssh 를 실행시켜줬다.
이때 .ssh 는 기본적으로 숨김파일이니 맥 기준 ⇧ + ⌘ + . 을 하면 숨김파일을 확인할 수 있다.

pem 키 복사여부 확인

cd ~/.ssh/
ll

복사된 pem 키의 권한 변경

chmod 600 ~/.ssh/pem키 파일
vim ~/.ssh/config

i입력후 편집

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

나는 서비스명으로 springboot-webservice 을 설정했다.
:wq 로 변경사항 저장

config 파일 실행 권한 설정

chmod 700 ~/.ssh/config

접속 성공여부 확인

ssh config에 등록한 서비스명

나는 config에 springboot-webservice라는 이름으로 서비스를 등록했다.

yes 입력

기타 설정 (작성중..)

JAVA 17 설치

현재 내 프로젝트의 java 버전은 17이다.

sudo yum install java-17-amazon-corretto

설치중 한번 물어보는게 나올때 y

설치된 java 버전 확인

다음의 명령어로 ec2 서버에 설치되어 있는 java 중 사용할 java 버전을 선택할 수 있다.

sudo /usr/sbin/alternatives --config java

타임존 변경


기존에 UTC 로 뜨던 것이 한국시간 KST 로 바뀐 모습을 확인할 수 있다.

호스트네임 변경

현재 AMI 로 Amazone Linux AMI 2 를 사용하고 있기 때문에 다음의 명령어를 입력한다.

sudo hostnamectl set-hostname 원하는이름.localdomain

나는 springboot-webservice 로 설정했다.

그러고 ec2 서버에접속한 상태로

sudo vim /etc/hosts

로 /etc/hosts 에 들어가서 다음과 같이 입력한다. (/etc/hosts 에 hostname 등록)

이렇게 Failed to connect to springboot-webservice port 80 이 뜨면 등록이 된 것이다. 이는 아직 80포트로 실행된 서비스가 없음을 의미하며 curl 호스트 이름으로 실행은 잘 되었음을 의미한다.

테스트 환경 요금 줄이기

참고로 현재까지 USD 2.12 가 발생했고 t2.micro 인스턴스 113Hr 사용료가 USD 1.63(프리티어 계정이 아닌것 같다), EBS 가 USD 0.49 만큼 요금이 발생했다.

항상 서버를 사용하고 있지 않은 상태인데 EC2 을 활성화 시켜두면 소량이라도 매달 과금이 발생한다.
따라서 EC2 인스턴스 중지, 탄력적 IP 연결 해제, 탄력적 IP 주소 릴리스 등의 조치를 취해두었다.
다시 EC2를 사용하려면 위의 EC2 서버에 접근하기 (mac) 에서 조치했던

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

이 부분에 수정이 필요할 것으로 보인다.(탄력적 IP 주소를 제거했으니 새로 생성한 탄력적 IP 주소로 변경해야 인스턴스에 접근가능)

또한 EBS 는 따로 중지할 수 있는 방법이 없어서 본격적으로 개발에 들어가기 전이라 일단 인스턴스를 샂게해서 EBS 도 같이 삭제시키는 방향으로 조치를 취해두었다.

다시 EC2 인스턴스 생성시 pem 키 생성하면 ~/.ssh 디렉토리에 pem 파일을 다시 붙여넣어야 한다.


(현재는 서버 사용중에 있어서 다시 인스턴스를 생성했다.)


프로젝트 배포하기

git 설치

git --version

sudo yum install git -y

프로젝트 클론

pwd : pring working directory, 현재 작업중인 디렉토리를 출력한다.

ec2 에서의 디렉토리 확인

gitlab 의 username 과 password 는 github 처럼 user.name 이 아니라 그냥 gitlab 자체의 계정ID, password 이다.

gradlew 실행권한이 없다고 뜨면

다음 명령어로 gradlew 에 권한을 부여후

chmod +x gradlew
./gradlew test

결과는 fail

아마도 테스트를 실행하려면 mysql 이 실행되어야 하는데 그게 안되어 있어서 실패하지 않았나 추정한다. (원인 찾는중)

보면 다른 장소에서 실행했더니 IP가 달라서 권한이 다른것 같기에 mysql 에 직접 들어가서 이 장소의 유저에게 권한을 부여하려 한다.

docker exec -it mysql-database bash
mysql -uroot -p --port 3306

위에 나온대로 jihun 이라는 유저에게 권한을 부여했다.

이후 사용한다고 한 database 인 jpa_ex 를 생성해줬다.

(해결)

ec2 내 파일 및 디렉토리 삭제

혹시 다른 디렉토리에 다시 클론받고 싶다면 기존에 클론받은 폴더 하위 파일들을 모두 삭제하면 된다.

rm -rf 폴더명

이 명령어를 실행하면 해당 폴더를 포함하여 폴더 내에 있는 하위 파일들을 모두 삭제한다.

프로젝트 빌드

현재 ec2에 클론한 프로젝트 ls 를 보자

이미 ./gradlew build 의 결과로 파란색의 build 를 볼 수 있다.

cd build
cd libs

???

build 에 libs 가 없다. 책에선 build 폴더 내에 libs 안에 실행파일 .jar 가 있다고 하는데 다시 빌드해보자.

???

충격. 테스트 코드에 이어 빌드도 실패. 문제가 있다.

원인을 찾아봤을때 MySQL 과 docker 가 EC2 상에 설치되어 있지 않은 점이 원인으로 보인다.

(현상황:
로컬에 mysql 을 바로 설치하지 않고 사용하려고 docker 를 사용하여 mysql 이미지를 받아 컨테이너를 생성해 사용중에 있음. 이를 springboot 프로젝트에 연결했지만 ec2 엔 docker 도, mysql 이미지도 받아두지 않은 상태. 이 상태서 build 및 테스트를 하려고 하니 오류가 뜨는 것으로 보임)

해결방법을 찾고 있는중...

profile
미래의 나를 만들어나가는 한 개발자의 블로그입니다.

0개의 댓글

관련 채용 정보