Hinweis:
- Dieses Tutorial erfordert Zugriff auf Oracle Cloud. Informationen zum Registrieren eines kostenlosen Accounts finden Sie unter Erste Schritte mit Oracle Cloud Infrastructure Free Tier.
- Es verwendet Beispielwerte für Oracle Cloud Infrastructure-Zugangsdaten, -Mandanten und -Compartments. Wenn Sie Ihre Übung abgeschlossen haben, ersetzen Sie diese Werte durch spezifische Werte für Ihre Cloud-Umgebung.
Oracle Cloud Infrastructure-REST-APIs programmgesteuert mit Shell und Java-Code verwalten
Einführung
Oracle Cloud Infrastructure (OCI) bietet Kunden eine Cloud-Infrastruktur zum Hosten ihrer geschäftskritischen Anwendungen in der Cloud. OCI bietet Kunden auch die Möglichkeit, über die Konsole oder über APIs auf OCI-Services zuzugreifen. Für die Verbindung über APIs können Kunden SDKs basierend auf der Programmiersprache ihrer Wahl verwenden, wie Java, Python oder Ruby. Es gibt jedoch nur wenige Fälle, in denen der Kunde SDK nicht verwenden kann und keine Programmiersprache verwenden kann, sondern stattdessen eine direkte Verbindung über APIs über ein Tool, eine Datenbank oder eine Drittanbieteranwendung herstellen möchte, in der er das SDK nicht installieren kann. Hier ist die Verwendung von REST-APIs praktisch. Kunden können die von OCI bereitgestellten REST-APIs für fast alle Services nutzen und sie direkt in ihren Tools verwenden, indem sie einfach die Endpunkte aktualisieren und sich um Autorisierung und Authentifizierung kümmern.
Heutzutage möchte jedes Unternehmen die Leistungsfähigkeit von REST-APIs in seinen Anwendungen nutzen und ein innovatives Angebot für seine Kunden erstellen, ohne ein SDK installieren und verwalten zu müssen.
In diesem Tutorial werden wir besprechen und verstehen, wie OCI Unternehmen auf der ganzen Welt helfen kann, die Leistungsfähigkeit von REST-APIs mit OCI zu nutzen. In diesem Tutorial wird ein Beispiel für REST-APIs gezeigt, die auf Shellskripting und Java-Code basieren.
Ziele
-
Richten Sie OCI-API-Schlüssel für den Benutzer ein, basierend auf denen REST-APIs eine Verbindung zum OCI-Mandanten herstellen.
-
Erstellen Sie einen Anwendungsfall zum Herunterladen oder Hochladen einer Binärdatei in OCI Object Storage mit REST-APIs.
-
Richten Sie eine Shell und eine Java-Anwendung ein, schreiben Sie geeigneten Code, um OCI-REST-APIs aufzurufen und anzuzeigen.
Voraussetzungen
-
Zugriff auf OCI und Policys, die in Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) zulässig sind. Der Benutzer muss Zugriff auf die entsprechenden Ressourcen haben, die er mit REST-APIs erstellen oder aktualisieren möchte.
-
Kenntnisse über Shell-Scripting und Java-Anwendungsentwicklung.
-
Grundlegendes Verständnis der agilen Methodik der Softwareentwicklung.
Aufgabe 1: Oracle Cloud Infrastructure-API-Schlüssel einrichten
-
Melden Sie sich beim OCI-Mandanten mit dem Serviceaccount oder dem Admin-Benutzer an, und gehen Sie zu den Benutzereinstellungen.
Oder
Gehen Sie über die OCI-IAM-Konsole zum Benutzer. Stellen Sie sicher, dass der Benutzer über den erforderlichen Zugriff zum Erstellen und Aktualisieren der Infrastruktur auf OCI verfügt.
-
Gehen Sie zum Abschnitt Ressourcen, und klicken Sie auf API-Schlüssel und API-Schlüssel hinzufügen. Wählen Sie diese Option aus, um den neuen Public Key und den neuen Private Key herunterzuladen, den Public Key hochzuladen oder den Public Key einzufügen.
-
Speichern Sie die Schlüssel an einem geeigneten Speicherort, und speichern Sie die Konfigurationsdatei wie auf der folgenden Seite gezeigt. Sie benötigen diese Konfigurationsdatei und diesen Private Key, wenn Sie mit REST-APIs eine Verbindung zu Ihrem Mandanten herstellen.
Hinweis:
-
Sie benötigen dieselbe
configuration parameters
, um eine Verbindung zu Ihrer OCI-Region und Ihrem OCI-Mandanten herzustellen. Sie ersetzen die Parameter in Java-Code und Shell-Skripten entsprechend, während Sie tiefer in das Tutorial eintauchen. -
Um OCI-Services von OCI Compute-Instanzen aufzurufen, bietet OCI eine sicherere Möglichkeit, Instanz-Principals zu verwenden. Verwenden Sie keine Benutzer-API-Schlüssel als Best Practices. Weitere Informationen finden Sie unter Services aus einer Instanz aufrufen.
-
Aufgabe 2: Shellskript zum Hochladen oder Einfügen einer Binärdatei aus OCI Object Storage mit REST-APIs erstellen und ausführen
-
Wechseln Sie zum Dateisystem, und erstellen Sie eine Shell-Datei. In diesem Beispiel lautet der Dateiname
PUT_OBJECT_REST_API.sh
. -
Öffnen Sie die Datei mit einem beliebigen Editor, und fügen Sie den folgenden Code in die Shell-Datei ein.
-
PUT_OBJECT_REST_API.sh
:#!/bin/bash ########################## Fill these in with your values ########################## #OCID of the tenancy calls are being made in to tenancy_ocid="ocid1.tenancy.oc1..aaaaaaaackopa" # namespace of the tenancy namespace="ocitenancyname" # OCID of the user making the rest call user_ocid="ocid1.user.oc1..aaaaaaaafelqsoffcjh" # path to the private PEM format key for this user privateKeyPath="/home/lovelesh/.oci/oci_api_key.pem" # fingerprint of the private key for this user fingerprint="72:d4:6c:f8:89" #bucket name for uplaod/ put bucket="ocibucketname" #file name for upload/ put object="test_pdf.pdf" # The REST api you want to call, with any required paramters. rest_api="/n/$namespace/b/$bucket/o/$object" # The host you want to make the call against host="objectstorage.us-ashburn-1.oraclecloud.com" # the file containing the data you want to POST to the rest endpoint body="/home/lovelesh/.oci/test_pdf.pdf" #################################################################################### # extra headers required for a POST/PUT request method="put" content_type="application/octet-stream" body_arg=(--data-binary @${body}) content_sha256="$(openssl dgst -binary -sha256 < $body | openssl enc -e -base64)"; content_sha256_header="x-content-sha256: $content_sha256" content_length="$(wc -c < $body | xargs)"; content_length_header="content-length: $content_length" headers="(request-target) date host" # add on the extra fields required for a POST/PUT headers=$headers" x-content-sha256 content-type content-length" content_type_header="content-type: $content_type"; date=`date -u "+%a, %d %h %Y %H:%M:%S GMT"` date_header="date: $date" host_header="host: $host" request_target="(request-target): $method $rest_api" # note the order of items. The order in the signing_string matches the order in the headers, including the extra POST fields signing_string="$request_target\n$date_header\n$host_header" # add on the extra fields required for a POST/PUT signing_string="$signing_string\n$content_sha256_header\n$content_type_header\n$content_length_header" signature=`printf '%b' "$signing_string" | openssl dgst -sha256 -sign $privateKeyPath | openssl enc -e -base64 | tr -d '\n'` set -x curl -v -X $(echo $method | tr [:lower:] [:upper:]) --data-binary "@$body" -sS https://$host$rest_api -H "date: $date" -H "x-content-sha256: $content_sha256" -H "content-type: $content_type" -H "content-length: $content_length" -H "Authorization: Signature version=\"1\",keyId=\"$tenancy_ocid/$user_ocid/$fingerprint\",algorithm=\"rsa-sha256\",headers=\"$headers\",signature=\"$signature\""
-
-
Jetzt haben wir den gesamten Code in die Shell-Datei eingefügt, lassen Sie uns daran arbeiten, die erforderlichen Werte zu aktualisieren und ihre Funktionalität zu verstehen.
tenancy_ocid="ocid1.tenancy.oc1..aaaaaaaackopa" ... fingerprint="72:d4:6c:f8:89"
Alle diese Werte sind für eine sichere Verbindung zu Ihrem OCI-Mandanten verantwortlich. Rufen Sie diese Werte aus der Konfigurationsdatei ab.
rest_api="/n/$namespace/b/$bucket/o/$object" host="objectstorage.us-ashburn-1.oraclecloud.com"
Dies ist der Endpunkt rest_api und der Endpunkt host. Bereiten Sie ihn entsprechend Ihrer Anforderung vor, da sich dies für jeden Service ändert. Das hier gezeigte Beispiel ist der Endpunkt für OCI Object Storage Service für die Ashburn-Region.
headers=$headers" x-content-sha256 content-type content-length" content_type_header="content-type: $content_type"; date=`date -u "+%a, %d %h %Y %H:%M:%S GMT"` date_header="date: $date" host_header="host: $host" request_target="(request-target): $method $rest_api"
Hier haben wir die Header für die REST-API zusammen mit dem Inhaltstyp und anderen erforderlichen Parametern erstellt. Beachten Sie, dass hier Definitionen für method_type, date und host header vorhanden sind, da für den Post Call ein detailliertes Headerset erforderlich ist.
signing_string="$signing_string\n$content_sha256_header\n$content_type_header\n$content_length_header" curl -v -X $(echo $method | tr [:lower:] [:upper:]) --data-binary "@$body" ...
Schließlich erstellen wir die Signaturzeichenfolge und führen dann den REST-API-Aufruf mit curl aus. Beachten Sie, dass OCI die API-Aufrufe signieren muss. Deshalb tun wir dies hier.
-
Nachdem Sie die Werte gemäß Ihrer Konfiguration aktualisiert haben, führen Sie das Shellskript aus. Es sollte angezeigt werden, dass das Skript alles gut ausführt, und die Datei wird an OCI Object Storage übertragen.
Hinweis:
-
Stellen Sie sicher, dass Sie die Shell-Dateiberechtigung auf eine ausführbare Datei aktualisiert haben, indem Sie sie auf 755 ändern oder selbst verwalten.
-
Sie können dies auch unter Windows mit Powershell tun oder dasselbe Skript unter Windows verwenden, indem Sie ein WSL (Windows-Subsystem für Linux) wie Ubuntu installieren und es unter Windows von Ubuntu WSL ausführen. Weitere Informationen finden Sie unter Windows-Subsystem für Linux.
-
Aufgabe 3: Java-Code zum Hochladen oder Einfügen einer Binärdatei aus OCI Object Storage mit REST-APIs erstellen und ausführen
-
Gehen Sie zu dem Dateisystem, und erstellen Sie eine JAVA-Datei. In diesem Beispiel lautet der Dateiname
PUT_OBJECT_REST_API.java
. -
Öffnen Sie die Datei mit einem beliebigen Editor, und fügen Sie den folgenden Code in die Shell-Datei ein.
-
PUT_OBJECT_REST_API.java
:import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.nio.file.Files; import java.nio.file.Paths; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.Signature; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Base64; // NOTE - Feel free to remove logging as needed. Currently logs the signing string, host, date, and response. public class PUT_OBJECT_REST_API { private static final String apiKeyFilePath = "C:\\Users\\User1\\Folder\\privatekey.pem" private static final String tenancyId = "ocid1.tenancy.oc1..aaaaaaaackopa27emaz4uteg4q7"; // OCI Tenancy ID private static final String userId = "ocid1.user.oc1..aaaaaaaafelqsoffcjq"; // OCI User ID private static final String keyFingerprint = "72:d4:6c:f8:89:74:aa"; // OCI fingerprint private static final String region = "us-ashburn-1"; // OCI Region private static final String namespace = "ocitenancyname"; // OCI bucket namespace private static final String bucketName = "ocibucketname"; // OCI bucket NAME public static void main(String[] args) { try { String filePath = "D:\\file\\location\\test_pdf.pdf"; //args.length > 0 ? args[0] : ""; // File to upload (path) PrivateKey privateKey = loadPrivateKey(apiKeyFilePath); String fileName = Paths.get(filePath).getFileName().toString(); String targetUri = "https://objectstorage." + region + ".oraclecloud.com/n/" + namespace + "/b/" + bucketName + "/o/" + fileName; HttpRequest request = buildRequest(targetUri, filePath, privateKey); HttpClient client = HttpClient.newHttpClient(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println("Response status code: " + response.statusCode()); System.out.println("Response body: " + response.body()); } catch (Exception e) { e.printStackTrace(); } } private static PrivateKey loadPrivateKey(String filePath) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException { String key = new String(Files.readAllBytes(Paths.get(filePath))) .replace("-----BEGIN PRIVATE KEY-----", "") .replace("-----END PRIVATE KEY-----", "") .replaceAll("\\s+", ""); // Remove all whitespace byte[] decodedKey = Base64.getDecoder().decode(key); PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(decodedKey); KeyFactory kf = KeyFactory.getInstance("RSA"); return kf.generatePrivate(spec); } private static HttpRequest buildRequest(String targetUri, String filePath, PrivateKey privateKey) throws Exception { String method = "put"; String path = "/n/" + namespace + "/b/" + bucketName + "/o/" + Paths.get(filePath).getFileName(); String host = "objectstorage." + region + ".oraclecloud.com"; String date = DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now(ZoneOffset.UTC)); byte[] fileContent = Files.readAllBytes(Paths.get(filePath)); // Read file content as byte array String signingString = "(request-target): " + method.toLowerCase() + " " + path + "\n" + "host: " + host + "\n" + "date: " + date; System.out.println("Signing String: \n" + signingString); String signature = signRequest(privateKey, signingString); String authorizationHeader = "Signature version=\"1\",headers=\"(request-target) host date\",keyId=\"" + tenancyId + "/" + userId + "/" + keyFingerprint + "\",algorithm=\"rsa-sha256\",signature=\"" + signature + "\""; return HttpRequest.newBuilder() .uri(URI.create(targetUri)) .header("Content-Type", "application/octet-stream") .header("date", date) .header("Authorization", authorizationHeader) .PUT(HttpRequest.BodyPublishers.ofByteArray(fileContent)) .build(); } private static String signRequest(PrivateKey privateKey, String dataToSign) throws Exception { Signature signatureInstance = Signature.getInstance("SHA256withRSA"); signatureInstance.initSign(privateKey); signatureInstance.update(dataToSign.getBytes()); byte[] signature = signatureInstance.sign(); return Base64.getEncoder().encodeToString(signature); } }
-
-
Jetzt haben wir den gesamten Code in die JAVA-Datei eingefügt, lassen Sie uns daran arbeiten, die erforderlichen Werte zu aktualisieren und ihre Funktionalität zu verstehen.
private static final String apiKeyFilePath = "C:\\Users\\User1\\Folder\\privatekey.pem" private static final String tenancyId = "ocid1.tenancy.oc1..aaaaaaaackopa27emaz4uteg4q7"; // OCI Tenancy ID private static final String userId = "ocid1.user.oc1..aaaaaaaafelqsoffcjq"; // OCI User ID private static final String keyFingerprint = "72:d4:6c:f8:89:74:aa"; // OCI fingerprint private static final String region = "us-ashburn-1"; // OCI Region private static final String namespace = "ocitenancyname"; // OCI bucket namespace private static final String bucketName = "ocibucketname"; // OCI bucket NAME
Alle diese Werte sind für eine sichere Verbindung zu Ihrem OCI-Mandanten verantwortlich. Rufen Sie diese Werte aus der Konfigurationsdatei ab.
String targetUri = "https://objectstorage." + region + ".oraclecloud.com/n/" + namespace + "/b/" + bucketName + "/o/" + fileName; HttpRequest request = buildRequest(targetUri, filePath, privateKey);
Dies ist der rest_api- und Hostendpunkt. Bereiten Sie ihn entsprechend Ihrer Anforderung vor, da sich dies für jeden Service ändert. Das hier gezeigte Beispiel ist der Endpunkt für OCI Object Storage Service für die Ashburn-Region.
private static HttpRequest buildRequest
Die Header für die REST-API wurden zusammen mit dem Inhaltstyp und anderen erforderlichen Parametern erstellt. Beachten Sie, dass hier Definitionen für method_type, Datum und Hostheader vorhanden sind, da für den Postanruf ein detailliertes Headerset erforderlich ist.
private static String signRequest
Schließlich erstellen wir die Signaturzeichenfolge und führen dann den REST-API-Aufruf durch. Beachten Sie, dass OCI die API-Aufrufe signieren muss. Deshalb tun wir dies hier.
-
Nachdem Sie die Werte gemäß Ihrer Konfiguration aktualisiert haben, führen Sie den JAVA-Code aus. Daraufhin sollte das Skript angezeigt werden, dass alles gut ausgeführt wird, und die Datei wird an OCI Object Storage übertragen.
Hinweis: Stellen Sie sicher, dass Java mit allen erforderlichen Packages installiert ist, wie es für den Code erforderlich ist.
Verwandte Links
Danksagungen
- Autor - Lovelesh Saxena (Principal Software Engineering Architect)
Weitere Lernressourcen
Lernen Sie andere Übungen auf docs.oracle.com/learn kennen, oder greifen Sie auf weitere kostenlose Lerninhalte im Oracle Learning YouTube Channel zu. Außerdem können Sie education.oracle.com/learning-explorer besuchen, um Oracle Learning Explorer zu werden.
Die Produktdokumentation finden Sie im Oracle Help Center.
Manage Oracle Cloud Infrastructure REST APIs Programmatically using Shell and Java Code
G11997-01
July 2024