nmk

Лабораторна робота №4 (2 години)

Тема: Розгортання та управління віртуальними машинами.

Створення та запуск віртуальних машин на Oracle Cloud Free Tier або AWS EC2; вибір типу та розміру екземпляра; підключення через SSH; налаштування автоматичного масштабування та груп доступності.

Мета: Набути практичні навички створення, конфігурації та управління хмарними віртуальними машинами, підключення до них через SSH, встановлення програмного забезпечення та розуміння концепцій масштабування.

Технологічний стек:


Завдання

  1. Створити SSH-ключову пару для підключення до VM
  2. Запустити хмарну VM та підключитись до неї через SSH
  3. Встановити та запустити Nginx-сервер на VM
  4. Переглянути метрики споживання ресурсів VM у хмарній консолі
  5. Зупинити та знову запустити VM; дослідити зміну IP-адреси
  6. (Додатково) Настроїти AWS Auto Scaling Group або ознайомитись із концепцією

Хід виконання роботи

Виберіть один із варіантів виконання:

  1. Варіант 1: Традиційні хмарні VM (Oracle Cloud / AWS) — робота з повноцінною віртуальною машиною, SSH та зовнішніми IP.
  2. Варіант 2: GitHub Codespaces (Container-based) — робота у хмарному контейнері з автоматичним форвардингом портів.

Варіант 1. Oracle Cloud / AWS (Традиційні хмарні VM)

Крок 1. Створення SSH-ключової пари

Linux / macOS:

# Генерація ключової пари RSA 4096-bit
ssh-keygen -t rsa -b 4096 -C "lab04-cloud-key" -f ~/.ssh/lab04_key

# Переглянути публічний ключ (він знадобиться при створенні VM)
cat ~/.ssh/lab04_key.pub

Windows (PowerShell):

# Створити папку .ssh, якщо вона не існує
New-Item -ItemType Directory -Path "$env:USERPROFILE\.ssh" -Force

# Генерація ключової пари
ssh-keygen -t rsa -b 4096 -C "lab04-cloud-key" -f "$env:USERPROFILE\.ssh\lab04_key"
Get-Content "$env:USERPROFILE\.ssh\lab04_key.pub"

Збережіть вміст публічного ключа — він буде вставлений при створенні VM.

Крок 2. Створення та запуск VM в Oracle Cloud

  1. У консолі Oracle Cloud: ☰ → ComputeInstancesCreate instance
  2. Name: lab04-vm
  3. Image and shape:
    • Image: Ubuntu 22.04 (або Oracle Linux 8)
    • Shape: VM.Standard.E2.1.Micro (Always Free)
  4. Networking:
    • VCN: використайте існуючий або оберіть дефолтний
    • Subnet: публічна підмережа
    • Public IP: Assign automatically
  5. Add SSH keys:
    • Вставте вміст lab04_key.pub
  6. Натисніть Create

Зачекайте ~2 хвилини поки статус зміниться на Running та з’явиться Public IP.

Крок 3. Підключення до VM через SSH

# Надаємо правильні права на приватний ключ
chmod 400 ~/.ssh/lab04_key

# Підключення (Oracle Cloud: default user = ubuntu або opc)
ssh -i ~/.ssh/lab04_key ubuntu@<PUBLIC_IP>

# Якщо Oracle Linux:
ssh -i ~/.ssh/lab04_key opc@<PUBLIC_IP>

Після підключення дослідіть систему:

# Інформація про систему
uname -a
cat /etc/os-release

# Ресурси (CPU, RAM, диск)
nproc              # кількість процесорів
free -h            # використання пам'яті
df -h              # використання дискового простору
uptime             # час роботи системи

Крок 4. Встановлення та запуск Nginx

# Оновлення пакетів та встановлення Nginx
sudo apt update && sudo apt install -y nginx   # Ubuntu
# або:
sudo yum install -y nginx                       # Oracle Linux

# Запуск та увімкнення автостарту
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx

# Перевірка локально
curl http://localhost

Відкрийте порт 80 у Security List / Security Group:

Відкрийте у браузері: http://<PUBLIC_IP> — ви маєте побачити сторінку привітання Nginx.

Створіть власну HTML-сторінку:

