[개발일기] EC2-RDS 연결 및 배포하는법

2023. 11. 8. 01:24개발일기/멋쟁이사자처럼

 
화이팅... 울고 있는 자신을 발견할 겁니다..첫 배포인데 이틀 걸렸네요 ㄷㄷㄷㄷ 다음 포스팅 땐 nginx와 EC2-RDS 연결과  제가 겪은 수많은 에러들과 함께 오곘습니다...^^


 
시작하기 전 MySQL 서버를 킵니다.
(시스템 설정 → MySQL 실행)

1. AWS 세팅하기

1-1 AWS Region 설정하기

먼저 AWS 사이트에 접속하고 로그인 한뒤 리전이 서울로 되어있는지 확인합니다

(다른 리전에 인스턴스를 생성하면 그 지역에 인스턴스가 생성되어 성능도 안 좋을 뿐더러 서울 리전에서는 확인이 불가능하니 서울 리전으로 맞춰줍시다.)
 

2. EC2인스턴스, RDS인스턴스 만들기

보안그룹 설정이 매우 중요함!! 꼭 꼼꼼하게 체크하시길 바랍니다..

2-1.  RDS 인스턴스 생성

서비스 → 데이터베이스 → RDS→ 데이터베이스 생성 버튼을 클릭
 
 
(1) DB 엔진 

→ MySQL
 
 
(2) 엔진버전

→ MySQL 8.0.33
 
 
(3)템플릿

→ 프리티어
 
(4) 설정

  • DB 인스턴스 식별자
    • 현재 AWS 리전에서 AWS 계정이 소유하는 모든 DB 인스턴스에 대해 고유한 이름을 작성합니다.
  • 자격 증명 설정
    • 마스터 사용자의 아이디/비번을 작성합니다.

 
(5) DB 인스턴스 크기 설정

사용 목적에 맞는 성능을 고려하여 인스턴스를 선택합니다. ( 참고 )
프리티어는 선택할것 없이 기본값을 고르고 넘어가면 됩니다.
 
 
(6) 스토리지 선택

 
 
(7) vpc 선택

 
추가구성(포트)

-> MySQL 기본 포트인 3306을 사용합니다. 
 
 
(8) 데이터베이스 인증

→ 암호인증
 
 
(9) 추가구성

→ 기본값 사용해도 무방함

→ RDS 인스턴스 생성완료
 
 

2-2. EC2 인스턴스 생성하기 

(1) IAM 사용자 ‘그룹’ 생성

EC2 서비스의 권한을 갖는 IAM 그룹을 먼저 생성해보도록 하겠습니다.
IAM 그룹은 같은 서비스에 접근 권한이 있는 IAM 계정들을 그룹화 해놓은 것을 말합니다.
 
 
(2) 그룹이름 설정



 
(3) 권한정책연결

이어서 정책을 설정하는 화면이 나옵니다.
이 그룹에는 EC2의 접근에 대한 권한을 설정하는 것이 목적이므로 검색 창에
AmazonEC2FullAccess를 입력
 
그리고 체크박스를 클릭하여 "Next Step"버튼을 눌러주세요.
이어서 "Create Group" 버튼을 눌러주세요.

그러면 EC2에 대한 fullaccess가 가능한 그룹이 생성되었습니다
 
(4) IAM 생성하기 ⇒ 생성한 그룹에 사용자(계정) 추가하기
위에서 생성한 그룹에 사용자를 추가하도록 하겠습니다.
EC2 인스턴스는 웹 서버로 활용되므로 S3에 접근할 일이 많습니다.
따라서 S3에 접근 권한을 갖는 계정을 생

user name에 유저명을 작성해주시고, 접근 유형을 체크합니다.
 
 
(5) 사용자 이름 설정

→ IAM 사용자를 생성하고 싶음 선택
 
 
(6) 사용자 세부정보 설정

  • IAM 사용자를 생성하고 싶음 선택
  • 사용자 지정 암호 (기록해두자)
  • 사용자는 다음 로그인 시 새 암호를 생성해야 합니다꼭 체크박스 해제

 
(7) 생성한 그룹에 현재 사용자 추가

생성한 그룹 선택 → 다음
 
 
(8) 검토 및 생성

검토 후 → 사용자 생성
 

사용자 성공적으로 생성함 !!!
 
(9) 암호 검색

