Scenario A: ridimensionamento automatico delle VM

Impostare il ridimensionamento automatico per le virtual machine (VM) che superano la memoria utilizzando i servizi di notifiche, funzioni e monitoraggio.

Questo scenario prevede la scrittura di una funzione per ridimensionare le VM e la creazione di un allarme che invia un messaggio a tale funzione. Quando l'allarme viene attivato, il servizio Notifiche invia il messaggio di allarme all'argomento di destinazione, che viene quindi visualizzato nelle sottoscrizioni dell'argomento. In questo scenario, le sottoscrizioni dell'argomento includono la funzione, l'indirizzo di posta elettronica e un numero di telefono SMS. La funzione viene richiamata alla ricezione del messaggio di allarme.

Nota

Il servizio Notifiche non contiene informazioni su una funzione dopo che è stata richiamata. Per ulteriori informazioni, vedere le informazioni sulla risoluzione dei problemi in Funzione non richiamata o non eseguita.

Questa immagine mostra le notifiche nel contesto di uno scenario che utilizza una funzione per ridimensionare le VM.

Criterio IAM necessario

Per utilizzare Oracle Cloud Infrastructure, un amministratore deve essere un membro di un gruppo a cui è stato concesso l'accesso di sicurezza in un criterio da un amministratore della tenancy. Questo accesso è necessario se si utilizza la console o l'API REST con un SDK, un'interfaccia CLI o un altro strumento. Se viene visualizzato un messaggio che informa che non si dispone dell'autorizzazione o che non si è autorizzati, verificare con l'amministratore della tenancy il tipo di accesso di cui si dispone e il compartimento in cui funziona l'accesso.

Se si è membri del gruppo Administrators, si dispone già dell'accesso necessario per eseguire questo scenario. In caso contrario, è necessario accedere a Monitoraggio, Notifiche e Funzioni. Per poter aggiungere la funzione come sottoscrizione a un argomento, è necessario disporre dell'autorizzazione FN_INVOCATION per la funzione. Per ridimensionare le VM, la funzione deve essere autorizzata ad aggiornare le istanze di computazione. Per autorizzare la funzione per l'accesso ad altre risorse di Oracle Cloud Infrastructure, ad esempio le istanze di computazione, includere la funzione in un gruppo dinamico e creare un criterio per concedere al gruppo dinamico l'accesso a tali risorse. Per ulteriori informazioni, vedere Accesso ad altre risorse di Oracle Cloud Infrastructure dall'esecuzione di funzioni.

Task 1: Crea e autorizza la tua funzione

Dopo aver creato la funzione per ridimensionare le VM utilizzando l'SDK preferito e aver autorizzato la funzione ad accedere alle VM (includere la funzione in un gruppo dinamico e concedere l'accesso al gruppo dinamico), è possibile completare tutti gli altri passi dello scenario nella console. In alternativa, puoi utilizzare l'interfaccia CLI o l'API di Oracle Cloud Infrastructure, che ti consente di eseguire manualmente le singole operazioni.

Per ulteriori informazioni sull'autorizzazione delle funzioni per accedere ad altre risorse di Oracle Cloud Infrastructure, vedere Accesso ad altre risorse di Oracle Cloud Infrastructure dalle funzioni in esecuzione.

Esempio di codice funzione
Nota

Per questo esempio di codice, si consiglia di gestire l'ideopotenza tramite un database.

Il seguente esempio di codice consente a una funzione di ridimensionare le VM. Per istruzioni sulla creazione e la distribuzione di funzioni, vedere Creazione e distribuzione di funzioni.

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"}
    )
Includi la tua funzione in un gruppo dinamico

Trovare e annotare la funzione OCID (il formato è ocid1.fnfunc.oc1.iad.exampleuniqueID), quindi specificare la regola seguente nel gruppo dinamico rilevante:

resource.id = '<function-ocid>'
Creare un criterio per concedere al gruppo dinamico l'accesso alle VM (istanze di computazione)

Aggiungere il criterio seguente:

allow dynamic-group <dynamic-group-name> to use instances in tenancy

Task 2: Creare l'argomento

