EC2(Elastic Compute Cloud)는 AWS에서 제공하는 성능, 용량 등을 유동적으로 사용할 수 있는 서버이다.
프리티어 플랜에서는 사양이 t2.micro만 가능하다.
처음에 미국 동부 (버지니아 북부)로 되어있던 리전을 아시아 태평양 (서울)리전으로 변경한다.
리전 : AWS의 서비스가 구동될 지역.
EC2 검색후 인스턴스 시작 클릭
서버 이름 지정후 AMI 선택 (서버이름 aws-v1)
AMI(Amazon Machine Image) : EC2 인스턴스를 시작하는데 필요한 정보를 이미지로 만들어 둔것. 인스턴스라는 가상 머신에 운영체제 등을 설치할 수 있게 구워 넣은 이미지
인스턴스 유형 - t2.micro
키 페어(로그인)
AWS에서 제공하는 방화벽으로 인바운드 규칙, 아웃바운드 규칙이 존재한다.
인바운드 규칙 편집
만약 다른 장소 (다른 ip 사용) 에서 EC2에 접속하려 할 경우 인바운드 규칙 편집에서 규칙을 추가하여 SSH 에 냬IP를 추가한다.
물론 이 경우 접속은 ssh 파일이 있어야 접속할 수 있다.
EC2 인스턴스 생성 완료
인스턴스도 하나의 서버이기 때문에 IP가 존재하는데 인스턴스 생성 시 항상 새 IP를 할당하며 같은 인스턴스를 중지하고 다시 시작할 때도 새 IP가 할당된다. 매번 IP 주소를 확인하는 것은 매우 번거로우니 인스턴스의 IP가 매번 변경되지 않고 고정 IP를 갖도록 해야 한다.
EIP : Elastic IP, 탄력적 IP, 고정 IP
EC2 왼쪽 사이드바 메뉴중 네트워크 및 보안에서 탄력적 IP 선택
탄력적 IP 주소 할당
별다른 설정 없이 할당
탄력적 IP 주소 연결
탄력적 IP 주소 연결 설정
인스턴스, 프라이빗 IP 주소 검색시 앞에서 생성한 인스턴스, 프라이빗 IP 주소 리스트가 나오니 그중에서 선택한다.
연결된 인스턴스 ID가 생성된 것을 볼 수 있다.
탄력적 IP 주소가 할당된 것을 볼 수 있다.
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이다.
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 --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 를 생성해줬다.
(해결)
혹시 다른 디렉토리에 다시 클론받고 싶다면 기존에 클론받은 폴더 하위 파일들을 모두 삭제하면 된다.
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 및 테스트를 하려고 하니 오류가 뜨는 것으로 보임)
해결방법을 찾고 있는중...