Remarques :
- Ce tutoriel nécessite un accès à Oracle Cloud. Pour vous inscrire à un compte gratuit, reportez-vous à Introduction au niveau gratuit d'Oracle Cloud Infrastructure.
- Il utilise des exemples de valeurs pour les informations d'identification, la location et les compartiments Oracle Cloud Infrastructure. Lorsque vous terminez votre atelier, remplacez ces valeurs par celles propres à votre environnement cloud.
Automatiser la mise à jour du service de métadonnées d'instance vers la version 2 uniquement pour les instances OCI Compute à l'aide de règles d'événement et de fonctions Python
Introduction
Garantir la sécurité et la cohérence entre les environnements cloud est une priorité pour les entreprises d'aujourd'hui. Dans Oracle Cloud Infrastructure (OCI), le service de métadonnées d'instance (IMDS) fournit des informations critiques propres à l'instance, et l'application de son utilisation de la version 2 (IMDSv2) améliore la sécurité en exigeant une authentification basée sur une session. L'automatisation de la mise à niveau vers IMDSv2 sur toutes les instances OCI Compute est un moyen efficace de maintenir cette norme de sécurité tout en réduisant les frais généraux manuels.
Ce tutoriel explique comment créer un workflow automatisé axé sur les événements à l'aide des règles du service OCI Events et d'OCI Functions pour appliquer la mise à jour IMDSv2. En tirant parti de l'automatisation basée sur Python, vous créerez et configurerez les ressources OCI nécessaires, telles que les groupes dynamiques, les règles d'événement et les fonctions sans serveur, afin de garantir la conformité avec ce protocole de sécurité amélioré.
Objectifs
- L'automatisation de la mise à jour d'IMDS vers la version 2 dans OCI garantit une meilleure sécurité et un meilleur contrôle de l'accès aux métadonnées d'instance. En utilisant des règles d'événement et des fonctions Python, vous pouvez créer un workflow automatisé qui applique cette mise à jour chaque fois que de nouvelles instances sont lancées. Cette approche simplifie la gestion des paramètres de métadonnées d'instance tout en maintenant la cohérence dans votre environnement cloud.
Prérequis
-
Interface de ligne de commande Oracle Cloud Infrastructure (interface de ligne de commande OCI) et kit SDK Python : installez et configurez l'interface de ligne de commande OCI et le kit SDK Python pour l'accès par programmation.
-
Stratégies Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) : assurez-vous que les stratégies OCI IAM requises sont en place pour gérer les groupes dynamiques, les fonctions et les règles d'événement.
-
Identificateur Oracle Cloud de compartiment (OCID) : obtenez l'OCID du compartiment dans lequel les ressources seront déployées.
-
Environnement Python : configurez Python avec la bibliothèque OCI installée (
pip install oci
). -
Configuration d'OCI Functions : assurez-vous qu'OCI Functions est activé dans votre location et qu'un environnement Docker est configuré pour le déploiement.
-
Droits d'accès utilisateur : assurez-vous que vous disposez des droits d'accès nécessaires pour créer et gérer des ressources OCI.
Tâche 1 : créer un groupe dynamique
Définissez un groupe dynamique pour permettre à la fonction d'accéder aux instances cible. Pour pouvoir utiliser d'autres services OCI, votre fonction doit faire partie d'un groupe dynamique.
ALL {resource.type = 'fnfunc'}
Lors de la spécification des règles de mise en correspondance, nous vous suggérons de mettre en correspondance toutes les fonctions d'un compartiment avec :
ALL {resource.type = 'fnfunc', resource.compartment.id = 'ocid1.compartment.oc1..aaaaaxxxxx'}
Tâche 2 : définition des stratégies OCI IAM
Créez une stratégie qui permet au groupe dynamique de gérer les instances de calcul. Nous accorderons un accès en gestion aux instances dans le compartiment spécifique.
Allow dynamic-group dmg-for-functions to manage instance-family in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to manage functions-family in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to use virtual-network-family in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to manage instances in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to read repos in compartment Compartment-Name
Tâche 3 : création et déploiement des fonctions OCI
Créez, déployez et appelez la fonction pour la mise à jour IMDS.
-
Créez une application dans la console OCI.
Connectez-vous à la console OCI, accédez à Services de développeur, à Fonctions et cliquez sur Applications. Sélectionnez la région appropriée pour OCI Functions et cliquez sur Créer une application.
-
Configurez l'environnement pour le déploiement de fonction, effectuez la configuration suivante sur votre instance OCI Cloud Shell ou OCI Compute (exécution d'Oracle Linux 8) ou sur tout système sur lequel vous prévoyez de créer et de déployer la fonction.
-
Installez les ressources suivantes : Installation de l'interface de ligne de commande, Installation de l'interface de ligne de commande du projet Fn et Installation du kit SDK Python Oracle Cloud Infrastructure.
-
Pour préparer l'environnement, suivez le guide de configuration détaillé dans OCI Functions QuickStart sur une instance OCI Compute. Cette préparation garantit que votre environnement est prêt à créer, déployer et gérer OCI Functions de manière transparente.
Remarque : vérifiez qu'un référentiel a été créé dans OCI Registry pour les images de fonction.
-
-
Connectez-vous à l'instance OCI Cloud Shell ou OCI Compute et accédez à OCI Cloud Shell ou à votre instance OCI Compute où vous allez créer la fonction. Définissez le contexte de l'interface de ligne de commande OCI Functions afin d'indiquer la région dans laquelle la fonction sera déployée.
fn use context <region-name> Replace <region-name> with the appropriate region (e.g., ap-hyderabad-1).
-
Mettre à jour le contexte avec l'ID de compartiment Exécutez la commande suivante pour définir le compartiment dans lequel l'application résidera.
fn update context oracle.compartment-id <compartment-ocid>
-
configurer OCI Registry. Entrez un préfixe de nom de référentiel unique pour distinguer les images de fonction. Exécutez la commande suivante pour mettre à jour le registre.
fn update context registry <region-key>.ocir.io/<tenancy-namespace>/<repo-name-prefix> Example: ap-hyderabad-1.ocir.io/namespace/prefix.
-
Générez un jeton d'authentification à partir de la console OCI sous votre profil utilisateur et exécutez la commande suivante pour vous connecter au registre de conteneurs à l'aide du jeton d'authentification.
docker login -u '<tenancy-namespace>/<user-id>' <region-key>.ocir.io
-
Vérifiez que l'application est correctement configurée en répertoriant les applications. Exécutez la commande suivante pour répertorier l'application.
fn list apps
-
Créez une fonction nommée
imdsupdate
à l'aide de l'exécution Python et initialisez la fonction.fn init --runtime python imdsupdate
-
Exécutez la commande suivante pour accéder au répertoire créé.
cd imdsupdate
-
Exécutez la commande
ls
pour répertorier les fichiers générés.ls
Tâche 4 : mise à jour du code de fonction Python
-
Ouvrez et modifiez le fichier Python généré (par exemple,
func.py
) dans le répertoire et ajoutez le code python suivant au fichier de fonction pour la logique.import io import json import logging from fdk import response import oci def handler(ctx, data: io.BytesIO = None): try: # Authenticate using Instance Principals signer = oci.auth.signers.get_resource_principals_signer() body = json.loads(data.getvalue()) logging.getLogger().info("Event body: " + str(body)) # Extract Required Details From Event Rule instance_id = body["data"]["resourceId"] # Instance OCID action_type = body["eventType"] logging.getLogger().info("Action type: " + action_type) # Proceed only if instance creation event if action_type == "com.oraclecloud.computeapi.launchinstance.end": compute_client = oci.core.ComputeClient(config={}, signer=signer) update_instance_imds(compute_client, instance_id) except (Exception, ValueError) as ex: logging.getLogger().error("Error: " + str(ex)) return response.Response( ctx, response_data=json.dumps({"message": "Error: " + str(ex)}), headers={"Content-Type": "application/json"}, ) return response.Response( ctx, response_data=json.dumps({"message": "Function executed successfully"}), headers={"Content-Type": "application/json"}, ) def update_instance_imds(compute_client, instance_id): """ Updates the instance metadata service (IMDS) configuration to disable legacy endpoints. """ try: # Fetch instance details instance_details = compute_client.get_instance(instance_id).data # Update instance configuration update_details = oci.core.models.UpdateInstanceDetails( instance_options=oci.core.models.InstanceOptions( are_legacy_imds_endpoints_disabled=True # Disable legacy endpoints ) ) response = compute_client.update_instance(instance_id, update_details) logging.getLogger().info( f"Successfully updated IMDS for instance {instance_id}: {response.data}" ) except Exception as ex: logging.getLogger().error("Failed to update IMDS: " + str(ex)) raise
-
Mettez à jour le fichier
requirements.txt
.fdk>=0.1.86 oci==2.138.0
-
Exécutez la commande suivante pour déployer la fonction vers l'application créée.
fn -v deploy --app <application-name> Example: fn -v deploy --app functionpyth.
Ces étapes garantissent que la fonction est créée, déployée et prête à être appelée pour automatiser les mises à jour de version IMDS dans OCI.
Tâche 5 : définir la règle d'événement
Utilisez le service OCI Events pour détecter la création d'une instance OCI Compute.
Pour configurer une règle d'événement, saisissez les informations suivantes.
- Source d'événement : sélectionnez Instance de calcul.
- Condition : Sélectionnez Type d'événement comme Instance – Fin de lancement.
- Action : sélectionnez Déclencher une fonction, entrez fonctions, compartiment de fonction, application de fonctions et la fonction à déclencher que vous avez créée dans la tâche 4.
Tâche 6 : valider la valeur IMDS de l'instance
Lancez une nouvelle instance pour déclencher la règle d'événement et vérifiez la configuration du service de métadonnées d'instance. Une fois la création de la machine virtuelle terminée, elle définit automatiquement la valeur IMDS sur la version 2 uniquement.
Ces configurations sont propres à la région et au compartiment. Si vous voulez appeler la même fonction dans un autre compartiment, créez une règle d'événement dans ce compartiment et définissez une règle pour déclencher cette fonction.
En effectuant ces tâches, vous automatiserez le processus de mise à jour de la version IMDS vers v2 pour les instances OCI Compute dans un compartiment spécifique.
Liens connexes
Remerciements
- Auteur - Akarsha I K (architecte cloud)
Ressources de formation supplémentaires
Explorez d'autres ateliers sur docs.oracle.com/learn ou accédez à d'autres contenus de formation gratuits sur le canal Oracle Learning YouTube. De plus, visitez le site education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.
Pour obtenir la documentation produit, consultez le site Oracle Help Center.
Automate the Instance Metadata Service update to version 2 only for OCI Compute Instances using Event Rules and Python Functions
G24777-01
January 2025