Szenario A: VMs automatisch skalieren

Richten Sie die automatische Skalierung für virtuelle Maschinen (VMs) ein, die mit den Services Notifications, Functions und Monitoring den verfügbaren Arbeitsspeicher überschreiten.

Dieses Szenario umfasst das Schreiben einer Funktion zum Skalieren von VMs und das Erstellen eines Alarms , der eine Nachricht an diese Funktion sendet. Wenn der Alarm ausgelöst wird, sendet der Notifications-Service die Alarmnachricht an das Zielthema. Diese wird dann an die Abonnements des Themas verteilt. In diesem Szenario umfassen die Abonnements des Themas die Funktion sowie Ihre E-Mail-Adresse und eine SMS-Telefonnummer. Die Funktion wird beim Empfang der Alarmnachricht aufgerufen.

Hinweis

Der Benachrichtigungsservice enthält keine Informationen zu einer Funktion, nachdem sie aufgerufen wurde. Weitere Informationen finden Sie in den Informationen zur Fehlerbehebung unter Funktion nicht aufgerufen oder ausgeführt.

Diese Abbildung zeigt den Notifications-Service im Kontext eines Szenarios, das eine Funktion zum Skalieren von VMs verwendet.

Erforderliche IAM-Policy

Um Oracle Cloud Infrastructure verwenden zu können, muss ein Administrator Mitglied einer Gruppe sein, der von einem Mandantenadministrator Sicherheitszugriff in einer Policy erteilt wurde. Dieser Zugriff ist unabhängig davon erforderlich, ob Sie die Konsole oder die REST-API mit einem SDK, einer CLI oder einem anderen Tool verwenden. Wenn Sie eine Nachricht erhalten, dass Sie keine Berechtigung haben oder nicht autorisiert sind, fragen Sie den Mandantenadministrator, welcher Zugriffstyp Ihnen erteilt wurde und in welchem Compartment Ihr Zugriff funktioniert.

Wenn Sie Mitglied der Administratorengruppe sind, besitzen Sie bereits die erforderliche Zugriffsberechtigung zur Ausführung dieses Szenarios. Andernfalls benötigen Sie Zugriff auf die Services Monitoring, Benachrichtigungen und Funktionen. Sie benötigen die Berechtigung FN_INVOCATION für die Funktion, um die Funktion als Abonnement zu einem Thema hinzufügen zu können. Um die Größe von VMs ändern zu können, muss die Funktion zum Aktualisieren von Compute-Instanzen autorisiert sein. Um Ihrer Funktion für den Zugriff auf andere Oracle Cloud Infrastructure-Ressourcen zu autorisieren, wie z.B. Compute-Instanzen, nehmen Sie die Funktion in eine dynamische Gruppe auf, und erstellen Sie eine Policy, um der dynamischen Gruppe Zugriff auf diese Ressourcen zu erteilen. Weitere Informationen finden Sie unter Auf andere Oracle Cloud Infrastructure-Ressourcen aus aktiven Funktionen zugreifen.

Aufgabe 1: Funktion erstellen und autorisieren

Nachdem Sie die Funktion zum Skalieren von VMs mit Ihrem bevorzugten SDK erstellt und die Funktion für den Zugriff auf VMs autorisiert haben (die Funktion in eine dynamische Gruppe aufnehmen und dieser dynamischen Gruppe Zugriff erteilen), können alle anderen Szenarioschritte in der Konsole ausgeführt werden. Alternativ können Sie die Oracle Cloud Infrastructure-CLI oder -API verwenden, um die einzelnen Vorgänge selbst auszuführen.

Weitere Informationen, wie Sie Funktionen Zugriff auf andere Oracle Cloud Infrastructure-Ressourcen erteilen, finden Sie unter Auf andere Oracle Cloud Infrastructure-Ressourcen aus aktiven Funktionen zugreifen.

Beispiel für Funktionscode
Hinweis