echo "<h1>Lab 04 — Cloud VM by $(whoami)</h1><p>IP: $(curl -s ifconfig.me)</p>" | sudo tee /var/www/html/index.html

Крок 5. Моніторинг метрик VM

Oracle Cloud:

AWS:

Запустіть навантаження для спостереження за метриками:

# Навантаження CPU на 30 секунд
yes > /dev/null &
sleep 30 && kill %1

Спостерігайте за зміною CPU на графіку метрик (може знадобитись ~1 хвилина для відображення).

Крок 6. Зупинка, запуск та зміна IP-адреси

# Запишіть поточну публічну IP-адресу
curl -s ifconfig.me

У консолі хмари:

  1. Зупиніть VM: Stop (статус → Stopped)
  2. Зачекайте 1–2 хвилини
  3. Запустіть знову: Start (статус → Running)
  4. Порівняйте нову публічну IP з попередньою

Спостереження: У більшості провайдерів динамічна публічна IP-адреса змінюється після зупинки/старту VM. Для постійної IP потрібне виділення статичної (Elastic IP в AWS, Reserved IP в OCI).

Крок 7 (Додатково). Концепція Auto Scaling

В AWS консолі ознайомтеся з Auto Scaling Groups:

Ключові параметри, які слід вивчити:

Варіант 2. GitHub Codespaces (Контейнеризоване хмарне середовище)

Адаптація під GitHub Codespaces Мета: Набути навички управління хмарним середовищем, налаштування веб-сервера Nginx та роботи з портами в умовах відсутності прямої публічної IP-адреси.

Крок 1. Створення SSH-ключової пари

Цей крок залишається ідентичним до оригіналу. Хоча Codespaces має вбудовану авторизацію, генерація ключів — це базова навичка для роботи з будь-якою хмарою.

Linux / macOS / Codespaces (Bash):

ssh-keygen -t rsa -b 4096 -C "codespaces-key" -f ~/.ssh/id_rsa_codespaces

Windows (PowerShell):

# Створити папку .ssh, якщо вона не існує
New-Item -ItemType Directory -Path "$env:USERPROFILE\.ssh" -Force

# Генерація ключової пари
ssh-keygen -t rsa -b 4096 -C "codespaces-key" -f "$env:USERPROFILE\.ssh\id_rsa_codespaces"

Приклад роботи в терміналі:

PS C:\nmk> New-Item -ItemType Directory -Path "$env:USERPROFILE\.ssh" -Force


    Directory: C:\Users\teach


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        19.03.2026      9:01                .ssh

PS C:\nmk> ssh-keygen -t rsa -b 4096 -C "codespaces-key" -f "$env:USERPROFILE\.ssh\id_rsa_codespaces"
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\teach\.ssh\id_rsa_codespaces
Your public key has been saved in C:\Users\teach\.ssh\id_rsa_codespaces.pub
The key fingerprint is:
SHA256:eJLV4yT/zaijQfbwlh******************gkpKRn9vOEsU codespaces-key
The key's randomart image is:
+---[RSA 4096]----+
|    .+..===.     |
|    + .o o+B .   |
|     **********  |
|      ********** |
|      ********** |
|      ********** |
|       **********|
|      ********** |
|       .....     |
+----[SHA256]-----+

Крок 2. Запуск хмарного середовища (Заміна Oracle/AWS)

  1. Створіть новий репозиторій на GitHub (наприклад, cloud-lab-04) або використайте існуючий.
  2. Натисніть зелену кнопку <> Code.
  3. Перейдіть на вкладку Codespaces і натисніть Create codespace on main.
  4. Зачекайте 10-20 секунд. Перед вами відкриється VS Code прямо у браузері. Це і є ваша “віртуальна машина”.

Крок 3. Дослідження системи та “підключення”

У нижній частині екрана відкрийте вкладку Terminal. Ви вже авторизовані як користувач vscode.

Перевірте характеристики вашої “хмари”:

# Кількість ядер та модель процесора
nproc
lscpu | grep "Model name"

# Обсяг оперативної пам'яті
free -h

# Версія ОС (зазвичай це Ubuntu)
cat /etc/os-release

Приклад роботи в терміналі:

