Scénario A : Redimensionner automatiquement des machines virtuelles

Configurez le redimensionnement automatique des machines virtuelles présentant un dépassement de mémoire à l'aide des services Avis, Fonctions et Surveillance.

Ce scénario comprend l'écriture d'une fonction pour redimensionner les machines virtuelles et la création d'une alarme  qui envoie un message à cette fonction. Lorsque l'alarme se déclenche, le service d'avis envoie le message d'alarme au sujet de destination, qui le transmet alors aux abonnements au sujet. Dans ce scénario, les abonnements au sujet incluent la fonction ainsi que votre adresse de courriel et un numéro de téléphone SMS. La fonction est appelée à la réception du message d'alarme.

Note

Le service d'avis n'a aucune information sur une fonction une fois celle-ci appelée. Pour plus de détails, consultez les informations sur le dépannage sous Fonction non appelée ou non exécutée.

Cette illustration présente le service d'avis dans le contexte d'un scénario qui utilise une fonction pour redimensionner des machines virtuelles.

Politique GIA requise

Pour utiliser Oracle Cloud Infrastructure, un administrateur doit être membre d'un groupe auquel l'accès de sécurité est accordé dans une politique par un administrateur de location. Cet accès est requis que vous utilisiez la console ou l'API REST avec une trousse SDK, l'interface de ligne de commande ou un autre outil. Si vous obtenez un message indiquant que vous ne disposez pas de l'autorisation requise, vérifiez auprès de l'administrateur de la location quel type d'accès vous avez et dans quel compartiment votre accès fonctionne.

Si vous êtes membre du groupe Administrateurs, vous disposez déjà de l'accès requis pour exécuter ce scénario. Sinon, vous avez besoin d'accéder aux services de surveillance, d'avis et de fonctions. Vous devez avoir l'autorisation FN_INVOCATION pour pouvoir ajouter la fonction en tant qu'abonnement à un sujet. Pour redimensionner des machines virtuelles, vous devez disposer de l'autorisation nécessaire pour mettre à jour les instances de calcul. Pour autoriser votre fonction à accéder aux autres ressources Oracle Cloud Infrastructure, telles que les instances de calcul, incluez-la dans un groupe dynamique et créez une politique accordant à ce groupe l'accès aux ressources. Pour plus d'informations, voir 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éé votre fonction pour redimensionner des machines virtuelles à l'aide de votre trousse SDK préférée, puis autorisé la fonction à accéder aux machines virtuelles (en incluant la fonction dans un groupe dynamique et en accordant 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 d'Oracle Cloud Infrastructure, qui vous permettent d'exécuter vous-même les opérations individuelles.

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

Exemple de code de fonction
Note

Pour cet exemple de code, nous recommandons de traiter l'idempotence au moyen d'une base de données.

L'exemple de code suivant crée une fonction pour redimensionner les machines virtuelles. Pour obtenir des instructions sur la création et le déploiement de fonctions, voir 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"}
    )
Inclure la fonction dans un groupe dynamique

