Appeler des services Web à partir d'une base de données autonome basée sur l'IA

Décrit les options pour appeler des services Web à partir d'une base de données d'IA autonome.

Il existe un certain nombre d'options pour appeler des services Web à partir de Autonomous AI Database, notamment :

  • Utiliser les API REST DBMS_CLOUD : La fonction DBMS_CLOUD.SEND_REQUEST commence une demande HTTP, obtient la réponse et met fin à la réponse. Cette fonction fournit un flux de travail pour envoyer une demande d'API REST en nuage avec des arguments et retourne un code de réponse et des données utiles. Pour plus d'informations, voir SEND_REQUEST Fonction et procédure.

  • Utiliser Oracle APEX : Vous pouvez interagir avec les services Web de style SOAP et RESTful à partir d'APEX dans votre instance de base de données autonome avec intelligence artificielle. Pour plus d'informations, voir Utiliser des services Web avec Oracle APEX.

  • Utilisez UTL_HTTP pour soumettre une demande à un site public : Voir Soumettre une demande HTTP à un hôte public pour plus d'informations.

  • Utilisez UTL_HTTP pour soumettre une demande à un site privé : Voir Soumettre une demande HTTP à un hôte privé pour plus d'informations.

    Lorsque votre instance de base de données IA autonome se trouve sur un point d'extrémité privé, vous pouvez utiliser un portefeuille géré par le client avec des procédures dans UTL_HTTP, DBMS_LDAP, UTL_SMTP ou UTL_TCP. Pour plus d'informations, voir Appels externes à l'aide d'un portefeuille géré par le client.

Voir Notes de l'ensemble PL/SQL pour Autonomous AI Database pour plus d'informations sur les restrictions pour UTL_HTTP pour Autonomous AI Database.

Rubriques

Soumettre une demande HTTP à un hôte public

Fournit des détails sur l'utilisation de UTL_HTTP pour soumettre une demande HTTP sur un hôte public.

Par exemple, pour soumettre une demande HTTP pour un hôte public www.example.com, créez une liste de contrôle d'accès pour l'hôte :

BEGIN
   DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
         host => 'www.example.com',
         ace =>  xs$ace_type( privilege_list => xs$name_list('http'),
                              principal_name => 'ADMIN',
                              principal_type => xs_acl.ptype_db));
END;

Soumettez ensuite la demande HTTP :

SELECT UTL_HTTP.REQUEST(url => 'https://www.example.com/') FROM dual;
Note

Si votre instance de base de données d'intelligence artificielle autonome se trouve sur un point d'extrémité privé et que vous souhaitez que vos appels UTL_HTTP aux hôtes publics soient soumis aux règles de trafic sortant de votre VCN de point d'extrémité privé, définissez la propriété de base de données ROUTE_OUTBOUND_CONNECTIONS.

Pour plus d'informations, voir Sécurité améliorée pour les connexions sortantes à l'aide de points d'extrémité privés.

Voir Notes de l'ensemble PL/SQL pour Autonomous AI Database pour plus d'informations sur les restrictions pour UTL_HTTP pour Autonomous AI Database.

Soumettre une demande HTTP à un hôte privé

Décrit les étapes à suivre pour utiliser UTL_HTTP pour soumettre une demande HTTP sur un hôte privé.

Pour soumettre une demande à un hôte cible sur un point d'extrémité privé, l'hôte cible doit être accessible à partir du VCN Oracle Cloud Infrastructure de la base de données source. Par exemple, vous pouvez vous connecter à l'hôte cible lorsque :

  • La base de données source et l'hôte cible se trouvent tous les deux dans le même VCN Oracle Cloud Infrastructure.

  • La base de données source et l'hôte cible se trouvent dans différents réseaux en nuage virtuels Oracle Cloud Infrastructure qui sont appariés.

  • L'hôte cible est un réseau sur place connecté au VCN Oracle Cloud Infrastructure de la base de données source à l'aide de FastConnect ou d'un RPV.

