본문 바로가기
DevOps/AWS

[AWS] EC2와 RDS 연결하기

by DUSTIN KANG 2024. 4. 9.

오늘 포스팅에서는 AWS EC2와 AWS RDS에 대해 알아보고 EC2와 RDS를 연결해보는 작업을 진행하려고 합니다.😄

🌱 AWS EC2

AWS EC2는 Elastic Computed Cloud의 약자이며, AWS에 제공해주는 가상의 서버(컴퓨터)입니다. 즉, AWS에서 컴퓨터를 임대받는다고 생각하시면 됩니다. 그럼 사용자는 EC2를 사용한 만큼 지불하면 됩니다. EC2를 생성하면서 AMI, 인스턴스, 보안 그룹, Key Pair 등 개념들을 알 필요가 있습니다. 그 부분에서도 차근차근 알아볼 예정입니다.

 

1. 인스턴스 생성 ~ AMI 고르기

EC2 페이지에서 주황색 [launch Instance] 버튼을 클릭합니다.  처음에는 서버의 이름과 태그를 정할 수 있습니다. 

아래 AMI(Amazon Machine Image)을 선택하는 단계를 보실 수 있습니다. AMI는 서버에 사용되는 컴퓨터의 운영체제(OS)와 소프트웨어를 고르는 단계입니다. OS를 고를 뿐더러 OS의 스펙을 고를 수 있습니다.  저는 가장 상단에 있는 Amzon Linux 2023 AMI를 사용하기로 했습니다.

 

AMI 선택

 

2. 인스턴스 유형 선택

이번엔 인스턴스 유형을 선택하는 단계입니다. 다양한 인스턴스 중 하나를 선택할 수 있는데요. 타입에 따라 컴퓨터의 성능이 달라지기도 합니다. 물론 과금이 안드는 프리티어의 경우 `t2.micro`가 적절합니다. 해당 인스턴스 유형은 무엇을 의미할까요?

오른쪽 인스턴스 유형 비교로 자세히 확인할 수 있습니다.

 

인스턴스 타입

가장 앞에 `t`는 인스턴트 타입 중 웹 서버를 의미합니다. 스크롤을 내려면 t뿐만아니라 m, c, g 등 다양한 타입들이 존재합니다. 보통 일반적인 목적으로 사용하는 경우는 `m`(모바일)이나 `t`(웹), `Mac`(MacOS)을 사용합니다. 이뿐만 아니라 CPU, 메모리, 용량, GPU에 따라 다르게 설정할 수 있습니다. 저는 가성비 좋은 적은 메모리와 성능의 마이크로 인스턴스를 사용하려고 합니다.

  • 컴퓨팅(CPU) 최적화 목적 : C(컴퓨팅), F(하드웨어), Inf(ML), G(그래픽)
  • 메모리 최적화 목적 : r(메모리), x(Spark 용도), p(ML), z(EDA)
  • 스토리지 최적화 목적 : H(하둡,맥리듀스), j(NoSQL, 데이터 웨어하우스), d(디스크 최적화)

3.  키 페어 생성

이번엔 키 페어를 생성하는 부분입니다. 만약에 EC2 서버에 내가 아닌 누군가 접속하게 된다면 엄청난 일이 벌어질 것입니다. 그렇기 때문에 보안상, 비대칭키 암호화가 필요합니다. 비대칭키 암호화를 간략하게 설명하자면 EC2 서버에 공개키(Public Key)를 저장하고 우리의 개인 PC에 개인키(Private Key)를 저장해 SSH를 통해 해당 인스턴스에 접속할 때 두 키 쌍을 복호화해 접속하게 됩니다. 즉, 개인키는 잃어버리면 접속을 못하는 것입니다. 

키페어 생성

 

개인 키의 파일 형식은 `.pem` 그리고 `.ppk`가 있습니다. MacOS에서는 `.pem` 키를 생성합니다. Windows도 PowerShell에서 .pem으로 인스턴스 연결을 할 수 있다고 합니다. [참고자료] OpenSSH를 사용하여 Windows에서 Linux 인스턴스에 연결 - AWS Docs↗

 

