
애플리케이션을 AWS 를 이용해 배포하기DevOps2024. 4. 30. 23:13
Table of Contents
📂배포 방식
- 보안 강화를 위하여 VPC 사용
- 외부에서의 DB 접근을 막기 위하여 Amazon RDS 를 Private Subnet 안에 EC2 인스턴스를 넣어줌
- 애플리케이션 사용자들이 해당 애플리케이션의 기능을 사용할 수 있도록 Public Subnet 에 Spring Boot 프로젝트EC2 인스턴스를 넣어줌
- aws 는 사용 환경이 잘 갖추어져 있지만 해킹의 사례들이 종종 보임. 그 중 한 명이었기에 이번 포스팅을 통해 적용하고자 함
💡VPC 란 무엇인가?
- AWS VPC(Virtual Private Cloud) 는 Amazon Web Service 에서 제공하는 서비스로, 사용자가 AWS 클라우드 내에서 로직적으로 격리된 가상 네트워크를 정의하고 구성할 수 있게 해줌
- 사용자가 전체적인 네트워크 환경을 제어할 수 있게 해주어 IP 주소 범위, 서브네스 라우팅 테이블, 네트워크 게이트웨이 및 보안 설정 등을 정의할 수 있음
1. VPC 생성
- VPC 생성 클릭
1-1. VPC 설정
- VPC 등 옵션 선택
- 이름 태그 설정
- 자동 생성으로 한다면 나중에 일일이 변경해주어야 함..
- 10.0.0.0/ 16 은 일반적인 네트워크에서 사용됨
1-2. 가용 영역 설정
- 설정 한 갯수의 가용 영역별 서브넷이 자동으로 분배되어 생성
- 퍼블릭 서브넷의 경우 트래픽이 IGW 로 향할 수 있도록 자동으로 라우팅 테이블 생성
- 프라이빗 서브넷의 경우 트래픽이 퍼블릭으로 향할 수 있도록 자동으로 생성
- NAT 게이트 웨이를 생성할 경우에는 트래픽이 NAT 로 향할 수 있도록 자동으로 생성
1-3. NAT 게이트웨이 설정
💡NAT 게이트웨이란 무엇인가?
- 내부 네트워크에서 인터텟을 사용할 수 있도록 하는 중요한 네트워크 구성 요소
- Network Address Translation 의 약자로, 프라이빗 IP 주소를 사용하는 프라이빗 서브넷의 인스턴스들이 인터냇 통신할 수 있게 도와주지만, 외부에서는 이 인스턴스들에 직접 접근할 수 없도록 함
📄특징
- 인터넷 연결 제공 : 프라이빗 서브넷에 있는 인스턴스들이 인터넷을 통해 업데이트나 패치를 다운로드하거나, 외부 API 와 통신할 수 있게 해줌
- 인바운드 트래픽 차단 : 외부에서 프라이빗 서브넷의 인스턴스로의 직접적인 접근을 차단하여 보안 수준을 제공. 즉, 인터넷에서는 프라이빗 서브넷의 인스턴스를 직접 볼 수 없음
- IP 주소 마스킹 : NAT 게이트웨이는 프라이빗 IP 주소를 공개 IP 주소로 변환하여 인터넷 리소스와의 통신을 가능하게 함. 이 때, 외부에는 단일 IP 주소(게이트웨이의 IP)만 노출되므로, 내부 네트워크의 구조는 숨겨짐]
- 스케일링과 내구성 : NAT 게이트웨이는 고가용성과 자동 확장 기능을 지원하며, AWS 가 관리하는 서비스이기 때문에 사용자는 별도의 관리 작업 없이 서비스를 사용할 수 있음.
- 예를 들어, 트래픽이 증가하더라도 NAT 게이트웨이는 자동으로 이를 처리할 수 있음
- 간편한 설정 : NAT 게이트웨이는 몇 번의 클릭으로 쉽게 설정할 수 있으며, VPC 의 라우팅 테이블에서 자동으로 통합됨
- 보안이 중요한 애플리케이션에서 인터넷 접속이 필요할 때 유용
- 이를 통해 보안을 유지하면서도 필요한 외부 리소스에 접근할 수 있는 균형을 이룰 수 있음
본 포스팅에서는 NAT 게이트웨이를 사용하지 않을 예정이름 없음으로 설정
- VPC 엔드포인트는 VPC 에서 AWS 내브 네트워트를 통해 AWS 서비스에 연결하는 방식으로, 프라이빗 서브넷에서 S3 로 접근할 경우 효율적으로 사용됨
2. 서브넷 생성
- 서브넷 생성 버튼 클릭
- 위에서 만든 VPC 를 선택
2-1. 서브넷 설정
- 가용역역의 경우 'ap-northeast-2a' 로 설정
- 서비스에 장애가 발생했을 때 지속 운영하기 위한 장치
- 아시아 태평양 (서울) / ap-northeast-2a 가 보이지 않는 콘솔의 우측 상단에 리전이 서울로 되어 있는지 확인
- IPv4 서브넷 CIDR 블록
- IPv4 서브넷 CIDR 블록들은 '10.0.0.0/16' 내부에 포함되어야 하며, 서브넷의 접두사 길이는 '/16' 보다 크거나 같아야 함
- '/16' 보다 커야하는 이유는, 서브넷은 상위 네트워크의 부분 집합이어야 하기 때문
- 본 포스팅는 소규모 서브넷 '10.0.32.0/24' 로 설정
- 32로 설정한 이유는 기존에 존재하는 서브넷과 겹치기에 32이 설정해주었음
- IPv4 서브넷 CIDR 블록들은 '10.0.0.0/16' 내부에 포함되어야 하며, 서브넷의 접두사 길이는 '/16' 보다 크거나 같아야 함
- 서브넷 이름을 설정해 준 후 서브넷 생성 클릭
2-2. 서브넷 설정 편집
- 생성된 서브넷을 체크하고 작업에서 서브넷 설정 편집 클릭
- 퍼블릭 IPv4 주소 자동 할당 활성화 체크 후 저장
3. 라우팅 테이블 설정
- 생성한 서브넷을 체크하고 라우팅 하단의 라우팅 테이블 탭을 확인해 보면 '10.0.0.0/16' 은 대상이 local 로 설정되어 있음
- 라우팅 테이블을 수정하여 VPC 내의 데이터 패킷이 인터넷 게이트웨이로 향하도록 설정해주어야 함
3-1. 라우팅 테이블 생성
- 대시보드에서 라우팅 테이블 탭으로 이동 → 라우팅 테이블 생성 클릭
- 이름을 설정하고 VPC 는 위에서 생성했던 VPC 를 선택 후 라우팅 테이블 생성 클릭
3-2. 라우팅 편집
- 라우팅 추가를 클릭하여 새 라우팅 정보 추가
- 대상은 '0.0.0.0/0' 으로 외부 인터넷으로 향하도록 설정
- 두 번째 대상은 인터넷 게이트웨이를 선택하고 위에서 생성한 인터넷 게이트웨이를 선택한 후 변경 사항 저장
4. RDS 설정
4-1. 외부망에서 VPC 내부에 있는 EC2 로 접근할 수 있도록 보안 그룹 생성
- VPC → 보안그룹 → 보안 그룹 생성보안 그룹 이름 및 설명 작성
- VPC 는 위에서 생성해준 VPC 로 설정
4-1-1. 인바운드 규칙을 아래와 같이 설정
- 설정이 끝나면 보안 그룹 생성 클릭
4-2. 내부망에서 VPC 내부에 있는 EC2 로 접근할 수 있도록 보안 그룹 생성
- VPC → 보안그룹 → 보안 그룹 생성
- VPC 는 위에서 생성해준 VPC 로 설정
4-2-1. 인바운드 규칙 추가
- 유형은 MYSQL/Aurora 소스는 위에서 생성한 보안 그룹으로 선택
- 해당 보안 그룹을 거친 트래픽만 3306 포트를 통해 허용한다는 의미
- 설정이 끝나면 보안 그룹 생성 클릭
4-3. RDS 서브넷 그룹 설정
- DB 서브넷 그룹 생성 클릭
4-3-1. 서브넷 그룹 세부 정보 작성
- 서브넷 그룹의 이름 및 설명을 작성
- VPC 는 위에서 생성한 VPC 로 설정
4-3-2. 서브넷 추가
- VPC 생성 시 가용영역으로 'ap-northeast-2a', 'ap-northeast-2b' 로 설정해주었기에 똑같이 선택
- 마찬가지로 서브넷 또한 모두 선택
- 모든 작업이 끝났다면 생성 클릭
4-4. 데이터베이스 생성
- RDS → 데이터베이스 → 데이터베이스 생성
- 표준 생성 선택
- 본 포스팅에서는 MariaDB 를 사용할 예정이므로 MariaDB 선택
- 프리티어 환경이므로 프리티어를 선택함
- 인스턴스 식별자 설정
- 마스터 사용자 이름과 마스터 암호 설정
- root 계정의 아이디와 비밀번호 역할을 하므로 정보를 기록하되 공유하지 말아야 함
- 인스턴스 구성은 기본 설정 그대로 진행
- 스토리지 자동 조정 활성화 해제
- 스토리지 자동 조정의 경우 필요한 스토리지 용량이 할당된 크키보다 커지면, 자동으로 할당 스토리지 용량이 추가되며 추가된 만큼 요금이 발생할 수 있음
- DB 에 대한 EC2 를 만들지 않아 연결 안 함을 선택
- VPC 는 위에서 만들어 준 VPC 를 선택
- 서브넷 그룹도 위에서 만들어준 서브넷 그룹 선택
- 외부에서 접근할 수 업도록 퍼블릭 엑세스는 '아니오' 선택
- VPC 보안 그룹은 위에서 생성한 VPC 보안 그룹을 선택
- 가용 영역은 위와 같이 'ap-northeast-2a' 로 설정
- IAM 을 사용하지 않으므로 '암호 인증' 선택
- 데이터베이스 이름 설정
- 테스트 환경이므로 자동 백업 비활성화
- 실제 배포 환경에서는 snapshot 이 필요하므로 체크해야 함
위 설정이 끝났다면 데이터베이스 생성 클릭
- 생성 완료까지 시간이 약 5~6분 소요
4-5. 데이터베이스를 위한 EC2 생성
- EC2 인스턴스의 이름 및 OS 설정
- 인스턴스 유형 선택
4-6. 키 페어 생성
- 해당 인스턴스에 사용할 키 페어를 생성
💡키 페어란 무엇인가?
- 인스턴스와의 안전한 통신을 위해 사용되는 보안 자격증명
- 공개 키와 비공개 키의 조합으로 구성되며, AWS 가 공개 키를 인스턴스에 저장하고 사용자는 비공개 키를 안전하게 보관해야 함!!
- 키 페어 이름 설정
- 키 페어 유형으로는 RSA 를 선택
- 키 파일 형식
- 터미널을 사용할 예정이라면 .pem / PuTTY 를 사용할 예정이라면 .ppk 를 선택 ( 본 포스팅에서는 ,pem 을 선택 )
- pem 키와 ppk 키는 puTTygen 을 통해 변환 가능하다
RSA 와 ED25519
더보기
1. RSA (Rivest -Shamir-Adleman)
- 가장 널리 사용되는 공개 키 암호화 알고리즘 중 하나
- 두 개의 큰 소수의 곱이라는 하나의 방향성 문제(공개 키와 개인 키 생성에 사용)에 기반
- 비교적 계산량이 많고, 키 길이가 길어질수록 보안성은 높아지지만, 처리 속도가 느려질 수 있음
- 일반적으로 2048 비트 이상의 키 길이를 사용하며, 보안성를 더욱 강화하기 위해 3072 비트나 4096 비트를 선택하기도 함
2. ED25519
- Edwards-curve Digital Signature Algorithm (EdSDA) 을 사용하는 공개 키 암호화 방식
- 타원 곡선 암호화에 기반을 두고 있으며, 특히 고성능과 강력한 보안을 제공하는 것으로 알려져 있음
- 짧은 키 길이(256 비트)에도 불구하고 높은 보안 수준을 제공하며, RSA 보다 빠르고 안전하게 데이터를 처리할 수 있음
- 키 생성, 서명, 검증 과정이 매우 빠르기 때문에, 저전력 환경이나 높은 성능이 요구되는 환경에서 유리
4-7. 네트워크 설정
- VPC 는 위에서 만든 VPC 선택
- 서브넷은 'public-ap-northeast-2a' 선택
- 퍼블릭 IP 의 경우 탄력적 IP (Elastic IP)를 생성하여 연결해 줄 예정이므로 비활성화
- 보안 그룹은 위에서 생성한 보안 그룹을 선택
위 설정이 끝났다면 인스턴스 시작을 클릭해 인스턴스 생성
4-8. 탄력적 IP 설정
- EC2 콘솔 탭의 좌측 네트워크 보안 → 탄력적 IP 클릭
- 탄력적 IP 주소 할당 클릭
- 이동 후 '할당' 을 클릭해 생성
- 항당된 주소를 체크하고 탄력적 IP 주소 연결 선택
- 위에서 만든 인스턴스 선택
- 프라이빗 IP 의 경우 클릭하여 나오는 주소 선택
위 작업이 끝났다면 생성 클릭
5. EC2 접속
- PuTTy 를 사용해 아래와 같이 접속 가능
- private-subnet 에 있는 RDS 와 연결된 public-subnet 의 EC2 는 Bastion Host 역할
5-1. 패키지 목록 업데이트
sudo apt-get update
- ERR 메시지가 나왔다
- Ubuntu 레포지토리에 엑세스하는 데 필요한 포트 80(HTTP) 및 포트 443(HTTPS)에서 아웃 바운드를 허용하지 않아서 였다
- vpc → 보안그룹 → 이전 생성한 보안그룹을 찾아 하단의 아웃바운드 규칙에 위와 같이 추가
- HTTP(포트 80) : 최신 패키지를 불러오는데 필요, HTTPS(포트 443): S3에 엑세스하는데 필요
5-2. MySQL 클라이언트 설치
- MySQL 및 MariaDB 서버에 모두 연결할 수 있는 MySQL 클라이언트 설치
sudo apt install mysql-client -y
5-3. RDS 접속
sudo mysql -u <RDS 마스터 사용자 이름> -p --port 3306 --host <RDS 인스턴스 엔드포인트>
- 올바른 비밀번호를 입력헀지만 접속이 안된다..
- 해당 RDS 가 EC2 와 연결이 안되어 있어서 그랬던 것
- RDS → 데이터베이스 → 생성한 데이터베이스 클릭 → 작업 → EC2 연결 설정
- 위에서 생성한 EC2 인스턴스 선택
위 작업이 끝났다면 완료!
참고 링크 : https://velog.io/@server30sopt/VPC-%EC%84%9C%EB%B8%8C%EB%84%B7-%EC%84%A4%EC%A0%95%EC%9C%BC%EB%A1%9C-RDS%EC%97%90-%EC%95%88%EC%A0%84%ED%95%98%EA%B2%8C-%EC%A0%91%EA%B7%BC%ED%95%98%EA%B8%B0
다음 포스팅에서는 백엔드 프로젝트를 컴파일하고 깃 액션과 Code Deploy 를 통해 배포하는 걸 해보곘습니다.
'DevOps' 카테고리의 다른 글
GitHub Actions 와 CodeDeploy 를 이용한 CI/CD 구현 (0) | 2024.05.10 |
---|
@BaekSJ :: 개발자의 길
Back-End, Front-End, DevOps 기록 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!