Vous pouvez également effectuer des appels UTL_HTTP avec un portefeuille géré par le client lorsque votre base de données Autonomous AI Database se trouve sur un point d'extrémité privé. Pour plus d'informations, voir Appels externes à l'aide d'un portefeuille géré par le client.

Pour effectuer une demande UTL_HTTP à une cible sur un point d'extrémité privé :

  1. Créez une liste de contrôle d'accès pour l'hôte.

    Exemple :

    BEGIN
       DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
             host => 'www.example.com',
             ace => xs$ace_type( privilege_list => xs$name_list('http'),
                                 principal_name => 'ADMIN',
                                 principal_type => xs_acl.ptype_db),
                                 private_target => TRUE);
    END;
    /

    Comme illustré dans cet exemple, lorsque vous créez une liste de contrôle d'accès pour l'hôte, spécifiez le paramètre private_target avec la valeur TRUE.

    Note

    Si vous réglez la propriété de base de données ROUTE_OUTBOUND_CONNECTIONS, le paramètre private_target à TRUE n'est pas requis dans cette API. Pour plus d'informations, voir Sécurité améliorée pour les connexions sortantes à l'aide de points d'extrémité privés.
  2. Soumettez la demande HTTP :

    SELECT UTL_HTTP.REQUEST(
                    url => 'https://www.example.com/',
                    https_host => 'www.example.com') 
                 FROM dual;

Voir Notes de l'ensemble PL/SQL pour Autonomous AI Database pour plus d'informations sur les restrictions pour UTL_HTTP pour Autonomous AI Database.

Soumettre une demande HTTP à un site privé avec un mandataire

Lorsque votre instance de base de données IA autonome se trouve sur un point d'extrémité privé, vous pouvez utiliser un mandataire pour soumettre des demandes HTTP avec UTL_HTTP.

Lorsque votre instance de base de données d'intelligence artificielle autonome se trouve sur un point d'extrémité privé, pour utiliser UTL_HTTP avec un mandataire cible, le mandataire cible doit être accessible à partir du VCN Oracle Cloud Infrastructure de la base de données source.

Par exemple, vous pouvez vous connecter à l'aide d'un mandataire lorsque :

  • La base de données source et le serveur mandataire se trouvent tous les deux dans le même VCN Oracle Cloud Infrastructure.

  • La base de données source et le serveur mandataire se trouvent dans différents réseaux en nuage virtuels Oracle Cloud Infrastructure appariés.

  • Le serveur mandataire est un réseau sur place connecté au VCN Oracle Cloud Infrastructure de la base de données source à l'aide de FastConnect ou d'un RPV.

Vous pouvez également effectuer des appels UTL_HTTP à l'aide d'un portefeuille géré par le client. Pour plus d'informations, voir Appels externes à l'aide d'un portefeuille géré par le client.

Pour utiliser un serveur mandataire avec UTL_HTTP :

  1. Définissez la liste de contrôle d'accès HTTP_PROXY sur le serveur mandataire.

    Exemple :

    BEGIN
      DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
           host =>'www-proxy-example.com',
           ace  => xs$ace_type(privilege_list => xs$name_list('HTTP_PROXY'),
                               principal_name => 'APPUSER1',
                               principal_type => xs_acl.ptype_db),
                               private_target => TRUE);
    END;
    /

    Comme illustré dans cet exemple, lorsque vous créez une liste de contrôle d'accès pour le serveur mandataire, spécifiez le paramètre private_target avec la valeur TRUE.

    Note

    Si vous réglez la propriété de base de données ROUTE_OUTBOUND_CONNECTIONS, le paramètre private_target à TRUE n'est pas requis dans cette API. Pour plus d'informations, voir Sécurité améliorée pour les connexions sortantes à l'aide de points d'extrémité privés.
  2. Définissez la liste de contrôle d'accès HTTP sur le serveur Web distant.

    Exemple :

    BEGIN
      DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
            host =>'example.com',
            ace => xs$ace_type( privilege_list => xs$name_list('HTTP'),
                                principal_name => 'APPUSER1',
                                principal_type => xs_acl.ptype_db)
    END;
    /
  3. Définissez le portefeuille et le mandataire pour UTL_HTTP.

    Exemple :

    BEGIN
       UTL_HTTP.SET_WALLET('');
       UTL_HTTP.SET_PROXY('www-proxy-example:80');
    END;
    /
  4. Soumettre une demande HTTP :
    SELECT UTL_HTTP.REQUEST(    
                        url         => 'https://www.example.com/',
                        https_host  => 'www.example.com')
                 FROM dual;

