[GCP] 서버 세팅기

아기코린이·2025년 5월 30일
0
post-thumbnail

들어가기

때는 바야흐로 약 1달 전 어느 좋은날. 인형뽑기에 심취했던 그날. 카드를 잃어버렸다...

그로인해 모든 자동결제가 해지되었다.. 눈물 또르륵.. 카드를 재발급 받고 모든 자동결제를 다시 등록했다고 생각했지만, 이럴수가 구글 결제정보 수정을 안한것이다. 이럴수가...

이걸 눈치챘을 땐 이미 GCP서버가 멈춘 뒤였다. 서버를 다시 시작하면 되지만, 다시 공부한다는 생각으로 서버 세팅하는 것을 기록으로 남겨보려한다. 지금바로 스타트!

이 글에서 다룰 것들.

  • GCE에서 e2.micro 인스턴스 생성
  • 서버 설정 및 간단한 웹 서버 생성
  • https를 위한 SSL 인증서 발급

Mac을 기준으로 진행한다.

왜 GCP를 선택했는가.

클라우드 컴퓨팅을 서비스하는 기업 중 가장 유명한 기업은 AWS의 EC2가 아닐까싶다. 그렇다면 가장 유명한 서비스인 AWS의 EC2를 선택하지 않고 왜 GCP의 GCE를 선택한 것 일까.

이유는 간단했다. AWS는 신규가입 크래딧이 모두 소모되는 순간부터 과금이 시작된다. 반면 GCP는 특정 서비스에 한하여 무료등급이 존재한다.

나의 경우 고성능의 서버가 필요한 것이 아니고 그저 테스트용 서버가 필요했다. 그래서 과금 걱정이 덜한 GCP의 GCE를 선택했다.

인스턴스를 생성하기 앞서 GCP는 아래와 같은 제품군의 free tier를 지원한다. 필자는 이번 블로깅을 위해 정보를 찾던 중 발견했는데 "역시 구글인가..." 싶었다. 정말 다양한 제품군의 free tier를 제공한다는 사실이 놀라웠다.

그 중에서 이번 글에서 다룰 내용은 좌상단에 위치하고 있는 Compute Engine이다. 해당탭을 눌러 tree tier로 제공하는 상품을 확인해보자.

위와 같은 조건에 한하여 완전 무료 혹은 월 1,000원 미만의 비용이 발생하는 e2-micro 서버 하나를 대여할 수 있다.

필자의 귀여운 서버가 죽기전 약 2년간의 과금 내역이다.

사진에서 보이듯이 10원 미만이 청구된 달도 있고 600원 이상이 청구된 달도 있다. GCP의 요금 정책에는 월 단위 요금시간 단위 요금이 있다. 이 중 GCE는 기본적으로 시간단위로 요금을 책정한다. 한 달을 730시간으로 보고 요금을 책정하며, 이를 초과한 비용에 대해서만 과금된다. 즉 한 달이 31일인 달약 14시간의 추가금이 발생할 수 있다는 뜻이다.

또한, 무료로 제공되는 730시간은 하나의 인스턴스에만 적용되는 것이 아니라 무료 리전에 있는 모든 e2.micro 인스턴스에 적용된다. free tier 할인 이외에도 지속 사용 할인 등이 있으니 필요하다면 확인해보길 바란다.

생성할 서버와 요금정책은 대충 알아봤으니 이제 본격적으로 시작해보자.

GCE에서 e2.micro 인스턴스 생성

서버 생성

GCP에 로그인하고 콘솔에 접속하면 위와 같은 화면을 확인할 수 있다. 이제 VM 만들기를 눌러 컴퓨터 한대를 대여해보자.

리전은 오리건, 아이오와, 사우스캐롤라이나 중 마음에 드는 한 곳을 선택한다.

인스턴스는 e2-micro를 선택한다.

좌측 메뉴에서 OS 및 스토리지를 누르고 필요한 OS(필자는 ubuntu 24.04 버전을 선택)를 선택한다. 부팅 디스크 유형은 표준 영구 디스크를 선택해야 free tier 혜택을 받을 수 있다. (30Gb까지 무료)

중요한 데이터를 담을 서버는 아니기 때문에 백업은 안 할거다.

http 통신을 위한 80번 포트와 https 통신을 위한 443번 포트를 열어줬다.

보안 탭의 최하단 SSH의 public key를 추가한다. 추후 이 키로 서버에 접속할 것이다. *키 발급 과정은 생략한다.)

관측 가능성에서는 모든 체크박스를 해제하고 고급 탭은 기본값으로 넘어갔다.

