📓 Oracle Cloud — журнал настройки (CLI, авторизация, сеть)

О чём это

Пошаговый журнал того, как мы подготовили Oracle Cloud под тяжёлый CPU-прогон (обогащение обучающих данных фичей KCP — см. 🎓 KCP-фича — тактика против глубины поиска): установка CLI, авторизация, выбор региона и создание виртуальной сети. Цель двойная: воспроизводимость (можно повторить с нуля) и понимание (каждый шаг объяснён с нуля, для того кто с облаком не работал). Соседний Oracle Cloud — раннбук — сжатый operational how-to; этот документ — детальный разбор с реальными командами и результатами.

Термины на пальцах

OCI = Oracle Cloud Infrastructure (облако Oracle). Tenancy = твой аккаунт целиком (корневой контейнер всех ресурсов). Compartment = папка для группировки ресурсов; у нас всё в корневом (= tenancy). Регион = дата-центр (город). OCID = уникальный идентификатор ресурса вида ocid1.<тип>.oc1.<регион>.<хэш> — как инвентарный номер.


1. Установка CLI (oci)

Ставим через mise глобально (не в проект — это инструмент оператора, а не зависимость сборки; см. рассуждение в Oracle Cloud — раннбук):

mise use -g "pipx:oci-cli@latest"   # ставит официальный PyPI-пакет oci-cli в изолированный venv
oci --version                       # проверка: у нас 3.89.1

Почему pipx:oci-cli, а не mise use oci@latest

Короткое имя oci в реестре mise ведёт на community asdf-плагин; pipx:oci-cli — прямой официальный пакет Oracle без лишнего звена. -g = глобально: воспроизводимо и не засоряет ни один репозиторий.

Косметический варнинг на Python 3.14

oci-cli 3.89.1 на Python 3.14 печатает SyntaxWarning: invalid escape sequence — безобидно, команда работает. Гасится export PYTHONWARNINGS=ignore.


2. Авторизация

Самый дружелюбный способ — сессия через браузер (не надо вручную возиться с API-ключами и OCID):

oci session authenticate

Что происходит:

  1. Спрашивает регион (мы выбрали 35: eu-frankfurt-1, см. §3).
  2. Открывает браузер → вход в свой OCI-аккаунт (SSO). Аккаунт остаётся у владельца — ключ/пароль никуда не копируются.
  3. Пишет профиль DEFAULT в ~/.oci/config с временным security-token.
# все дальнейшие команды используют этот токен:
oci iam region-subscription list --auth security_token

Про токен и срок жизни

Токен живёт ~1 час (обновляется oci session refresh). Нам это не мешает: токен нужен только чтобы запускать/гасить/настраивать ресурсы (секунды-минуты). Сам многочасовой прогон идёт на инстансе и от токена не зависит.

Гоча оболочки zsh

В zsh переменная без кавычек НЕ разбивается на слова: A="--auth security_token"; oci ... $A → oci получит --auth security_token одним аргументом и упадёт с No such option. Пиши флаг дословно в каждой команде (или используй bash-массив). У нас это уронило первый прогон скрипта (ресурсы при этом не создались — проверили vcn list).


3. Регион: eu-frankfurt-1

Выбран Франкфурт (индекс 35), потому что:

  • ближайший крупный EU-регион к Латвии (низкая задержка, EU-резидентность данных);
  • лучшая ёмкость Ampere A1 (наш CPU-шейп);
  • на триал-аккаунте ресурсы создаются только в home-регионе (заданном при регистрации) — проверили: region-subscription list показал единственный eu-frankfurt-1 (READY).

Проверка готовности (всё read-only):

oci iam region-subscription list --auth security_token          # → eu-frankfurt-1 READY
oci iam availability-domain list --compartment-id <tenancy> \
  --auth security_token                                          # → 3 AD (AD-1/2/3)
oci compute image list --compartment-id <tenancy> \
  --shape VM.Standard.A1.Flex --operating-system "Canonical Ubuntu" \
  --operating-system-version "22.04" --auth security_token       # → Canonical-Ubuntu-22.04-aarch64 есть

4. Виртуальная сеть — зачем и что это

Чтобы у будущей VM был публичный IP и её можно было достать по SSH, нужна сеть. Аналогия — свой мини-датацентр:

flowchart TB
    subgraph VCN["VCN 10.0.0.0/16 — твоя изолированная сеть"]
        SUB["Public Subnet 10.0.0.0/24<br/>(здесь будет VM с публичным IP)"]
        RT["Route Table<br/>0.0.0.0/0 → IG"]
        SL["Security List<br/>вход: SSH :22 · выход: всё"]
    end
    IG["Internet Gateway<br/>дверь в интернет"]
    NET(("Интернет"))
    SUB --- RT --- IG --- NET
    SUB --- SL
  • VCN — большая изолированная приватная сеть (адреса 10.0.0.0/16), контейнер для всего.
  • Subnet — её срез (10.0.0.0/24), где реально живут машины. Публичная = машинам можно выдать внешний IP.
  • Internet Gateway (IG) — «дверь» между VCN и публичным интернетом.
  • Route Table — «указатель»: весь внешний трафик (0.0.0.0/0) отправлять в дверь (IG).
  • Security List — «охранник/файрвол»: что впускать/выпускать. Впускаем только SSH (порт 22), выпускаем всё.