Per informazioni sulla risoluzione dei problemi, vedere Risoluzione dei problemi delle notifiche.

  • Nota

    Un altro workflow della console per questo scenario prevede la creazione di un nuovo argomento e la prima sottoscrizione quando si crea l'allarme, quindi si creano sottoscrizioni aggiuntive in tale argomento.
    1. Aprire il pannello Crea argomento: nella pagina di elenco Argomenti, selezionare Crea argomento. Per informazioni su come trovare la pagina dell'elenco, vedere Elenco di argomenti.
    2. Per Nome, digitare quanto segue: Argomento di allarme
    3. Selezionare Crea.
  • Per creare un argomento, utilizzare il comando oci ons topic create e i parametri necessari:

    oci ons topic create --name <name> --compartment-id <compartment_OCID>

    Esempio:

    oci ons topic create --name "Alarm Topic" --compartment-id "<compartment_OCID>"

    Per un elenco completo dei parametri e dei valori per i comandi CLI, vedere Command Line Reference for Notifications.

  • Eseguire l'operazione CreateTopic per creare un argomento.

    Esempio:

    POST /20181201/topics
    Host: notification.us-phoenix-1.oraclecloud.com
    <authorization and other headers>
    {
      "name": "Alarm Topic",
      "compartmentId": "<compartment_OCID>"
    }

Task 3: Creare le sottoscrizioni

La funzione deve essere distribuita prima di creare la sottoscrizione alla funzione.

Per informazioni sulla risoluzione dei problemi, vedere Risoluzione dei problemi delle notifiche.

    1. Selezionare l'argomento creato in precedenza (il nome di esempio era Argomento di allarme): nella pagina di elenco Argomenti, selezionare l'argomento da utilizzare. Per informazioni su come trovare la pagina dell'elenco o l'argomento, vedere Elenco di argomenti.
    2. Creare la sottoscrizione alla funzione.
      1. Aprire il pannello Crea sottoscrizione: nella pagina dei dettagli dell'argomento, selezionare Crea sottoscrizione.
        Viene visualizzato il pannello Crea sottoscrizione.
      2. Per Protocollo, selezionare Funzione.
      3. Completare gli altri campi.
        Campo descrizione;
        Compartimento funzione Selezionare il compartimento che contiene la funzione.
        Applicazione funzione Selezionare l'applicazione che contiene la funzione.
        Funzione Selezionare la funzione.
      4. Selezionare Crea.
        Non è necessaria alcuna conferma per le nuove sottoscrizioni alle funzioni.
    3. Creare la sottoscrizione SMS.
      1. Aprire il pannello Crea sottoscrizione: nella pagina dei dettagli dell'argomento, selezionare Crea sottoscrizione.
        Viene visualizzato il pannello Crea sottoscrizione.
      2. Per Protocollo, selezionare SMS.
      3. Completare gli altri campi.
        Campo descrizione;
        Paese Selezionare il paese per il numero di telefono. Vedere Before You Begin.
        Numero di telefono Immettere il numero di telefono utilizzando il formato E.164.
      4. Selezionare Crea.
      5. Confermare la nuova sottoscrizione SMS: seguire le istruzioni ricevute telefonicamente.
    4. Creare la sottoscrizione e-mail.
      1. Aprire il pannello Crea sottoscrizione: nella pagina dei dettagli dell'argomento, selezionare Crea sottoscrizione.
        Viene visualizzato il pannello Crea sottoscrizione.
      2. Per Protocollo, selezionare E-mail.
      3. Completare gli altri campi.
        Campo descrizione;
        Posta elettronica Digitare un indirizzo di posta elettronica.
      4. Selezionare Crea.
      5. Conferma la nuova sottoscrizione e-mail: aprire il messaggio e-mail e passare all'URL di conferma.
  • Nota

    Dopo aver creato le sottoscrizioni a SMS ed e-mail, confermarle.

    Per creare ogni sottoscrizione, utilizzare il comando oci ons subscription create e i parametri necessari.

    oci ons subscription create --protocol <subscription_type> --subscription-endpoint <endpoint> --compartment-id <compartment_OCID> --topic-id <topic_OCID>

    Esempio di sottoscrizione alla funzione:

    oci ons subscription create --protocol "ORACLE_FUNCTIONS" --subscription-endpoint "<function-ocid>" --compartment-id "<compartment_OCID>" --topic-id "<topic_OCID>"

    Esempio di sottoscrizione SMS:

    oci ons subscription create --protocol "SMS" --subscription-endpoint "<sms-endpoint>" --compartment-id "<compartment_OCID>" --topic-id "<topic_OCID>"

    Esempio di sottoscrizione e-mail:

    oci ons subscription create --protocol "EMAIL" --subscription-endpoint "john.smith@example.com" --compartment-id "<compartment_OCID>" --topic-id "<topic_OCID>"

    Per un elenco completo dei parametri e dei valori per i comandi CLI, vedere Command Line Reference for Notifications.

  • Nota

    Dopo aver creato le sottoscrizioni a SMS ed e-mail, confermarle.

    Eseguire l'operazione CreateSubscription per creare ogni sottoscrizione.

    Esempio di sottoscrizione alla funzione:

    POST /20181201/subscriptions
    Host: notification.us-phoenix-1.oraclecloud.com
    <authorization and other headers>
    {
      "topicId": "<topic_OCID>",
      "compartmentId": "<compartment_OCID>",
      "protocol": "ORACLE_FUNCTIONS",
      "endpoint": "<function_OCID>"
    }

    Esempio di sottoscrizione SMS:

    POST /20181201/subscriptions
    Host: notification.us-phoenix-1.oraclecloud.com
    <authorization and other headers>
    {
      "topicId": "<topic_OCID>",
      "compartmentId": "<compartment_OCID>",
      "protocol": "SMS",
      "endpoint": "<sms-endpoint>"
    }

    Esempio di sottoscrizione e-mail:

    POST /20181201/subscriptions
    Host: notification.us-phoenix-1.oraclecloud.com
    <authorization and other headers>
    {
      "topicId": "<topic_OCID>",
      "compartmentId": "<compartment_OCID>",
      "protocol": "EMAIL",
      "endpoint": "john.smith@example.com"
    }

