Project/reciping

[reciping] 기본 EC2 배포하기(Gateway Server)

S_N_Y 2025. 11. 5. 05:42

※ 기존에 기록해둔 노션 글을 옮겨적은 것으로, 노션 템플릿에 맞게 적게된 글이라 해당 링크를 통해 더 가독성있게 보실 수 있습니다.

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 인스턴스 만들기 및 세부 설정 항목들에 관하여

‘인스턴스 시작’ 클릭
이름은 reciping-gateway-ec2-01, reciping-gateway-ec2-02로 가져가겠습니다.

[ 애플리케이션 및 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 누구나 올린 공개 이미지 무료 많지만 보안 위험 주의

 

충분히 트래픽을 감당하도록 단일 큰용량의 인스턴스 필요, VCPU 2개 / RAM 4GB로 초기 트래픽으로 설정(나중에 모니터링 후, 용량 다시 설정해야 합니다.)

[ 모든 세대 ]

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

똑같이 구성하고 인스턴스 시작 클릭 (가용영역이 2개여서 인스턴스를 reciping-private-subnet-02 로 똑같이 하나 더 만들기)

[ 퍼블릭 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 &

결과