API Gateway가 User Service에 연결할 수 없는 문제 발생

500 Server Error for HTTP POST "/v1/auth/signup"
io.netty.channel.AbstractChannel$AnnotatedConnectException: finishConnect(..) failed: Connection refused: /172.17.0.2:10001

 

 

환경구성>

Eureka Server :  Lightsail 인스턴스 (43.203.45.192:8761)

API Gateway : EC2 인스턴스 (3.34.137.212:10000)

User Service : EC2 인스턴스 (3.35.3.139:10001)

→ 각 서비스는 Docker 컨테이너로 실행됨

 

User-service의 application.yml

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://43.203.45.192:8761/eureka/
  instance:
    prefer-ip-address: true

 

 

원인

Dockers 내부 IP vs EC2 IP 문제

  • User Service가 Eureka에 등록될 때 IP를 명시하지 않아 내부IP(172.17.0.2)를 등록
  • 내부IP는 해당 EC2 인스턴스 내에서만 유효하므로 다른 EC2에서 접근 불가능
  • API Gateway가 Eureka에서 조회한 User Service IP (172.17.0.2) 주소로 연결을 시도했으나 실패함

 

해결 방법

1) User Service의 Eureka 클라이언트 설정을 수정 - EC2의 실제 IP 주소를 등록하도록 변경

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://43.203.45.192:8761/eureka/
  instance:
    prefer-ip-address: true
    ip-address: 3.35.3.139  # EC2의 실제 IP 주소
    instance-id: ${eureka.instance.ip-address}:${server.port}

 

 

 

 

 

2) 호스트모드

: 컨테이너가 호스트의 네트워크 스택을 직접 사용

-d --network=host

 

docker run -d --network=host --name user-serivce --restart always user-service

 

 

브릿지모드 vs 호스트모드

 

 

 

'DevOps > AWS' 카테고리의 다른 글

AWS Lightsail 배포  (1) 2025.05.07
AWS EC2 배포 (JAR 파일을 이용한 수동 배포)  (0) 2025.05.07

 

1. DB를 한 서버에 Docker compose로 올리기

 

1) 인스턴스 생성

2) SSH 접속 / TimeZone 설정

https://gamza-devlog.tistory.com/37

 

AWS EC2 배포 (JAR 파일을 이용한 수동 배포)

유광열 튜터님 강의- 클라우드: IT 서비스를 운영할 시 필요한 기계들을 온라인으로 대여할 수 있는 서비스- AWS : 아마존에서 서비스하는 클라우드- EC2 : AWS에서 대여해주는 서버용 컴퓨터 (Elastic

gamza-devlog.tistory.com

 

3) Docker 설치

curl -fsSL https://get.docker.com/ | sudo sh

# root 사용자로 전환했을 경우
curl -fsSL https://get.docker.com/ | sh

 

 

4) docker-complse.yml 올리기

# 로컬 터미널 
scp -i /Users/t2024-m0206/Documents/Dev/key/LightsailDefaultKey-ap-northeast-2.pem /Users/t2024-m0206/Documents/git/musinsam/docker-compose.yml ubuntu@IPv4:/home/ubuntu/

 

5) docker compose 실행

docker compose -d
docker ps

 

 

 

 

2. 애플리케이션 배포

 

1) Dockerfile

: 이 애플리케이션을 어떻게 패키징 할지 정의하는 설정 파일

FROM eclipse-temurin:17-jdk-alpine 				# 1. JAVA 17 환경 가져옴
WORKDIR /app							# 2. 컨테이너 내부에 /app 폴더 생성
COPY *.jar app.jar						# 3. JAR 파일을 컨테이너에 복사
EXPOSE 8761							# 4. 8761 포트를 외부에 공개
ENTRYPOINT ["java", "-jar", "/app/app.jar"]			# 5. 컨테이너 시작 시 실행할 명령

 

2) 로컬에서 JAR 파일 빌드

# ./gradlew 파일에 실행 권한 부여 해야 할 수 있음
chmod +x ./gradlew

./gradlew build
# 또는
./gradlew bootJar

 

3) 파일들을 서버로 전송

# eureka-server 디렉토리 만들기
mkdir eureka-server
# 디렉토리의 권한을 수정
sudo chown ubuntu:ubuntu /home/ubuntu/eureka-server
# 로컬
scp -i /Users/t2024-m0206/Documents/Dev/key/LightsailDefaultKey-ap-northeast-2.pem /Users/t2024-m0206/Documents/git/musinsam/eureka-server/build/libs/eureka-server-0.0.1-SNAPSHOT.jar ubuntu@IPv4:/home/ubuntu/eureka-server/ 
scp -i /Users/t2024-m0206/Documents/Dev/key/LightsailDefaultKey-ap-northeast-2.pem /Users/t2024-m0206/Documents/git/musinsam/eureka-server/Dockerfile ubuntu@IPv4:/home/ubuntu/eureka-server/

 

4) 서버에서 Docker 이미지 빌드 및 실행

# Docker 설치
curl -fsSL https://get.docker.com/ | sudo sh

