Autonomous DatabaseからのWebサービス呼出し

Autonomous DatabaseからWebサービスをコールするためのオプションについて説明します。

Autonomous DatabaseからWebサービスを呼び出すには、次のような多くのオプションがあります。

  • DBMS_CLOUD REST APIの使用: DBMS_CLOUD.SEND_REQUESTファンクションは、HTTPリクエストを開始し、レスポンスを取得して、レスポンスを終了しますこのファンクションは、引数を含むクラウドREST APIリクエストを送信するためのワークフローを提供し、ファンクションはレスポンス・コードおよびペイロードを返します。詳細は、SEND_REQUESTファンクションおよびプロシージャを参照してください。

  • Oracle APEXの使用: Autonomous DatabaseインスタンスのAPEXから、SOAPとRESTfulの両方のスタイルのWebサービスを操作できます。詳細は、Oracle APEXでのWebサービスの使用を参照してください。

  • UTL_HTTPを使用して、パブリック・サイトにリクエストを送信します。詳細は、パブリック・ホストへのHTTPリクエストの発行を参照してください。

  • UTL_HTTPを使用して、リクエストをプライベート・サイトに送信します。詳細は、プライベート・ホストへのHTTPリクエストの発行を参照してください。

    Autonomous Databaseインスタンスがプライベート・エンドポイントにある場合は、UTL_HTTPDBMS_LDAPUTL_SMTPまたはUTL_TCPの手順で顧客管理ウォレットを使用できます。詳細は、顧客管理Walletを使用した外部コールの実行を参照してください。

Autonomous DatabaseでのUTL_HTTPの制限の詳細は、Autonomous DatabaseのPL/SQLパッケージ・ノートを参照してください。

トピック

パブリック・ホストへのHTTPリクエストの送信

UTL_HTTPを使用してパブリック・ホストでHTTPリクエストを送信するための詳細を提供します。

たとえば、パブリック・ホストwww.example.comのHTTPリクエストを送信するには、ホストのアクセス制御リストを作成します。

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;

次に、HTTPリクエストを送信します。

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

Autonomous Databaseインスタンスがプライベート・エンドポイントにあり、パブリック・ホストへのUTL_HTTPコールをプライベート・エンドポイントVCNエグレス・ルールの対象にする場合は、ROUTE_OUTBOUND_CONNECTIONSデータベース・プロパティをPRIVATE_ENDPOINTに設定します。

詳細は、プライベート・エンドポイントを使用したアウトバウンド接続のセキュリティの強化を参照してください。

Autonomous DatabaseでのUTL_HTTPの制限の詳細は、Autonomous DatabaseのPL/SQLパッケージ・ノートを参照してください。

プライベート・ホストへのHTTPリクエストの送信

UTL_HTTPを使用してプライベート・ホストでHTTPリクエストを送信するステップについて説明します。

プライベート・エンドポイントのターゲット・ホストにリクエストを送信するには、ソース・データベースのOracle Cloud Infrastructure VCNからターゲット・ホストにアクセスできる必要があります。たとえば、次の場合にターゲット・ホストに接続できます。

  • ソース・データベースとターゲット・ホストの両方が同じOracle Cloud Infrastructure VCNにあります。

  • The source database and the target host are in different Oracle Cloud Infrastructure VCNs that are paired.

  • ターゲット・ホストは、FastConnectまたはVPNを使用してソース・データベースのOracle Cloud Infrastructure VCNに接続されているオンプレミス・ネットワークです。

Autonomous Databaseがプライベート・エンドポイントにある場合は、顧客管理ウォレットを使用してUTL_HTTPコールを実行することもできます。詳細は、顧客管理Walletを使用した外部コールの実行を参照してください。

プライベート・エンドポイントのターゲットにUTL_HTTPリクエストを作成するには:

  1. ホストのアクセス制御リストを作成します。

    たとえば:

    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;
    /

    この例に示すように、ホストのアクセス制御リストを作成するときに、private_targetパラメータに値TRUEを指定します。

    ノート

    ROUTE_OUTBOUND_CONNECTIONSPRIVATE_ENDPOINTに設定した場合、このAPIではprivate_targetパラメータをTRUEに設定する必要はありません。詳細は、プライベート・エンドポイントを使用したアウトバウンド接続のセキュリティの強化を参照してください。
  2. HTTPリクエストを発行します。

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