아래에서 사용자의 암호를 보고 다운로드하거나 AWS 관리 콘솔에 로그인하기 위한 사용자 지침을 이메일로 보낼 수 있습니다. 지금이 이 암호를 확인 및 다운로드할 수 있는 유일한 시간입니다. (잘 기록해두자)
 
(10) 암호 발급
콘솔 로그인 URL, 콘솔 비밀번호를 안전하게 보관해주세요
두 정보는 절대로 외부에 노출되서는 안됩니다 !

여기까지 IAM 사용자 (minseo)를 생성해서 IAM 그룹(koun)에 추가했습니다.
(다음 단계로 넘어가기 전에 체크 권장합니다.)
 
 

이제 이 계정에서 S3에 접근 할 수 있도록 S3 접근 권한을 부여하도록 하겠습니다.

 

3. S3 접근권한 부여 (역할부여)

[이 계정에서 S3에 접근 할 수 있도록 S3 접근 권한을 부여]
user 목록에서 방금 생성한 계정을 선택!
 
(1) 사용자 권한 추가

최근 생성한 사용자 → 권한 추가
 
 
(2) 권한옵션

  • 권한옵션 → 직접정책연결
  • 정책이름 → AmazonEC2FullAccess 선택 → 다음

 
(3) 검토

검토 후 → 권한 추가
 
 
(4) 인라인 정책 생성

인라인 정책 생성 클릭
 
 
(5) 권한 지정

 
 

  • S3 선택 → 모든 S3 작업 선택

aws 공식문서를 살펴보니 "지나치게 허용적인 정책을 비롯하여 정책이 잘못 구성되면 의도하지 않은 리소스에 대한 디바이스 액세스를 허용하는 등의 보안 인시던트가 발생할 수 있습니다" 라고 나와있습니다
 

  • 리소스 → 특정 → bucket → 모두
    • arn:aws:s3:::my_bucket
     

 
(6) 검토 및 생성

정책 검토 후 → 정책 생성(저는 이름까지 설정해줬습니다.)
 

성공!!
 
 

4. EC2 인스턴스에서 S3에 접근 (역할부여)

이제 IAM user에 역할을 부여하도록 하겠습니다.
이 User 계정에는 EC2 인스턴스에서 S3에 접근할 수 있는 역할이 부여됩니다.
 
 
(1) 역할 만들기

역할 검색 → 역할 만들기
 
 
(2) 신뢰할 수 있는 엔티티 선택

  • 신뢰할 수 있는 엔티티 유형 →AWS 서비스 (EC2)
  • 서비스 또는 사용 사례 → EC2

 
(3) 권한 추가

AmazonS3FullAccess 검색 → 다음
 
 
(4) 이름지정, 검토 및 생성
다음 화면에서 Role name과 Role 설명을 작성해주고 "create role" 버튼을 눌러 role을 생성합시다.

→ 역할생성 완료!!!
 

5. AWS EC2에 (Linux 기반)Ubuntu 20.04LTS 인스턴스 생성하기

기존에 EC2를 생성했던 방법과 다른 점은 IAM 역할을 부여한다는 것입니다.
IAM 역할을 부여한 EC2 인스턴스는 S3의 접급만 가능하고, 다른 서비스로의 접근 불가능합니다.
 
 
(1) 인스턴스 시작
AWS 콘솔 창에서 EC2 검색 후 대시보드 진입

-> 인스턴스 시작 클릭
 
 
 
(2) AMI 선택에서 Ubuntu 선택
아래 사진처럼 설정해줍니다.

  • ubuntu를 선택합니다.
  • Ubuntu Server 22.04 LTS (HVM), SSD Volume Type (2023.11.07 기준)
  • '프리 티어 사용 가능'이라고 되어있는지 확인합니다.
  • 아키텍처를 선택합니다. (윈도우 👉🏻 64비트(x86) / 맥 👉🏻 64비트(Arm))

 
(3) 인스턴스 유형 선택

→ c6g.medium 선택
 
 
(4) 키 페어 생성

  • 키 페어 이름을 본인이 원하는 이름으로 입력해줍니다.
  • 키 페어 유형 → RSA로 선택
  • 프라이빗 키 파일 형식 → .pem으로 설정 후
  • 키 페어 생성 버튼을 클릭

 
(5) 네트워크 설정
아래 화면처럼 설정해줍니다.

 
 
 
(6) 스토리지 구성
인스턴스의 스토리지를 설정합니다. (기본값으로 Root장치는 꼭 있어야 함)
볼륨 유형에 따라 비용의 차이가 있는데,

