Hinweis:
- Dieses Tutorial erfordert Zugriff auf Oracle Cloud. Informationen zur Registrierung für einen kostenlosen Account finden Sie unter Erste Schritte mit Oracle Cloud Infrastructure Free Tier.
- Es verwendet Beispielwerte für Oracle Cloud Infrastructure-Zugangsdaten, -Mandanten und -Compartments. Ersetzen Sie diese Werte nach Abschluss der Übung durch Werte, die für Ihre Cloud-Umgebung spezifisch sind.
Automatisieren Sie das Update des Instance Metadata Service auf Version 2 nur für OCI Compute-Instanzen mit Ereignisregeln und Python-Funktionen
Einführung
Die Gewährleistung von Sicherheit und Konsistenz über Cloud-Umgebungen hinweg ist für moderne Unternehmen eine Priorität. In Oracle Cloud Infrastructure (OCI) stellt der Instance Metadata Service (IMDS) wichtige instanzspezifische Informationen bereit. Durch die Durchsetzung der Verwendung von Version 2 (IMDSv2) wird die Sicherheit erhöht, da eine sessionbasierte Authentifizierung erforderlich ist. Die Automatisierung des Upgrades auf IMDSv2 über alle OCI Compute-Instanzen hinweg ist eine effektive Möglichkeit, diesen Sicherheitsstandard aufrechtzuerhalten und gleichzeitig den manuellen Aufwand zu reduzieren.
Dieses Tutorial zeigt, wie Sie einen automatisierten, ereignisgesteuerten Workflow mit OCI Events Service-Regeln und OCI Functions erstellen, um das Update IMDSv2 durchzusetzen. Durch die Nutzung der Python-basierten Automatisierung erstellen und konfigurieren Sie die erforderlichen OCI-Ressourcen wie dynamische Gruppen, Ereignisregeln und serverlose Funktionen, um die Einhaltung dieses erweiterten Sicherheitsprotokolls nahtlos sicherzustellen.
Ziele
- Die Automatisierung des Updates von IMDS auf Version 2 in OCI gewährleistet eine bessere Sicherheit und Kontrolle über den Zugriff auf Instanzmetadaten. Mit Ereignisregeln und Python-Funktionen können Sie einen automatisierten Workflow erstellen, der dieses Update durchsetzt, wenn neue Instanzen gestartet werden. Dieser Ansatz vereinfacht die Verwaltung von Instanzmetadateneinstellungen und sorgt gleichzeitig für Konsistenz in Ihrer Cloud-Umgebung.
Voraussetzungen
-
Oracle Cloud Infrastructure-Befehlszeilenschnittstelle (OCI-CLI) und Python Software Development Kit (SDK): Installieren und konfigurieren Sie OCI-CLI und Python-SDK für programmgesteuerten Zugriff.
-
Oracle Cloud Infrastructure Identity and Access Management-(OCI IAM-)Policys: Stellen Sie sicher, dass die erforderlichen OCI-IAM-Policys vorhanden sind, um dynamische Gruppen, Funktionen und Ereignisregeln zu verwalten.
-
Oracle Cloud-ID (OCID) des Compartments: Rufen Sie die OCID des Compartments ab, in dem Ressourcen bereitgestellt werden.
-
Python-Umgebung: Richten Sie Python mit der installierten OCI-Library ein (
pip install oci
). -
OCI Functions-Setup: Stellen Sie sicher, dass OCI Functions in Ihrem Mandanten aktiviert ist und dass eine Docker-Umgebung für das Deployment konfiguriert ist.
-
Benutzerberechtigungen: Stellen Sie sicher, dass Sie über Berechtigungen zum Erstellen und Verwalten von OCI-Ressourcen verfügen.
Aufgabe 1: Dynamische Gruppe erstellen
Definieren Sie eine dynamische Gruppe, damit die Funktion auf die Zielinstanzen zugreifen kann. Um andere OCI-Services verwenden zu können, muss Ihre Funktion Teil einer dynamischen Gruppe sein.
ALL {resource.type = 'fnfunc'}
Wenn Sie die Übereinstimmungsregeln angeben, wird empfohlen, alle Funktionen in einem Compartment mit Folgendem abzugleichen:
ALL {resource.type = 'fnfunc', resource.compartment.id = 'ocid1.compartment.oc1..aaaaaxxxxx'}
Aufgabe 2: OCI-IAM-Policys definieren
Erstellen Sie eine neue Policy, mit der die dynamische Gruppe Compute-Instanzen verwalten kann. Wir erteilen Verwaltungszugriff auf Instanzen im spezifischen Compartment.
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
Aufgabe 3: OCI Functions erstellen und bereitstellen
Erstellen, implementieren und rufen Sie die Funktion für das IMDS-Update auf.
-
Erstellen Sie eine Anwendung in der OCI-Konsole.
Melden Sie sich bei der OCI-Konsole an, navigieren Sie zu Entwicklerservices, Funktionen, und klicken Sie auf Anwendungen. Wählen Sie die entsprechende Region für OCI Functions aus, und klicken Sie auf Anwendung erstellen.
-
Richten Sie die Umgebung für das Funktions-Deployment ein, und führen Sie das folgende Setup in Ihrer OCI Cloud Shell- oder OCI Compute-Instanz (mit Oracle Linux 8) oder in jedem System aus, in dem Sie die Funktion erstellen und bereitstellen möchten.
-
Installieren Sie die folgenden Ressourcen: CLI installieren, Fn-Projekt-CLI installieren und Oracle Cloud Infrastructure-Python-SDK installieren.
-
Befolgen Sie die detaillierte Setupdokumentation in OCI Functions QuickStart auf einer OCI-Compute-Instanz, um die Umgebung vorzubereiten. Diese Vorbereitung stellt sicher, dass Ihre Umgebung bereit ist, OCI Functions nahtlos zu erstellen, bereitzustellen und zu verwalten.
Hinweis: Stellen Sie sicher, dass in der OCI-Registry ein Repository für die Funktionsimages erstellt wurde.
-
-
Melden Sie sich bei der OCI Cloud Shell- oder OCI Compute-Instanz an, und greifen Sie auf die OCI Cloud Shell oder Ihre OCI Compute-Instanz zu, in der Sie die Funktion erstellen. Legen Sie den Kontext für die OCI Functions-CLI fest, um die Region anzugeben, in der die Funktion bereitgestellt wird.
fn use context <region-name> Replace <region-name> with the appropriate region (e.g., ap-hyderabad-1).
-
Aktualisieren Sie den Kontext mit der Compartment-ID. Führen Sie den folgenden Befehl aus, um das Compartment festzulegen, in dem sich die Anwendung befindet.
fn update context oracle.compartment-id <compartment-ocid>
-
OCI Registry einrichten Geben Sie ein eindeutiges Präfix für den Repository-Namen ein, um Ihre Funktionsimages zu unterscheiden. Führen Sie den folgenden Befehl aus, um die Registrierung zu aktualisieren.
fn update context registry <region-key>.ocir.io/<tenancy-namespace>/<repo-name-prefix> Example: ap-hyderabad-1.ocir.io/namespace/prefix.
-
Generieren Sie in der OCI-Konsole unter Ihrem Benutzerprofil ein Authentifizierungstoken, und führen Sie den folgenden Befehl aus, um sich mit dem Authentifizierungstoken bei der Container-Registry anzumelden.
docker login -u '<tenancy-namespace>/<user-id>' <region-key>.ocir.io
-
Prüfen Sie, ob die Anwendung korrekt eingerichtet wurde, indem Sie die Anwendungen auflisten. Führen Sie den folgenden Befehl aus, um die Anwendung aufzulisten.
fn list apps
-
Erstellen Sie mit der Python-Laufzeit eine neue Funktion namens
imdsupdate
, und initialisieren Sie die Funktion.fn init --runtime python imdsupdate
-
Führen Sie den folgenden Befehl aus, um zum erstellten Verzeichnis zu navigieren.
cd imdsupdate
-
Führen Sie den Befehl
ls
aus, um die generierten Dateien aufzulisten.ls
Aufgabe 4: Python-Funktionscode aktualisieren
-
Öffnen und bearbeiten Sie die generierte Python-Datei (z.B.
func.py
) im Verzeichnis, und fügen Sie den folgenden python-Code zur Funktionsdatei für die Logik hinzu.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
-
Aktualisieren Sie die Datei
requirements.txt
.fdk>=0.1.86 oci==2.138.0
-
Führen Sie den folgenden Befehl aus, um die Funktion in der erstellten Anwendung bereitzustellen.
fn -v deploy --app <application-name> Example: fn -v deploy --app functionpyth.
Mit diesen Schritten wird sichergestellt, dass die Funktion zur Automatisierung von IMDS-Versionsupdates in OCI erstellt, bereitgestellt und aufgerufen werden kann.
Aufgabe 5: Ereignisregel definieren
Mit dem OCI Events-Service können Sie erkennen, wann eine neue OCI Compute-Instanz erstellt wird.
Geben Sie die folgenden Informationen ein, um die Ereignisregel zu konfigurieren.
- Ereignisquelle: Wählen Sie Compute-Instanz aus.
- Bedingung: Wählen Sie Ereignistyp Instanz - Startende aus.
- Aktion: Wählen Sie Funktion auslösen aus, geben Sie Funktionen, Funktions-Compartment, Funktionsanwendung und die Funktion ein, die Sie in Aufgabe 4 erstellt haben.
Aufgabe 6: Instanz-IMDS-Wert validieren
Starten Sie eine neue Instanz, um die Ereignisregel auszulösen und die Konfiguration des Instance Metadata Service zu prüfen. Sobald die Erstellung der virtuellen Maschine (VM) abgeschlossen ist, wird der IMDS-Wert automatisch nur auf Version 2 gesetzt.
Diese Konfigurationen sind regional und Compartment-spezifisch. Wenn Sie dieselbe Funktion in einem anderen Compartment aufrufen möchten, erstellen Sie eine Ereignisregel in diesem Compartment, und legen Sie eine Regel fest, um diese Funktion auszulösen.
Durch Ausführung dieser Aufgaben automatisieren Sie den Prozess zum Aktualisieren der IMDS-Version für OCI Compute-Instanzen in einem bestimmten Compartment auf v2.
Verwandte Links
Danksagungen
- Autor - Akarsha I K (Cloud Architect)
Weitere Lernressourcen
Sehen Sie sich andere Übungen zu docs.oracle.com/learn an, oder greifen Sie im Oracle Learning YouTube-Channel auf weitere kostenlose Lerninhalte zu. Besuchen Sie außerdem education.oracle.com/learning-explorer, um Oracle Learning Explorer zu werden.
Die Produktdokumentation finden Sie im Oracle Help Center.
Automate the Instance Metadata Service update to version 2 only for OCI Compute Instances using Event Rules and Python Functions
G24774-01
January 2025