EC2 인스턴스 접속 후 서버 띄우기
1. 인스턴스 접속하기
1.1. 준비물
인스턴스를 생성했다면 서버를 띄우기 위해서 EC2 인스턴스에 접속해야 한다. 인스턴스 접속 방법은 다양하고 그 중 하나는 운영체제의 기본 터미널을 사용하는 것이다. MAC OS 기본 터미널로 인스턴스에 접속하기 위한 준비물은 다음과 같다.
인스턴스 생성 시 발급받은 프라이빗 키(.pem 파일)
실행 중인 인스턴스의 퍼블릭 IPv4 주소
프라이빗 키는 삭제하지 않았다면 파일 저장소 내부에 저장되어 있을 것이다.

인스턴스의 퍼블릭 IPv4 주소를 확인하기 위해서는 AWS 웹사이트 방문이 필요하다. EC2 대시보드에서 인스턴스를 클릭하고 인스턴스를 선택하면 퍼블릭 IPv4 주소를 확인할 수 있다.
1.2. 인스턴스 접속
프라이빗 키의 기본 권한은 0644(-rw-r--r--)이다. 이는 리눅스의 파일 권한을 나타내며 의미는 다음과 같다.
(-): 파일의 권한
(rw-): 파일 소유자(owner)의 권한
(r--): 파일 그룹(group)의 권한
(r--): 다른 사용자(other)의 권한
권한을 변경하지 않으면 EC2 인스턴스 접속 시 다음과 같은 에러를 출력한다.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '프라이빗_키.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "프라이빗_키.pem": bad permissions
'사용자_이름'@'퍼블릭_IPv4_주소': Permission denied (publickey).
프라이빗 키가 나를 제외한 다른 사용자에게 열려있는 건 위험하므로 EC2 접근을 거부하는 것이다. 따라서 EC2 인스턴스에 접근하기 위해서는 chmod로 프라이빗 키 권한을 변경해야 한다. 리눅스 파일의 권한 변경 명령어는 chmod이다.
# ==============================================================================
# 1. 프라이빗 키 권한 변경
# ==============================================================================
# 터미널에 아래 명령어 입력 후 엔터
chmod 400 '프라이빗_키_경로/프라이빗_키.pem'
읽기 권한만 주고 싶으면 400, 쓰기 권한까지 주고 싶으면 600을 입력하면 된다. 나는 읽기 권한만 쓸 예정이므로 400을 입력했다.
# ==============================================================================
# 2. EC2 인스턴스 접속
# ==============================================================================
# 터미널에 아래 명령어 입력 후 엔터
ssh -i '프라이빗_키_경로/프라이빗_키.pem' '사용자_이름'@'퍼블릭_IPv4_주소'
# 제대로 환경변수가 설정되었다면 아래와 같이 출력
, #_
~\_ ####_ AMI
~~ \_#####\
~~ \###|
~~ \#/ ___ https://aws.amazon.com/
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
Last login: Thu Oct 26 00:00:00 2023 from 'IP_주소'
['사용자_이름'@'IP_주소' ~]$
사용자 이름은 인스턴스의 이미지 종류에 따라 달라진다. 공식 문서(link)를 참고해서 입력하자.
Amazon Linux 2023 Amazon Linux 2 the Amazon Linux AMI
ec2-user
CentOS AMI
Fedora AMI
Oracle AMI
RHEL AMI
ec2-user 또는 root
SUSE AMI
Debian AMI
admin
Ubuntu AMI
ubuntu
Bitnami AMI
bitnami
1.3. 설정을 통한 인스턴스 접속
설정 파일을 생성하면 조금 더 간단한 명령어로 EC2 인스턴스에 접속할 수 있다.
# ==============================================================================
# 1. 프라이빗 키를 ~/.ssh/에 복사
# ==============================================================================
# 터미널에 아래 명령어 입력 후 엔터
cp '프라이빗_키_경로/프라이빗_키.pem' ~/.ssh/
# ==============================================================================
# 2. 복사한 프라이빗 키 권한 변경
# ==============================================================================
# 터미널에 아래 명령어 입력 후 엔터
chmod 400 ~/.ssh/'프라이빗_키.pem'
먼저 프라이빗 키를 ~/.ssh/에 복사하고 권한을 변경한다.
# ==============================================================================
# 3. ~/.ssh/에 config 생성 및 수정
# ==============================================================================
# 터미널에 아래 명령어 입력 후 엔터
vi ~/.ssh/config
# i 버튼 입력 후 아래 내용 붙여넣고 :wq! 입력하고 엔터
Host 'ssh 명령어에 사용할 이름'
HostName '퍼블릭_IPv4_주소'
User '사용자_이름'
IdentityFile ~/.ssh/'프라이빗_키.pem'
설정 파일을 생성하고 수정한다.
# ==============================================================================
# 4. 설정 파일 권한 변경
# ==============================================================================
# 터미널에 아래 명령어 입력 후 엔터
chmod 400 ~/.ssh/config
생성된 설정 파일은 프라이빗 키와 마찬가지로 보안이 중요하므로 파일 권한을 변경한다.
# ==============================================================================
# 5. 설정 파일로 EC2 인스턴스 접속
# ==============================================================================
# 터미널에 아래 명령어 입력 후 엔터
ssh 'ssh 명령어에 사용할 이름'
# 제대로 환경변수가 설정되었다면 아래와 같이 출력
, #_
~\_ ####_ AMI
~~ \_#####\
~~ \###|
~~ \#/ ___ https://aws.amazon.com/
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
Last login: Thu Oct 26 00:00:00 2023 from 'IP_주소'
['사용자_이름'@'IP_주소' ~]$
2. 인스턴스 설정 변경
2.1. 탄력적 IP 할당
생성한 인스턴스는 중지 후 다시 실행하면 퍼블릭 IPv4 주소가 변경된다. 퍼블릭 IP는 변경될 가능성이 있으므로 변하지 않는 IP 주소 할당이 필요하다. 탄력적 IP는 실행 중인 인스턴스와 연결되어 있지 않거나 중지된 인스턴스 또는 연결되지 않은 네트워크 인터페이스와 연결된 경우 소액의 시간당 요금이 부과된다. 인스턴스가 실행 중인 동안 이와 연결된 탄력적 IP 주소 하나에 대해서는 요금이 부과되지 않는다. 자세한 건 AWS 공식 문서(link)를 참고하자.