Autonomous DatabaseでのUTL_HTTPの制限の詳細は、Autonomous DatabaseのPL/SQLパッケージ・ノートを参照してください。

プロキシを使用したプライベート・サイトへのHTTPリクエストの送信

Autonomous Databaseインスタンスがプライベート・エンドポイントにある場合、プロキシを使用してUTL_HTTPでHTTPリクエストを送信できます。

Autonomous Databaseインスタンスがプライベート・エンドポイントにある場合、ターゲット・プロキシでUTL_HTTPを使用するには、ソース・データベースのOracle Cloud Infrastructure VCNからターゲット・プロキシにアクセスできる必要があります。

たとえば、次の場合にプロキシを使用して接続できます。

  • ソース・データベースとプロキシ・サーバーの両方が同じOracle Cloud Infrastructure VCNにあります。

  • The source database and the proxy server are in different Oracle Cloud Infrastructure VCNs that are paired.

  • プロキシ・サーバーは、FastConnectまたはVPNを使用してソース・データベースのOracle Cloud Infrastructure VCNに接続されているオンプレミス・ネットワークです。

また、顧客管理ウォレットを使用してUTL_HTTPコールを実行することもできます。詳細は、顧客管理Walletを使用した外部コールの実行を参照してください。

UTL_HTTPでプロキシ・サーバーを使用するには:

  1. プロキシ・サーバーでHTTP_PROXY ACLを設定します。

    たとえば:

    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;
    /

    この例に示すように、プロキシ・サーバーのアクセス制御リストを作成するときに、private_targetパラメータに値TRUEを指定します。

    ノート

    ROUTE_OUTBOUND_CONNECTIONSPRIVATE_ENDPOINTに設定した場合、このAPIではprivate_targetパラメータをTRUEに設定する必要はありません。詳細は、プライベート・エンドポイントを使用したアウトバウンド接続のセキュリティの強化を参照してください。
  2. リモートWebサーバーでHTTP ACLを設定します。

    たとえば:

    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. UTL_HTTPのウォレットおよびプロキシを設定します。

    たとえば:

    BEGIN
       UTL_HTTP.SET_WALLET('');
       UTL_HTTP.SET_PROXY('www-proxy-example:80');
    END;
    /
  4. HTTPリクエストを発行します。
    SELECT UTL_HTTP.REQUEST(    
                        url         => 'https://www.example.com/',
                        https_host  => 'www.example.com')
                 FROM dual;

UTL_HTTP.SET_PROXYを使用したプロキシ・サーバーの設定に関するノート:

  • DBMS_CLOUDリクエストは、UTL_HTTP.SET_PROXYで設定したプロキシ・サーバーを使用しません。これには、DBMS_CLOUD.SEND_REQUESTと、DBMS_CLOUD.CREATE_EXTERNAL_TABLEDBMS_CLOUD.CREATE_EXTERNAL_PART_TABLEまたはDBMS_CLOUD.CREATE_HYBRID_PART_TABLEで定義したDBMS_CLOUD外部表に対するすべてのオブジェクト・ストレージ・アクセスが含まれます。

  • APEX_WEB_SERVICEリクエストは、UTL_HTTP.SET_PROXYで設定したプロキシ・サーバーを使用しません。

Autonomous DatabaseでのUTL_HTTPの制限の詳細は、Autonomous DatabaseのPL/SQLパッケージ・ノートを参照してください。

資格証明オブジェクトを使用したHTTP認証の設定

資格証明オブジェクトをUTL_HTTP.SET_CREDENTIALプロシージャに渡す方法について説明します。

UTL_HTTP.SET_CREDENTIALプロシージャでは、HTTP要求ヘッダーにHTTP認証情報が設定されます。Webサーバーが要求を認証するにはこの情報が必要です。