Notes pour définir un serveur mandataire avec UTL_HTTP.SET_PROXY :

  • Les demandes DBMS_CLOUD ne respectent pas le serveur mandataire que vous avez défini avec UTL_HTTP.SET_PROXY. Cela inclut DBMS_CLOUD.SEND_REQUEST et tous les accès au stockage d'objets pour les tables externes DBMS_CLOUD que vous définissez avec DBMS_CLOUD.CREATE_EXTERNAL_TABLE, DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE ou DBMS_CLOUD.CREATE_HYBRID_PART_TABLE.

  • Les demandes APEX_WEB_SERVICE ne respectent pas le serveur mandataire que vous avez défini avec UTL_HTTP.SET_PROXY.

Voir Notes de l'ensemble PL/SQL pour Autonomous AI Database pour plus d'informations sur les restrictions pour UTL_HTTP pour Autonomous AI Database.

Utiliser des objets de données d'identification pour définir l'authentification HTTP

Décrit comment transmettre des objets de données d'identification à la procédure UTL_HTTP.SET_CREDENTIAL.

La procédure UTL_HTTP.SET_CREDENTIAL définit les informations d'authentification HTTP dans l'en-tête de la demande HTTP. Le serveur Web a besoin de ces informations pour autoriser la demande.

La procédure UTL_HTTP.SET_CREDENTIAL vous permet de transmettre des objets de données d'identification pour définir l'authentification HTTP. Les objets de données d'identification sont des objets de schéma. Par conséquent, ils ne sont accessibles que par des utilisateurs dotés de privilèges et vous permettent de configurer des privilèges au niveau du schéma pour contrôler les données d'identification. La transmission d'objets de données d'identification est un moyen approprié et sécurisé de stocker et de gérer le nom d'utilisateur/mot de passe/clés à utiliser pour l'authentification.

La procédure UTL_HTTP.SET_CREDENTIAL est une alternative sûre et pratique à la procédure UTL_HTTP.SET_AUTHENTICATION.

Exemple


...
UTL_HTTP.SET_AUTHENTICATION (l_http_request, 'web_app_user', 'xxxxxxxxxxxx');
...

Comme indiqué dans l'exemple ci-dessus, lorsque vous appelez la procédure SET_AUTHENTICATION, vous devez transmettre le nom utilisateur/mot de passe en texte clair dans le cadre des paramètres formels PL/SQL. Vous devrez peut-être intégrer le nom utilisateur/mot de passe dans divers scripts d'automatisation PL/SQL ou cron. La transmission de mots de passe en texte clair est un problème de conformité qui est traité dans la procédure UTL_HTTP.SET_CREDENTIAL.

Pour plus d'informations, voir Procédure SET_AUTHENTICATION et Procédure SET_AUTHENTICATION_FROM_WALLET.

Syntaxe UTL_HTTP.SET_CREDENTIAL

UTL_HTTP.SET_CREDENTIAL (
    r          IN OUT NOCOPY req,
    credential IN VARCHAR2,
    scheme     IN VARCHAR2 DEFAULT 'Basic',
    for_proxy  IN BOOLEAN  DEFAULT FALSE);

