Oracle Cloud: PHP скрипт, когда сильно хочется бесплатный VPS 4 ядра ARM/24ГБ памяти

Kate

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

Каждый арендатор получает бесплатно первые 3000 часов условных ЦП и 18 000 ГБ-часов в месяц для создания экземпляров Ampere A1 Compute с использованием конфигурации VM.Standard.A1.Flex (эквивалентно 4 условным ЦП и 24 ГБ памяти).
Подход, описанный здесь, требует PHP 7.4 и composer. Будет вызываться метод “LaunchInstance” (конечная точка OCI API). Мы используем пакет, который я разработал и опубликовал некоторое время назад, вот статья https://habr.com/ru/post/541894/

Если вам ближе использование консольной утилиты, соответствующую инструкцию я опубликовал ранее https://habr.com/ru/post/568368/

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

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

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

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

git clone https://github.com/hitrov/oci-arm-host-capacity.git
и запуска

cd oci-arm-host-capacity/
composer install
нужно изменить аргументы, передаваемые в конструктор OciConfig (файл index.php).

  1. Аргументы 1–5 (region, user, tenancy, fingerprint, path to private key) следует взять из текстового поля во время генерации ключей (начало статьи).
  2. Для получения аргументов 6–8 (availabilityDomain, subnetId, imageId) следует инициировать создание экземпляра из веб-браузера (консоли) Oracle Cloud (Menu -> Compute -> Instances -> Create Instance).
    Поменяйте образ и тип (shape), убедитесь, что домен доступности (Availability Domain) – с плашкой “Always Free Eligible”.
9f509f84d1991d8572b82f353b5fac35.png

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

7d5591f36845d4a5f47f7fd3d0a0be79.png

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

921e8a99432e7ce440e827a995987622.png

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

fc90a59c7c78308e35abdd6e7517bcc7.png

кликните по нему правой кнопкой мыши и выберите "скопировать как curl". Вставьте содержимое в любой текстовый редактор, посмотрите на параметр --data-binary. Найдите availabilityDomain, subnetId, imageId. Используйте их как аргументы 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 выше и увидеть тот же вывод, что из запуска команды в консоли.

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

98eac586619cb1f0e35a86176a7eaffe.png
83dcdcfbf734eeaf3900efd433c5f88e.png

Прежде, чем создать экземпляр, скрипт вызовет 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

Источник статьи: https://habr.com/ru/post/568386/
 
Сверху