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.
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.
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.
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"}
)
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>'
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.- Ö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.
- Geben Sie unter Name Folgendes ein: Alarmthema
- 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.
- 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.
-
Erstellen Sie das Funktionsabonnement.
-
Erstellen Sie das SMS-Abonnement.
-
Erstellen Sie das E-Mail-Abonnement.
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.
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.
- Öffnen Sie die Seite Alarm erstellen.
- Öffnen Sie das Navigationsmenü , und wählen Sie Observability and Management aus. Wählen Sie unter Monitoring die Option Alarmdefinitionen aus.
-
Wählen Sie Alarm erstellen.
- Geben Sie unter Alarmname Folgendes ein: VM-Speicheralarm
-
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. -
Richten Sie unter Triggerregel den Alarmschwellenwert ein.
Feld Beispielwert für dieses Szenario Operator größer als Value 90 Triggerverzögerung in Minuten 1 - 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. -
Wählen Sie Alarm speichern aus.
- Öffnen Sie die Seite Alarm erstellen.
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 }