Exemple pour transmettre un objet de données d'identification dans la procédure SET_CREDENTIAL :

  • Créez un objet de données d'identification :

    BEGIN DBMS_CLOUD.CREATE_CREDENTIAL (
        credential_name => 'HTTP_CRED',
        username        => 'web_app_user',
        password        => '<password>' );
    END;

    Cela crée un objet de données d'identification qui crée une paire nom utilisateur/mot de passe stocké.

    Pour plus d'informations, voir ProcédureCREATE_CREDENTIAL.

    Pour plus d'informations, voir Spécification des données d'identification de la tâche du programmateur.

  • Appelez la procédure UTL_HTTP.SET_CREDENTIAL :

    DECLARE
          l_http_request  UTL_HTTP.REQ;
        BEGIN 
          l_http_request := UTL_HTTP.BEGIN_REQUEST('https://www.example.com/v1/dwcsdev/NAME/dwcs_small_xt1.csv');
          UTL_HTTP.SET_CREDENTIAL (l_http_request, 'HTTP_CRED','BASIC');
          ...
    END;
    

    Cet exemple crée d'abord une demande en appelant la procédure BEGIN_REQUEST et définit les informations d'authentification HTTP dans l'en-tête de la demande HTTP en appelant la procédure SET_CREDENTIAL. Le serveur Web a besoin de ces informations pour autoriser la demande. La valeur l_http_request est la demande HTTP, HTTP_CRED est le nom des données d'identification et BASIC est le modèle d'authentification HTTP.

Pour plus d'informations, voir UTL_HTTP.

Voir Notes de l'ensemble PL/SQL pour Autonomous AI Database pour plus d'informations sur les restrictions pour UTL_HTTP pour Autonomous AI Database.

Notes pour la soumission de demandes HTTP avec Oracle APEX ou Database Actions

Lorsque vous utilisez les commandes SQL Oracle APEX ou la feuille de calcul SQL Database Actions pour exécuter plusieurs commandes SQL séquentielles, ces commandes peuvent être exécutées dans différentes sessions de base de données qui n'enregistrent pas l'état d'une instruction précédente. Ce comportement diffère des clients SQL de bureau tels que SQL*Plus et SQL Developer qui conservent une connexion persistante à la base de données.

Les commandes SQL d'Oracle APEX et les soumissions de feuille de calcul SQL Database Actions à une instance de base de données d'IA autonome sont sans état. Cela signifie que l'exécution d'instructions SQL et PL/SQL individuelles peut enregistrer l'état dans la mémoire de la base de données, par exemple lorsque vous soumettez une commande d'utilisation d'un "wallet", mais que l'état peut être effacé avant l'exécution de l'instruction suivante.

Consultez le tableau suivant pour connaître les étapes à suivre pour conserver l'état de mémoire de la base de données entre les exécutions d'énoncés pour les commandes SQL que vous soumettez à Autonomous AI Database.

Outil de commande SQL Soumettre les relevés en tant que bloc
Feuille de calcul SQL Database Actions
  • Sélectionnez tous les énoncés et cliquez sur Exécuter l'énoncé
  • Sélectionnez rien et cliquez sur Exécuter en tant que script SQL
Commandes SQL Oracle APEX

Les commandes SQL APEX prennent uniquement en charge l'exécution d'instructions individuelles. Pour exécuter plusieurs instructions, vous devez les encapsuler dans un bloc anonyme PL/SQL unique. Pour exécuter le bloc avec des commandes SQL APEX, cliquez sur Exécuter.

Par exemple, utilisez le bloc de code suivant pour exécuter une commande utl_http.request() qui utilise un portefeuille géré par le client :

SELECT utl_http.request(url => 'https://api.example.com/', wallet_path => 'file:path_to_wallet', wallet_password => 'password' ) FROM DUAL";

Comparez cela à l'exécution avec deux énoncés consécutifs qui pourraient échouer si la commande utl_http.set_wallet() et l'énoncé utl_http.request() s'exécutent individuellement, plutôt qu'en tant que bloc de code unique :

EXEC utl_http.set_wallet('file:WALLET_DIR/wallet.sso', 'password');
SELECT utl_http.request('https://api.example.com/') FROM DUAL;

