Крайне заманчивая конфигурация была недавно анонсирована в рамках доступа "Всегда бесплатно". К сожалению, "очень быстро разбирают", а именно - сложно запустить экземпляр, постоянно вылазит ошибка “Out of Capacity” (по состоянию на июль 2021 г.). Здесь мы решаем эту проблему, так как Oracle время от времени наращивает ёмкость.

Каждый арендатор получает бесплатно первые 3000 часов условных ЦП и 18 000 ГБ-часов в месяц для создания экземпляров Ampere A1 Compute с использованием конфигурации VM.Standard.A1.Flex (эквивалентно 4 условным ЦП и 24 ГБ памяти).

Подход, описанный здесь, требует PHP 7.4 или PHP 8.0 и composer. Будет вызываться метод “LaunchInstance” (конечная точка OCI API). Мы используем пакет, который я разработал и опубликовал некоторое время назад, вот статья.

Видеоинструкция на YouTube https://youtu.be/uzAqgjElc64

Если вам ближе использование консольной утилиты, соответствующую инструкцию я опубликовал ранее.

Генерируем ключи доступа к API

Уже описал ранее в таком же разделе.

Изменяем файл скрипта

После клонирования репозитория

git clone https://github.com/hitrov/oci-arm-host-capacity.git

и запуска

cd oci-arm-host-capacity/
composer install

нужно изменить аргументы, передаваемые в конструктор OciConfig (файл index.php).

  1. Аргументы 1–5 (regionusertenancyfingerprintpath to private key) следует взять из текстового поля во время генерации ключей (начало статьи).

  2. Для получения аргументов 6–8 (availabilityDomainsubnetIdimageId) следует инициировать создание экземпляра из веб-браузера (консоли) Oracle Cloud (Menu -> Compute -> Instances -> Create Instance).

    Поменяйте образ и тип (shape), убедитесь, что домен доступности (Availability Domain) – с плашкой “Always Free Eligible”.

Измените также секцию "Networking" - установите чекбокс "Do not assign a public IPv4 address". Важно: если вы ранее не создавали экземпляр M.Standard.E2.1.Micro, сделайте это прямо сейчас, перед всем этим (две штуки оных предоставляются бесплатно) – нам нужны существующие VNC, subnet, route table, security list и т.д.

Секция “Add SSH keys” нас здесь пока не интересует. До клика по кнопке “Create”…

...откройте инструменты разработчика в браузере (вкладка "Сеть"). Теперь жмите “Create” и подождите немного - получите ошибку “Out of capacity”. Найдите вызов конечной точки /instances (красный)...

кликните по нему правой кнопкой мыши и выберите "скопировать как curl". Вставьте содержимое в любой текстовый редактор, посмотрите на параметр --data-binary. Найдите availabilityDomainsubnetIdimageId. Используйте их как аргументы 6,7 and 8, соответственно – конструктора OciConfig.

OciConfig также имеет два последних опциональных аргумента – ocpus и memoryInGBs соответственно. По умолчанию они равны 4 и 24. Разумеется, можете их изменить. Возможные варианты значений 1/6, 2/12, 3/18 and 2/24. В случае использования образа Oracle Linux Cloud Developer обратите внимание, что он требует как минимум 8 ГБ ОЗУ.

3. Чтобы иметь безопасный зашифрованный доступ к экземпляру, нужно иметь сгенерированную пару ключей ~/.ssh/id_rsa и ~/.ssh/id_rsa.pub. Имя файла второго из них (публичного) должно быть передано в команду ниже. В сети достаточно инструкций, чтобы выполнить их генерацию, здесь мы опустим эту часть.

Запускаем скрипт

php /path/to/oci-arm-host-capacity/index.php

Ставлю на то, что ошибка будет такой же, как в браузере несколько минут назад

{
    "code": "InternalError",
    "message": "Out of host capacity."
}

а может и

{
    "code": "LimitExceeded",
    "message": "The following service limits were exceeded: standard-a1-memory-count, standard-a1-core-count. Request a service limit increase from the service limits page in the console. "
}

Теперь можно настроить периодический запуск, например

EDITOR=nano crontab -e

добавьте сюда новую строку (запуск каждую минуту и запись вывода в файл) со значением...

* * * * * /usr/bin/php /path/to/oci-arm-host-capacity/index.php > /path/to/script.log

...и сохраните.

Возможны случаи, когда пользователю cron не хватает определённых привилегий, простейший способ решить это - поместить код в директорию, доступную веб-серверу, например, /usr/share/nginx/html. И настроить crontab следующим образом

* * * * * curl http://server.add.re.ss/oci-arm-host-capacity/index.php

Можете посетить URL выше и увидеть тот же вывод, что из запуска команды в консоли.

В случае же успеха вывод будет похожим на

Прежде, чем создать экземпляр, скрипт вызовет OCI API ListInstances метод и проверит, есть ли уже в наличии оные такого же типа $shape, и их количество $maxRunningInstancesOfThatShape (можете спокойно поменять переменные, например, если вам нужно два экземпляра VM.Standard.A1.Flex по 2/12 каждый).

Назначаем публичный IP адрес

Уже описал ранее в таком же разделе https://habr.com/ru/post/568368/

Заключение

Вот, как вы будете логиниться в экземпляр после его создания (обратите внимание на имя пользователя - opc)

ssh -i ~/.ssh/id_rsa opc@ip.add.re.ss

Если же вы не назначили внешний (публичный) IP адрес, вы всё равно можете подключиться, используя его внутреннее доменное имя (internal FQDN) или частный (private) IP адрес (10.x.x.x) со страницы Instance Details, если экземпляр находится в той же сети VNIC, например,

ssh -i ~/.ssh/id_rsa opc@instance-20210714-xxxx.subnet.vcn.oraclevcn.com

Спасибо, что прочли!

Комментарии (2)


  1. Un_ka
    29.07.2021 20:23

    Полезней будет только инструкция как зарегистрироваться в oracle cloud. ;)

    Пишу как человек, пытавшийся зарегистрироваться с марта сего года и совершивший более 10 попыток с 8 карт.


    1. xitroff Автор
      30.07.2021 09:13

      Попробуйте с другого компьютера (не облачного сервера) и IP (без VPN), не в режиме инкогнито, желательно с кредитной картой (не Яндекс/Yoomoney)