AWS EC2 배포 중 발생한 이슈와 해결 과정

ZEDY·2024년 6월 27일
0

개발

목록 보기
9/11

AWS EC2 배포 중 발생한 이슈와 해결 과정

개발 환경

  • 운영체제: Mac
  • 프레임워크: Spring Boot
  • 프로그래밍 언어: Java 21
  • 데이터베이스: MongoDB
  • 암호화: JASYPT_ENCRYPTOR 사용
  • 서버: AWS Linux EC2 인스턴스

이번 배포 과정은 저에게 많은 것을 가르쳐 준 경험이었습니다. 개발 환경에서부터 배포 과정 중 발생한 여러 이슈들을 해결하면서 DevOps의 중요성과 그 역할에 대해 실질적으로 배울 수 있었습니다.

1. 서버 접속 불가 문제

문제 발생

AWS EC2 인스턴스에 접속하려고 했으나, 응답이 없었습니다.

해결 방법

  1. 보안 그룹 설정 확인

    • 보안 그룹 설정에서 현재 IP 주소가 SSH 허용 목록에 있는지 확인했습니다. AWS 대시보드에서 보안 그룹 설정을 확인하고 현재 IP 주소를 SSH 허용 목록에 추가했습니다.
  2. 서버 자체 문제

    • AWS EC2 대시보드에서 인스턴스를 재부팅했습니다.

접속 명령어:

ssh -i "pem키 위치" ubuntu@서버주소

느낀 점

보안 그룹 설정은 AWS EC2 인스턴스를 사용할 때 중요한 부분 중 하나임을 다시 한 번 느꼈습니다. 특히 IP 주소 변경 시 SSH 접속이 불가능해질 수 있으므로 항상 현재 IP 주소를 확인하고 보안 그룹 설정을 업데이트해야 한다는 점을 깨달았습니다. 이를 통해 서버 보안과 접근 제어의 중요성을 실감하게 되었습니다.

2. GitHub에서 코드 가져와서 배포하기

문제 발생

코드를 수정한 후 GitHub에서 최신 코드를 가져와서 배포하는 과정에서 여러 이슈가 발생했습니다.

해결 방법

  1. Git에서 코드 Pull하기

    git pull origin main  # 또는 현재 사용 중인 브랜치
  2. 기존 JAR 종료하기

    pkill -f 'java -jar'  # 모든 Java 프로세스를 종료

    또는 실행 중인 Java 프로세스를 직접 확인하여 종료합니다.
    1) 실행 중인 Java 프로세스 확인:

    ps -ef | grep java

    2) 프로세스 종료:

    kill -9 <PID>
  3. 환경 변수 설정
    JASYPT를 사용하여 암호화 복호화를 하기 때문에 환경 변수를 따로 설정합니다.
    1) 환경 변수 확인:

    echo $JASYPT_ENCRYPTOR_PASSWORD

    2) 환경 변수가 설정되지 않았다면 설정하기:

    export JASYPT_ENCRYPTOR_PASSWORD=your_password
  4. DB 접속 확인

    sudo systemctl status mongod
  5. DB 켜기

    sudo systemctl start mongod
  6. 애플리케이션 빌드 및 배포
    1) 기존 프로세스 종료:

    pkill -f 'java -jar'

    2) 애플리케이션 빌드:

    ./gradlew clean build -x test

    3) 새로운 프로세스 시작:

    nohup java -jar -Dspring.profiles.active=dev build/libs/mobby-0.0.1-SNAPSHOT.jar > log.txt 2>&1 &
  7. 로그 확인

    tail -f log.txt

느낀 점

애플리케이션 배포 과정에서 각 단계가 얼마나 중요한지 다시 한번 느꼈습니다. 특히, 환경 변수 설정과 MongoDB 상태 확인이 중요하며, 배포 후 로그를 확인하는 것이 필수적이라는 것을 깨달았습니다. 이를 통해 DevOps에 대한 이해와 중요성을 실감하게 되었습니다. 배포 과정 중 발생하는 문제들을 해결하면서 문제 해결 능력이 향상되었음을 느꼈습니다.

