# [OCI] Resource Scheduler

*El artículo también se encuentra publicado en Ingles* [***English version***](https://dbaintheshadow.com/oci-resource-scheduler)*.*

Uno de los puntos que hay que tener en cuenta a la hora de crear nuevos entornos en OCI es la gestión de apagado/encendido de los entornos para reducir los costes dentro de la **tenancy** de nuestros clientes.

Desde *Mayo del 2024*, OCI lanzo el servicio de “**OCI resource scheduler**“ para facilitarnos esta tarea. Antes de esa fecha, podríamos controlarlo con alguno de estos métodos:

* **Crontab**. Normalmente, en el entorno de producción se configuraba dentro del usuario **opc** un shell script con el listado de nodos que se deberían apagar/arrancar.
    
    Ese *sh* se ejecutaba dentro de una tarea planificada:
    

```bash
[opc ~]$ crontab -l
 30 7 * * 1,2,3,4,5 /home/opc/dbsystem/start_dbsystem.sh >> /home/opc/dbsystem/start_dbsystem.log
[opc ~]$ cat /home/opc/dbsystem/start_dbsystem.sh
#!/bin/bash
cd /home/opc/dbsystem 

NODE_SWITCH=<OCID>

. ./oci-curl.sh

oci-curl <END_POINT> POST ./empty.json /20160918/dbNodes/${NODE_SWITCH}?action=start
```

* **Auto Scaling** para OCI. el gran **Richard Garsthagen** tiene publicado en su *github* un repositorio denominado **OCI-AutoScale** ([link repositorio](https://github.com/AnykeyNL/OCI-AutoScale)) para gestionar este tipo de operaciones por medio de **tags.**
    
    Cuando realizas la instalación de **OCI-AutoScale** en una instancia, uno de los pasos es definir en la etiqueta **Schedule:**
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1761066421080/8d6ff26f-6b78-4e54-b088-13fb3fa38783.png align="center")
    
    Asociaríamos esas etiquetas a las instancias que queremos aplicarlo:
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1761067383472/96de0ce7-76eb-4820-82d4-11b573cd26d2.png align="center")
    
    En este ejemplo, tendríamos dos etiquetas aplicadas, son:
    
    * **Weekend**: Apagado el fin de semana.
        
    * **WeekDay**: Encendido ciertas horas. La traducción de “*0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0*” sería la tabla de la izquierda.
        

### **OCI resource scheduler**

Estos son los pasos que vamos a seguir para utilizar **Resource Scheduler**:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1761387868063/3a4ba0ab-e96e-43b6-9a47-8a173f5fb812.png align="center")

Antes de ver como trabaja este servicio en OCI, debemos de asegurarnos que:

* El usuario que utilicemos tiene permisos para crear **schedules**.
    
    ```bash
    Allow any-user to manage resource-schedule-family in tenancy
    ```
    
* Debemos asegurarnos que a nivel **schedule** se le han dado permisos para administrar recursos en nuestro tenancy.
    
    ```bash
    Allow any-user to manage all-resources in compartment '<compartment>' where all{request.principal.type='resourceschedule'}
    ```
    
* Definimos una instancia para testear el nuevo servicio:
    
* ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1761309258652/d97f8028-ace1-46c6-9092-6f82c533a42d.png align="center")
    

Después de asegurarnos que tenemos todos esos puntos, ya podríamos configurar nuestro servicio, ¡vamos a ello!

Vamos a la sección “**Governance & Administration**” y “**Schedules**”

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1761068526472/9929d499-5f66-4a50-acda-833868cecc06.png align="center")

Una vez dentro, veremos la siguiente ventana. Aquí solo debemos pulsar en “***Create a schedule***”:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1761309028722/e9034b35-103f-4096-8104-788d10cd0319.png align="center")

En la primera parte tendremos que cumplimentar la información básica, como es un nombre y la acción a realizar, en nuestro caso es *start.*

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1761121076288/22ac80c3-37ba-49c2-b89a-a253255b91c8.png align="center")

En la siguiente ventana, debemos seleccionar el recurso de nuestra *tenancy* que queremos aplicar este servicio:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1761121425419/0d50bdf6-6c94-4f46-a2d8-d84085a17919.png align="center")

Si nos fijamos bien, tenemos un filtro con dos valores: **Static** o **Dynamic**. La diferencia entre ambos, es que **Static**, sería aplicarlo de manera individual, es decir, a un único recurso (este sería nuestro caso) o **Dynamic**, que sería aplicarlo a un conjunto de recursos que cumplan el siguiente criterio:

* *Tag:* Aplica a todos los recursos que lleven ese tag*.*
    
* *Resource Type*: Los tipos de recurso a los que se puede aplicar son: *Instance*, *InstancePool*, *AutonomousDatabase*, *Function o DBSystem*.
    
* *Compartment:* Podemos seleccionar un compartment especifico o que aplique a todos*.*
    
* *Status*: Los estados son Available, Running, Stopped o que aplique a todos
    

Seleccionamos **Static** y seleccionamos la instancia en el que queremos aplicarlo:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1761229546582/04090d6d-5cd1-492f-841c-535a9d6cfec7.png align="center")

En la siguiente ventana sería para agregar parámetros a nuestro recurso que hemos seleccionado en el paso anterior. En nuestro caso no aplica.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1761229642165/3d8f9104-96b9-4a2d-940e-08fb1a3982d7.png align="center")

La siguiente ventana es la más importante, porque vamos a definir la hora de arranque.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1761168926242/91b09e8b-7e19-46b8-9176-0532bc4c6a56.png align="center")

La primera opción es, como quieres definir la información referente al **schedule**, si bien desde la propia interface “**Form Interface**“ o bien desde “**Cron expression**”. Como vamos ha definir dos, uno de arranque y otro de parada, probaremos los dos.

En nuestro caso, para el arranque vamos a seleccionar “**Cron expression**”

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1761390922785/506e6db2-1023-4086-a47b-6bcafcc1dfd1.png align="center")

Las opciones que vemos son:

* **Recurrence details**: Una pequeña descripción, es opcional. Cuidado con este punto, porque en caso de que seleccionemos vía cron, debemos informar ahí la **Cron expression**.
    
    De no hacerlo, no salta un error interno a la hora de crearlo:
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1761171906611/e9bee26a-4174-4bcb-92ae-4b48db164b46.png align="left")
    
    Nuestra **Cron expression** es: “*30 12 \* \* \**“**.**
    
* **Time**: En formato de 24h-UTC, sería la hora en la que se ejecuta.
    
* **Start date**: Que día empieza a estar vigente. Podemos introducir la fecha a mano o por medio del calendario.
    
* **End date**: Si queremos marcar una fecha fin, es opcional.
    

La última ventana sería como un resumen del *schedule* que vamos a definir .

Para el apagado será exactamente igual salvo la información referente al **schedule,** donde la vamos a definir como **From interface**:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1761392305970/8afad909-ad45-4f2d-88cb-867c27c4d3b2.png align="center")

Con esto ya tenemos definidos el arranque/parada de nuestra instancia.

Si volvemos a la ventana del principio, podemos ver que nuestros **schedules** se están ejecutando correctamente:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1761392915448/08e0f6c3-0336-4909-aa71-4fe3b1d07bf9.png align="center")

Listo, de esta manera tan sencilla podemos controlar el arranque/apagado de nuestros recursos.

Espero que os sirva :)