4.  보안 그룹 구성

보안 그룹은 외부에서 EC2 인스턴스를 접근할 때 허용하는 소스만 접근할 수 있도록 제어하는 규칙입니다. 만약 보안 그룹을 설정하지 않고 EC2에 접속한다면 `time out issue`가 발생할 수 있는 데 이는 보안 그룹을 설정하지 않아 들어올 수 없게 될때 발생하는 오류입니다.

보안 그룹에는 인바운드 규칙(들어오는 것에 대한 규칙)과 아웃바운드 규칙이 있습니다.

 

보안 그룹을 생성할 때 SSH 트래픽 허용을 위치 무관으로 설정하게 되면 누구나 SSH로 접속할 수 있습니다. 그러나 기본적으로 개인 프로젝트이기 때문에 자신의 IP를 선택하는 것([내 IP])이 보안상 유리합니다. 만약 데스크 탑이 아닌 노트북을 사용하면서 카페나 독서실, 학교등 다양하게 Wifi를 사용한다면 그때마다 IP를 변경해야 합니다. 아, 그리고 보안 그룹은 추후에도 [네트워크 및 보안 - 보안 그룹]에서 수정할 수 있으니 걱정안하셔도 됩니다.

 

저는 인바운드 규칙을 다음과 같이 적용했습니다.

프로토콜 포트 소스 설정
SSH 22 내 IP
HTTP 80 무관
HTTPS 443 무관

5.  스토리지(볼륨,EBS) 구성

EBS(Elastic Block Store)인스턴스와 함께 사용할 수 있는 스토리지 볼륨(데이터 저장 공간)입니다.  EBS를 생성할 때는 항상 인스턴스와 같은 AZ(가용영역)에서만 생성이 가능하는 유의해두세요. 만약 다른 AZ로 옮기려면 스냅샷을 사용해 옮길 수 있습니다. 지금은 이 개념이 반드시 필요한 것은 아니기때문에 넘어가겠습니다. 

 