@SurkovKostiantyn ➜ /workspaces/test (main) $ nproc
2
@SurkovKostiantyn ➜ /workspaces/test (main) $ lscpu | grep "Model name"
Model name:                           Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
@SurkovKostiantyn ➜ /workspaces/test (main) $ free -h
               total        used        free      shared  buff/cache   available
Mem:           7.8Gi       1.7Gi       248Mi        62Mi       6.2Gi       6.1Gi
Swap:             0B          0B          0B
@SurkovKostiantyn ➜ /workspaces/test (main) $ cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.3 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo

Додатково: Підключення через локальний термінал (SSH)

Якщо ви хочете працювати з Codespace не в браузері, а у своєму звичному терміналі (PowerShell, CMD або Linux), виконайте наступне:

  1. Встановіть GitHub CLI (gh), якщо він ще не встановлений: cli.github.com.
  2. Авторизуйтесь у GitHub через термінал:
    gh auth login
    

    (Оберіть SSH як протокол і завантажте свій публічний ключ id_rsa_codespaces.pub, коли запитає).

  3. Налаштуйте SSH-конфігурацію (виконується один раз):
    gh codespace ssh --setup_ssh
    
  4. Підключіться до вашої машини:

    # Запустіть цю команду, щоб побачити список ваших активних Codespaces
    gh codespace list
    
    # Підключіться до обраного
    gh codespace ssh -c <NAME>
    

    Примітка: Замініть <NAME> на унікальну назву вашого середовища (наприклад, scaling-computing-machine-xyz).

Приклад роботи в терміналі: підключення до Codespace:

PS C:\test> gh --version
gh version 2.86.0 (2026-01-21)
https://github.com/cli/cli/releases/tag/v2.86.0
PS C:\test> gh auth login
? Where do you use GitHub? GitHub.com
? What is your preferred protocol for Git operations on this host? SSH
? Upload your SSH public key to your GitHub account? C:\Users\teach\.ssh\id_rsa_codespac
? Title for your SSH key: (GitHub CLI)

? Title for your SSH key: GitHub CLI
? How would you like to authenticate GitHub CLI? Login with a web browser

! First copy your one-time code: \*\*\*\*-\*\*\*\*
Press Enter to open https://github.com/login/device in your browser...
✓ Authentication complete.
- gh config set -h github.com git_protocol ssh
✓ Configured git protocol
✓ Uploaded the SSH key to your GitHub account: C:\Users\teach\.ssh\id_rsa_codespaces.pub
✓ Logged in as SurkovKostiantyn