기본적인 범용 SSD(gp2)를 선택합니다.
 
 
 
(7) 인스턴스 시작

-> 성공 !!
 

다시 EC2 대시보드에 들어가보면 인스턴스에 추가된 것을 확인할 수 있습니다.
 
 
(8) 발급 받은 ssh 키로 AWS EC2 인스턴스에 접속

  • 인스턴스를 클릭해 인스턴스 페이지로 이동합니다.
  • 연결 클릭

chmood: ~ / ssh ~ 의 명령어들을 활용할 것입니다. 터미널 창을 실행시켜줍니다.

 
 
(9) 터미널을 켜서 키페어가 있는 위치로 이동합니다.
/Users/minseopark/minseo-workspace./KounKey
 
 
(10) ssh 명령어로 EC2 인스턴스에 접속 (순서 유의!!!!!!!)

  1. ssh -i "EC2 KounKeyPair.pem" ubuntu@ec2-15-165-44-249.ap-northeast-2.compute.amazonaws.com

🚨 오류 : UNPROTECTED PRIVATE KEY FILE!
아래 사진과 같은 화면이 뜰 경우 파일 주인(owner)만 읽을 수 있게하고 모든 권한을 없애면 문제가 사라집니다.

 
2. 해결방법 (명령어 권한 바꾸기)

  • chmod 400 EC2 KounKeyPair.pem

만약 파일 이름에 공백이 있다면 터미널에 키 페어 이름 입력 시 띄어쓰기 하기 이전에 '\'를 해주고 띄어쓰기를 해줘야 합니다.
 

ex) 내 키 페어 파일 이름 👉🏻 chmod 400 EC2 KounKeyPair.pem

	터미널 입력 시 👉🏻 chmod 400 EC2\ KounKeyPair.pem

 
아래 사진이 성공 화면입니다.

 
 
(11) 인스턴스 id 클릭

 
 
(12) 인스턴스 퍼블릭 IPv4 주소 확인

나는 혹시 몰라 인스턴스 ID, 퍼블릭 IPv4 주소 따로 저장해줬다.
 

이제 EC2, IAM 둘 다 잘 생성이 되었는지 확인 한 번 하고 가자. 

 
EC2

인스턴스 상태 생성 및 실행 중 확인
 
IAM

사용자 그룹/ 사용자 / 역할 확인
 
(13) 보안 그룹 생성하기
 
보안 그룹이란?

AWS 에서 제공하는 방화벽으로 인바운드 규칙, 아웃바운드 규칙이 존재합니다.
 

  • 인바운드 규칙(inbound) : 외부에서 EC2나 RDS 등의 내부로 접근할때 사용되는 방화벽 규칙
  • 아웃바운드 규칙(outbound) : EC2나 RDS 등의 내부에서 외부로 접근할때 사용되는 방화벽 규칙

보안 그룹을 생성할 때에는 필요한 규칙들을 추가해줘야 한다. 이러한 규칙들은 아래와 같이 다양한 옵션으로 트래픽을 제어할 수 있다.

  • 포트(Port)
  • 인증된 IP 범위 - IPv4 and IPv6
  • 인스턴스 밖에서 안으로 들어오는 Inbound Network
  • 인스턴스 안에서 밖으로 나가는 Outbound Network

 


EC2 메뉴의 네트워크 및 보안 탭의 보안 그룹 을 눌러 보안 그룹 세팅 창으로 들어갑니다.

보안 그룹 생성을 눌러 새로운 보안 그룹을 생성해 줍시다

위 목록에서 보안 그룹의 이름과 설명을 적으시고
 

인바운드/아웃바운드 규칙의 규칙추가를 누르면
 

보안그룹 생성 성공 !
 

  1. 인바운드 규칙으로 정해진 IP와 Port를 추가하였기 때문에 보안 그룹을 통과하여 인스턴스에 접속할 수 있다.
  2. 인바운드 규칙으로 허용된 IP 혹은 Port가 아니라면 접속할 수 없다.
  3. 아웃바운드 규칙으로 모든 트래픽을 허용하였기 때문에 IP, Port와 상관없이 바깥으로 내보낼 수 있다.

 
(14) 보안그룹설정하기
이제 만든 보안 그룹을 아까 만든 EC2에 설정해줄 차례입니다.

EC2 콘솔에 들어가 아까 만든 인스턴스를 클릭하고 마우스 우클릭 → 보안 → 보안그룹변경
 
