※ 기존에 기록해둔 노션 글을 옮겨적은 것으로, 노션 템플릿에 맞게 적게된 글이라 해당 링크를 통해 더 가독성있게 보실 수 있습니다.
https://www.notion.so/EC2-Gateway-Server-2690661ce6288076a2aee25376a5a77d
기본 EC2 배포하기(Gateway Server) | Notion
1. EC2 키페어 만들기
pleasant-sand-55a.notion.site
1. EC2 키페어 만들기
reciping-vpc(애플리케이션 운영용 VPC)에 필요한 범용 prod .pem키를 발급해보도록 하겠습니다.

2. EC2 인스턴스 만들기 및 세부 설정 항목들에 관하여


[ 애플리케이션 및 OS 이미지(Amazon Machine Image) ]
- Q : 여기서 AMI란?
- A : AMI(Amazon Machine Image) 는 EC2 인스턴스를 실행할 때 사용하는 운영체제(OS)와 필수 소프트웨어가 미리 설치되어 있는 "템플릿 이미지" (=AMI는 “이대로 인스턴스를 부팅해라”라는 스냅샷+설정 모음집)
[ Quick Start ]
: Quick Start는 AWS에서 자주 사용하는 OS/애플리케이션 조합을 미리 골라놓은 대표적인 AMI 목록
- Amazon Linux : AWS 최적화, 성능 좋고 AWS CLI 및 SSM Agent 기본 탑재
- Ubuntu : 리눅스 환경, 오픈소스 친화적, 문서 많고 커뮤니티 활발
- MacOS : iOS/macOS 앱 빌드(웹X), 테스트 용도(Mac 전용 인스턴스(mac1..)만 사용 가능 → 매우 고가)
✅ +) Quick Start vs Community AMI vs Marketplace
| 유형 | 설명 | 특징 |
| Quick Start | AWS 공식 인기 이미지 | 안정성 ↑, 기본적인 구성, 초보자 추천 |
| My AMIs | 사용자가 직접 만든 이미지 | 재사용 목적, 커스텀 설정 가능 |
| AWS Marketplace | 서드파티 제공 이미지 | 상용 소프트웨어 포함 (예: Bitnami, Jenkins) |
| Community AMIs | 누구나 올린 공개 이미지 | 무료 많지만 보안 위험 주의 |

[ 모든 세대 ]
: 모든 세대 옵션은 ON했을 경우 최신 세대와 예전 세대 전부를 다 보여주는데, 되도록이면 최신 세대(t3…)를 사용하는게 좋습니다. 왜냐하면 오래된 세대는 phase-out되는 경우가 있기 때문입니다.

[ 퍼블릭 IP 자동 할당 ]
: 프라이빗 서브넷에서는 퍼블릭 IP가 없어야 정상이고, ALB를 통해서만 접근하게 되므로 퍼블릭 IP 필요 없음
3. 로컬 ~/.ssh에 .pem키 백업하고 백업본 따로 저장해두기

