scénario A : redimensionnement automatique de machines virtuelles

Configurez le redimensionnement automatique des machines virtuelles qui dépassent la mémoire allouée à l'aide des services Notifications, Functions et Monitoring.

Ce scénario implique l'écriture d'une fonction afin de redimensionner les machines virtuelles et la création d'une alarme qui envoie un message à cette fonction. Lorsque l'alarme est déclenchée, le service Notifications envoie le message d'alarme au sujet de destination, qui le distribue à ses abonnements. Dans ce scénario, les abonnements du sujet incluent la fonction, votre adresse électronique et un numéro de téléphone SMS. La fonction est appelée à la réception du message d'alarme.

Remarque

Le service Notifications ne dispose d'aucune information sur une fonction après que celle-ci a été appelée. Pour plus de détails, reportez-vous aux informations de dépannage dans Fonction non appelée ou non exécutée.

Cette image présente Notifications dans le contexte d'un scénario qui utilise une fonction pour redimensionner les machines virtuelles.

Stratégie IAM requise

Pour utiliser Oracle Cloud Infrastructure, un administrateur doit vous accorder un accès sécurisé dans une stratégie. Cet accès est requis, que vous utilisiez la console ou l'API REST avec un kit SDK, une interface de ligne de commande ou un autre outil. Si un message vous indique que vous ne disposez pas des droits d'accès ou des autorisations nécessaires, vérifiez auprès de l'administrateur le type d'accès qui vous a été accordé et le compartiment dans lequel vous devez travailler.

Si vous êtes membre du groupe Administrateurs, vous disposez déjà de l'accès requis pour exécuter ce scénario. Sinon, vous devez accéder à Monitoring, Notifications et Functions. Vous devez disposer du droit d'accès FN_INVOCATION sur la fonction afin de pouvoir l'ajouter en tant qu'abonnement à un sujet. Pour redimensionner les machines virtuelles, la fonction doit être autorisée à mettre à jour les instances de calcul. Pour autoriser la fonction à accéder à d'autres ressources Oracle Cloud Infrastructure, telles que des instances de calcul, incluez la fonction dans un groupe dynamique et créez une stratégie pour accorder au groupe l'accès à ces ressources. Pour plus d'informations, reportez-vous à Accès à d'autres ressources Oracle Cloud Infrastructure à partir de fonctions en cours d'exécution.

Tâche 1 : créer et autoriser votre fonction

Une fois que vous avez créé la fonction pour redimensionner les machines virtuelles à l'aide du kit SDK de votre choix et autorisé la fonction à accéder aux machines virtuelles (incluez la fonction dans un groupe dynamique et octroyez l'accès à ce groupe dynamique), toutes les autres étapes de scénario peuvent être effectuées dans la console. Vous pouvez également utiliser l'interface de ligne de commande ou l'API Oracle Cloud Infrastructure, vous permettant d'exécuter les différentes opérations vous-même.

Pour plus d'informations sur l'autorisation d'accès des fonctions aux autres ressources Oracle Cloud Infrastructure, reportez-vous à Accès à d'autres ressources Oracle Cloud Infrastructure à partir de fonctions en cours d'exécution.

Exemple de code de fonction
Remarque

Pour cet exemple de code, nous vous recommandons de gérer l'idempotence via une base de données.

L'exemple de code suivant permet à une fonction de redimensionner les machines virtuelles. Pour obtenir des instructions sur la création et le déploiement de fonctions, reportez-vous à Création et déploiement de fonctions.

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"}
    )
Inclusion de la fonction dans un groupe dynamique

Recherchez et notez l'OCID  de la fonction (format : ocid1.fnfunc.oc1.iad.exampleuniqueID), puis spécifiez la règle suivante dans le groupe dynamique pertinent :

resource.id = '<function-ocid>'
Créer une stratégie pour accorder au groupe dynamique l'accès aux machines virtuelles (instances Compute)

Ajoutez la stratégie suivante :

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

Tâche 2 : créer le sujet

Pour obtenir de l'aide sur le dépannage, reportez-vous à Dépannage de Notifications.

  • Remarque

    Pour ce scénario, un autre workflow de console consiste à créer un sujet et le premier abonnement lorsque vous créez l'alarme, puis à créer des abonnements supplémentaires dans ce sujet.
    1. Ouvrez le panneau Créer une rubrique : sur la page de liste Rubriques, sélectionnez Créer une rubrique. Si vous avez besoin d'aide pour trouver la page de liste, reportez-vous à la rubrique Liste des sujets.
    2. Pour Nom, saisissez les informations suivantes : Rubrique d'alarme
    3. Cliquez sur Créer.
  • Utilisez la commande oci ons topic create et les paramètres requis pour créer un sujet :

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

    Exemple :

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

    Afin d'obtenir la liste complète des paramètres et des valeurs des commandes d'interface de ligne de commande, reportez-vous à Référence de ligne de commande pour Notifications.

  • Exécutez l'opération CreateTopic pour créer un sujet.

    Exemple :

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

Tâche 3 : créer les abonnements