Recherchez votre fonction et notez son OCID  (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 politique accordant au groupe dynamique l'accès aux machines virtuelles (instance de calcul)

Ajoutez la politique  suivante :

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

Tâche 2 : Créer le sujet

Pour obtenir de l'aide concernant le dépannage, voir Dépannage des avis.

  • Note

    Un autre flux de travail de la console pour ce scénario implique la création d'un nouveau sujet et du premier abonnement lorsque vous créez l'alarme, puis la création d'abonnements supplémentaires dans ce sujet.
    1. Ouvrez le panneau Créer un sujet : Dans la page de liste Sujets, sélectionnez Créer un sujet. Si vous avez besoin d'aide pour trouver la page de liste, voir Liste des sujets.
    2. Pour Nom, entrez les informations suivantes : Rubrique d'alarme
    3. Sélectionnez 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>"

    Pour la liste complète des paramètres et valeurs des commandes de l'interface de ligne de commande, voir Référence de ligne de commande pour les avis.

  • 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

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

Pour obtenir de l'aide concernant le dépannage, voir Dépannage des avis.

    1. Sélectionnez le sujet que vous avez créé précédemment (par exemple, le nom était Rubrique d'alarme) : Dans la page de liste Rubriques, sélectionnez le sujet avec lequel vous voulez travailler. Si vous avez besoin d'aide pour trouver la page de liste ou le sujet, voir Liste des sujets.
    2. Créez l'abonnement à la fonction.
      1. Ouvrez le panneau Créer un abonnement : dans la page de détails du sujet, sélectionnez Créer un abonnement.
        Le panneau Créer un abonnement s'ouvre.
      2. Pour Protocole, sélectionnez Fonction.
      3. Remplissez les champs restants.
        Champ Description
        Compartiment de la fonction Sélectionnez le compartiment contenant la fonction.
        Application de fonction Sélectionnez l'application contenant la fonction.
        Fonction Sélectionnez la fonction.
      4. Sélectionnez Créer.
        Aucune confirmation n'est nécessaire pour les nouveaux abonnements aux fonctions.
    3. Créez l'abonnement SMS.
      1. Ouvrez le panneau Créer un abonnement : dans la page de détails du sujet, sélectionnez Créer un abonnement.
        Le panneau Créer un abonnement s'ouvre.
      2. Pour Protocole, sélectionnez SMS.
      3. Remplissez les champs restants.
        Champ Description
        Pays Sélectionnez le pays du numéro de téléphone. Voir Avant de commencer
        Numéro de téléphone Entrez le numéro de téléphone au format E.164.
      4. Sélectionnez Créer.
      5. Confirmez le nouvel abonnement SMS : Suivez les instructions reçues par téléphone.
    4. Créez l'abonnement de courriel.
      1. Ouvrez le panneau Créer un abonnement : dans la page de détails du sujet, sélectionnez Créer un abonnement.
        Le panneau Créer un abonnement s'ouvre.
      2. Pour Protocole, sélectionnez Courriel.
      3. Remplissez les champs restants.
        Champ Description
        Courriel Entrez une adresse de courriel.
      4. Sélectionnez Créer.
      5. Confirmer le nouvel abonnement à un courriel : Ouvrez le courriel et naviguez jusqu'à l'URL de confirmation.
  • Note

    Après avoir créé les abonnements SMS et par courriel, 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 à une fonction :

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

    Exemple d'abonnement SMS :

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

    Exemple d'abonnement par courriel :

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

    Pour la liste complète des paramètres et valeurs des commandes de l'interface de ligne de commande, voir Référence de ligne de commande pour les avis.

  • Note

    Après avoir créé les abonnements SMS et par courriel, confirmez-les.

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

    Exemple d'abonnement à une 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 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 par courriel :

    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éer l'alarme

Pour obtenir de l'aide concernant le dépannage, voir Dépannage des avis.

    1. Ouvrez la page Créer une alarme .
      1. Ouvrez le menu de navigation et sélectionnez Observabilité et gestion. Sous Surveillance, sélectionnez Définition d'alarmes.
      2. Sélectionnez Créer une alarme.

    2. Pour Nom de l'alarme, entrez les informations suivantes : Alarme de mémoire de machine virtuelle
    3. Sous Description de la mesure, sélectionnez la mesure, l'intervalle et la statistique.

      Champ Exemple de valeur pour ce scénario
      Compartiment Sélectionnez le compartiment qui contient 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éclenchement, 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 Avis, Destinations, sélectionnez le sujet que vous avez créé précédemment.
      Champ Exemple de valeur pour ce scénario
      Service de destination Service d'avis
      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. Sélectionnez 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

    Pour la liste complète des paramètres et des valeurs des commandes de l'interface de ligne de commande, voir Référence de ligne de commande pour le service de surveillance.

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