이후 만들기를 누르면 아이오와에 위치한 구글데이터 센터의 서버 중 한 대를 대여하게된다.

GCE free tier의 경우 public ip(외부 ip)에 따로 요금이 부과되지 않는다.

대여한 서버에 접속하기

ssh -i [key 경로] [username]@[server ip]

예시) ssh -i ~/.ssh/id_rsa oscar0421@192.168.0.101

각자 사용하는 ssh 프로그램을 통해 원격으로 서버에 접속한다.

새로운 서버를 생성하고 난 뒤에는 아래 명령어로 업데이트를 진행해주자.

sudo apt update

서버 설정 및 간단한 웹 서버 생성

Nginx 설치 및 세팅

일반적으로 Nginx는 웹 서버용으로 많이 사용된다. 하지만 이 글에서는 분기처리용으로 사용하려고한다. 필자가 Nginx를 분기처리용으로 사용하려는 이유는 다음과 같다.

  • 메인도메인 및 서브도메인으로의 분기처리
  • 한번의 ssl 인증서 등록으로 여러 도메인의 ssl 인증처리

위 사진을 순서로 정리하자면,

  1. 사용자가 원하는 서비스의 도메인으로 요청을 보낸다.
  2. Nginx가 각 도메인의 맞는 서비스로 분기한다.
  3. 해당 서버는 요청에 따른 로직을 수행한 후 결과를 전달한다.
  4. Nginx는 각 요청의 따른 응답을 사용자 전달한다.
  5. 사용자는 응답을 확인한다.

일반적으로는 보안적용이 안된 HTTP프로토콜로 통신하겠지만, 본 글에서는 SSL인증을 적용한 HTTPS까지 다뤄볼 예정이다.

Nginx 설치

sudo apt install nginx

Nginx로 들어오는 요청만 통과시키려면 방화벽을 켜고 규칙을 추가해주면 된다. 우분투는 기본적으로 방화벽이 꺼진채 만들어진다. 필자는 테스트 진행을 위해 끄고 진행하겠지만, 해당 코드는 남겨두겠다.

sudo ufw allow 'Nginx Full'
sudo ufw allow OpenSSH
sudo ufw enable

sudo ufw allow OpenSSH 기본적으로 방화벽룰에는 아무것도 추가되어 있지않기 때문에 SSH를 사용하려면 해당 포트도 방화벽에 추가해준다. 방화벽 룰을 제거하고 방화벽을 해제하고 싶다면 아래 명령어를 참고하자.

sudo ufw delete allow 'Nginx Full'
sudo ufw delete allow OpenSSH
sudo ufw disable 

Nginx가 잘 설치됐다면 아래와 같은 화면을 볼 수 있다.

외부 IP에 도메인 연결하기

먼저 자신이 원하는 DNS업체에서 도메인을 구매한다. 아무 도메인이나 상관없다. 필자는 가비아에서 구매했다.

각 DNS 업체에서 GCP서버 IP와 도메인을 연결해준다.

가비아 기준 DNS 설정에는 최대 48시간이 걸린다고 한다.

연결이 정상적으로 완료됐다면 위와 같이 도메인으로 서버에 접근할 수 있다. 혹시나 접속이 안된다면 시크릿 브라우저로 접속해보자 아니면 인터넷 사용기록을 삭제해보자.

SSL 인증서 발급 및 적용

SSL 인증서는 공인된 여러 기업을 통해 발급된다.

당장 이 글에서 다루고있는 GCP 역시 SSL 인증서 발급을 지원한다. 이외에도 AWS, Azure, NCP와 같은 CSP 기업. 가비아, Cloudflare와 같은 DNS 기업. 이외에도 SSL 인증서만을 발급해주는 기업들이 있다. 각 기업마다 SSL 인증서의 등급이 다르니 용도에 따라 선택하면된다.

이 글에서는 Certbot을 사용하여 Let’s Encrypt의 DV등급 인증서를 발급받고 적용시켜려 한다.

Certbot으로 인증서 발급받기

이 글에서는 총 두개의 방법을 소개하려고 한다.

첫 번째는 메인도메인 + 와일드카드 서브도메인을 발급 받는방법이다.
두 번째는 메인도메인 + 서브도메인1 서브도메인2 ... 서브도메인n을 발급 받는방법이다.

첫 번째 방법에는 몇 가지 제약이 존재한다. 꼭 글을 읽어보고 진행하기를 권장한다.

메인도메인 + 와일드카드 서브도메인

서브도메인을 와일드카드로 발급받기위해서는 반드시 DNS-01 챌린지 사용해야한다.

먼저 Certbot을 설치해준다.

sudo apt install certbot

