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の制限の詳細は、PL/SQLパッケージ・ノートAutonomous Databaseを参照してください。

トピック

パブリック・ホストへの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の制限の詳細は、PL/SQLパッケージ・ノートAutonomous Databaseを参照してください。

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

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

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

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

  • ソース・データベースとターゲット・ホストは、ペアになっている異なるOracle Cloud Infrastructure VCNにあります。

  • ターゲット・ホストが、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の制限の詳細は、PL/SQLパッケージ・ノートAutonomous Databaseを参照してください。

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

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

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

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

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

  • ソース・データベースとプロキシ・サーバーは、ペアになっている異なるOracle Cloud Infrastructure VCNにあります。

  • プロキシ・サーバーは、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の制限の詳細は、PL/SQLパッケージ・ノートAutonomous Databaseを参照してください。

資格証明オブジェクトを使用した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の制限の詳細は、PL/SQLパッケージ・ノートAutonomous Databaseを参照してください。

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;