⛅️ 백엔드 개발환경 구축, 평생 무료

새양·2021년 6월 26일
4
post-thumbnail

서버를 24시간 무료로 작동

불과 몇년 전만 해도 호스팅 이라는 것으로 운영체제를 대신 돌려주고 사용하도록 했습니다.
요즘은 클라우드 서버라는 이름으로 더 많은 기능들을 포함하여 떠오르고 있는데요, 대표적으로

  • 아마존의 AWS
  • 구글의 GCP
  • 마이크로소프트의 Azure

가 있습니다.

AWSAzure 도 정말 좋지만 저는 평생 무료를 찾아 해매던 중 GCP 가 제한된 리소스에 한정해서 사용하면 평생 무료로 사용할 수 있다고 합니다!

열심히 만든 자신만의 웹페이지나 서버 프로그램을 24시간 돌려 실제 서비스화 하고 싶은 분들이나
윈도우 환경이 아닌 리눅스 환경에서 개발을 해야하는 분들께 매우 좋은 서비스일 것입니다.

클라우드 서비스는 정말 무궁무진하여 여기서 전부 다룰 수 없고 관심이 있으시면 찾아보시는걸 추천드립니다!


진행 순서

대략적으로 어떻게 진행되고 무엇을 할 수 있는지 알아보도록 하겠습니다.

1. 구글 클라우드 VM 인스턴트 만들기


구글이 공식적으로 알려주는 무료 한정 셋팅을 통해 24시간 구동될 수 있는 가상머신을 만들 것입니다.
운영체제는 Ubuntu 20.04 를 사용할 것입니다.

2. Cloudflare API를 활용하여 동적 외부IP를 도메인으로 고정하기


GCP의 VM 인스턴스는 기본적으로 인스턴스가 껏다 켜질 때 마다 외부IP가 동적으로 바뀌게 되며 접속하려할 때 마다 새로운 IP로 접속해야하는 번거로움이 있습니다.

외부IP를 정적으로 고정시킬 수는 없나?

가능합니다. 다만, 무료 등급에서 지원하지 않으므로 일정 금액을 매달 지불해야 합니다.

하지만, 도메인을 통해 무료 등급에서 서버에 항상 같은 주소로 접근할 수 있는 방법이 있습니다.

도메인 구매 방법 https://velog.io/@chch1213/build-home-server-5

아니 결국 도메인을 구매하면 모든걸 무료로 하는게 아니지 않냐?

그렇지 않습니다. 일반적으로 .kr.com 으로 끝나는 흔히 보던 도메인들은 1년에 만 원정도 지불해야 하지만 .cf 와 같이 흔히 볼 수 없는 최상위 도메인주소로는 무료로 가입할 수 있는 곳이 구글링 하다보면 있습니다.

자신만의 서버를 가지고 싶지만 절대 돈을 낼 수 없다 하시는 분들을 비인기 도메인을 찾아 가입하시면 되지만
도메인 만큼은 .kr.com 처럼 의미있는 서버 주소를 하는것을 추천드립니다.


3. 데스크톱 또는 노트북에서 SSH Key를 만들고 GCP에 저장


GCP의 VM 인스턴스는 아이디 비밀번호로 접근하는 것이 불가능 합니다.
따라서 개인키, 공개키 쌍을 만들어 GCP에 저장해두면 VM 인스턴스에 PuTTY와 같은 프로그램으로 아무런 입력없이 원할하게 접근이 가능합니다.

4. VS Code 연동


Visual Studio CodeRemote - SSH 라는 확장 프로그램을 통해 프로그램을 데스크톱에서 실행되고 있지만 실제 코드들을 GCP VM 인스턴스에서 수정되고 있는 효과를 볼 수 있습니다.

이렇게 모두 끝나고 나면 NodeJS, Java Spring boot, C, C++, C#, Phython 등 여러가지 서비스들을 사용할 수 있고 무엇보다 서버는 항상 24시간 구동되어 있으며 자신이 개발하고 싶을 때 VS Code만 실행하여 GUI 환경으로 편리하게 개발할 수 있다는 장점이 너무 좋습니다.



GCP VM 인스턴스 만들기

GCP 시작하기

우선 아래 링크를 통해 Google Cloud Platform 에 접속하여 무료로 시작하기 를 클릭하고 아래 화면처럼 대시보드 까지 진입해보세요.
중간에 카드정보 입력란이 있었는데 결제 될까봐 너무 염려하지 마시고 입력하세요!