Envoyer les en-têtes de réseau d'identité de base de données pour les demandes HTTP sortantes

Vous pouvez configurer votre base de données d'intelligence artificielle autonome pour envoyer des informations d'identité de base de données en tant qu'en-têtes HTTP personnalisés lors de la création de demandes HTTP sortantes.

À propos des en-têtes du réseau d'identités de base de données

Les en-têtes de réseau d'identité de base de données vous permettent d'envoyer des informations d'identification spécifiques à la base de données (telles que database name, region, tenancy OCID, database OCID, compartment OCID, cloud domain et client IP address) en tant qu'en-têtes HTTP personnalisés avec des demandes HTTP sortantes. Cela permet aux endpoints distants d'identifier la source des demandes entrantes.

L'en-tête de réseau d'identité de base de données extrait tous ses champs de Cloud Identity. La base de données autonome d'IA tient à jour un objet d'identité en nuage pour chaque base de données, qui comprend des métadonnées telles que le nom de la base de données, le nom de la région, l'OCID de la location, l'OCID de la base de données et l'OCID du compartiment. Oracle configure les champs d'identité pour chaque base de données. Vous pouvez la voir dans les vues de base de données V$PDBS. Cependant, vous ne pouvez pas le modifier.

Avec l'en-tête de réseau d'identité de base de données, vous disposez d'une sécurité améliorée. Les points d'extrémité distants peuvent valider la base de données d'origine et limiter l'accès aux bases de données autorisées uniquement. Par défaut, vous devez configurer explicitement les champs d'identité à inclure et les domaines autorisés à recevoir ces en-têtes.

Configurer les en-têtes du réseau d'identités de base de données

Pour chaque demande UTL_HTTP sortante, la base de données envoie automatiquement un en-tête HTTP (par exemple, X-ADB-Source-Database) dont la valeur est un document JSON avec des champs d'identité sélectionnés tels que database name, region, tenancy OCID, database OCID, compartment OCID, cloud domain et client IP address.

Pour envoyer des en-têtes de réseau d'identité de base de données avec des demandes HTTP sortantes, vous devez configurer deux propriétés de base de données :
  • DATABASE_IDENTITY_NETWORK_HEADERS : Spécifie les champs d'identité à inclure dans l'en-tête HTTP personnalisé.
  • DATABASE_IDENTITY_NETWORK_HEADERS_DOMAINS : Spécifie les domaines autorisés à recevoir ces en-têtes.

Préalables

Vous devez configurer des listes de contrôle d'accès réseau pour autoriser l'accès HTTP sortant aux domaines cibles.

Définir les champs d'identité à inclure dans les en-têtes HTTP

La propriété DATABASE_IDENTITY_NETWORK_HEADERS contrôle les champs d'identité de base de données envoyés dans le cadre de l'en-tête HTTP personnalisé X-ADB-Source-Database.

Pour configurer les champs d'identité :

Réglez la propriété DATABASE_IDENTITY_NETWORK_HEADERS à un tableau JSON contenant un ou plusieurs des champs suivants :
  • DATABASE_NAME : Nom de la base de données d'intelligence artificielle autonome
  • REGION : Région Oracle Cloud Infrastructure où se trouve la base de données
  • TENANT_OCID : Identificateur Oracle Cloud (OCID) de la location
  • DATABASE_OCID : OCID de la base de données d'IA autonome
  • COMPARTMENT_OCID : OCID du compartiment contenant la base de données
  • CLOUD_DOMAIN : Domaine en nuage de la base de données
  • CLIENT_IP_ADDRESS : Adresse IP à partir de laquelle la session d'utilisateur a été établie
Par exemple, pour inclure database name, region et database OCID :
ALTER DATABASE PROPERTY SET DATABASE_IDENTITY_NETWORK_HEADERS = '[
"DATABASE_NAME",
"REGION",
"DATABASE_OCID"
]';

