개발일지 1 - AWS

tk7580·2025년 5월 21일
post-thumbnail

로컬(localhost)를 더 이상 사용하지 않는 이유

지금까지의 개발 공부는 localhost로 컴퓨터 안에서 이루어졌다.
하지만 이번 프로젝트에서는 클라우드의 데이터베이스를 사용할 계획이다.
이는 내 컴퓨터가 꺼지더라도 데이터가 클라우드에 보존되어 개발을 할 수 있다는 장점을 가지며
AWS 프리 티어는 1년간 제한된 용량의 데이터베이스를 무료로 제공하여 비용 부담 없이 실제 클라우드 환경을 경험하고 학습할 수 있다.

기존엔 XAMPP 컨트롤 패널, SQLyog를 사용하였는데
AWS RDS와 인텔리제이의 쿼리 실행기를 사용하면 앞선 두 가지를 사용하지 않아도 인텔리제이 하나로 개발할 수 있게 되어 편리해진다.

AWS란?

웹사이트를 만들기 위해서는 사이트를 구동하는 서버 컴퓨터를 직접 구해서
(웹사이트는 대부분 24시간 작동되어야 하므로)
항상 꺼지지 않게 전력을 공급하고 관리해야 한다.

AWS는 이러한 모든 것을 아마존에서 대신 해주고 비용을 지불하는 서비스이다.
AWS에서는 EC2라는 이름의 가상 컴퓨터, RDS라는 이름의 데이터베이스를 제공한다.
(그 외에도 파일 보관 스토리지, 인공지능, 머신러닝, 사용자 인증 등 수많은 IT서비스를 제공)

이번 프로젝트에서는 서비스를 배포할 계획은 없으므로 EC2는 사용하지 않고,
RDS(데이터베이스)만 사용한다.


AWS‧네트워크 기본 용어

용어설명
VPCAWS 안의 사설 네트워크
SubnetVPC 내부 IP 블록 (AZ 단위)
AZAvailability Zone, 같은 리전의 물리 DC 묶음
IGWInternet Gateway, VPC↔인터넷 관문
Route Table목적지→대상 라우팅 규칙
Security Group인스턴스용 가상 방화벽
DB Subnet GroupRDS가 쓸 서브넷 리스트
Free Tier신규 계정 12 개월 무료 한도

초기화 및 재설정

아래의 생성 옵션들은 예시로 이름을 작성한 것이며 각종 주소나 이름은 동일하지 않아도 된다.

보안 그룹, 인바운드와 아웃바운드 규칙은 이쪽을 참고

https://velog.io/@tk7580/%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80-7.5-%EC%9D%B8%EB%B0%94%EC%9A%B4%EB%93%9C%EC%99%80-%EC%95%84%EC%9B%83%EB%B0%94%EC%9A%B4%EB%93%9C

0. 기존 리소스 삭제

리소스위치이유
VPC, Subnet, IGW, Route TableVPC 콘솔충돌·과금 방지
RDS 인스턴스 & DB Subnet GroupRDS 콘솔비용·이름 중복 방지
Security GroupVPC ▸ Security Groups룰 꼬임 예방

1. 새 VPC 생성

항목값(예)
이름my-vpc-01
IPv4 CIDR10.0.0.0/24
IPv6비활성
aws ec2 create-vpc --cidr-block 10.0.0.0/24 \
  --tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=my-vpc-01}]'

2. 퍼블릭 서브넷 3개 (AZ 분산)

이름AZCIDR
subnet-aap-ne-2a10.0.0.0/26
subnet-bap-ne-2b10.0.0.64/26
subnet-cap-ne-2c10.0.0.128/26

왜 3개? RDS 퍼블릭 엔드포인트는 최소 2 AZ를 요구.
처음부터 3개 두면 Multi-AZ 전환이 편함.

3. Internet Gateway 붙이기

  1. VPC ▸ Internet Gateways ▸ Create → 이름 my-vpc-01-igw
  2. Attach to VPC → my-vpc-01

4. Route Table 수정

  • Route tables ▸ 기본 테이블 선택
  • Routes ▸ Edit routes ▸ Add route
    • Destination 0.0.0.0/0
    • Target IGW(my-vpc-01-igw)
  • Subnet Associations 탭 → subnet-a/b/c 체크 → Save