주의

구글 클라우드는 처음 시작하면 30만원 정도의 평가판 크레딧을 주며 6개월동안 사용하게 해줍니다.
이는 구글 클라우드 모든 서비스를 사용할 수 있는 크레딧이므로 아깝다 생각하시면 잘 생각하시고 시작하시길 바랍니다.

저는 어짜피 평생 무료 아니면 의미 없다 생각해서 막 이것저것 사용해 보았습니다.

https://cloud.google.com/


VM 인스턴스 생성


이제 생성할 VM 인스턴스의 성능을 설정할 수 있는데 이 때, 무료 등급에 해당하는 성능을 입력해야 평생 무료로 사용할 수 있습니다.
아래는 GCP 문서 페이지 인데 무료 등급에 대해 나와있습니다.

https://cloud.google.com/free/docs/gcp-free-tier?hl=ko
저희가 중요하게 봐야할 것은

  • f1-micro 인스턴스 1개/월
  • 지역
    • us-west1
    • us-central1
    • us-east1
  • HDD 30GB/월

입니다.

이 자료는 2021년 6월 25일 기준으로 언제든지 달라질 수 있으므로 잘 확인하시길 바랍니다.

이것은 토대로 VM 인스턴스를 생성해봅시다.

  • 이름 리눅스 프롬프트로 보여질 이름입니다.
  • 리전 무료 등급으로 사용하려면 3개의 리전중 1개를 택해야 합니다.
  • 영역 아무거나 선택해도 됩니다. 무료 등급에 영향을 미치지 않습니다.
  • 머신 구성: 시리즈 f1-micro 를 고르기 위해 N1을 선택해야합니다.
  • 머신 구성: 머신 유형 f1-micro를 선택하세요. 무료 등급에 해당하는 성능 입니다.
  • 부팅 디스크 운영체제의 용량을 최소화 하기위해 Minimal 버전을 선택하였고 무료 등급에 해당하는 HDD는 표준 영구 디스크를 선택해야 하며 용량은 30GB가 최대입니다.
  • 방화벽 웹 개발을 하시는 분들은 HTTP(80)HTTPS(443) 을 기본적으로 사용할 수 있도록 해주기 위해 2개의 체크박스를 선택해주시면 되겠습니다.
    이외에도 자신이 원하는 포트를 개방하고 싶다면 VPC 네트워크 메뉴의 방화벽 에 들어가시면 설정하실 수 있습니다.

생성이 끝나셨다면 아래에 만들기 버튼을 클릭하여 VM 인스턴스를 생성해주세요.
아래와 같이 생성된 것을 볼 수 있습니다.
이제 여러분만의 개인 서버가 만들어졌고 실행되고 있습니다!




내 도메인 Cloudflare 네임서버에 연결

Cloudflare에 도메인 추가

Cloudflare에 가입한 후 사이트 추가 버튼을 눌러줍니다.

자신이 가지고 있는 도메인을 입력해주세요.
저는 호스팅 케이알에서 ygh.kr이란 도메인을 구매했고 Cloudflare에 등록했습니다.

요금제 선택은 무료로 하면 됩니다.

클라우드 서버에 연결하여 사용할 서브 도메인들을 입력해줍니다.
우선 이름란에 @를 넣어 루트 도메인부터 등록합시다.
IP 주소 는 나중에 쉘 스크립트가 알아서 바꿔줄 것이니 아무거나 입력하시면 됩니다.

추가적으로 사용할 도메인을 입력한 후 계속 버튼을 클릭하세요.


도메인의 네임서버 변경

이제 도메인을 구입한 사이트에서 자신의 도메인의 네임서버를 Cloudflare의 네임서버로 지정해줘야합니다.
CloudflareDNS탭에서 이름 서버 2개를 복사한 후

자신의 도메인이 있는 사이트에서 해당 도메인의 네임서버를 변경해줍시다.

이제 Cloudflare 의 대시보드로 돌아가서 등록한 도메인이 이름 서버 업데이트가 될 때 까지 기다립니다.



Cloudflare API 사용

다시 Cloudflare로 돌아와서 개요 탭에서 아래로 내린 뒤 API 토큰 가져오기 를 클릭하세요.

Global API Key 보기를 클릭하고 Catpcha 로 사람인걸 인증합니다.

아래에 나온 API 키 를 복사 하세요!
조금 이따 DDNS 쉘 스크립트 작성에 필요합니다.

