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.
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.
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.
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"}
)
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>'
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.- 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.
- Pour Nom, saisissez les informations suivantes : Rubrique d'alarme
- 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.
- 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.
-
Créez l'abonnement de la fonction.
-
Créez l'abonnement par SMS.
-
Créez l'abonnement e-mail.
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.
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.
- Ouvrez la page Créer une alarme.
- Ouvrez le menu de navigation et cliquez sur Observation & gestion. Sous Surveillance, cliquez sur Définitions d'alarme.
-
Cliquez sur Créer une alerte.
- Pour Nom de l'alarme, saisissez la commande suivante : VM Memory Alarm
-
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. -
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 - 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. -
Cliquez sur Enregistrer l'alarme.
- Ouvrez la page Créer une 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 }