5. VPC DNS 옵션 ON

  • Actions ▸ Edit DNS Resolution → Enable
  • Actions ▸ Edit DNS Hostnames → Enable

6. DB Subnet Group

필드
Namerds-public-subnet-group
VPCmy-vpc-01
Subnetssubnet-a, b, c

7. Security Group rds-sg

Inbound
| Prot | Port | Source |
|------|------|--------|
| TCP | 3306 | 내 공인 IP/32 |

8. RDS MySQL 인스턴스

AWS RDS는 정해진 한도 내에서 12개월의 무료 사용을 지원한다.
아래의 생성 옵션을 따르면 된다.

옵션해설
TemplateFree tier프리 티어(무료버전)
EngineMySQL 8.0
Classdb.t3.micro기본으로 설정되는 클래스이다. 건드리지 말 것.
Storage20 GiB gp2기본으로 할당되는 저장소 값이다. 건드리지 말 것.
Public accessYes퍼블릭 엑세스를 허용한다. 반드시 활성화 (보안은 따로 설정 가능)
VPC/Subnet Grpmy-vpc-01 / rds-public-subnet-group
SGrds-sg
Master useradmin /

엔드포인트 → <YOUR-RDS-ENDPOINT>.rds.amazonaws.com:3306

9. MySQL 접속 & 스키마 생성

mysql -h <YOUR-RDS-ENDPOINT>.rds.amazonaws.com \
      -P 3306 -u admin -p

CREATE DATABASE tmr
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_general_ci;

10. application.properties 파일

    spring.datasource.username=admin
    spring.datasource.password=<YOUR-PASSWORD>
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.show-sql=true
    spring.jpa.properties.hibernate.format_sql=true

11. 실행 로그 OK 신호

  • HikariPool-1 - Start completed
  • Tomcat started on port 8080

12. 오류 요약

오류원인해결
UnknownHostException엔드포인트 오타·VPC DNS OFFVPC DNS ON, 8.8.8.8
Communications link failure3306 차단SG Inbound 3306 허용
Driver not accept jdbcUrlurl 키 중복spring.datasource.url 한 줄만
MongoSocketOpenExceptionMongo 스타터만 남음의존성 제거

13. 무과금 옵션

  1. RDS db.t3.micro 750h/월, 20 GiB 이하
  2. EC2 / NAT GW / Elastic IP 미사용
  3. 스냅샷·CloudWatch Logs 수시 정리
  4. S3·SNS 등 다른 서비스 무심코 켜지 않기

연결 설정 및 테스트

인텔리제이의 우측 상단에 원통형 아이콘이 Database 도구이다.
+ 버튼을 눌러 나오는 Data Source에서
db종류를 선택하면(나 같은 경우에는 MySQL) 이런 창이 뜨게 된다.

Host 부분에 생성한 db의 주소(AWS의 Aurora and RDS로 들어가서 왼쪽 데이터베이스를 클릭한 후 원하는 데이터베이스를 선택한다. 연결 및 보안에서 엔드포인트를 복사해서 넣는다(복사 버튼도 존재함))를 입력한다.

User와 Password도 RDS 생성 시에 입력했던 정보를 그대로 입력한다.
입력 후 Test Connection을 눌러 테스트 연결을 한다.

성공할 경우 이렇게 초록색 결과창이 뜨는데, 테스트 연결에 성공했다면 Apply, ON을 순서대로 누르고 추가한다.

연결이 추가되었다면 이런 식으로 상단 바가 변하게 되는데,
딱 봐도 새로고침과 중지처럼 생긴 버튼이 있다.
그 오른쪽에 있는 버튼이 쿼리 실행기를 여는 버튼이다.

눌러서 아무 쿼리 콘솔이나 눌러주게 되면 쿼리 실행기가 뜨는데

이런 식으로 쿼리문을 입력하고 초록색 실행 버튼으로 실행해주면 된다.
초록색 박스는 실행할 쿼리의 범위를 나타낸다.
사진은 어플리케이션을 실행하기 위해
properties파일에 실제 데이터베이스, 즉 스키마를 생성해줘야 하므로
create database를 작성한 것이다.
사진처럼 줄을 나타내는 숫자 옆에 체크 표시가 뜬다면 쿼리가 정상적으로 실행됐다는 뜻이다.
쿼리가 여러 줄이라면 각 블록을 내려가며 체크표시가 생기게 된다.