PS C:\test> gh codespace list
NAME                        DISPLAY NAME      REPOSITORY            BRANCH  STATE      CREATED AT
reimagined-guide-vxgrpq...  reimagined guide  SurkovKostiantyn/...  main    Available  about 8 minutes ago
PS C:\test> gh codespace ssh
? Choose codespace: SurkovKostiantyn/test [main]: reimagined guide
Welcome to Ubuntu 24.04.3 LTS (GNU/Linux 6.8.0-1044-azure x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

@SurkovKostiantyn ➜ /workspaces/test (main) $

Крок 4. Встановлення Nginx та керування портами

У традиційних хмарах ми налаштовуємо Security Groups. У Codespaces ми використовуємо Port Forwarding.

Встановіть Nginx:

sudo apt update && sudo apt install -y nginx
sudo service nginx start   # У Codespaces використовуємо service замість systemctl

Приклад роботи в терміналі: перевірка статусу Nginx:

@SurkovKostiantyn ➜ /workspaces/test (main) $ sudo service nginx status && sudo ss -ltnp | grep nginx || true
 * nginx is running
LISTEN 0      511          0.0.0.0:80         0.0.0.0:*    users:(("nginx",pid=10888,fd=5),("nginx",pid=10887,fd=5),("nginx",pid=10886,fd=5))
LISTEN 0      511             [::]:80            [::]:*    users:(("nginx",pid=10888,fd=6),("nginx",pid=10887,fd=6),("nginx",pid=10886,fd=6))

Відкриття порту:

  1. У VS Code перейдіть на вкладку Ports (поруч із Terminal).
  2. Ви побачите, що порт 80 автоматично з’явився там.
  3. Клацніть правою кнопкою на Visibility і змініть з Private на Public (це аналог правила Ingress у хмарі).
  4. Натисніть на іконку глобуса (Open in Browser), щоб побачити сторінку Nginx.

Якщо порт не відкрився автоматично, то виконайте наступні команди:

sudo ss -ltnp | grep nginx

Додайте порт вручну:

  1. Перейдіть на вкладку Ports.
  2. Натисніть кнопку Add Port (або “+”).
  3. Введіть 80 і натисніть Enter. Це змусить VS Code перевірити цей порт.

Приклад роботи в терміналі: перевірка доступності порту:

@SurkovKostiantyn ➜ /workspaces/test (main) $ curl -I http://127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.24.0 (Ubuntu)
Date: Thu, 19 Mar 2026 07:18:49 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Thu, 19 Mar 2026 07:13:17 GMT
Connection: keep-alive
ETag: "69bba20d-267"
Accept-Ranges: bytes

Створіть свою сторінку:

echo "<h1>Lab 04 — Codespaces VM by $(whoami)</h1>" | sudo tee /var/www/html/index.html

Крок 5. Моніторинг ресурсів

Оскільки в Codespaces немає графічної панелі CloudWatch, ми використовуємо професійні термінальні інструменти.

Встановіть монітор:

sudo apt install -y htop
htop

Приклад роботи в терміналі: моніторинг ресурсів:

@SurkovKostiantyn ➜ /workspaces/test (main) $ sudo apt install -y htop
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
htop is already the newest version (3.3.0-4build1).
0 upgraded, 0 newly installed, 0 to remove and 145 not upgraded.

Після запуску команди htop, перед вами відкриється вікно з моніторингом ресурсів:

screenshot

Симуляція навантаження: Відкрийте другий термінал і запустіть:

yes > /dev/null &
# Через 20 секунд вимкніть
killall yes

Спостерігайте в htop, як завантажується ядро процесора:

screenshot

Крок 6. Зупинка та зміна адреси

У Codespaces поняття “IP” замінено на унікальний URL (наприклад, legendary-space-trout-q7rv...github.dev).

  1. Перейдіть на github.com/codespaces.
  2. Знайдіть свій Codespace, натисніть -> Stop Codespace.
  3. Запустіть його знову через 1 хвилину.
  4. Перевірте вкладку Ports. URL для доступу до Nginx залишиться тим самим або зміниться? (Зазвичай у Codespaces URL прив’язаний до назви проєкту, що є зручнішим за динамічні IP).

Крок 7. Концепція Auto Scaling (Теорія)

Оскільки Codespaces — це одиничний контейнер, горизонтальне масштабування тут не реалізується наочно. Але ви можете порівняти:


Контрольні запитання

  1. Що таке AMI (Amazon Machine Image) або Cloud Image? Яку роль він відіграє при створенні VM?
  2. Поясніть різницю між типами EC2-інстанцій у AWS (t, m, c, r-серії). Для чого кожен тип оптимізований?
  3. Чому публічна IP-адреса змінюється після зупинки та повторного запуску VM? Як зберегти постійну адресу?
  4. Що таке Auto Scaling? Поясніть різницю між горизонтальним (scale out) та вертикальним (scale up) масштабуванням.
  5. Що таке Spot Instance (AWS) або Preemptible VM (Google Cloud)? Коли їх вигідно використовувати?
  6. Чому важливо правильно налаштувати Security Group / Security List перед запуском VM у хмарі?

Питання до варіанту 2

  1. Чим контейнеризоване середовище GitHub Codespaces відрізняється від класичної VM на Oracle Cloud?
  2. Яку функцію виконує вкладка Ports у Codespaces, і як вона замінює Security Groups в AWS?
  3. Що таке “Visibility” порту (Private vs Public) і чому це важливо для безпеки?
  4. Як ви можете змінити ресурси (CPU/RAM) для свого Codespace? (Дослідіть меню налаштувань).

Вимоги до звіту

  1. Скриншот успішного підключення через SSH (ssh ubuntu@<IP>)
  2. Вивід команд uname -a, free -h, df -h з VM
  3. Скриншот сторінки Nginx у браузері (з вашим текстом)
  4. Скриншот метрик CPU VM під навантаженням та без
  5. Порівняння Public IP до та після зупинки/запуску VM
  6. Відповіді на контрольні запитання у файлі lab04.md
  7. Посилання на GitHub або файли матеріалів надіслати в Classroom