機械翻訳について

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

Autonomous DatabaseからWebサービスを呼び出すオプションについて説明します。

Autonomous DatabaseからWebサービスを呼び出すためのオプションは、次のとおりです:

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

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

プロキシを使用したプライベート・サイトへの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 DatabaseUTL_HTTPの制限の詳細は、「Autonomous DatabaseのPL/SQLパッケージ・ノート」を参照してください。

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

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

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

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

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

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

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

Oracle APEX Autonomous Databaseインスタンスへの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;