[AWS-EC2] 배포-SSH프로토콜(1): Jar빌드 후 EC2로 복사, 실행

손지민·2024년 1월 2일
1

AWS

목록 보기
8/13
post-thumbnail
post-custom-banner

개요

Spring Boot/Java/Gradle 프로젝트를 EC2 배포하고자한다.
이번 글에는 로컬에서 Jar 파일 생성 후 git bash에서 scp 명령어로 EC2 서버로 복사-실행방법을 알아보겠습니다.

여러가지 배포 방식

  • 배포하는 방법은 여러가지가 있습니다. (자세한 내용은 링크 참고)
  1. 로컬에서 Jar 파일 생성 후 git bash에서 scp 명령어로 EC2 서버로 복사-실행
  2. EC2 서버에서 repository를 Git clone을 하여 프로젝트 실행
  3. 배포 도구 사용
  4. Docker 사용
  5. 설정 관리 도구 활용

환경
Amazon Linux 2/Spring Boot3,Java17/Gradle/MySQL/Git Bash 입니다.


1. 방법

요약
1. 로컬에서 프로젝트를 jar 파일로 만든다.
2. EC2 인스턴스를 생성한다.
3. Git Bash를 사용하여 EC2 인스턴스에 접속한다.
4. EC2서버에 jar 파일 실행을 위해 EC2에 jdk17을 설치한다.
5. 로컬의 jar 파일을 scp 명령어를 사용해 EC2로 전송한다.
6. EC2에서 jar 실행한다.

이전 글에서 git bash 설치까지 하였고 이번 글에서는 EC2에 연결하는 단계부터 시작한다.

AWS EC2 인스턴스에 연결하는 방법은 4가지
(이번 글은 그 중 3번-SSH 클라이언트를 사용하는 방법을 적용)
1. EC2 인스턴스에 연결
2. Sesstion Manager
3. SSH 클라이언트
4. EC2 직렬 콘솔

1.1. git bash 로 EC2 연결

  1. git bash 열기(설치 방법은 작성된 블로그 참고)

  2. 해당 키 페어가 있는 경로로 이동

    • 명령어
    $ cd "경로"
    예: $ cd "/c/Users/lijna/OneDrive/바탕 화면/"

    (띄어쓰기가 있는 경우 쌍따옴표로 감싸주어야한다고 합니다.)

  3. $ ls 명령어로 해당 키 페어가 있는지 확인합니다.

  4. 존재하면 해당 위치에서 키 페어에 400이라는 권한을 부여해야합니다.

    • EC2->인스턴스에 연결->SSH 클라이언트에 있는 명령어 입력하면 됩니다.

    • 명령어

      $ chmod 400 {키 페어 이름}.pem
      예: $ chmod 400 "ward_server_key.pem"
      • 별 오류 메시지가 안 뜨면 성공입니다.
  5. 인스턴스에 연결 - SSH 클라이언트 하단에 보이는 ssh 쉘 접속 명령어를 통해 EC2 서버에 접속합니다.

    • 명령어
      띄어쓰기 주의
    $ ssh -i {키페어 이름}.pem ec2-user@{퍼블릭 IPv4 DNS}"
    예: $ ssh -i ward_Server_key.pem ec2-user@{퍼블릭 IPv4 DNS}
  6. 처음 접속할 경우 알림 발생 - (yes/no/fingerprint)? 나오면 yes 하면 접속 완료.
    여기까지 진행하면 현재 bash 쉘은 내 컴퓨터가 아닌 EC2 서버에 연결되어있게됩니다.

1.2. EC2에 자바 설치