5. Команды, которыми мы создали сеть

--force и --raw-output

--force — не спрашивать подтверждение (для скрипта). --raw-output — вернуть чистое значение (OCID) без кавычек, чтобы подставить в следующую команду. Каждый OCID проверяли, что начинается с ocid1. (иначе стоп).

export PYTHONWARNINGS=ignore
TEN=<tenancy-OCID>   # из ~/.oci/config, поле tenancy
 
# 1) VCN — приватная сеть-контейнер
VCN=$(oci network vcn create --compartment-id "$TEN" \
  --cidr-blocks '["10.0.0.0/16"]' --display-name dicechess-oracle-vcn \
  --dns-label dcvcn --auth security_token --query 'data.id' --raw-output)
# VCN создаётся с дефолтными route table и security list — берём их:
RT=$(oci network route-table list   --compartment-id "$TEN" --vcn-id "$VCN" --auth security_token --query 'data[0].id' --raw-output)
SL=$(oci network security-list list --compartment-id "$TEN" --vcn-id "$VCN" --auth security_token --query 'data[0].id' --raw-output)
 
# 2) Internet Gateway — дверь в интернет
IG=$(oci network internet-gateway create --compartment-id "$TEN" --vcn-id "$VCN" \
  --is-enabled true --display-name dicechess-oracle-ig --auth security_token --query 'data.id' --raw-output)
 
# 3) Маршрут: весь внешний трафик → IG
oci network route-table update --rt-id "$RT" --force --auth security_token \
  --route-rules "[{\"destination\":\"0.0.0.0/0\",\"destinationType\":\"CIDR_BLOCK\",\"networkEntityId\":\"$IG\"}]"
 
# 4) Файрвол: впустить SSH :22, выпускать всё
oci network security-list update --security-list-id "$SL" --force --auth security_token \
  --ingress-security-rules '[{"protocol":"6","source":"0.0.0.0/0","tcpOptions":{"destinationPortRange":{"min":22,"max":22}}}]' \
  --egress-security-rules  '[{"protocol":"all","destination":"0.0.0.0/0"}]'
 
# 5) Публичная subnet
SUBNET=$(oci network subnet create --compartment-id "$TEN" --vcn-id "$VCN" \
  --cidr-block 10.0.0.0/24 --display-name dicechess-oracle-subnet --dns-label dcsub \
  --route-table-id "$RT" --security-list-ids "[\"$SL\"]" --auth security_token --query 'data.id' --raw-output)

Проверка: oci network subnet list --vcn-id "$VCN" --auth security_tokendicechess-oracle-subnet 10.0.0.0/24 AVAILABLE, публичная (prohibit-public-ip-on-vnic = False).

protocol":"6" — это TCP

В правилах OCI протокол задаётся номером IANA: 6 = TCP, 1 = ICMP, 17 = UDP, all = любой. SSH — это TCP на порт 22.

SSH открыт с 0.0.0.0/0

Впускаем SSH с любого адреса — но вход только по ключу (пароль отключён), а VM временная, так что риск низкий. Ужесточить = заменить source на <твой-IP>/32 (curl ifconfig.me). Мы оставили 0.0.0.0/0, потому что сеть создана заранее, а IP дев-машины к моменту запуска может смениться.


6. Наши ресурсы (справочник, регион eu-frankfurt-1)

OCID — это идентификаторы, не секреты. Токены/SSH-ключи здесь НЕ хранятся.

РесурсИмяOCID (хвост)
VCNdicechess-oracle-vcn…e7fpl4pa
Internet Gatewaydicechess-oracle-ig…7dn5xrmq
Route Table (default)…fbgv5ndq
Security List (default)…bzna5xkq
Subnet (public)dicechess-oracle-subnet…qrfendxa

Полные OCID лежат локально в scratchpad/oracle-resources.txt (у оператора). Всё, кроме будущего compute-инстанса, бесплатно.


7. Что дальше

  • Запуск VM (когда обогащение готово): oci compute instance launch с --subnet-id <subnet> --assign-public-ip true --shape VM.Standard.A1.Flex … + образ Canonical-Ubuntu-22.04-aarch64. Пошагово — Oracle Cloud — раннбук §3–5. При Out of host capacity на A1 → другой AD или шейп E5 (x86).
  • Снос сети (если понадобится): удалять в обратном порядке — subnet → internet-gateway → (маршрут/правила очистятся с VCN) → vcn. oci network vcn delete --vcn-id <vcn> --force требует пустой VCN.

Про деньги

Сеть бесплатна. Платит только запущенный compute-инстанс — по часам running (не по использованию CPU). Поэтому VM поднимаем строго под прогон и гасим сразу после (oci compute instance terminate …), и ставим Budget alert в Console.

Связанные: Oracle Cloud — раннбук · 🎓 KCP-фича — тактика против глубины поиска · План усиления value-модели