아래 명령어를 실행한다.

certbot -d example.com,*.example.com --manual --preferred-challenges dns certonly

아래와 같은 결과가 나왔다면,


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name:

_acme-challenge.example.com.

with the following value:

<인증코드>

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

도메인을 구매한 DNS 업체의 설정페이지에서 다음과 같이 설정한다.

설정을 했다면, 터미널로 돌아와 엔터를 누른다.

Before continuing, verify the TXT record has been deployed. Depending on the DNS
provider, this may take some time, from a few seconds to multiple minutes. You can
check if it has finished deploying with aid of online tools, such as the Google
Admin Toolbox: https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.example.com.
Look for one or more bolded line(s) below the line ';ANSWER'. It should show the
value(s) you've just added.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.example.com. 에서 등록여부를 확인하거나 터미널에서 nslookup -q=txt _acme-challenge.example.com 로 확인한다.

등록이 되었다면 다시 터미널로 돌아와 엔터를 누른다.

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/example.com/privkey.pem
This certificate expires on 2025-08-24.
These files will be updated when the certificate renews.

NEXT STEPS:
- This certificate will not be renewed automatically. Autorenewal of --manual certificates requires the use of an authentication hook script (--manual-auth-hook) but one was not provided. To renew this certificate, repeat this same certbot command before the certificate's expiry date.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

정상적으로 발급이 완료되었다면 위와 같은 메세지를 확인할 수 있다.이 방법은 Certbot renew 명령어로 자동 갱신이 되지않는다. 따라서 3개월 마다 해당 작업을 반복해 줘야한다. 만약 DNS 업체에서 DNS관련 API를 제공한다면 자동 갱신 스크립트 작성이 가능하다.

3개월마다 갱신이 귀찮다면, 와일드카드 서브도메인 포기하고 사용하고자 하는 도메인만을 등록하면 된다. 그 방법은 밑에서 설명하겠다.

인증서를 발급받았다면 적용시켜보자.

# /etc/nginx/nginx.conf

http {
		...

        server {
                listen 443 ssl;
                
                ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
                ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
        }
        
        server {
                listen 80;
                
                return 301 https://$host$request_uri;
        }
        
        ...
        
}

사용자가 http://example.com으로 접속시 https://example.com으로 리다이렉트 시켜준다.

설정이 적용된 화면은 아래에 있다.

메인도메인 + 서브도메인1 서브도메인2 서브도메인n

Certbot과 Certbot-nginx 플러그인을 설치한다.

sudo apt install certbot python3-certbot-nginx -y

아래 명령어를 실행한다.

certbot --nginx -d example.com,test.example.com,prod.example.com

다음과 같은 메세지가 출력됐다면 성공이다.
설정 정보는 sites-available sites-enabled에서 확인할 수 있다.

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for example.com and 3 more domains

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/example.com/privkey.pem
This certificate expires on 2025-08-24.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for example.com.com to /etc/nginx/sites-enabled/default
Successfully deployed certificate for www.example.com.com to /etc/nginx/sites-enabled/default
Successfully deployed certificate for test.example.com.com to /etc/nginx/sites-enabled/default
Successfully deployed certificate for prod.example.com.com to /etc/nginx/sites-enabled/default
Congratulations! You have successfully enabled HTTPS on https://example.com, https://www.example.com, https://test.example.com, and https://prod.example.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

이 방법은 기본적으로 자동갱신이 적용된다. 아래의 명령어로 자동갱신 테스트를 진행해보자.

sudo certbot renew --dry-run

다음과 같은 메세지가 보인다면 성공이다.

Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/example.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Simulating renewal of an existing certificate for example.com and 3 more domains

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded: 
  /etc/letsencrypt/live/example.com/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

적용확인

인증서의 설정이 정상적으로 완료되었다면 아래와 같은 결과를 볼 수 있다.

분기처리 확인하기

ubuntu 기준 /etc/nginx/default에 설정파일이 위치해있다. 아래 코드를 추가하자.

...

server {
        listen 443 ssl;

        server_name test.example.com;

        location / {
                proxy_pass http://127.0.0.1:3000;
        }
}

...

필자는 Nodejs로 간단하게 서버하나를 돌렸고, 확인해 보니 분기처리가 완료 되었다.

마치며.

이번 글은 정말 가벼운 마음으로 시작했다. 그리고 금방 끝나겠구나 싶었다. 하지만 이것저것 알아보고 추가하고 글을 쓰다보니 시간이 제법걸리게 되었다.

그래도 잘 마무리한 것 같아서 기분은 좋다. 앞으로도 화이팅!

profile
아기코린이

0개의 댓글