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_HTTP
、DBMS_LDAP
、UTL_SMTP
またはUTL_TCP
のプロシージャで顧客管理ウォレットを使用できます。詳細は、顧客管理Walletを使用した外部コールの作成を参照してください。
Autonomous DatabaseでのUTL_HTTP
の制限の詳細は、PL/SQLパッケージ・ノートAutonomous Databaseを参照してください。
トピック
- パブリック・ホストへのHTTPリクエストの送信
UTL_HTTP
を使用してパブリック・ホストにHTTPリクエストを送信するための詳細を提供します。 - プライベート・ホストへのHTTPリクエストの送信
UTL_HTTP
を使用してプライベート・ホストにHTTPリクエストを送信するステップについて説明します。 - プロキシを使用したプライベート・サイトへのHTTPリクエストの送信
Autonomous Databaseインスタンスがプライベート・エンドポイントにある場合、プロキシを使用してUTL_HTTP
でHTTPリクエストを送信できます。 - 資格証明オブジェクトを使用したHTTP認証の設定
資格証明オブジェクトをUTL_HTTP.SET_CREDENTIAL
プロシージャに渡す方法について説明します。 - Oracle APEXまたはデータベース・アクションを使用したHTTPリクエストの発行に関するノート
Oracle APEX SQLコマンドまたはデータベース・アクションのSQLワークシートを使用して複数の順次SQLコマンドを実行すると、コマンドは、前の文の状態を保存しない異なるデータベース・セッションで実行できます。この動作は、データベースへの永続的な接続を維持するSQL*PlusやSQL Developerなどのデスクトップ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
の制限の詳細は、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
リクエストを行うには:
-
ホストのアクセス制御リストを作成します。
たとえば:
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_CONNECTIONS
をPRIVATE_ENDPOINT
に設定した場合、このAPIではprivate_target
パラメータをTRUE
に設定する必要はありません。詳細は、プライベート・エンドポイントを使用したアウトバウンド接続のセキュリティの強化を参照してください。 -
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
でプロキシ・サーバーを使用するには:
UTL_HTTP.SET_PROXY
を使用してプロキシ・サーバーを設定するためのノート:
-
DBMS_CLOUD
リクエストは、UTL_HTTP.SET_PROXY
で設定したプロキシ・サーバーを受け入れません。これには、DBMS_CLOUD.SEND_REQUEST
およびDBMS_CLOUD.CREATE_EXTERNAL_TABLE
、DBMS_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ワークシート |
|
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;