VM 인스턴스로 돌아와서 SSH 연결합니다.

편집기를 설치하고 DDNS 쉘 스크립트를 작성합시다.

sudo apt update && sudo apt install -y vim

아래 내용 중 일부를 변경한 후 전부 복사해서 붙여넣으면 됩니다.

  • [이메일 주소] Cloudflare에 회원가입한 이메일 (ex. chchch1213@naver.com)
  • [복사한 API 키] 아까 복사해 둔 API 키
  • [도메인 주소] Cloudflare에 등록한 도메인 (ex. ygh.kr)
  • [서브 도메인 주소] A 레코드로 등록할 도메인 (ex. ygh.kr,www.ygh.kr)

출처

이 스크립트는 varins.com 에서 인용해 온것입니다.
https://varins.com/library/server/dynamic-dns-cloudflare/

sudo vim /usr/local/etc/ddns.sh
#!/bin/bash

### CloudFlare A Recoard Updater by varins.com
### A_Record : Separate the contents with commas (,)
### Proxied : true or false
### TTL : Between 120 and 2147483647 seconds, or 1 for automatic
### To force updating, run with -f

Login_Email=[이메일 주소]
Global_API_Key=[복사한 API 키]
Domain=[도메인 주소]
A_Record=[서브 도메인 주소]
Proxied=false
TTL=1

### v1.0.9 Published on 17 June 2020

[ ! -f /var/tmp/ip.txt ] && touch /var/tmp/ip.txt
CIP=$(curl -s "https://ipv4.icanhazip.com/")
PIP=$(cat /var/tmp/ip.txt)
echo -e "CloudFlare A Recoard Updater v1.0.9"
echo -e "Current IP: $CIP"
echo -e "Previous IP: $PIP"

if [ "$CIP" == "$PIP" ] && [[ $1 != "-f" ]]; then
  echo "No need to update"; exit 0
elif [[ $1 == "-f" ]]; then
  echo "Force updating A recoard......"
elif [ "$CIP" != "$PIP" ]; then
  echo "Updating A recoard......"
fi

echo $CIP > /var/tmp/ip.txt

V4="https://api.cloudflare.com/client/v4/zones"
H1="-HX-Auth-Email:$Login_Email"
H2="-HX-Auth-Key:$Global_API_Key"
H3="-HContent-Type:application/json"
ZN=$(curl -s -X GET "$V4?name=$Domain" \
    $H1 $H2 $H3 | grep -Po '(?<="id":")[^"]*' | head -1)

string=$A_Record
IFS=',' ARARY=(${string})

function AID() {
  for AREC in "${ARARY[@]}"
    do
      (curl -s -X GET "$V4/$ZN/dns_records?name=$AREC" \
      $H1 $H2 $H3 | grep -Po '(?<="id":")[^"]*' | head -1)
    done
}

IFS=$'\n' AIDARY=($(AID))

