학습일지/K-Digital Traing

[KDT] AIaaS 마스터클래스 2주차 - VM 배포 실습

tierr 2025. 4. 3. 12:15

실습: 단일 VM에 웹 서비스 배포하기

이 실습에서는 카카오 클라우드에서 단일 VM을 생성하고, 해당 VM에 간단한 웹 애플리케이션을 배포한 후 외부에서 접속하는 방법을 학습합니다.
  • 카카오 클라우드 계정 필요
  • SSH 클라이언트 (Windows: PuTTY 또는 WSL, macOS/Linux: Terminal) 프로그램 필요

1.  VPC 및 서브넷 생성 (권한이 없으므로 생략)
2.  보안 그룹 생성  (권한이 없으므로 생략)
3.  VM 인스턴스 생성 및 퍼블릭 IP 할당

3-1. VM 인스턴스 생성

[인스턴스 생성] 버튼 클릭해서 새로운 인스턴스를 생성하자

 

아래 내용을 기반으로 인스턴스를 생성

- 이름: test-instance-yji  ※ 임의 입력
- 개수: 1
- 이미지: Ubuntu 24.04
- 인스턴스 유형: t1i.small
- 루트 볼륨: 10GB
-  키 페어 생성하기:
    - 키 페어 이름 입력: test-keypair-yji                 ※ 임의 입력
    - 키 페어(.pem 파일)가 자동으로 다운로드됨  ※  안전하게 보관해야 함
- VPC: sfacspace-default              ※ 카카오 클라우드 설정 참고
- 서브넷: main  ← Public Subnet  ※  카카오 클라우드 설정 참고
- 보안 그룹: default                       ※ 카카오 클라우드 설정 참고

 


3-2. 퍼블릭 IP 할당

인스턴스 상세 페이지로 들어가서 [인스턴스 작업 > 퍼블릭 IP 연결]을 선택해 퍼블릭 IP 할당

기본 퍼블릭 IP가 할당된 것을 확인할 수 있다.


4. VM에 접속하여 예제 웹 애플리케이션 배포

1. SSH로 VM 접속

VM에 SSH 연결하는 가이드라인은 다음과 같다. Mac/Linux 환경에서는 이대로 따라하기만 하면 된다.

SSH 연결 가이드라인

 

하지만 나는  Windows 환경이므로 PuTTY를 이용해 SSH 연결을 해야 한다.

🧩 PuTTY를 이용해 SSH 연결하는 방법에 대해서는 아래 링크에 정리해두었다.

https://tierr.tistory.com/26

 

Windows 환경에서 PuTTY를 이용해 ssh 접속하기

상황실습을 위해 카카오클라우드에 VM인스턴스를 생성했다. (Ubuntu 24.04)이 VM에 접속하고 싶다. 그러나 내 PC는 Windows 환경이고...Windows 환경에서 리눅스에 SSH 접속하기 위해서는 PuTTY를 이용해야

tierr.tistory.com

 

2. 기본 패키지 업데이트

sudo apt update
sudo apt upgrade -y

 

 

3. 리눅스 기초 실습

 

🧩 리눅스 명령어에 대해서는 아래 링크에 정리해두었다.

https://tierr.tistory.com/33

 

💻 자주 쓰는 리눅스 명령어 정리

alias, cat, cd, chmod, cp, curl, cut, df, done, echo, find, free, grep, head, history, htop, ip, jobs, kill, ll, ls, man, mkdir, mv, nano, netstat, nslookup, ping, ps, pwd, rm, sleep, sort, sudo, tail, tar, top, traceroute, tree, uname, unzip, vi, zip🔹

tierr.tistory.com

 

4. Docker 설치

sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker ubuntu

 

 

5. 예제 웹 애플리케이션 배포해보기

# 간단한 Node.js 웹 애플리케이션 파일 생성
mkdir -p ~/web-app
cd ~/web-app

cat > package.json << 'EOF'
{
  "name": "simple-web-app",
  "version": "1.0.0",
  "description": "A simple web application",
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "^4.17.1"
  }
}
EOF

cat > app.js << 'EOF'
const express = require('express');
const app = express();
const port = 80;

app.get('/', (req, res) => {
  res.send(`
    <html>
      <head>
        <title>카카오 클라우드 - 단일 VM 웹 서비스</title>
        <style>
          body {
            font-family: Arial, sans-serif;
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
            text-align: center;
          }
          h1 {
            color: #FF7E00;
          }
          .container {
            background-color: #f9f9f9;
            border-radius: 10px;
            padding: 20px;
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
          }
          .info {
            text-align: left;
            margin-top: 20px;
          }
        </style>
      </head>
      <body>
        <div class="container">
          <h1>🎉 성공적으로 배포되었습니다!</h1>
          <h2>카카오 클라우드 VM에서 실행 중인 웹 서비스</h2>

          <div class="info">
            <h3>서버 정보:</h3>
            <ul>
              <li>호스트명: ${require('os').hostname()}</li>
              <li>플랫폼: ${require('os').platform()} ${require('os').release()}</li>
              <li>메모리: ${Math.round(require('os').totalmem() / (1024 * 1024 * 1024))} GB</li>
              <li>현재 시간: ${new Date().toLocaleString()}</li>
            </ul>
          </div>
        </div>
      </body>
    </html>
  `);
});

app.listen(port, () => {
  console.log(`웹 애플리케이션이 포트 ${port}에서 실행 중입니다...`);
});
EOF

# Dockerfile 생성
cat > Dockerfile << 'EOF'
FROM node:14

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 80

CMD [ "node", "app.js" ]
EOF

 

6. Docker 이미지 빌드 및 컨테이너 실행

sudo docker build -t simple-web-app .
sudo docker run -d -p 80:80 --name my-web-app simple-web-app

5. 웹 브라우저에서 접속 테스트

http://[퍼블릭_IP]
or
http://[퍼블릭_IP]:80
## 80포트는 자동으로 redirecting 되기에 상관없음

퍼블릭 IP 접속 테스트

 


본 후기는 [카카오엔터프라이즈x스나이퍼팩토리] 카카오클라우드로 배우는 AIaaS 마스터 클래스 (B-log) 리뷰로 작성 되었습니다.