UTL_HTTP.SET_CREDENTIALプロシージャを使用すると、資格証明オブジェクトを渡してHTTP認証を設定できます。資格証明オブジェクトはスキーマ・オブジェクトであるため、権限のあるユーザーのみがアクセスでき、資格証明を制御するためのスキーマ・レベルの権限を構成できます。資格証明オブジェクトの受渡しは、認証に使用するユーザー名/パスワード/キーを格納および管理するための適切で安全な方法です。

UTL_HTTP.SET_CREDENTIALプロシージャは、UTL_HTTP.SET_AUTHENTICATIONプロシージャのかわりに安全で便利なプロシージャです。


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

前述の例に示すように、SET_AUTHENTICATIONプロシージャを起動する場合は、PL/SQL仮パラメータの一部としてユーザー名/パスワードをクリア・テキストで渡す必要があります。ユーザー名/パスワードを様々なPL/SQL自動化またはcronスクリプトに埋め込む必要がある場合があります。クリア・テキスト・パスワードを渡すことは、 UTL_HTTP.SET_CREDENTIALプロシージャで解決されるコンプライアンスの問題です。

詳細は、SET_AUTHENTICATIONプロシージャおよびSET_AUTHENTICATION_FROM_WALLETプロシージャを参照してください。

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);

SET_CREDENTIALプロシージャで資格証明オブジェクトを渡す例:

  • 資格証明オブジェクトを作成します。

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

    これにより、格納されたユーザー名/パスワードのペアを作成する資格証明オブジェクトが作成されます。

    詳細は「CREATE_CREDENTIALプロシージャ」を参照してください。

    詳細は、スケジューラ・ジョブ資格証明の指定を参照してください。

  • 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;
    

    この例では、最初にBEGIN_REQUESTプロシージャを起動してリクエストを作成し、SET_CREDENTIALプロシージャを起動してHTTPリクエスト・ヘッダーにHTTP認証情報を設定します。Webサーバーが要求を認証するにはこの情報が必要です。値l_http_requestはHTTPリクエスト、HTTP_CREDは資格証明名、BASICはHTTP認証スキームです。

詳細は、UTL_HTTPを参照してください。

Autonomous DatabaseでのUTL_HTTPの制限の詳細は、Autonomous DatabaseのPL/SQLパッケージ・ノートを参照してください。

Oracle APEXまたはデータベース・アクションを使用したHTTPリクエストの送信に関するノート

Oracle APEXのSQLコマンドまたはデータベース・アクションのSQLワークシートを使用して複数の順次SQLコマンドを実行すると、前の文の状態を保存しない様々なデータベース・セッションでコマンドを実行できます。この動作は、データベースへの永続接続を維持するSQL*PlusやSQL DeveloperなどのデスクトップSQLクライアントとは異なります。

Autonomous DatabaseインスタンスへのOracle APEX SQLコマンドおよびデータベース・アクションSQLワークシートの発行はステートレスです。つまり、個々のSQL文およびPL/SQL文を実行すると、ウォレットを使用するコマンドを発行するときなどに、データベース・メモリーの状態が保存されますが、次の文を実行する前に状態がクリアされる場合があります。

Autonomous Databaseに送信するSQLコマンドの文実行間でデータベース・メモリーの状態を維持するステップは、次の表を参照してください。

SQLコマンド・ツール ブロックとしての文の発行
データベース・アクションSQLワークシート
  • すべての文を選択し、「文の実行」をクリックします
  • 何も選択せず、「SQLスクリプトとして実行」をクリックします
Oracle APEX SQLコマンド

APEX SQLコマンドでは、個々の文の実行のみがサポートされます。複数の文を実行する場合は、1つのPL/SQL無名ブロックで文をラップする必要があります。APEX SQLコマンドでブロックを実行するには、「実行」をクリックします。

たとえば、次のコード・ブロックを使用して、顧客管理Walletを使用するutl_http.request()コマンドを実行します。

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

これを、1つのコード・ブロックとしてではなく、utl_http.set_wallet()コマンドおよびutl_http.request()文を個別に実行すると失敗する可能性のある2つの連続した文と比較します。

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