jar 를 동작하기 위해 AWS 컴퓨터에 java를 설치해야합니다. 설치 확인을 위해 java - version 명령어 실행합니다. 없는걸 확인하면 java17 설치해야합니다.

  1. Amazon Linux 2 에서는 sudo yum -y install openjdk-17-jdk or sudo yum install java-17-amazon-corretto 명령어 실행하여 java17 다운로드11의 경우 17만 11로 변경해주면 된다고합니다.ubuntu나 다른 것은 명령어가 다른 듯 합니다.

  2. Is this ok [y/d/N]: 명령어 나오면 y 입력

    설치 중간에 Ctrl+C 사용하여 중단된 경우
    이를 이어서 설치하려면yum load-transaction /tmp/yum_save_tx.2024-01-02.09-25.v98HWm.yumtx 이 명령어를,
    다 삭제했다가 다시 설치하려면 sudo yum clean all 이 명령어를 입력하고,sudo yum install java-17-amazon-corretto를 다시 입력하여 재설치합니다.

  3. $ java -version 명령어를 통해 설치 확인(버전 뜨면 성공)

1.3. jar 파일 EC2로 전송

1.3.1. 방법 2가지

  1. git clone 을 통해 프로젝트 Repositoryclone**하는 방법
  2. scp 명령어를 통해 로컬->EC2 서버로 jar 파일 이동

1.3.2. SCP 명령어를 통해 EC2 서버로 .jar파일 이동

1. 현재 키페어에 권한을 줘야합니다.

  1. .pem 파일 경로로 이동
  2. chmod 명령어
    $ chmod 400 {키페어}.pem

2. scp 명령어로 jar 파일을 EC2로 이동

  1. jar 파일이 있는 위치로 이동하여 $ ls 명령어로 파일 존재 확인
  2. jar 파일 있으면 scp 명령어 실행
    • 주소 띄어쓰기 정확하게 하기
    • 키페어 위치랑 jar 파일 위치 다르면 절대 주소 정확하게 작성하기
    • 띄어쓰기 있으면 ""쌍따옴표로 감싸기
    $ scp -i .{키페어}.pem {보낼 파일 경로} ec2-user@{퍼블릭 IPv4 DNS}:받을 경로
    예시: $ scp -i "/c/Users/lijna/OneDrive/바탕 화면/son/개발/Ward 프로젝트/ward_server_key.pem" ./ward_server-0.0.1-SNAPSHOT.jar ec2-user@{퍼블릭 IPv4 DNS}:~/
    * {퍼블릭 IPv4 DNS} 부분은 AWS 인스턴스에 연결-SSH클라이언트 제일 하단 내용과 동일
    * 예시의 scp 명령어는 jar 파일 경로에서 작성하였음.
    • 이런 식으로 100% 돼야 성공한겁니다. 아무것도 안뜨면 안 옮겨진 것.

3. EC2 에서 파일 복사 확인

  • $ ls 명령어

1.4. Jar 파일 실행

1.4.1. jar 파일 실행하기

  • 명령어 실행(sudo를 앞에 붙여 관리자 권한으로 실행)
$ sudo java -jar ward_server-0.0.1-SNAPSHOT.jar

1.4.2 오류 발생 - MySQL 설치 안되어있어서 에러 발생

  • $ sudo java -jar ward_server-0.0.1-SNAPSHOT.jar 이 명령어 실행하니 MySQL DB 가 없어서 오류 발생
    • 프로젝트 내에 MySQL 연결 코드 존재

해결

1.4.3. 오류 발생 - java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

  • 이 메시지는 사용자 'root'가 'localhost'에서의 연결 시도에서 암호를 사용하여 액세스를 거부당했다는 것을 나타냅니다. 이 문제의 주요 원인은 사용자 'root'가 'localhost'에서의 암호 인증에 실패했거나 해당 사용자에게 필요한 권한이 부족한 경우입니다.

해결

1.5. 웹 브라우저에 테스트

http://{퍼블릭 IPv4 DNS}:8080/ 입력하여 동작시켜봅니다.

1.5.1. 오류 발생 - 응답하는 데 시간이 너무 오래 걸립니다.

해결


2. 문제/의문

2.1. 의문1

로컬에서 jar 파일을 만들고 scp 명령어로 EC2로 옮기는 방식에서는
1. 보안 정보가 들어 있는 application.yml 파일이 그대로 옮겨지는건 보안상 괜찮은가?
2. 나중에 CI/CD 하는데 문제 없는가?
3. 그럼 코드가 바뀔 때마다 jar 만들고 옮겨야되나?