EC2 대시보드에서 탄력적 IP를 클릭해서 탄력적 IP 주소로 이동한다.

탄력적 IP 주소에서 탄력적 IP 주소 할당버튼을 클릭하면 탄력적 IP를 생성할 수 있다.

할당 버튼을 클릭하면 탄력적 IP를 생성할 수 있다.

생성된 탄력적 IP 주소는 실행 중인 인스턴스에 연결해야 한다. 작업 ➜ 탄력적 IP 주소 연결로 탄력적 IP 주소 연결 화면으로 이동한다.

그리고 인스턴스와 프라이빗 IP 주소를 선택한 후 연결 버튼을 클릭하면 탄력적 IP를 인스턴스에 연결할 수 있다.
2.2. 보안 그룹 수정
기본 보안 그룹이라면 Spring Boot 포트를 설정해야 한다.

EC2 대시보드에서 보안 그룹을 클릭하고 보안 그룹으로 이동한다. 그리고 인스턴스와 연결된 보안 그룹의 인바운드 규칙 편집을 클릭한다.

사용자 지정 TCP와 8080으로 스프링 부트 포트를 열 수 있다.
3. 인스턴스에서 서버 실행
스프링 부트 프로젝트가 준비되어 있다고 가정한다. Amazon Linux 2023은 3세대 Amazon Linux 배포판으로 Fedora를 기반으로 한다. AL2023은 yum을 대체하는 명령어로 dnf를 제공한다. 자세한 건 공식 문서(link)를 참고하자. 서버를 가동시키는 방법은 두 가지가 있다.
Jar 파일 실행
프로젝트 실행
인스턴스에서 서버가 실행되는지 확인만 할 생각이라 1번으로 진행했다.
# ==============================================================================
# 1. jar 파일 생성
# ==============================================================================
# 프로젝트 폴더로 이동 후 터미널에 아래 명령어 입력 후 엔터
./gradlew build
# 제대로 생성됐다면 다음과 같이 출력
BUILD SUCCESSFUL in 691ms
7 actionable tasks: 2 executed, 5 up-to-date
먼저 프로젝트 폴더에서 jar 파일을 생성한다. 생성된 jar 파일은 **프로젝트_이름/build/libs/**에서 확인할 수 있다.
# ==============================================================================
# 2. jar 파일을 EC2 인스턴스로 전송
# ==============================================================================
# 터미널에 아래 명령어 입력 후 엔터
scp 'jar_파일_경로/jar_파일_이름-SNAPSHOT.jar' '호스트_이름':/home/'사용자_이름'/
# 제대로 전송되었다면 다음과 같이 출력
jar_파일_이름-SNAPSHOT.jar 100% 20MB 33.9MB/s 00:00
여기서 '호스트_이름'은 config 파일에 설정한 'Host'를 가리킨다.
# ==============================================================================
# 3. EC2 인스턴스에 java 설치
# ==============================================================================
# 터미널에 아래 명령어 입력 후 엔터
scp dnf update
# 터미널에 아래 명령어 입력 후 엔터
sudo dnf install java-17-amazon-corretto-devel
# 터미널에 아래 명령어 입력 후 엔터
java -version
# 제대로 환경변수가 설정되었다면 아래와 같이 출력
openjdk version "17.0.9" 2023-10-17 LTS
OpenJDK Runtime Environment Corretto-17.0.9.8.1 (build 17.0.9+8-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.9.8.1 (build 17.0.9+8-LTS, mixed mode, sharing)
업데이트가 있는지 확인하고 java를 설치하자. 나는 프로젝트의 스프링 부트 버전이 3.15였으므로 자바 17버전을 설치했다.
# ==============================================================================
# 4. EC2 인스턴스에서 jar 실행
# ==============================================================================
# 터미널에 아래 명령어 입력 후 엔터
java -jar 'jar_파일_이름-SNAPSHOT.jar'
# 제대로 jar 파일이 실행되면 아래와 같이 출력
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.1.5)
제대로 실행되고 있는지 확인하기 위해 주소창에 퍼블릭 IPv4 주소와 포트 번호(8080)을 입력해보자.

스프링 부트 프로젝트의 index.html 화면이 출력된다면 성공이다.
참고 자료
Last updated