Note :
- Ce tutoriel nécessite l'accès à Oracle Cloud. Pour vous inscrire à un compte gratuit, voir Introduction à l' niveau gratuit d'Oracle Cloud Infrastructure.
- Il utilise des exemples de valeurs pour les données d'identification, la location et les compartiments Oracle Cloud Infrastructure. À la fin de votre laboratoire, remplacez ces valeurs par celles propres à votre environnement en nuage.
Automatiser la mise à jour du service de métadonnées d'instance vers la version 2 uniquement pour les instances de calcul OCI à l'aide de règles d'événement et de fonctions Python
Présentation
Assurer la sécurité et la cohérence dans tous les environnements en nuage est une priorité pour les entreprises modernes. 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 sa 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 dans toutes les instances de calcul d'OCI 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 flux de travail automatisé basé sur les événements à l'aide des règles du service d'événements pour OCI et du service des fonctions pour OCI pour appliquer la mise à jour IMDSv2. En tirant parti de l'automatisation basée sur Python, vous allez créer et configurer les ressources OCI nécessaires, telles que les groupes dynamiques, les règles d'événement et les fonctions sans serveur, pour assurer de façon transparente la conformité à ce protocole de sécurité amélioré.
Objectifs
- L'automatisation de la mise à jour d'IMDS vers la version 2 dans OCI assure 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 flux de travail 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 assurant la cohérence dans votre environnement en nuage.
Préalables
-
Interface de ligne de commande Oracle Cloud Infrastructure (interface de ligne de commande OCI) et trousse SDK Python : Installez et configurez l'interface de ligne de commande OCI et la trousse SDK Python pour l'accès par programmation.
-
Politiques Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) : Assurez-vous que les politiques IAM OCI 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 du service des fonctions pour OCI : Assurez-vous que le service des fonctions pour OCI est activé dans votre location et qu'un environnement Docker est configuré pour le déploiement.
-
Autorisations d'utilisateur : Assurez-vous que vous disposez des autorisations 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 cibles. Pour 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 correspondance, nous 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éfinir des politiques IAM pour OCI
Créez une politique qui permet au groupe dynamique de gérer les instances de calcul. Nous accorderons l'accès en gestion aux instances du 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éer et déployer le service des fonctions pour 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, naviguez jusqu'à Services de développement, Fonctions et cliquez sur Applications. Sélectionnez la région appropriée pour le service des fonctions pour OCI et cliquez sur Créer une application.
-
Configurez l'environnement pour le déploiement de la fonction, effectuez la configuration suivante sur votre instance de calcul OCI Cloud Shell ou OCI (exécution d'Oracle Linux 8) ou sur tout système où vous prévoyez de créer et de déployer la fonction.
-
Installez les ressources suivantes : Installation de l'interface de ligne de commande, Installer l'interface de ligne de commande Fn Project et Installer la trousse SDK Python pour Oracle Cloud Infrastructure.
-
Suivez le guide de configuration détaillé dans le service des fonctions OCI QuickStart sur une instance de calcul OCI pour préparer l'environnement. Cette préparation garantit que votre environnement est prêt pour la création, le déploiement et la gestion du service des fonctions pour OCI de façon transparente.
Note : Vérifiez qu'un référentiel a été créé dans le registre OCI pour vos images de fonction.
-
-
Connectez-vous à l'instance de calcul OCI Cloud Shell ou OCI et accédez à Cloud Shell ou à votre instance de calcul OCI dans laquelle vous allez créer la fonction. Définissez le contexte pour l'interface de ligne de commande du service des fonctions pour OCI afin de spécifier la région où 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 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>
-
Configurez le registre OCI. Entrez un préfixe de nom de référentiel unique pour distinguer vos 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 dans votre profil d'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 listant les applications. Exécutez la commande suivante pour lister l'application.
fn list apps
-
Créez une nouvelle 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 lister les fichiers générés.ls
Tâche 4 : Mettre à jour le 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 dans 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 d'événements OCI pour détecter lorsqu'une nouvelle instance de calcul OCI est créée.
Pour configurer une règle d'événement, entrez les informations suivantes.
- Source de l'événement : Sélectionnez Instance de calcul.
- Condition : Sélectionnez Type d'événement 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 règle automatiquement la valeur IMDS à 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 de calcul OCI dans un compartiment spécifique.
Liens connexes
Confirmation
- Auteur - Akarsha I K (architecte en nuage)
Autres ressources d'apprentissage
Explorez d'autres laboratoires sur la page docs.oracle.com/learn ou accédez à plus de contenu d'apprentissage gratuit sur le canal YouTube d'Oracle Learning. De plus, visitez education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.
Pour obtenir de la documentation sur le produit, visitez Oracle Help Center.
Automate the Instance Metadata Service update to version 2 only for OCI Compute Instances using Event Rules and Python Functions
G24776-01
January 2025