# pem키 백업하기 (제 맥북 배경화면에 있는 dev_backup 폴더에 백업)
cp /Users/sini/Desktop/dev_documents/reciping-prod-ec2-key.pem /Users/sini/Desktop/dev_backup/
# ~/.ssh 폴더로 복사
cp /Users/sini/Desktop/dev_documents/reciping-prod-ec2-key.pem ~/.ssh/
# 퍼미션 설정 (보안 경고 방지)
chmod 400 ~/.ssh/reciping-prod-ec2-key.pem
4. 로컬에서 빌드한 JAR 파일을 Bastion 서버를 거쳐 EC2에 업로드
아마 본인 로컬 상황에 따라 여기서부터 좀 다르게 가져가실 수 있습니다.
그래서 어떤 과정인지만 알아두시고 챗지피티와 소통을..!!ㅎ
(1) application-prod.yml 설정
server:
port: 8090
spring:
cloud:
gateway:
globalcors:
add-to-simple-url-handler-mapping: true
corsConfigurations:
'[/**]':
allowedOrigins:
- "https://www.reciping.kr"
- "https://reciping.kr"
allowedMethods:
- GET
- POST
- PUT
- DELETE
- OPTIONS
allowedHeaders:
- "*"
- Authorization
- Content-Type
exposedHeaders:
- Authorization
allowCredentials: true
logging:
level:
com.three.recipinggatewayservicebe.jwt: DEBUG
jwt:
secret:
key: m5M/3YqO8kB/32Xu0/AlU8TKtsKhXHXuRAm5XGvx786uTj3+BpN1RAA65tJvbOg1pZuVG+TqMyFk2XRL3rU7HA==
server:
port: 8090
spring:
cloud:
gateway:
globalcors:
add-to-simple-url-handler-mapping: true
corsConfigurations:
'[/**]':
allowedOrigins:
- "https://www.reciping.kr"
- "https://reciping.kr"
allowedMethods:
- GET
- POST
- PUT
- DELETE
- OPTIONS
allowedHeaders:
- "*"
- Authorization
- Content-Type
exposedHeaders:
- Authorization
allowCredentials: true
routes:
- id: user-service
uri: http://10.0.64.103:8080
predicates:
- Path=/users/**
logging:
level:
com.three.recipinggatewayservicebe.jwt: DEBUG
jwt:
secret:
key: m5M/3YqO8kB/32Xu0/AlU8TKtsKhXHXuRAm5XGvx786uTj3+BpN1RAA65tJvbOg1pZuVG+TqMyFk2XRL3rU7HA==
(2) [ Mac 터미널에서 해야하는 작업 (1) ]
# cd 명령어를 통해 현재 디렉토리를 해당 프로젝트 폴더로 이동
cd /Users/sini/Desktop/dev_sini/reciping-gateway-service-BE
# Gradle Wrapper (gradlew)를 실행
# 프로젝트를 새로 빌드해서 실행 가능한 .jar 파일을 생성
# /build/libs/ 디렉토리에 아래와 같은 결과물이 생깁니다.
# 예시) reciping-gateway-service-BE-0.0.1-SNAPSHOT.jar
# 기존에 var/logs..로 로컬 리눅스 폴더에 만들었기 때문에 xml쪽 빌드가 안될 것임(먼저 -x test로 테스트 없이 빌드)
./gradlew clean build -x test
3) +) 참고사항
# JAR 이름은 build.gradle에 이렇게 지정했으니
bootJar {
archiveFileName = 'reciping-gateway.jar'
}
# 따라서 jar 파일 경로는 다음과 같을 것임
/Users/sini/Desktop/dev_sini/reciping-gateway-service-BE/build/libs/reciping-gateway.jar
(4)
[ Mac 터미널에서 해야하는 작업 ]
# scp로 jar 파일을 우선 Bastion 서버로 업로드(macOS 기준) / 베스천 서버의 퍼블릭 IP : 3.39.222.21
scp -i ~/.ssh/reciping-bastion-ec2-key.pem \
/Users/sini/Desktop/dev_sini/reciping-gateway-service-BE/build/libs/reciping-gateway.jar \
ec2-user@3.39.222.21:~
[ Bastion 서버에서 해야하는 작업 ]
# Bastion 서버에 ssh 접속
ssh -i ~/.ssh/reciping-bastion-ec2-key.pem ec2-user@3.39.222.21
# 베스천의 ssh폴더에 pem키 옮기기
mv ~/reciping-prod-ec2-key.pem ~/.ssh/reciping-prod-ec2-key.pem
# AWS EC2 접속용 키에 필요한 권한 설정(권한 400 주기)
chmod 400 ~/.ssh/reciping-prod-ec2-key.pem
[ Mac 터미널에서 해야하는 작업 ] - Jar 전송하기
# Gateway 1로 JAR 복사
scp -o "ProxyCommand=ssh -i ~/.ssh/reciping-bastion-ec2-key.pem -W %h:%p ec2-user@3.39.222.21" -i ~/.ssh/reciping-prod-ec2-key.pem /Users/sini/Desktop/dev_sini/reciping-gateway-service-BE/build/libs/reciping-gateway.jar ec2-user@10.0.72.75:~
# Gateway 2로 JAR 복사
scp -o "ProxyCommand=ssh -i ~/.ssh/reciping-bastion-ec2-key.pem -W %h:%p ec2-user@3.39.222.21" -i ~/.ssh/reciping-prod-ec2-key.pem /Users/sini/Desktop/dev_sini/reciping-gateway-service-BE/build/libs/reciping-gateway.jar ec2-user@10.0.83.252:~

Amazon Linux (특히 Amazon Linux 2나 2023)는 기본적으로 java가 설치되어 있지 않아서 애플리케이션 서버에서 직접 수동 설치해야합니다.
sudo yum install -y java-17-amazon-corretto
혹은 아래 링크로 다운 후, 폴더를 download 파일에 넣어두기
https://corretto.aws/downloads/latest/amazon-corretto-17-x64-linux-jdk.rpm

(5)
[ gateway 서버에서 해야하는 작업 ] - Bastion ProxyJump 방식으로 Gateway 서버에 접속 후, rpm으로 설치
az-2도 똑같이 반복해주시면 됩니다.
# 게이트웨이 ec2 인스턴스에 접속 (예 : az-1)
ssh \
-o "ProxyCommand=ssh -i ~/.ssh/reciping-bastion-ec2-key.pem -W %h:%p ec2-user@3.39.222.21" \
-i ~/.ssh/reciping-prod-ec2-key.pem \
ec2-user@10.0.72.75
# rpm으로 ec2에 자바17 설치
sudo rpm -ivh ./java-17-amazon-corretto-devel-17.0.15.6-1.x86_64.rpm
# 설치 확인
java -version
# java -version 입력 시, 결과 화면
openjdk version "17.0.15" 2025-04-15 LTS
OpenJDK Runtime Environment Corretto-17.0.15.6.1 (build 17.0.15+6-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.15.6.1 (build 17.0.15+6-LTS, mixed mode, sharing)
(5)
[ Mac 터미널에서 해야하는 작업 ] - Bastion ProxyJump 방식으로 Gateway 서버에 접속
# scp로 ec2 인스턴스로 전송 (az-1)
scp \
-o "ProxyCommand=ssh -i ~/.ssh/reciping-bastion-ec2-key.pem -W %h:%p ec2-user@3.39.222.21" \
-i ~/.ssh/reciping-prod-ec2-key.pem \
./amazon-corretto-17-x64-linux-jdk.rpm \
ec2-user@10.0.72.75:~
# 게이트웨이 ec2 인스턴스에 접속 (az-1)
ssh \
-o "ProxyCommand=ssh -i ~/.ssh/reciping-bastion-ec2-key.pem -W %h:%p ec2-user@3.39.222.21" \
-i ~/.ssh/reciping-prod-ec2-key.pem \
ec2-user@10.0.72.75
# 다시 게이트웨이 서버에 로그 디렉토리 생성 및 권한 부여
sudo mkdir -p /var/log/reciping/gateway-service
sudo chown -R $(whoami) /var/log/reciping/gateway
# 게이트웨이 서버 실행
nohup java -jar ~/reciping-gateway.jar > /var/log/reciping/gateway/gateway-nohup.log 2>&1 &
# 정상실행 확인
ps -ef | grep reciping-gateway
# scp로 ec2 인스턴스로 전송 (az-2)
scp \
-o "ProxyCommand=ssh -i ~/.ssh/reciping-bastion-ec2-key.pem -W %h:%p ec2-user@3.39.222.21" \
-i ~/.ssh/reciping-prod-ec2-key.pem \
./amazon-corretto-17-x64-linux-jdk.rpm \
ec2-user@10.0.83.252:~
# 게이트웨이 ec2 인스턴스에 접속 (az-2)
ssh \
-o "ProxyCommand=ssh -i ~/.ssh/reciping-bastion-ec2-key.pem -W %h:%p ec2-user@3.39.222.21" \
-i ~/.ssh/reciping-prod-ec2-key.pem \
ec2-user@10.0.83.252
# 다시 게이트웨이 서버에 로그 디렉토리 생성 및 권한 부여
sudo mkdir -p /var/log/reciping/gateway-service
sudo chown -R $(whoami) /var/log/reciping/gateway
# 게이트웨이 서버 실행
nohup java -jar ~/reciping-gateway.jar > /var/log/reciping/gateway/gateway-nohup.log 2>&1 &
# 정상실행 확인
ps -ef | grep reciping-gateway
# +) 참고사항!
# JAR 실행 기본 명령어는 아래와 같습니다. (각 인스턴스 접속 후)
java -jar ~/reciping-gateway.jar
# => 이렇게 하면 포그라운드에서 실행돼서 터미널이 JAR 실행 화면에 고정됨. 나중에 꺼지면 앱도 종료됨.
# 그래서 이 방법 말고, 기존에 커스텀 로그 설정한 것도 있으니, 백그라운드 실행 + 로그 저장 방식으로 실행하기
nohup java -jar ~/reciping-gateway.jar > /var/log/reciping/gateway-service/gateway-nohup.log 2>&1 &

'Project > reciping' 카테고리의 다른 글
| [reciping] 프론트단의 Route53 + S3 + CloudFront 설정하기 (0) | 2025.11.05 |
|---|---|
| [reciping] ECS(EC2, Fargate)로 백엔드 애플리케이션 배포하기 + 기본 EC2배포까지 (2) (0) | 2025.11.05 |
| [reciping] ECS(EC2, Fargate)로 백엔드 애플리케이션 배포하기 + 기본 EC2배포까지 (1) (0) | 2025.11.05 |
| [reciping] 베스천 서버 세팅하기 (0) | 2025.11.05 |
| [reciping] VPC 생성하기 (0) | 2025.11.05 |