Escenario A: Cambio de tamaño automático de las VM
Configure el cambio de tamaño automático para las máquinas virtuales (VM) que excedan la memoria mediante los servicios Notifications, Functions y Monitoring.
Este escenario implica escribir una función para cambiar el tamaño de las VM y crear una alarma que envíe un mensaje a esa función. Cuando se activa la alarma, el servicio de notificaciones envía el mensaje de alarma al tema de destino, que a continuación distribuye las suscripciones del tema. En este escenario, las suscripciones del tema incluyen la función, así como su dirección de correo electrónico y un número de teléfono SMS. Al recibir el mensaje de alarma, se llama a la función.
Nota
El servicio de notificaciones no tiene información sobre una función una vez llamada. Para obtener detalles, consulte la información de solución de problemas en Función no llamada o no ejecutada.
Política de IAM necesaria
Para utilizar Oracle Cloud Infrastructure, un administrador debe ser miembro de un grupo al que un administrador de arrendamiento haya otorgado acceso de seguridad en una política . Este acceso es necesario tanto si utiliza la Consola como la API de REST con un SDK, una CLI u otra herramienta. Si recibe un mensaje que indica que no tiene permiso o no está autorizado, verifique con el administrador del arrendamiento el tipo de acceso que tiene y en qué compartimento trabaja el acceso.
Si es miembro del grupo Administradores, ya tendrá el acceso necesario para ejecutar este escenario. De lo contrario, necesita acceso a los servicios de control, notificaciones y funciones. Debe tener el permiso FN_INVOCATION en la función para poder agregar la función como suscripción a un tema. Para cambiar el tamaño de las VM, la función debe estar autorizada para actualizar instancias informáticas. A fin de autorizar la función para que pueda acceder a otros recursos de Oracle Cloud Infrastructure, como instancias informáticas, incluya la función en un grupo dinámico y cree una política para otorgar acceso al grupo dinámico a esos recursos. Para obtener más información, consulte Acceso a otros recursos de Oracle Cloud Infrastructure desde funciones en ejecución.
Tarea 1: Creación y autorización de la función 🔗
Una vez creada la función para cambiar el tamaño de las VM con su SDK preferido y autorizada su función para acceder a las VM (incluir la función en un grupo dinámico y otorgar acceso a ese grupo dinámico), todos los demás pasos del escenario se pueden completar en la consola. También puede utilizar la CLI o API de Oracle Cloud Infrastructure, que le permite ejecutar las operaciones individuales.
Para este ejemplo de código, recomendamos gestionar idempotency mediante una base de datos.
El siguiente ejemplo de código es para que una función cambie el tamaño de las VM. Para obtener instrucciones sobre la creación y el despliegue de funciones, consulte Creación y despliegue de funciones.
Copiar
import io
import json
import oci
from fdk import response
def increase_compute_shape(instance_id, alarm_msg_shape):
signer = oci.auth.signers.get_resource_principals_signer()
compute_client = oci.core.ComputeClient(config={}, signer=signer)
current_shape = compute_client.get_instance(instance_id).data.shape
print("INFO: current shape for Instance {0}: {1}".format(instance_id,current_shape), flush=True)
if current_shape != alarm_msg_shape:
return "The shape of Instance {} differs from the Alarm message".format(instance_id)
# improve the logic below to handle more scenarios, make sure the shapes you select are available in the region and AD
if current_shape == "VM.Standard1.1":
new_shape = "VM.Standard2.1"
elif current_shape == "VM.Standard2.1":
new_shape = "VM.Standard2.2"
else:
return "Instance {0} cannot get a bigger shape than its current shape {1}".format(instance_id,current_shape)
print("INFO: new shape for Instance {0}: {1}".format(instance_id,new_shape), flush=True)
try:
update_instance_details = oci.core.models.UpdateInstanceDetails(shape=new_shape)
resp = compute_client.update_instance(instance_id=instance_id, update_instance_details=update_instance_details)
print(resp, flush=True)
except Exception as ex:
print('ERROR: cannot update instance {}'.format(instance_id), flush=True)
raise
return "The shape of Instance {} is updated, the instance is rebooting...".format(instance_id)
def handler(ctx, data: io.BytesIO=None):
alarm_msg = {}
message_id = func_response = ""
try:
headers = ctx.Headers()
message_id = headers["x-oci-ns-messageid"]
except Exception as ex:
print('ERROR: Missing Message ID in the header', ex, flush=True)
raise
print("INFO: Message ID = ", message_id, flush=True)
# the Message Id can be stored in a database and be used to check for duplicate messages
try:
alarm_msg = json.loads(data.getvalue())
print("INFO: Alarm message: ")
print(alarm_msg, flush=True)
except (Exception, ValueError) as ex:
print(str(ex), flush=True)
if alarm_msg["type"] == "OK_TO_FIRING":
if alarm_msg["alarmMetaData"][0]["dimensions"]:
alarm_metric_dimension = alarm_msg["alarmMetaData"][0]["dimensions"][0] #assuming the first dimension matches the instance to resize
print("INFO: Instance to resize: ", alarm_metric_dimension["resourceId"], flush=True)
func_response = increase_compute_shape(alarm_metric_dimension["resourceId"], alarm_metric_dimension["shape"])
print("INFO: ", func_response, flush=True)
else:
print('ERROR: There is no metric dimension in this alarm message', flush=True)
func_response = "There is no metric dimension in this alarm message"
else:
print('INFO: Nothing to do, alarm is not FIRING', flush=True)
func_response = "Nothing to do, alarm is not FIRING"
return response.Response(
ctx,
response_data=func_response,
headers={"Content-Type": "application/json"}
)
Busque y anote el OCID de función (el formato es ocid1.fnfunc.oc1.iad.exampleuniqueID); a continuación, especifique la siguiente regla en el grupo dinámico relevante:
Otro flujo de trabajo de la consola para este escenario implica la creación de un nuevo tema y la primera suscripción al crear la alarma y, a continuación, crear suscripciones adicionales en ese tema.
Abra el panel Crear tema: en la página de lista Temas, seleccione Crear tema. Si necesita ayuda para buscar la página de lista, consulte Lista de temas.
Para Nombre, escriba lo siguiente: Tema de alarma
Haga clic en Crear.
Utilice el comando oci ons topic create y los parámetros necesarios para crear un tema:
Comando
CopiarProbar
oci ons topic create --name <name> --compartment-id <compartment_OCID>
Ejemplo:
Comando
CopiarProbar
oci ons topic create --name "Alarm Topic" --compartment-id "<compartment_OCID>"
Ejecute la operación CreateTopic para crear un tema.
Ejemplo:
POST /20181201/topics
Host: notification.us-phoenix-1.oraclecloud.com
<authorization and other headers>
{
"name": "Alarm Topic",
"compartmentId": "<compartment_OCID>"
}
Tarea 3: Creación de suscripciones 🔗
La función se debe desplegar antes de crear la suscripción a la función.
Seleccione el tema que ha creado anteriormente (el nombre de ejemplo era Tema de alarma): en la página de lista Temas, seleccione el tema con el que desea trabajar. Si necesita ayuda para buscar la página de lista o el tema, consulte Lista de temas.
Cree la suscripción de función.
Abra el panel Crear suscripción: en la página de detalles del tema, seleccione Crear suscripción.
Se abrirá el panel Crear suscripción.
En Protocolo, seleccione Función.
Rellene los campos restantes.
Campo
Descripción
Compartimento de función
Seleccione el compartimento que contiene la función.
Aplicación de función
Seleccione la aplicación que contiene la función.
Función
Seleccione la función.
Haga clic en Crear.
No se necesita confirmación para las nuevas suscripciones a funciones.
Cree la suscripción de SMS.
Abra el panel Crear suscripción: en la página de detalles del tema, seleccione Crear suscripción.
Se abrirá el panel Crear suscripción.
En Protocolo, seleccione SMS.
Rellene los campos restantes.
Campo
Descripción
País
Seleccione el país para el número de teléfono. Consulte Antes de empezar.
Número de teléfono
Introduzca el número de teléfono con el formato E.164.