그리고 Database 도구 창을 열어서 연결되어있는 데이터베이스를 클릭하면 실제 테이블 구조를 확인할 수 있다.

보안 설정

ip주소를 개방하고 학원 ip, 각자 집 ip에서도 사용 가능하게 하자는 논의가 있었다.

안 되는 이유

ip주소를 개방한다는 말은 인바운드 규칙을 0.0.0.0/0으로 지정하여
모든 ip에서 해당 포트로의 접근을 가능하게 한다는 뜻

  • 무작위 대입 공격, SQL 인젝션 등의 공격을 받을 위험 존재

  • DDos나 제로데이 공격 등에 쉽게 노출

  • 데이터 유출 및 손상 위험이 높아짐

  • 불필요한 트래픽 및 리소스 소모
    포트가 개방되면 사용자와 무관한 스캐닝 트래픽, 공격 시도 트래픽 등이 유입됨
    이러한 불필요한 트래픽은 인스턴스의 자원을 소모시키고 요금 발생으로도 이어질 수 있음

    회사 차원에서 진행하는 중요한 프로젝트는 아니더라도 심각한 보안 취약으로 이어질 수 있으므로 각자의 ip를 인바운드 규칙에 추가하는 방향으로 결정

IP에 대하여

인바운드 규칙 편집에서

AWS 보안 그룹에서 IP 주소 뒤에 붙는 /숫자는 CIDR(사이더, Classless Inter-Domain Routing) 표기법이라고 하며, 허용할 IP의 범위를 나타낸다.

  • /32 : 이 주소 하나만을 의미한다. 32비트로 이루어진 IP주소이 모든 자리를 고정한다는 뜻
  • /24 : (예시)123.123.12.0/24와 같이 입력하면, 123.123.12.0부터 123.123.12.255까지의 모든 IP(총 256개)를 허용한다는 의미이다. 특정 사무실의 IP 대역 등에 사용한다.
  • 0.0.0.0/0 : 전 세계 모든 IP를 허용한다는 의미이다.
    앞서 설명한 것처럼 보안상 절대로 사용해서는 안 된다.

IP란 무엇인가

컴퓨터 네크워크에 연결된 모든 장치에 할당되는 고유한 숫자 식별자
현실에 주소가 있는 것처럼 네트워크 상에서 장치를 식별하고 통신하는 데 사용되는 주소이다.

주요 기능

종류와 구성

현재 주로 사용되는 IP주소는 IPv4와 IPv6으로 두 가지 버전이 존재한다.

  1. IPv4 (Internet Protocol version 4)

  • 구조 : 32비트 숫자로 구성되며, 일반적으로 8비트씩 네 부분으로 나뉘어 점(.)으로 구분된다. 각 부분은 0부터 255까지의 십진수 숫자로 표현된다.
  • 예시: 192.168.1.100
  • 구성: 네트워크 부분(Network ID)과 호스트 부분(Host ID)으로 나뉜다. 네트워크 ID는 장치가 속한 네트워크를 식별하고, 호스트 ID는 네트워크 내의 개별 장치를 식별한다.
  • 한계: 32비트로는 약 43억 개의 고유한 주소만 표현할 수 있어, 인터넷 장치 수 증가로 인한 주소 고갈 문제에 직면하고 있다.

  2. IPv6 (Internet Protocol version 6)

  • 구조: 128비트 숫자로 구성되며, 콜론(:)으로 구분된 8개의 16진수 그룹으로 표현된다.
  • 예시: 2001:0db8:85a3:0000:0000:8a2e:0370:7334 또는 2001:db8:85a3::8a2e:370:7334 (축약형)
  • 구성: 네트워크 프리픽스(Network Prefix)와 인터페이스 식별자(Interface Identifier)로 나뉜다.
  • 장점: 128비트 주소 공간은 거의 무한대에 가까운(3.4×10383.4 \times 10^{38}개) 주소를 제공하여 주소 고갈 문제를 해결한다. 향상된 보안 기능과 효율적인 라우팅이 가능하다.

0개의 댓글