Acceso autenticado con una AK/SK
Si un servicio en tiempo real está en el estado Running, el servicio en tiempo real se ha implementado correctamente. Este servicio proporciona una API de RESTful estándar para que los usuarios invoquen. Los usuarios pueden invocar a la API mediante autenticación basada en AK/SK.
Cuando se utiliza la autenticación basada en AK/SK, puede utilizar el SDK de APIG o el SDK de ModelArts para acceder a las API. Para obtener más información, véase Descripción de autenticación de sesión. Esta sección describe cómo utilizar el SDK de APIG para acceder a un servicio en tiempo real. El proceso es el siguiente:
- Obtención de un par de AK/SK
- Obtención de información sobre un servicio en tiempo real
- Envío de una solicitud de inferencia
- La autenticación basada en AK/SK admite solicitudes de API con un cuerpo de no más de 12 MB. Para las solicitudes de API con un cuerpo más grande, se recomienda la autenticación basada en tokens.
- La hora local en el cliente debe sincronizarse con el servidor de reloj para evitar un desplazamiento grande en el valor del encabezado de solicitud X-Sdk-Date. API Gateway comprueba el formato de hora y compara la hora con la hora en que API Gateway recibe la solicitud. Si la diferencia de tiempo supera los 15 minutos, API Gateway rechazará la solicitud.
Obtención de un par de AK/SK
Si un par de AK/SK ya está disponible, omita este paso. Encuentre el archivo AK/SK descargado, que normalmente se llama credentials.csv.
Como se muestra en la siguiente figura, el archivo contiene el nombre de usuario, AK y SK.
- Regístrese e inicie sesión en la consola de gestión.
- Haga clic en el nombre de usuario y elija My Credentials en la lista desplegable.
- En la página My Credentials, elija Access Keys en el panel de navegación.
- Haga clic en Create Access Key. Aparece el cuadro de diálogo Identity Verification.
- Complete la autenticación de identidad como se le indique, descargue la clave de acceso y manténgala segura.
Obtención de información sobre un servicio en tiempo real
Al invocar a una API, es necesario obtener la dirección de API y los parámetros de entrada del servicio en tiempo real. El procedimiento es el siguiente:
- Inicie sesión en la consola de gestión de ModelArts. En el panel de navegación izquierdo, elija Service Deployment > Real-Time Services. De forma predeterminada, el sistema cambia a la página Real-Time Services.
- Haga clic en el nombre del servicio de destino. Se muestra la página de detalles del servicio.
- En la página de detalles de un servicio en tiempo real, obtenga la dirección API y los parámetros de entrada del servicio.
La URL de API es la URL de servicio del servicio en tiempo real. Si se define una ruta para apis en el archivo de configuración del modelo, la URL debe ir seguida de la ruta definida por el usuario, por ejemplo, {URL of the real-time service}/predictions/poetry.Figura 2 Obtención de la URL de la API y los parámetros de entrada de predicción de archivos de un servicio en tiempo real
Figura 3 Obtención de la URL de la API y los parámetros de entrada de predicción de texto de un servicio en tiempo real
Método 1: Usar Python para enviar una solicitud de inferencia
- Descargue el SDK de Python y configúrelo en la herramienta de desarrollo. Para obtener más información, consulte Integración del SDK de Python para la firma de solicitudes de API.
- Cree un cuerpo de solicitud para inferencia.
- Ingreso de archivo
# coding=utf-8 import requests import os from apig_sdk import signer if __name__ == '__main__': # Config url, ak, sk and file path. url = "URL of the real-time service" # Hardcoded or plaintext AK/SK is risky. For security, encrypt your AK/SK and store them in the configuration file or environment variables. # In this example, the AK/SK are stored in environment variables for identity authentication. Before running this example, set environment variables HUAWEICLOUD_SDK_AK and HUAWEICLOUD_SDK_SK. ak = os.environ["HUAWEICLOUD_SDK_AK"] sk = os.environ["HUAWEICLOUD_SDK_SK"] file_path = "Local path to the inference file" # Create request, set method, url, headers and body. method = 'POST' headers = {"x-sdk-content-sha256": "UNSIGNED-PAYLOAD"} request = signer.HttpRequest(method, url, headers) # Create sign, set the AK/SK to sign and authenticate the request. sig = signer.Signer() sig.Key = ak sig.Secret = sk sig.Sign(request) # Send request files = {'images': open(file_path, 'rb')} resp = requests.request(request.method, request.scheme + "://" + request.host + request.uri, headers=request.headers, files=files) # Print result print(resp.status_code) print(resp.text)
file_path es la ruta de acceso local al archivo de inferencia. La ruta puede ser una ruta absoluta (por ejemplo, D:/test.png para Windows y /opt/data/test.png para Linux) o una ruta relativa (por ejemplo, ./test.png).
Formato del cuerpo de la solicitud de files: files = {"Request parameter": ("Load path", File content, "File type")}. Para obtener detalles sobre los parámetros de files, véase Tabla 1.Tabla 1 Parámetros de files Parámetro
Obligatorio
Descripción
Request parameter
Sí
Introduzca el nombre del parámetro del servicio en tiempo real.
Load path
No
Ruta de acceso en la que se almacena el archivo.
File content
Sí
Contenido del archivo que se va a cargar.
File type
No
Tipo del archivo que se va a cargar, que puede ser una de las siguientes opciones:
- txt: texto/plano
- jpg/jpeg: imagen/jpeg
- png: imagen/png
- Ingreso de texto (JSON)
A continuación se muestra un ejemplo del cuerpo de la solicitud para leer el archivo de inferencia local y realizar la codificación Base64:
# coding=utf-8 import base64 import json import os import requests from apig_sdk import signer if __name__ == '__main__': # Config url, ak, sk and file path. url = "URL of the real-time service" # Hardcoded or plaintext AK/SK is risky. For security, encrypt your AK/SK and store them in the configuration file or environment variables. # In this example, the AK/SK are stored in environment variables for identity authentication. Before running this example, set environment variables HUAWEICLOUD_SDK_AK and HUAWEICLOUD_SDK_SK. ak = os.environ["HUAWEICLOUD_SDK_AK"] sk = os.environ["HUAWEICLOUD_SDK_SK"] file_path = "Local path to the inference file" with open(file_path, "rb") as file: base64_data = base64.b64encode(file.read()).decode("utf-8") # Create request, set method, url, headers and body. method = 'POST' headers = { 'Content-Type': 'application/json' } body = { 'image': base64_data } request = signer.HttpRequest(method, url, headers, json.dumps(body)) # Create sign, set the AK/SK to sign and authenticate the request. sig = signer.Signer() sig.Key = ak sig.Secret = sk sig.Sign(request) # Send request resp = requests.request(request.method, request.scheme + "://" + request.host + request.uri, headers=request.headers, data=request.body) # Print result print(resp.status_code) print(resp.text)
El nombre de body viene determinado por el parámetro de entrada del servicio en tiempo real. El nombre del parámetro debe ser el mismo que el del parámetro de entrada del tipo de cadena. image se utiliza como ejemplo. El valor de base64_data de body es del tipo de cadena.
- Ingreso de archivo
Método 2: Usar Java para enviar una solicitud de inferencia
- Descargue el SDK de Java y configúrelo en la herramienta de desarrollo.
- Cree un cuerpo de solicitud Java para inferencia.
En el SDK de Java de APIG, request.setBody() solo puede ser una string. Por lo tanto, solo se admiten solicitudes de inferencia de texto. Si hay un archivo de entrada, conviértalo en texto usando Base64.
- Ingreso de archivo
El siguiente es un ejemplo del cuerpo de la solicitud (JSON) para leer el archivo de inferencia local y realizar la codificación de Base64.
package com.apig.sdk.demo; import com.cloud.apigateway.sdk.utils.Client; import com.cloud.apigateway.sdk.utils.Request; import org.apache.commons.codec.binary.Base64; import org.apache.http.HttpHeaders; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class MyAkSkTest2 { public static void main(String[] args) { String url = "URL of the real-time service"; // Hard-coded or plaintext AK/SK is risky. For security, encrypt your AK/SK and store them in the configuration file or environment variables. // In this example, the AK/SK are stored in environment variables for identity authentication. Before running this example, set environment variables HUAWEICLOUD_SDK_AK and HUAWEICLOUD_SDK_SK. String ak = System.getenv("HUAWEICLOUD_SDK_AK"); String sk = System.getenv("HUAWEICLOUD_SDK_SK"); String filePath = "Local path to the inference file"; try { // Create request Request request = new Request(); // Set the AK/SK to sign and authenticate the request. request.setKey(ak); request.setSecret(sk); // Specify a request method, such as GET, PUT, POST, DELETE, HEAD, and PATCH. request.setMethod(HttpPost.METHOD_NAME); // Add header parameters request.addHeader(HttpHeaders.CONTENT_TYPE, "application/json"); // Set a request URL in the format of https://{Endpoint}/{URI}. request.setUrl(url); // build your json body String body = "{\"image\":\"" + getBase64FromFile(filePath) + "\"}"; // Special characters, such as the double quotation mark ("), contained in the body must be escaped. request.setBody(body); // Sign the request. HttpRequestBase signedRequest = Client.sign(request); // Send request. CloseableHttpResponse response = HttpClients.createDefault().execute(signedRequest); // Print result System.out.println(response.getStatusLine().getStatusCode()); System.out.println(EntityUtils.toString(response.getEntity())); } catch (Exception e) { e.printStackTrace(); } } /** * Convert the file into a byte array and Base64 encode it * @return */ private static String getBase64FromFile(String filePath) { // Convert the file into a byte array InputStream in = null; byte[] data = null; try { in = new FileInputStream(filePath); data = new byte[in.available()]; in.read(data); in.close(); } catch (IOException e) { e.printStackTrace(); } // Base64 encode return new String(Base64.encodeBase64(data)); } }
Si se utiliza la codificación de Base64, debe agregar el código para decodificar el cuerpo de la solicitud al código de inferencia del modelo.
- Ingreso de texto (JSON)
// Package name of the demo. package com.apig.sdk.demo; import com.cloud.apigateway.sdk.utils.Client; import com.cloud.apigateway.sdk.utils.Request; import org.apache.http.HttpHeaders; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class MyAkSkTest { public static void main(String[] args) { String url = "URL of the real-time service"; // Hard-coded or plaintext AK/SK is risky. For security, encrypt your AK/SK and store them in the configuration file or environment variables. // In this example, the AK/SK are stored in environment variables for identity authentication. Before running this example, set environment variables HUAWEICLOUD_SDK_AK and HUAWEICLOUD_SDK_SK. String ak = System.getenv("HUAWEICLOUD_SDK_AK"); String sk = System.getenv("HUAWEICLOUD_SDK_SK"); try { // Create request Request request = new Request(); // Set the AK/SK to sign and authenticate the request. request.setKey(ak); request.setSecret(sk); // Specify a request method, such as GET, PUT, POST, DELETE, HEAD, and PATCH. request.setMethod(HttpPost.METHOD_NAME); // Add header parameters request.addHeader(HttpHeaders.CONTENT_TYPE, "application/json"); // Set a request URL in the format of https://{Endpoint}/{URI}. request.setUrl(url); // Special characters, such as the double quotation mark ("), contained in the body must be escaped. String body = "{}"; request.setBody(body); // Sign the request. HttpRequestBase signedRequest = Client.sign(request); // Send request. CloseableHttpResponse response = HttpClients.createDefault().execute(signedRequest); // Print result System.out.println(response.getStatusLine().getStatusCode()); System.out.println(EntityUtils.toString(response.getEntity())); } catch (Exception e) { e.printStackTrace(); } } }
body está determinado por el formato de texto. JSON se utiliza como ejemplo.
- Ingreso de archivo