기존의 기본 보안 그룹은 체크 해제후 방금 만든 보안그룹으로 교체해줍니다.

→ 변경 성공!!
 
 

6. 우분투 콘솔에서 git ssh 연동 후 git clone 하기

ubuntu → apt
Linux → yum
 
(1) 깃 설치하기

  • sudo apt-get install git

위 명령어로 git 설치를 해줍시다.

  • git --version

 
설치를 해줬다면 위 명령어로 설치가 되었나 확인이 가능합니다.

 
(2) 깃헙에서 SSH KEY 생성하기

  • cd ~/.ssh
  • ssh-keygen -t rsa -C github계정 메일(example@github.com)

        (ssh-keygen -t rsa -C qkralstj0808@github.com)
 

위 명령어를 통해 .ssh 디렉토리에서 키페어를 생성하게 되고 id_res.pub 파일이 생성됩니다.
 

  • cat id_rsa.pub

cat 명령어로 id_rsa.pub 파일을 출력후 이것을 깃헙 ssh에 저장을 해주어야 합니다.

 
github -> setting -> SSH and GPG keys 탭으로 이동후 new SSH key 버튼을 클릭

타이틀에는 임의로 정해주시면 되고 key 부분에 복사한 위에서 출력한 id_rsa.pub 값을 넣어주면 됩니다.
 
 
(3) git clone 하기
이제 git clone을 하기 위한 준비가 끝났습니다.
깃헙 레포지토리로 이동후 code 버튼 -> ssh 탭을 누르고 나온 주소를 복사해줍시다.

이 복사한 값을 EC2에 접속한 터미널에서 git clone할 디렉토리로 이동후
 

  • git clone 복사한 값

      (git clone git@github.com:LikelionKau/likelion11-Tteokip-BE.git)

-> yes

-> 클론 성공!
 
 

7. 내려받은 파일로 빌드하고 jar 파일 실행시켜 스프링 부트 서버 실행시키기

(1) 빌드파일 생성
이제 클론한 디렉토리로 한번 이동해서 빌드를 실행해 보도록 하겠습니다.
클론한 디렉토리에서 gradlew 파일을 실행시켜 jar 빌드파일을 생성해야합니다.
그전에 기본 EC2에는 자바가 설치되어있지 않으므로

  • sudo apt install openjdk-17-jdk

Do you want to continue ? → y
 

으로 자바를 설치해준뒤 (인텔리제이 자바버전과 동일해야 하니 확인 잘 하자)
 

  • ./gradlew build

빌드가 성공적으로 끝났다면 build -> libs 디렉토리가 새롭게 생기고

  • cd build
  • cd libs

를 통해 해당 디렉토리로 이동해줍니다.
이동했다면 해당 디렉토리에서 ls 명령어로 jar 파일이 생성된 것을 확인해줍시다.

 
 
 
(2) 빌드파일 실행

  • nohup java -jar manymanyUsers-0.0.1-SNAPSHOT.jar &

      (nohup java -jar koun-0.0.1-SNAPSHOT.jar &)
 
다음 명령어로 생성된 jar 파일을 실행해 줍니다. 여기서 파일이름은 생성된 파일 이름으로 수정하시면 됩니다.
nohub 명령어 뒤에 &를 붙이면 벡그라운드에서 실행한다는 의미로 저희가 EC2 콘솔 접속을 끊더라도 실행파일을 계속 실행하라는 명령어입니다.
명령어를 실행시켜도 스프링 부트가 실행되고 있다는 로그가 나오지 않아 실행되는지 잘 모르겠다면
다음의 명령어를 따라하시면 됩니다.
 
우선 ls 명령어로 libs 디렉토리에 nohub.out 파일이 생성됐는지 확인하고
 

 

  • cat nohup.out

위 명령어로 nohup.out 파일을 출력하면 로그가 나오는것을 확인할 수 있습니다.
(로그를 nohup.out 파일에 저장해놓기 때문에 저렇게 따로 출력해서 확인해줘야 합니다.)

 

8. 브라우저 URL로 접속하기

드디어 대망의 마지막 과정입니다. 다시 AWS 콘솔 창으로 이동한 뒤

퍼블릭 DNS 혹은 IP 주소로 된 값 중 아무거나 복사후 뒤에 :8080을 붙여서 브라우저로 접속해봅시다.

접속 성공! ㅜㅜㅜㅜㅜ