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.
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.
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.
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"}
)
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>'
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.- 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.
- Pour Nom, entrez les informations suivantes : Rubrique d'alarme
- 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.
- 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.
-
Créez l'abonnement à la fonction.
-
Créez l'abonnement SMS.
-
Créez l'abonnement de courriel.
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.
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.
- Ouvrez la page Créer une alarme .
- Ouvrez le menu de navigation et sélectionnez Observabilité et gestion. Sous Surveillance, sélectionnez Définition d'alarmes.
-
Sélectionnez Créer une alarme.
- Pour Nom de l'alarme, entrez les informations suivantes : Alarme de mémoire de machine virtuelle
-
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. -
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 - 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. -
Sélectionnez 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
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 }