# root 사용자로 전환했을 경우
curl -fsSL https://get.docker.com/ | sh
# eureka-server 디렉토리 이동 후
# Docker 이미지 빌드 (이 과정에서 Java 설치, JAR 파일 복사 등이 자동으로 이루어짐)
docker build -t eureka-server .
# Docker 컨테이너 실행
docker run -d --name eureka-server -p 8761:8761 --restart always eureka-server

# 환경변수 있을 시
docker run -d --name eureka-server -p 8761:8761 --restart always -e 환경변수1=value -e 환경변수2=value eureka-server
 

docker ps

 

 

유광열 튜터님 강의

- 클라우드: IT 서비스를 운영할 시 필요한 기계들을 온라인으로 대여할 수 있는 서비스

- AWS : 아마존에서 서비스하는 클라우드

- EC2 : AWS에서 대여해주는 서버용 컴퓨터 (Elastic Compute Cloud)

- MobaXterm : 클라우드 서버에 접속하기 위한 프로그램 (콘솔 사용 및 파일 관리, putty와 filezilla 합친 느낌)

 

EC2에 리눅스를 설치하면 해당 컴퓨터의 시간대가 초기화(UTC+0)되어 DB에 데이터 업데이트 시 잘못된 시간이 저장될 수 있음

→ 대한민국 서울 시간대로 조정해야 함

 

 

1) 프로젝트 빌드

# ./gradlew 파일에 실행 권한 부여 해야 할 수 있음
chmod +x ./gradlew

./gradlew build
# 또는
./gradlew bootJar

 

 

2) EC2 대여 (인스턴스 생성)

 

- 키 페어 : 서버에 접속할 수 있는 암호 파일

 

- 인바운드 규칙 편집 : 외부에서 서버 컴퓨터로 접근할 수 있는 규칙 정함

해당 프로젝트는 8080포트를 사용하고 있음 외부에서 해당 포트로 접근할 수 있도록 설정해야 함

모든 사람들이 접근할 수 있도록 IP는 0.0.0.0/0으로 설정

 

 

3) SSH 접속

✅ EC2 인스턴스 생성 시 .pem 키 파일 다운로드
✅ 보안 그룹에서 포트 22 (SSH) 열려 있어야 함
✅ 인스턴스 퍼블릭 IPv4 주소 확인

 

1. 키 파일 권한 설정

키 파일 있는 디렉토리 이동 후

chmod 400 first_key.pem # 400: 읽기만 허용

 

2. SSH 접속

OS가 Ubuntu일 경우 유저네임 ubuntu

ssh -i first_key.pem ubuntu@IPv4 주소

 

 

4) TimeZone 설정

관리자(루트) 권한 사용

$ sudo su

현재 시간대 확인

timedatectl

 

 

대한민국 시간대로 변경

timedatectl set-timezone Asia/Seoul

 

 

 

5) JDK 다운로드

 

다운로드 목록 받아옴 (패키지 목록을 업데이트해서 새로운 버전이 있는지 확인)

sudo apt update

 

목록에 openjdk가 있는지 검색

apt-cache search openjdk

 

openjdk-17-jdk  설치

apt install -y openjdk-17-jdk

 

자바가 잘 설치되었는지 확인

java -version

 

 

6) 폴더 만들기 / 배포

mkdir my_app # /home/ubuntu/my_app

 

- 로컬에 있는 mybatis_project-0.0.1-SNAPSHOT.jar 파일을 my_app 디렉터리에 넣기

 

my_app 디렉토리의 권한을 수정해서 ubuntu 사용자에게 쓰기 권한을 부여

sudo chown ubuntu:ubuntu /home/ubuntu/my_app

 

# 로컬 터미널
scp -i /Users/t2024-m0206/Documents/Dev/key/first_key.pem /Users/t2024-m0206/Documents/git/Sparta_CodingClub/AWS/build/libs/mybatis_project-0.0.1-SNAPSHOT.jar ubuntu@IPv4:/home/ubuntu/my_app/

 

ls -l /home/ubuntu/my_app/

 

 

7) 서버 프로그램 실행

 

cd my_app/
nohup java -jar mybatis_project-0.0.1-SNAPSHOT.jar 1>log.out 2>err.out &

nohup: 유저가 콘솔에 접속 중이지 않더라도 서버 실행 유지 (터미널 세션이 끊겨도 계속 실행되도록 해줌)

java -jar : 자바 jar파일 실행 (내부 톰캣용)

파일명 : m + tab 자동완성

1>log.out : 1은 표준 출력, 문제 없을 때 log.out 파일에 로그 기록

2>err.out : 2는 에러 출력, 문제 있을 때 err.out에 출력

&: 백그라운드 실행 (유저가 로그아웃하면 꺼짐. nohup과 같이 사용하면 실행 유지 가능)

 

 

8) 로그 확인

cat err.out
cat log.out
tail -f log.out (파일 내용 중 마지막만 보여줌. -f 붙이면 실시간 업데이트)

 

 

9) 프로세스 확인 및 kill

자바 프로세스 확인

ps -ef | grep mybatis_project-0.0.1-SNAPSHOT.jar

자바 프로세스 아이디 : 3790

프로세스 종료

kill -9 프로세스아이디

+ Recent posts