[GCP] Node.js(NestJS) 클라우드 배포 : (1) 인스턴스에 Docker 컨테이너 기반 App 배포
Google Cloud Platform (GCP)은 Google이 제공하는 클라우드 컴퓨팅 서비스 플랫폼이다.
비슷한 경쟁사로는 AWS, Azure 등이 있다.
해당 포스팅에서는 Docker를 이용하여, GCP 인스턴스에 배포하는 방법을 간략하게 다루어보도록 하겠다.
물론 해당 포스팅에서 다룬 내용 이외에 GCP의 활용 가능성은 무궁무진하지만, 가장 간단하게 사용할 수 있는 방법을 소개하려고 한다.
해당 포스팅에서는 Docker에 대한 자세한 설명은 다루지 않으므로, Docker에 대해서 모른다면 블로그 내의 다른 Docker 관련 포스팅을 참고하자.
무엇을 할 것인가
간단히 말해서, 컴퓨터를 빌리고, 안에서 Docker를 이용하여 앱을 실행시키고, 네트워크를 설정시켜서 외부에서 접속 가능하게 하기!
- GCP 접속
- 컴퓨터 빌린다
- 빌린 컴퓨터에서 깃을 통해 소스코드를 다운로드 받는다
- Docker-compose 설치한다
- Docker-compose 실행한다
프로젝트 구조
다음은 각각 프로젝트 구조, Dockerfile, docker-compose.yaml을 작성한 내용이다.
프로젝트를 Dockerlizing하기 위해 필요한 소스 코드와, Docker 관련 설정 파일들이다.
해당 소스코드는 Git에 Push해두도록 하자.
GCP 인스턴스 생성
우선 컴퓨터를 빌려야 한다. 해당 과정을 GCP 클라우드의 VM(가상 머신) 인스턴스를 생성하는 과정이라고 칭한다.
GCP에서 프로젝트를 생성한 후, Compute Engine을 찾아 들어가보도록 하자.
VM 인스턴스를 생성할 때에는 크게 보아야 할 것이, 리전, 머신 구성 및 유형, 부팅 디스크 설정의 부분이다.
리전 : 인스턴스를 가동시킬 머신의 위치를 선택한다. 일반적으로 대다수의 서버 접속자들과 가까운 지역이 핑 상태가 좋아서 선호된다.
- Gcping : 리전에 따라 핑을 체크하여 지역 선택에 도움을 줌
머신 구성 : 인스턴스의 종류를 선택한다. CPU, Memory 등의 조건과 그에 따른 금액 조건이 달라진다. 필자는 가장 저렴한 E2 인스턴스를 선택하였다. 그 중에서도 e2-medium으로 머신 유형을 선택해주었다.
부팅 디스크 : 임대할 컴퓨터의 운영체제를 선택하고, 저장 공간의 크기를 조절할 수 있다. 일반적으로 Ubuntu가 가장 가볍고 저렴하여 선호되는 편이다. 필자는 직접 운영할 용도가 아니기에 디스크 저장공간은 10GB정도로 가장 작게 설정하였다.
이렇게 되면 컴퓨터를 임대하는 것에 성공한 것이다.
이어서 옆에 SSH 연결을 해보자. 임대한 Ubuntu 인스턴스의 Secure shell(터미널)이 열리게 된다.
Docker 설치와 Git에서 소스코드 다운로드 받기
기본적으로 GCP에는 Git이 설치되어 있다. 아래 세 가지의 과정을 거쳐보자
apt update # Docker-compose를 다운로드 받기 전 apt 업데이트를 진행하자
apt install docker-compose # Docker 다운로드
git clone YOUR_GIT_REPOSITORY_URL # Git에서 소스코드 다운로드
환경변수 파일 생성
기본적으로 우리는 .env와 같은 환경설정 파일은 gitignore를 통해 Git 저장소에 푸시하지 않는다.
따라서 Ubuntu 내부에서 Vi 에디터를 이용하여 .env 파일을 직접 작성해주었다.
만약 Git 저장소에 포함되지 않은 환경변수나 Secret 등이 있다면 직접 작성해주면 된다.
VI 에디터의 명령어만 적으면 포스팅 몇 개의 분량이 나오겠지만, 일단 사용했던 과정만 간략하게 적어두었다.
1. sudo vi .env (에디터 접속)
2. i (Insert 모드로 변경)
3. 내용 편집
4. esc (Insert 모드 종료)
5. Shift + : + wq (저장 후 VI 종료)
Dockerfile 빌드 및 컨테이너 실행
docker-compose를 빌드해주고, 컨테이너를 실행시켜주는 과정이다.
로컬 우분투 컴퓨터에서 도커 컨테이너를 실행시키는 과정과 별 반 다를 점이 없다.
docker-compose build
docker-compose up -d
네트워크 방화벽 설정
Docker 컨테이너가 잘 작동하는 것을 확인하였다면, 이제 외부에서 접속이 되는지를 확인해 볼 차례이다.
해당 인스턴스의 외부 IP의 해당하는 포트를 찾아서 접속을 시도해보면 될 텐데, 정상적으로 접근이 되지 않을 것이다.
이유는 방화벽에 의해서 접근 허용이 되지 않기 때문이다. 따라서 해당 인스턴스의 앱을 실행시키는 포트에 대해서 승인된 사용자에게 접근을 허가해주도록 방화벽 설정을 할 필요가 있다.
우선 VPC 네트워크를 찾아서, 방화벽 탭으로 이동해주도록 하자.
방화벽 규칙 생성
방화벽 규칙을 생성해주자.
대상 태그에 들어가는 내용은 일종의 방화벽 규칙에 대한 스티커이다. 나중에 인스턴스에 해당 스티커를 붙여주면 해당 규칙을 적용하겠다는 의미로 사용된다. 의미있는 이름을 지어주도록 하자.
소스 IPv4 범위는 접근을 허용시킬 클라이언트들의 범위를 설정하는 곳이다.
다음과 같이 0.0.0.0/0으로 설정하면, 모든 사용자들에 대해서 접근을 허용하겠다는 뜻이다.
프로토콜 및 포트에서는 TCP/3000번 포트를 해당 규칙을 적용시킬 네트워크 포트로 지정하였다.
따라서, 3000번 포트는 모든 사용자들이 접근할 수 있도록 될 것이다.
VM 인스턴스 네트워크 수정
아까 만든 VM 인스턴스를 편집하는 곳에 들어간다.
방금 만든 방화벽 규칙의 대상 태그(스티커)의 이름을 네트워크 태그에 포함시켜주자.
이제 해당 인스턴스는 방화벽 규칙을 적용받아, 3000번 포트로 접근이 허용될 것이다.
배포 API 접근 확인하기
이제 외부 IP의 3000번 포트로 접속하게 되면 API에 접근할 수 있게 되었다.
'Cloud > GCP' 카테고리의 다른 글
[GCP] Node.js(NestJS) 클라우드 배포 : (6) Kubernetes - 명령어와 네트워크 설정 (0) | 2023.09.24 |
---|---|
[GCP] Node.js(NestJS) 클라우드 배포 : (5) Kubernetes - Cluster와 Deployment 생성하기 (0) | 2023.09.24 |
[GCP] Node.js(NestJS) 클라우드 배포 : (4) 로드밸런서와 HTTPS 적용 (0) | 2023.09.10 |
[GCP] Node.js(NestJS) 클라우드 배포 : (3) 도메인 연결 (0) | 2023.09.10 |
[GCP] Node.js(NestJS) 클라우드 배포 : (2) VM 인스턴스 데이터베이스로 Cloud SQL 이용하기 (0) | 2023.09.04 |