La fonction doit être déployée avant de créer l'abonnement à la fonction.

Pour obtenir de l'aide sur le dépannage, reportez-vous à Dépannage de Notifications.

    1. Sélectionnez le sujet que vous avez créé précédemment (par exemple, Rubrique d'alarme) : sur la page de liste Rubriques, sélectionnez le sujet à utiliser. Si vous avez besoin d'aide pour rechercher la page de liste ou le sujet, reportez-vous à Liste des sujets.
    2. Créez l'abonnement de la fonction.
      1. Ouvrez le panneau Créer un abonnement : sur la page de détails du sujet, cliquez sur Créer un abonnement.
        Le panneau Créer un abonnement apparaît.
      2. Pour Protocole, sélectionnez Fonction.
      3. Renseignez les autres champs.
        Champ Description
        Compartiment de fonction Sélectionnez le compartiment contenant la fonction.
        Application de fonction Sélectionnez l'application contenant la fonction.
        Fonction Sélectionnez la fonction.
      4. Cliquez sur Créer.
        Aucune confirmation n'est nécessaire pour les nouveaux abonnements aux fonctions.
    3. Créez l'abonnement par SMS.
      1. Ouvrez le panneau Créer un abonnement : sur la page de détails du sujet, cliquez sur Créer un abonnement.
        Le panneau Créer un abonnement apparaît.
      2. Pour Protocole, sélectionnez SMS.
      3. Renseignez les autres champs.
        Champ Description
        Pays Sélectionnez le pays du numéro de téléphone. Reportez-vous à Avant de commencer.
        Numéro de téléphone Entrez le numéro de téléphone à l'aide du format E.164.
      4. Cliquez sur Créer.
      5. Confirmez le nouvel abonnement SMS : suivez les instructions reçues au téléphone.
    4. Créez l'abonnement e-mail.
      1. Ouvrez le panneau Créer un abonnement : sur la page de détails du sujet, cliquez sur Créer un abonnement.
        Le panneau Créer un abonnement apparaît.
      2. Pour Protocol, sélectionnez Email.
      3. Renseignez les autres champs.
        Champ Description
        Courriel Saisissez une adresse électronique.
      4. Cliquez sur Créer.
      5. Confirmez le nouvel abonnement par courriel : ouvrez le courriel et accédez à l'URL de confirmation.
  • Remarque

    Une fois les abonnements SMS et par courriel créés, confirmez-les.

    Utilisez la commande oci ons subscription create et les paramètres requis pour créer chaque abonnement :

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

    Exemple d'abonnement de fonction :

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

    Exemple d'abonnement par SMS :

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

    Exemple d'abonnement aux courriels :

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

    Afin d'obtenir la liste complète des paramètres et des valeurs des commandes d'interface de ligne de commande, reportez-vous à Référence de ligne de commande pour Notifications.

  • Remarque

    Une fois les abonnements SMS et par courriel créés, confirmez-les.

    Exécutez l'opération CreateSubscription pour créer chaque abonnement.

    Exemple d'abonnement de fonction :

    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>"
    }

    Exemple d'abonnement par 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>"
    }

    Exemple d'abonnement aux courriels :

    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"
    }

Tâche 4 : création de l'alarme

Pour obtenir de l'aide sur le dépannage, reportez-vous à Dépannage de Notifications.

    1. Ouvrez la page Créer une alarme.
      1. Ouvrez le menu de navigation et cliquez sur Observation & gestion. Sous Surveillance, cliquez sur Définitions d'alarme.
      2. Cliquez sur Créer une alerte.

    2. Pour Nom de l'alarme, saisissez la commande suivante : VM Memory Alarm
    3. Sous Description de mesure, sélectionnez la mesure, l'intervalle et la statistique.

      Champ Exemple de valeur pour ce scénario
      Compartiment Sélectionnez le compartiment contenant la machine virtuelle à redimensionner automatiquement.
      Espace de noms de mesure oci_computeagent
      Nom de mesure MemoryUtilization
      Intervalle 1m
      Statistique Max.
    4. Sous Règle de déclencheur, configurez le seuil d'alarme.

      Champ Exemple de valeur pour ce scénario
      Opérateur supérieur à
      Valeur 90
      Délai de déclenchement en minutes 1
    5. Sous Notifications, Destinations, sélectionnez le sujet que vous avez créé précédemment.
      Champ Exemple de valeur pour ce scénario
      Service de destination Service Notifications
      Compartiment Sélectionnez le compartiment qui contient le sujet que vous avez créé précédemment.
      Sujet Sélectionnez le sujet que vous avez créé précédemment.
    6. Cliquez sur Enregistrer l'alarme.

  • Utilisez la commande oci monitoring alarm create et les paramètres requis pour créer une alarme :

    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>

    Exemple :

    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

    Afin d'obtenir la liste complète des paramètres et des valeurs des commandes d'interface de ligne de commande, reportez-vous à Référence de ligne de commande pour Monitoring.

  • Exécutez l'opération CreateAlarm pour créer une alarme.

    Exemple :

    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
    }