Für dieses Codebeispiel wird empfohlen, Idempotenz über eine Datenbank zu handhaben.

Es folgt ein Codebeispiel für eine Funktion zum Skalieren von VMs. Anweisungen zum Erstellen und Bereitstellen von Funktionen finden Sie unter Funktionen erstellen und bereitstellen.

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"}
    )
Funktion in eine dynamische Gruppe aufnehmen

Notieren Sie sich die OCID  Ihrer Funktion (das Format lautet ocid1.fnfunc.oc1.iad.exampleuniqueID), und geben Sie folgende Regel für die entsprechende dynamische Gruppe  an:

resource.id = '<function-ocid>'
Policy erstellen, um der dynamischen Gruppe Zugriff auf VMs (Recheninstanzen) zu erteilen

Fügen Sie die folgende Policy  hinzu:

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

Aufgabe 2: Thema erstellen

Hilfe zur Fehlerbehebung finden Sie unter Fehlerbehebung für Notifications.

  • Hinweis

    Ein anderer Konsolenworkflow für dieses Szenario umfasst das Erstellen eines neuen Themas und des ersten Abonnements, wenn Sie den Alarm erstellen und dann zusätzliche Abonnements erstellen in diesem Thema.
    1. Öffnen Sie den Bereich Thema erstellen: Wählen Sie auf der Listenseite Themen die Option Thema erstellen aus. Wenn Sie Hilfe bei der Suche nach der Listenseite benötigen, finden Sie weitere Informationen unter Themen auflisten.
    2. Geben Sie unter Name Folgendes ein: Alarmthema
    3. Klicken Sie auf Erstellen.
  • Verwenden Sie den Befehl oci ons topic create und die erforderlichen Parameter, um ein Thema zu erstellen:

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

    Beispiel:

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

    Eine vollständige Liste der Parameter und Werte für CLI-Befehle finden Sie in der Befehlszeilenreferenz für Notifications.

  • Führen Sie den Vorgang CreateTopic aus, um ein Thema zu erstellen.

    Beispiel:

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

Aufgabe 3: Abonnements erstellen

Ihre Funktion muss vor dem Erstellen des Funktionsabonnements bereitgestellt sein.