볼륨 유형으로는 `gp2` `gp3` `io1` io2`등이 있습니다. 자세히는 다루지 않지만 범용으로 gp2와 gp3 중 어떤 것이 좋은 지 찾아본 결과 gp3의 성능이 gp2보다 4배 정도 빠르다고 합니다. 뿐만아니라 gp2보다 가격도 20%도 저렴하고 IOPS 처리량도 독립적으로 늘릴 수 있다고 합니다. 그래서 gp3 볼륨을 택하기로 했습니다.

 

더보기

EC2 고급 세부 정보 알아보기

  • 도메인 조인 디렉터리(Domain Join Directory) : 중앙 관리식 환경에 연결을 적용할 것인지 여부
  • IAM 인스턴스 프로파일(IAM Instance Profile) : 해당 인스턴스에 사람들 마다 권한 부여
  • 호스트 이름 유형 : DNS HostName으로 할 것인지 IP Hostname으로 할 것인지
  • 인스턴스 자동 복구 : 시스템 상태 확인을 실패하면 자동 복구 할것인지 여부(기본값)
  • 종료 동작 : 인스턴스를 종료할 때 지워버릴지 말지(중지)
  • 최대 절전(Hibernate) 중지 방식 : 잠자기일 때 RAM에 있는 내용을 볼륨에 저장할지 (메모리 소모 vs 속도)
  • 중지 방지 : 중지할때 정말 중지할 것인지 (비활성화)
  • 세부 CloudWatch 모니터링 : 자동으로 현재 CPU, Memory, 디스크를 얼만큼 쓰고 있는지 세부적으로 기록(금액상관O) 
  • 메타데이터 : EC2 인스턴스에 대한 설명 데이터 
  • 사용자 데이터 : 인스턴스를 시작할 때 실행할 명령 또는 스크립트

6.  개인키로 EC2 접속

이전에 다운받은 개인키(`.pem`)을 통해 EC2 서버에 접속해볼 예정입니다.

다음 명령어를 통해 SSH 프로토콜로 서버에 접속해보겠습니다.

ssh-add key.pem을 입력하면 다음에 키를 입력할 필요 없이 접속이 가능합니다.
접속하게되면 다음과 같은 새 모양을 보실 수 있습니다.

 

현재 우리가 갖고 있는 `.pem` 파일은 개인키 파일입니다. 그러면 공개키는 어디있을까요?

공개키 파일은 서버에 들어가게되면 `.ssh` 숨김 폴더에 들어가게 되면 `authorized_keys`에서 확인하실 수 있습니다.

 

`ec2-metadata`를 입력하면 인스턴스에 메타데이터 정보를 확인할 수 있습니다. 물론 공개키도 볼 수 있습니다.

만약 UNPROTECTED PRIVATE KEY FILE이라는 오류가 발생한다면 `chmod`를 통해 사용자 권한만 가능하게 만들어주면 됩니다. 
User Group Other
4(R) 2(W) 1(E) 4(R) 2(W) 1(E) 4(R) 2(W) 1(E)

🌱 AWS RDS

이번에는 AWS에서 DB 서버를 사용할 수 있도록 제공하는 RDS를 생성해보도록 하겠습니다. 

RDS는 데이터베이스를 셋업하거나 백업, 복구, 확장등을 할 수 있습니다.

RDS는 여러가지 엔진들이 존재합니다. 대표적으로 MySQL, PostgreSQL, AWS 자체 Aurora라고 하는 높은 성능의 DB가 있습니다.

1. 데이터베이스 생성하기

먼저 RDS 페이지에서 [데이터베이스 → 데이터베이스 생성]을 통해 데이터베이스를 생성합니다.

생성 방식에는 표준 방식과 손쉬운 방식이 있는데 그래도 중요한 설정을 파악하기 위해 [표준 생성]을 클릭합니다.

2. DB 엔진 및 템플릿 설정

저는 프리티어로 PostgreSQL 엔진을 사용하기로 했습니다.

프리티어를 사용하면 무료로 RDS를 구축할 수 있습니다. 다만 멀티 가용영역(배포 옵션)을 사용할 수 없고 DB를 생성하는 데 다른 템플릿보다 오래 걸린다는 특징이 있습니다.

  • 엔진 : PostgreSQL
  • 템플릿 : 프리 티어

 

3. 설정

다음은 RDS 인스턴스를 만들기 위한 기본 설정입니다.

이 부분에서 중요한 것은 자격 증명을 설정하는 부분입니다. 이 부분(마스터 이름, 암호)은 추후 DB 서버에 접속할 때 필요하므로 반드시 인지하고 있어야 합니다.

 

그 다음 설정은 DB의 인스턴스 크기, 스토리지를 설정하는 부분입니다.

사실상, 프리티어를 사용하면 `db.t3.micro`와 `db.t4g.micro`를 선택할 수 있습니다. 

AWS에 따르면, DB.t4g가 DBt3보다 더 저렴하고 3배이상 좋은 CPU 성능을 보인다고 합니다. 또한 사용량을 확장시킬 수 있는 기능도 있습니다. 그러나, 호환성에 대한 문제가 있을 수도 있기 때문에 판단해서 사용하는게 좋을 것 같습니다.

 

4. 연결

다음은 데이터베이스 서버와 연결과 관련된 설정 부분입니다. 

VPC와 Subnet 그룹을 선택한 후 [퍼플릭 액세스] 여부를 통해 외부에서 해당 RDS에 접근을 허용할 것인지를 선택할 수  있습니다. 

저는 RDS와 같은 VPC에서만 연결을 할 예정이기 때문에 [아니오]로 설정했습니다. 만약  EC2가 아닌 외부에서 연결을 하려면 [예]를 해야할 것입니다.

 

메뉴 설정
컴퓨팅 리소스 Default VPC
서브넷 그룹 기본 서브넷 그룹
퍼플릭 액세스 아니오
VPC 보안그룹 기존
추가 구성 - 포트 5432

 

5. 데이터베이스 인증

데이베이스는 이전 기본 증명 정보를 통해 설정한 [암호 인증]으로 설정합니다.

6. 모니터링 및 추가 구성

모니터링과 추가 구성 부분에서는 특별히 건드릴 건 없습니다. 사실 아직 모르는게 많습니다. 하지만 그대로인 상태에서 DB 서버를 생성해도 문제가 되지 않기 떄문입니다. 여기서 중요한 건 초기 데이터베이스 이름을 생성하는 부분입니다. 서버 내에 데이터베이스를 생성해주기 위해 이름을 생성해주는데 EC2내에서 DB를 생성할 것이라면 굳이 생성하지 않아도 됩니다. 저는 이후에 생성할 것이기 때문에 생성하지 않았습니다. 

 

7. DB 생성 후 EC2 연결

마지막으로 RDS 인스터스를 생성하기 전에 추정 요금을 확인하시고 프리티어인 경우 다음조건의 범위 안에서 무료로 사용할 수 있습니다.

 

RDS 인스턴스를 생성하게 되면 상태가 [사용가능]이 되면 RDS와 연결할 준비가 된 것입니다.

해당 경우는 MySQL 엔진을 사용했을 때입니다. PostgreSQL도 엔진만 다를 뿐 가정은 동일합니다.

 

이번엔 방금 만들었던 EC2 인스턴스에 RDS 인스턴스를 접근하도록 할 예정입니다. 

RDS를 생성했을 때의 보안 그룹에 EC2에 소스를 지정하면 되는데요. RDS를 생성했을 때의 보안 그룹 - 인바운드 규칙에 들어갑니다.

이후 다음과 같이 인바운드 규칙을 수정해줍니다. 

 

 

AWS에서 RDS와 EC2의 접근 설정은 여기서 마무리되었습니다.

이후에 작업에는 EC2 내 Django와 같은 웹 Application과 서버에 접근 방법입니다. 

EC2를 하나의 컴퓨터라 생각하고 해당 포스팅↗을 참고하여 설치해주시면 됩니다. 

설치가 완료 되었으면 `settings.py` 혹은 환경변수에 다음과 같이 데이터베이스 연결을 설정해주시면 됩니다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql', # 데이터베이스 엔진, 파란색 마커에 따라 변경해주세요.
        'NAME': 'postgres', # 데이터베이스 이름
        'USER' : '', # 데이터베이스 username
        'PASSWORD' : '', # 데이터베이스 Password
        'HOST' : 'localhost', # PostgreSQL 호스트 주소 (로컬에서 작동하는 경우, Localhost)
        'PORT' : '5432' # PostgreSQL 포트번호
    }
}

 

만약 DB 서버 연결 도중 에러가 발생한다면 자주 발생하는 에러는 아래의 에러입니다.

참고바랍니다.

8. RDS 연결시, 관련한 에러

  • Can't connect to MySQL server on
    • 해당 오류는 데이터베이스가 엔드포인트에 접근할 수 없을 때, 발생하는 오류입니다. 보안그룹(ACG)에서 인바운드와 아웃바운드를 확인해 해당 컴퓨터가 DB 서버에 접속할 수 있게끔 해주세요.
  • Access denied for user
    • 데이터베이스의 USER 정보(이름, 패스워드)를 잘못 입력 했을 때 발생하는 오류입니다.

 

☕️ 포스팅이 도움이 되었던 자료

EC2를 쓰는 것만으로 잘하는 것이 아니라고 합니다. AWS를 얼마나 잘 사용하냐 즉, 비용을 예측할 수 있는 서버를 구축하는 것이 AWS를 잘 사용하는 사람이라고 합니다. 물론 비용 뿐만아니라 장애 빈도나 퀄리티도 중요합니다.

 

오늘도 저의 포스트를 읽어주셔서 감사합니다.

설명이 부족하거나 이해하기 어렵거나 잘못된 부분이 있으면 부담없이 댓글로 남겨주시면 감사하겠습니다.

 

 

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

[AWS] AWS IAM 설정하기  (0) 2024.01.25
AWS 친해지기  (0) 2024.01.24