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.
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.
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.
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"}
)
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>'
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.- 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.
- Per Nome, digitare quanto segue: Argomento di allarme
- 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.
- 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.
-
Creare la sottoscrizione alla funzione.
-
Creare la sottoscrizione SMS.
-
Creare la sottoscrizione e-mail.
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.
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.
- Aprire la pagina Crea allarme.
- Aprire il menu di navigazione e selezionare Osservabilità e gestione. In Monitoraggio, selezionare Definizioni allarmi.
-
Selezionare Crea allarme.
- In Nome allarme, digitare quanto segue: Allarme memoria VM
-
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 -
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 - 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. -
Selezionare Salva allarme.
- Aprire la pagina Crea 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 }