3. 배포 후 접속 문제

문제 발생

애플리케이션이 성공적으로 배포되었지만, HTTP 요청이 접속되지 않았습니다.

해결 방법

AWS 콘솔에서 보안 그룹 설정을 확인하여 8080 포트가 열려 있는지 확인했습니다.

느낀 점

배포 후 접속 문제는 주로 보안 그룹 설정과 관련이 있다는 점을 알게 되었습니다. 8080 포트를 반드시 열어야 외부에서 접속이 가능하다는 것을 명심하게 되었습니다. 이를 통해 네트워크 보안 설정의 중요성을 다시 한번 인식하게 되었습니다.

4. MongoDB 접속 문제

문제 발생

애플리케이션이 MongoDB에 접속하지 못하는 문제가 발생했습니다.

해결 방법

  1. MongoDB 상태 확인:
    sudo systemctl status mongod
  2. MongoDB 시작:
    sudo systemctl start mongod

느낀 점

MongoDB 서비스가 중지되었을 때 애플리케이션이 정상적으로 작동하지 않는다는 것을 알게 되었습니다. 항상 MongoDB 서비스가 실행 중인지 확인하는 것이 중요합니다. 이를 통해 데이터베이스 관리의 중요성을 깨닫게 되었고, 시스템의 가용성을 높이는 방법에 대해 배울 수 있었습니다.

DevOps와의 연관성 및 배운 점

DevOps는 개발(Development)과 운영(Operations)의 합성어로, 소프트웨어 개발과 IT 운영의 협업을 강조하는 방법론입니다. 이번 배포 과정을 통해 DevOps의 여러 원칙을 몸소 체험하고 실천할 수 있었습니다.

  1. 자동화 및 반복 가능성

    • 빌드 및 배포 과정을 자동화하고 반복 가능하도록 설정함으로써, 인적 오류를 줄이고 배포 시간을 단축할 수 있었습니다. 특히, ./gradlew clean build -x test 명령어를 사용하여 빌드를 자동화한 점이 대표적입니다.
  2. 지속적인 통합 및 배포(CI/CD)

    • GitHub에서 코드를 pull하고 빌드 및 배포 과정을 통해 CI/CD의 중요성을 체험할 수 있었습니다. 매번 코드를 변경할 때마다 빌드와 배포를 자동으로 수행하여 최신 코드를 항상 배포 가능한 상태로 유지할 수 있었습니다.
  3. 모니터링 및 로깅

    • 배포 후 로그를 확인하고 문제를 해결하는 과정에서 모니터링과 로깅의 중요성을 깨달았습니다. tail -f log.txt 명령어를 통해 애플리케이션의 상태를 지속적으로 모니터링하고, 문제가 발생했을 때 빠르게 대응할 수 있었습니다.
  4. 보안 및 접근 제어

    • 보안 그룹 설정을 통해 서버 접근을 제어하고, 환경 변수를 사용하여 민감한 정보를 보호하는 방법을 배웠습니다. 이를 통해 시스템 보안의 중요성을 깨달았습니다.

최종 요약

위 단계를 통해 AWS EC2 인스턴스에 Spring Boot 애플리케이션을 배포하는 과정을 기록했습니다. 이러한 기록이 추후 여러분에게 큰 도움이 되길 바랍니다. 추가적으로 문제가 발생할 경우 로그를 통해 원인을 파악하고 문제를 해결해 나가면 됩니다.


이번 배포 과정을 통해 저는 많은 성장을 경험했습니다. 다양한 문제를 해결하면서 배운 점들을 정리해 보았으니, 이 글이 여러분에게 도움이 되길 바랍니다. 특히, DevOps와 관련된 부분에서 많은 것을 배울 수 있었으며, 이를 통해 문제 해결 능력이 향상되었다고 느낍니다. DevOps의 원칙을 실천함으로써 효율적이고 안정적인 배포 과정을 구축할 수 있었으며, 이를 통해 시스템의 신뢰성과 가용성을 높일 수 있었습니다.


profile
Spring Boot 백엔드 주니어 개발자

0개의 댓글