Task 4: Creare l'allarme

Per informazioni sulla risoluzione dei problemi, vedere Risoluzione dei problemi delle notifiche.

    1. Aprire la pagina Crea allarme.
      1. Aprire il menu di navigazione e selezionare Osservabilità e gestione. In Monitoraggio, selezionare Definizioni allarmi.
      2. Selezionare Crea allarme.

    2. In Nome allarme, digitare quanto segue: Allarme memoria VM
    3. In Descrizione metrica selezionare la metrica, l'intervallo e la statistica.

      Campo Valore di esempio per questo scenario
      Compartimento Selezionare il compartimento contenente la VM che si desidera ridimensionare automaticamente.
      Spazio di nomi metrica oci_computeagent
      Nome metrica MemoryUtilization
      Intervallo 1m
      Statistiche Massimo
    4. In Regola trigger impostare la soglia di allarme.

      Campo Valore di esempio per questo scenario
      Operatore maggiore di
      Valore 90
      Minuti di ritardo trigger 1
    5. In Notifiche, Destinazioni, selezionare l'argomento creato in precedenza.
      Campo Valore di esempio per questo scenario
      Servizio di destinazione Servizio notifiche
      Compartimento Selezionare il compartimento che contiene l'argomento creato in precedenza.
      Argomento Selezionare l'argomento creato in precedenza.
    6. Selezionare Salva allarme.

  • Utilizzare il comando oci monitoring Alarm create e i parametri richiesti per creare un allarme.

    oci monitoring alarm create --display-name <name> --compartment-id <compartment_OCID> --metric-compartment-id <compartment_OCID> --namespace <metric_namespace> --query-text <mql_expression> --severity <level> --destinations <file_or_text> --is-enabled <true_or_false>

    Esempio:

    oci monitoring alarm create --display-name "VM Memory Alarm" --compartment-id "<compartment_OCID>" --metric-compartment-id "<compartment_OCID>" --namespace "oci_computeagent" --query-text "MemoryUtilization[1m].max() > 90" --severity "CRITICAL" --destinations "<topic-ocid>" --is-enabled true

    Per un elenco completo dei parametri e dei valori per i comandi CLI, vedere Command Line Reference for Monitoring.

  • Eseguire l'operazione CreateAlarm per creare un allarme.

    Esempio:

    POST /20180401/alarms
    Host: telemetry.us-phoenix-1.oraclecloud.com
    <authorization and other headers>
    {
      "displayName": "VM Memory Alarm",
      "compartmentId": "<compartment_OCID>",
      "metricCompartmentId": "<compartment_OCID>",
      "namespace": "oci_computeagent",
      "query": "MemoryUtilization[1m].max() > 90",
      "severity": "CRITICAL",
      "destinations":
      [
        "<topic_OCID>"
      ],
      "isEnabled": true
    }