Pour inclure tous les champs d'identité disponibles :
ALTER DATABASE PROPERTY SET DATABASE_IDENTITY_NETWORK_HEADERS = '[
"DATABASE_NAME",
"REGION",
"TENANT_OCID",
"DATABASE_OCID",
"COMPARTMENT_OCID",
"CLOUD_DOMAIN",
"CLIENT_IP_ADDRESS"
]';

Notes d'utilisation :

  • Si vous réglez cette propriété à null, l'API n'envoie pas les champs d'identité. C'est par défaut.
  • Les noms de champ ne sont pas sensibles à la casse.
  • La spécification de noms ou de valeurs de champ non valides génère une erreur ORA-60565.

Spécifier les domaines autorisés

La propriété DATABASE_IDENTITY_NETWORK_HEADERS_DOMAINS contrôle les domaines autorisés à recevoir les en-têtes d'identité de base de données.

Pour configurer les domaines autorisés :

Réglez la propriété DATABASE_IDENTITY_NETWORK_HEADERS_DOMAINS à l'une des valeurs suivantes :
  • Un seul astérisque (*) pour envoyer des en-têtes à tous les domaines
  • Liste séparée par des virgules de noms de domaine spécifiques
Par exemple, pour envoyer des en-têtes à tous les domaines :
ALTER DATABASE PROPERTY SET DATABASE_IDENTITY_NETWORK_HEADERS_DOMAINS = '*';
Pour envoyer des en-têtes aux domaines du service de stockage d'objets pour Oracle Cloud uniquement :
ALTER DATABASE PROPERTY SET DATABASE_IDENTITY_NETWORK_HEADERS_DOMAINS = 'objectstorage.oraclecloud.com';
Pour envoyer des en-têtes à plusieurs domaines spécifiques :
ALTER DATABASE PROPERTY SET DATABASE_IDENTITY_NETWORK_HEADERS_DOMAINS = 'oraclecloud.com, example.com';

Notes d'utilisation :

  • La correspondance de domaine est basée sur la correspondance exacte de suffixe. Par exemple, si oracle.cloud.com correspond à api.oraclecloud.com, objectstorage.oraclecloud.com et à tout autre sous-domaine de oraclecloud.com.
  • Les modèles génériques (tels que *.oraclecloud.com) ne sont pas pris en charge.
  • Si vous réglez cette propriété à NULL, l'API n'envoie pas les champs d'identité. C'est par défaut.
  • Les en-têtes sont envoyés uniquement lorsque DATABASE_IDENTITY_NETWORK_HEADERS et DATABASE_IDENTITY_NETWORK_HEADERS_DOMAINS sont configurés.

Format d'en-tête HTTP

Lorsque les en-têtes de réseau d'identité de base de données sont configurés, la base de données ajoute automatiquement l'en-tête personnalisé X-ADB-Source-Database aux demandes HTTP sortantes effectuées à l'aide de l'ensemble UTL_HTTP.

La valeur d'en-tête est un objet JSON contenant les champs d'identité configurés avec leurs valeurs correspondantes.
X-ADB-Source-Database=
  {"databaseName":"MYDATABASENAME",
   "region":"region_identifier",
   "tenantOcid":"tenant_ocid",
   "databaseOcid":"database_ocid",
   "compartmentOcid":"compartment_ocid",
   "clientIpAddress":"client_ip_address"}

L'en-tête X-ADB-Source-Database est alimenté automatiquement par le noyau de la base de données et ne peut pas être modifié ou défini explicitement à l'aide des API UTL_HTTP.

Note

Vous ne pouvez pas définir cet en-tête. Si vous essayez, le système renvoie une erreur.

Vous recevrez une erreur ORA-60565: Invalid value for DATABASE_IDENTITY_NETWORK_HEADERS property si une valeur non valide est spécifiée pour la propriété DATABASE_IDENTITY_NETWORK_HEADERS. La valeur doit être un tableau JSON contenant un ou plusieurs noms de champ valides et ne doit pas dépasser 4000 octets.