ATOTAL=${#ARARY[*]}

for ((i=0; i<$ATOTAL; i++))
do
  (curl -s -X PUT "$V4/$ZN/dns_records/${AIDARY[$i]}" $H1 $H2 $H3 \
  --data "{\"type\":\"A\",\"name\":\"${ARARY[$i]}\",\"content\":\"$CIP\",\"proxied\":$Proxied,\"ttl\":$TTL}" \
  | grep -Po '(?<="name":")[^"]*|(?<="content":")[^"]*|(?<=Z"},)[^}]*|(?<="success":false,)[^$]*|(?<=\s\s)[^$]*' | xargs)
done

vim 으로 접속한 화면에서 Ctrl + V 을 눌러 붙여넣기를 하고 : 키를 누른 뒤 wq 를 입력하고 편집에서 빠져나오면 됩니다.

이제 쉘 스크립트를 실행하여 작동이 되는지 확인합니다.

sudo chmod +x /usr/local/etc/ddns.sh
sudo /usr/local/etc/ddns.sh -f


success:true 멘트가 보이면 정상작동한 것입니다.
만약, 실패하였을 경우 API키를 확인해 본다던지 네임서버를 확인해보는 등 순차적으로 문제가 생긴부분을 찾아보시길 바랍니다.

DDNS 쉘 스크립트 자동 실행 등록

VM 인스턴스는 종료되었다가 다시 켜질 때 외부 IP가 변경됩니다.
따라서, 운영체제가 켜졌을 때 최초 한 번 쉘 스크립트를 실행하도록 cron 을 사용해서 등록해보겠습니다.

sudo apt install -y cron
sudo crontab -e

아래 내용을 제일 마지막줄에 입력한 후 마찬가지로 키 : 를 클릭한 후 wq를 입력해서 빠져나오시면 됩니다.

@reboot /usr/local/etc/ddns.sh




SSH 키 생성 후 GCP에 등록

윈도우에서 SSH 키 생성

Powershell 이 지원을 하지만 PuTTY keygen을 사용하도록 하겠습니다.
윈도우에서 자신의 홈디렉토리에 .ssh 라는 폴더를 만든 뒤 puttygen.exe 를 다운로드한 후 실행해 주세요.

puttygen.exe 다운로드

아래 경로로 들어가서 Download PuTTY > puttygen.exe 클릭
https://www.putty.org/

Generate 버튼을 누른 뒤 마우스를 막 움직여 줍니다.

랜덤하게 움직인 마우스 위치를 통해 key 값이 생성됩니다.

만든 개인 키를 저장해 줍니다.
이 때 저장하는 것은 다음에 puttygen.exe 로 불러오기 위함과 putty.exe 에서 사용하는 개인키 입니다.

저장한 이 ppk 확장자의 개인키는 Save private key 버튼 위의 Load 버튼을 눌러서 불러오면 같은 화면을 보실 수 있습니다.

이제 PuTTY 가 아닌 VS Code, SSHFS 등에 사용되기 위한 OpenSSH 용 개인키를 저장합시다.

따로 확장자를 지정해주지 않고 id_rsa 라는 이름으로 저장합니다.

이제 GCP 에 공개키를 저장해주기 위해 내용을 복사합니다.

GCP 에서 Compute Engine > 메타데이터 에 들어갑니다.

SSH키 탭에 가서 항목 추가 버튼을 누른 뒤 아까 puttygen.exe 에서 복사한 공개키를 붙여넣습니다.
이 때, puttygen.exe 에서 key comment로 지정해준 값이 마지막에 보일텐데 자신의 구글 ID와 동일하게 맞춰주셔야 합니다.

이제 자신의 VM 인스턴스에 연결되어 있는 SSH 웹 창을 끝 뒤 다시 연결함으로써 SSH 키를자동으로 전송되도록 해줍시다.

잘 전송 되었는지 아래 명령어로 확인해봅시다.

cat .ssh/authorized_keys

이로써 SSH Key 를 통하여 VM 인스턴스에 접근할 수 있는 환경이 만들어 졌습니다.


VS Code에서 VM 인스턴스 연결

Remote - SSH 확장

설치해주세요.

사용자 이름과 서버 주소를 통해 SSH 연결 명령어를 입력해주세요.

연결 정보에 관한 파일을 저장해두어야 하는데 경로는 Key 파일과 같은 위치인 .ssh 폴더로 지정해줍시다.

폴더+ 모양을 눌러서 연결을 해봅시다!

연결할 서버의 지문이 이러이러 한데 연결하고 저장해 둘 것이냐 물어보는 것입니다.
Continue 를 선택해줍니다.

축하합니다! 아래와 같은 화면이 보이신다면 서버와 연결이 정상적으로 끝났고 개발 환경 셋팅이 끝났습니다.


테스트

마지막으로 웹서버가 잘 돌아가는지 테스트만 해보도록 하겠습니다.
아래 쪽에 보이는 터미널은 SSH로 연결했을 때 사용하는 터미널과 동일하게 사용 가능합니다.
웹서버인 nginx 를 설치하고 상태를 확인한 뒤 http://[도메인 주소] 로 접속해보면 잘 접속 된 것을 확인할 수 있습니다.

sudo apt install -y nginx
systemctl status nginx



뭐든지 해보세요

gcc, g++, gdb 를 이용해서 CC++ 도 개발할 수 있고

Docker 확장을 설치하여 보다 편리하게 도커 이미지와 컨테이너를 제작할 수 있습니다.

NodeJs, Npm, pm2, reactJs, VueJs 등등 정말 많은 편리할 기능들이 있기 때문에 최고의 IDE VS Code와 함께 코딩하여 실력을 쌓아가 봅시다!

여기까지 따라오느라 정말 수고 많으셨습니다!

이제 자신만의 멋진 서버를 만들어보세요 :)

profile
안녕, 세상

1개의 댓글

comment-user-thumbnail
2023년 10월 2일

좋은 글 감사합니다!

답글 달기