2.2. 답1

  1. application.yml 파일 보안: 만약 .jar 파일 내에 포함된 application.yml 파일에 보안 정보가 포함되어 있다면, 해당 정보가 .jar 파일을 통해 EC2로 옮겨지면서 노출될 수 있습니다. 이는 보안상 취약점이 될 수 있습니다. 따라서 중요한 보안 정보는 코드 레포지토리에 포함하지 않고, 환경 변수나 별도의 보안 저장소를 활용하여 관리하는 것이 좋습니다.
  2. CI/CD 설정: CI/CD를 구축하는 경우, 빌드 파이프라인에서 .jar 파일을 생성하고 해당 .jar 파일을 EC2로 전송하는 단계를 자동화할 수 있습니다. 보안 정보가 포함된 파일은 코드 레포지토리에 저장하지 않고 CI/CD 도구의 시크릿 관리 기능이나 환경 변수를 활용하여 안전하게 관리합니다.
  3. 자동화된 빌드 및 전송: 코드 변경이 있을 때마다 수동으로 .jar 파일을 만들고 옮기는 것은 번거로울 뿐만 아니라 오류가 발생할 가능성이 높아집니다. CI/CD 파이프라인을 구축하여 코드 변경이 발생할 때 자동으로 빌드하고 EC2로 전송하는 것이 효율적입니다.

2.2. 의문2

  1. EC2 서버에서 git clone 을 통해 옮기면 git ignore 에 들어 있는 정보는 안 옮겨질텐데 어떻게 해야되지?
  2. git ignore가 아니라 Github private repository 설정 파일을 사용하면 괜찮나?
  3. 더 좋은 방법이 있나?

2.2. 답2

  1. 문제 해결 방법: .gitignore 파일에 명시된 파일 및 디렉토리는 git clone 시에 제외됩니다. 하지만, .gitignore에 명시된 파일들이 프로젝트 실행에 필요한 파일이라면 수동으로 복사하거나 해당 파일들을 따로 관리해야 합니다.
  2. 방법: GitHub Private Repository를 사용하려면, GitHub에 등록된 SSH 키를 EC2 서버에 추가해야 합니다. 이후 git clone 명령을 통해 프로젝트를 가져올 수 있습니다.
    장점: 보안상의 이유로 GitHub Private Repository를 사용하는 것이 좋습니다. 사용자 인증이 필요하며, 액세스 토큰이나 SSH 키 등을 사용하여 레포지토리에 접근할 수 있습니다.
  3. 배포 도구 사용: 배포 도구를 사용하면 코드를 EC2 서버로 전송하고 애플리케이션을 배포하는 프로세스를 자동화할 수 있습니다. 대표적인 배포 도구로는 Jenkins, Travis CI, GitLab CI/CD, AWS CodeDeploy 등이 있습니다.
    Docker 사용: Docker를 사용하면 애플리케이션과 모든 종속성을 컨테이너화하여 쉽게 배포할 수 있습니다. Docker 이미지를 빌드하고 EC2 서버에 배포하는 것이 편리합니다.
    설정 관리 도구 활용: Ansible, Chef, Puppet 등의 설정 관리 도구를 사용하여 서버 구성과 배포를 자동화할 수 있습니다.

2.3. 수정하고 싶은 부분(gitignore->git repository 환경설정)

  • git ignore 사용하니 서버 개발자끼리 설정파일 변동이 생기면 계속 공유해서 사용해야하는 불편함이 있습니다.
    • 이를 해결하기 위해 Github private Repository를 사용해보고자 합니다.
      적용 방법은 추가로 글 작성해보도록 하겠습니다.

2.4. MySQL 설치 안해놔서 jar 실행 불가

참고 : velog - [AWS] EC2(Amazon Linux 2)에 MySQL 설치/연결하기


참고

profile
Developer
post-custom-banner

0개의 댓글