Hilfe zur Fehlerbehebung finden Sie unter Fehlerbehebung für Notifications.

    1. Wählen Sie das Thema aus, das Sie zuvor erstellt haben (Beispielname: Alarmthema): Wählen Sie auf der Listenseite Themen das Thema aus, mit dem Sie arbeiten möchten. Wenn Sie Hilfe bei der Suche nach der Listenseite oder dem Thema benötigen, finden Sie weitere Informationen unter Themen auflisten.
    2. Erstellen Sie das Funktionsabonnement.
      1. Öffnen Sie den Bereich Abonnement erstellen: Wählen Sie auf der Detailseite für das Thema die Option Abonnement erstellen aus.
        Der Fensterbereich Abonnement erstellen wird geöffnet.
      2. Wählen Sie unter Protokoll die Option Funktion aus.
      3. Füllen Sie die restlichen Felder aus.
        Feld Beschreibung
        Funktions-Compartment Wählen Sie das Compartment aus, das die Funktion enthält.
        Funktionsanwendung Wählen Sie die Anwendung mit der Funktion.
        Funktion Wählen Sie die Funktion aus.
      4. Klicken Sie auf Erstellen.
        Für neue Funktionsabonnements ist keine Bestätigung erforderlich.
    3. Erstellen Sie das SMS-Abonnement.
      1. Öffnen Sie den Bereich Abonnement erstellen: Wählen Sie auf der Detailseite für das Thema die Option Abonnement erstellen aus.
        Der Fensterbereich Abonnement erstellen wird geöffnet.
      2. Wählen Sie unter Protokoll die Option SMS aus.
      3. Füllen Sie die restlichen Felder aus.
        Feld Beschreibung
        Land Wählen Sie das Land für die Telefonnummer aus. Siehe Bevor Sie beginnen.
        Telefonnummer Geben Sie die Telefonnummer im E.164-Format ein.
      4. Klicken Sie auf Erstellen.
      5. Bestätigen Sie das neue SMS-Abonnement: Befolgen Sie die Anweisungen am Telefon erhalten.
    4. Erstellen Sie das E-Mail-Abonnement.
      1. Öffnen Sie den Bereich Abonnement erstellen: Wählen Sie auf der Detailseite für das Thema die Option Abonnement erstellen aus.
        Der Fensterbereich Abonnement erstellen wird geöffnet.
      2. Wählen Sie unter Protokoll die Option E-Mail aus.
      3. Füllen Sie die restlichen Felder aus.
        Feld Beschreibung
        E-Mail Geben Sie eine E-Mail-Adresse ein.
      4. Klicken Sie auf Erstellen.
      5. Bestätigen Sie das neue E-Mail-Abonnement: Öffnen Sie die E-Mail, und navigieren Sie zur Bestätigungs-URL.
  • Hinweis

    Nachdem Sie die SMS- und E-Mail-Abonnements erstellt haben, bestätigen Sie sie.

    Verwenden Sie den Befehl oci ons subscription create und die erforderlichen Parameter, um jedes Abonnement zu erstellen:

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

    Beispiel für Funktionsabonnement:

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

    Beispiel für ein SMS-Abonnement:

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

    Beispiel für ein E-Mail-Abonnement:

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

    Eine vollständige Liste der Parameter und Werte für CLI-Befehle finden Sie in der Befehlszeilenreferenz für Notifications.

  • Hinweis

    Nachdem Sie die SMS- und E-Mail-Abonnements erstellt haben, bestätigen Sie sie.

    Führen Sie den Vorgang CreateSubscription aus, um jedes Abonnement zu erstellen.

    Beispiel für Funktionsabonnement:

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

    Beispiel für ein SMS-Abonnement:

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

    Beispiel für ein E-Mail-Abonnement:

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

Aufgabe 4: Alarm erstellen

Hilfe zur Fehlerbehebung finden Sie unter Fehlerbehebung für Notifications.

    1. Öffnen Sie die Seite Alarm erstellen.
      1. Öffnen Sie das Navigationsmenü , und wählen Sie Observability and Management aus. Wählen Sie unter Monitoring die Option Alarmdefinitionen aus.
      2. Wählen Sie Alarm erstellen.

    2. Geben Sie unter Alarmname Folgendes ein: VM-Speicheralarm
    3. Wählen Sie unter Metrikbeschreibung die Metrik, das Intervall und die Statistik aus.

      Feld Beispielwert für dieses Szenario
      Compartment Wählen Sie das Compartment mit der VM aus, deren Größe Sie automatisch ändern möchten.
      Metrik-Namespace oci_computeagent
      Metrik-Name MemoryUtilization
      Intervall 1m
      Statistik Max.
    4. Richten Sie unter Triggerregel den Alarmschwellenwert ein.

      Feld Beispielwert für dieses Szenario
      Operator größer als
      Value 90
      Triggerverzögerung in Minuten 1
    5. Wählen Sie unter Benachrichtigungen, Ziele, das zuvor erstellte Thema aus.
      Feld Beispielwert für dieses Szenario
      Zielservice Notifications Service
      Compartment Wählen Sie das Compartment aus, das das zuvor erstellte Thema enthält.
      Thema Wählen Sie das zuvor erstellte Thema aus.
    6. Wählen Sie Alarm speichern aus.

  • Verwenden Sie den Befehl oci monitoring alarm create und die erforderlichen Parameter, um einen Alarm zu erstellen:

    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>

    Beispiel:

    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

    Eine vollständige Liste der Parameter und Werte für CLI-Befehle finden Sie in der Befehlszeilenreferenz für Monitoring.

  • Führen Sie den Vorgang CreateAlarm aus, um einen Alarm zu erstellen.

    Beispiel:

    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
    }