クラウド・ファンクションおよび外部プロシージャの起動
オンプレミスのOracle Database (Enterprise、Standard、Express、Personal Editions)では、PL/SQL、JavaまたはCでユーザー定義ファンクションを記述して、SQLまたはSQL組込みファンクションにはない機能を提供できます。これらのユーザー定義ファンクションは、式が発生する可能性があるSQL文で起動できます。「ユーザー定義関数について」を参照してください。
Oracle Database 19c以降では、SQLのEmbedded Python実行機能を使用して、Pythonスクリプトを作成、格納および実行できます。OML4Pyを使用した埋込みPythonの実行を参照してください。
Oracle Autonomous AI Database on Dedicated Exadata Infrastructureは、OCI Functionsなどのサーバーレス・コンピュート・サービスを呼び出すSQL Functionsを記述できるようにすることで、ユーザー定義のファンクション機能をクラウドに拡張しますまた、AWSラムダ関数、または外部プロシージャ(C/C++ルーチン、シェルまたはPythonスクリプトを含む)は、Autonomous AI Databaseの外部にあるOCIコンピュートVMで実行されます。
クラウド関数および外部プロシージャについて
ユーザー定義関数を使用すると、データベース内のPL/SQLまたはSQLコードから外部で使用可能な関数を起動できます。ユーザー定義関数を使用して、次の外部関数を起動できます。
-
Oracle Cloud Infrastructure Functions: Oracle Cloud Infrastructure Functionsは、フルマネージドのマルチテナント、スケーラビリティの高いオンデマンドのFunctions-as-a-Serviceプラットフォームです。Oracle Cloud Infrastructure FunctionsはエンタープライズグレードのOracle Cloud Infrastructure上に構築されており、Fn Projectオープン・ソース・エンジンによって強化されています。詳細は、OCI関数の概要を参照してください。
-
AWSラムダ関数: AWSラムダは、サーバーのプロビジョニングや管理を行わずに、ほぼすべてのアプリケーションまたはバックエンド・サービスに対してコードを実行できる、サーバーレスのイベント駆動型コンピュート・サービスです。詳細は、「AWSラムダ」を参照してください。
-
外部プロシージャ: 外部プロシージャは、第3世代言語(Cなど)で記述されたファンクション、またはSQLファンクションまたはPL/SQLプロシージャまたはファンクションとして起動できるOSシェル・スクリプトまたはPythonスクリプトです。詳細は、外部プロシージャとはを参照してください。
OCI Cloud FunctionsのSQL関数としての起動
専用Exadataインフラストラクチャ上のAutonomous AI DatabaseでOCIクラウド関数をSQL関数として起動するステップを示します。
これらのステップに進む前に、OCIテナンシおよびコンパートメントにOCIファンクションを作成してデプロイしたと想定しています。詳細は、OCI関数を参照してください。
OCIファンクションを操作したら、DBMS_CLOUDおよびDBMS_CLOUD_FUNCTION PL/SQL APIを使用して、APIエンドポイントを介してそれぞれのクラウド・ファンクションを参照およびコールするSQLラッパー・ファンクションのカタログをAutonomous AI Databaseに作成します。DBMS_CLOUD_FUNCTION APIを使用して、データベース・アプリケーションからファンクションを管理します。
-
DBMS_CLOUD.CREATE_CREDENTIALプロシージャを使用して資格証明を作成します。
OCIテナンシ・ユーザーのAPI秘密キー(APIキーの作成時にダウンロードしたdot-pemファイルのコンテンツ)を、資格証明オブジェクト、キーのフィンガープリント、テナンシOCIDおよびユーザーOCIDとして指定します。必要なキーとOCIDを参照してください。
SET DEFINE OFF BEGIN DBMS_CLOUD.CREATE_CREDENTIAL ( credential_name => 'OCI_CRED', -- provide a string as the name user_ocid => 'user_ocid', -- provide the OCID string for the user, obtained from OCI Console User Profile tenancy_ocid => 'tenancy_ocid', -- provide the OCID string for the tenancy, obtained from OCI Console User Profile private_key => 'private_key', -- provide the content of the dot-pem file that you downloaded when you created the API Key fingerprint => 'fingerprint' -- provide the fingerprint string for the API key ); END; /これにより、OCI_CRED資格証明オブジェクトが作成されます。
詳細は、「CREATE_CREDENTIALプロシージャ」を参照してください。
-
DBMS_CLOUD_FUNCTION.CREATE_CATALOGプロシージャを使用してカタログ・オブジェクトを作成します。
カタログは、APIエンドポイントを介してそれぞれのクラウド・ファンクションを参照およびコールするラッパー・ファンクションのコレクションです。資格証明オブジェクト、クラウド・サービス・プロバイダ名(この例ではOCI)、OCIリージョンID (この例ではPHX)、およびOCIファンクションが配置されているOCIコンパートメントIDを指定します。
BEGIN DBMS_CLOUD_FUNCTION.CREATE_CATALOG ( credential_name => 'OCI_CRED', catalog_name => 'OCI_DEMO_CATALOG', service_provider => 'OCI', cloud_params => '{"region_id":"phx", "compartment_id":"compartment_id"}' ); END; /これにより、OCI_DEMO_CATALOGカタログ・オブジェクトが作成されます。
詳細は、CREATE_CATALOGプロシージャを参照してください。DBA_CLOUD_FUNCTION_CATALOGビューおよびUSER_CLOUD_FUNCTION_CATALOGビューを問い合せて、データベース内のすべてのクラウド・ファンクション・カタログのリストを取得できます。
-
DBMS_CLOUD_FUNCTION.LIST_FUNCTIONSプロシージャを使用して、カタログ内のすべてのクラウド・ファンクションをリストできます。
SET PAGESIZE 1000 VAR function_list CLOB; BEGIN DBMS_CLOUD_FUNCTION.LIST_FUNCTIONS ( credential_name => 'OCI_CRED', catalog_name => 'OCI_DEMO_CATALOG', function_list => :function_list ); END; /SELECT JSON_QUERY (:function_list, '$' RETURNING VARCHAR2(32676) pretty) AS search_results FROM dual;SEARCH_RESULTS ------------------------------------------------------------------------------------------------ [ { "functionName" : "create_par", "functionId" : "ocid.funfc.oc1.phx.aaaa_example", "invokeEndpoint" : "https://dw.us.func.oci.oraclecloud_example.com" }, { "functionName" : "fintech", "functionId" : "ocid.funfc.oc1.phx.bbbb_example" "invokeEndpoint" : "https://dw.us.func.oci.oraclecloud.com_example" }, { "functionName" : "jwt_codec", "functionId" : "ocid.funfc.oc1.phx.jwt_code_example", "invokeEndpoint" : "https://dw.us.func.oci.oraclecloud_example.com" }, { "functionName" : "oci-objectstorage-create-par-python", "functionId" : "ocid.funfc.oc1.phx.aaaaaaaas_example", "invokeEndpoint" : "https://dw.us.func.oci.oraclecloud_example.com" }, { "functionName" : "run_dbt", "functionId" : "ocid.funfc.oc1.phx.aaaaaaaav_example", "invokeEndpoint" : "https://dw.us.func.oci.oraclecloud_example.com" } ]詳細は、LIST_FUNCTIONSプロシージャを参照してください。
-
SQLラッパー関数を作成します。次の2つの方法のいずれかを使用して、カタログからラッパーSQL関数を作成し、それぞれのクラウド関数をコールできます。
-
DBMS_CLOUD_FUNCTIONを使用できます。カタログ・オブジェクトからSQLラッパーを生成するSYNC_FUNCTIONSプロシージャ。
-
DBMS_CLOUD_FUNCTIONを使用して、個々のラッパー・ファンクションを手動で作成できます。CREATE_FUNCTIONプロシージャ。
-
SYNC_FUNCTIONS: SYNC_FUNCTIONSは、カタログ内のラッパー・ファンクションを、カタログが作成されたリージョン、コンパートメントおよびテナンシで定義されたクラウド・ファンクションの完全なリストとともに自動的に同期(作成または更新)します。
BEGIN DBMS_CLOUD_FUNCTION.SYNC_FUNCTIONS ( catalog_name => 'OCI_DEMO_CATALOG' ); END; /これにより、カタログに新しいファンクションを追加したり、カタログから削除されたファンクションのラッパーを削除するためのPL/SQLラッパーが作成されます。
特定の現行ユーザーについて、次の問合せを使用して同期結果を検証できます。
SHOW userTEST_USERSELECT object_name FROM sys.all_objects WHERE owner='TEST_USER' AND object_type='FUNCTION';OBJECT_NAME -------------------------------------------------------------------------------- CREATE_PAR FINTECH JWT_CODEC OCI-OBJECTSTORAGE-CREATE-PAR-PYTHON RUN_DBT詳細は、SYNC_FUNCTIONSプロシージャを参照してください。
-
CREATE_FUNCTION: DBMS_CLOUD.CREATE_FUNCTIONを使用して、それぞれのクラウド・ファンクションをコールするSQLファンクションをカタログに手動で作成できます。
VAR function_args CLOB; EXEC :function_args := TO_CLOB('{"command": "VARCHAR2", "value": "VARCHAR2"}'); BEGIN DBMS_CLOUD_FUNCTION.CREATE_FUNCTION ( credential_name => 'OCI_CRED', catalog_name => 'OCI_DEMO_CATALOG', function_name => 'FINTECH_FUNCTION', function_id => 'ocid1.fnfunc.oc1.phx.aaabbbcccc_example', input_args => :function_args ); END; /これにより、エンドポイントがFUNCTION_IDパラメータによって参照されるそれぞれのクラウド関数への参照として、OCI_DEMO_CATALOGカタログにFINTECH_FUN関数が作成されます。カタログ内の関数を引数とともに呼び出すと、OCI内の対応するクラウド関数が実行され、クラウド関数によって返される出力が提供されます。
ノート: OCI関数の名前は、FINTECH_FUNCTIONとまったく異なる場合があります。function_idパラメータへの入力として指定したOCI関数のOCIDのみが、この参照を作成するために考慮されます。
-
カスタム戻り型およびレスポンス・ハンドラを使用したCREATE_FUNCTION: ファンクションを手動で作成すると、カスタム戻り型およびレスポンス・ハンドラを作成できます(次の例を参照)。
最初に、戻り型と関数のレスポンス・ハンドラを作成します。
CREATE OR REPLACE TYPE fintech_rt AS OBJECT ( status VARCHAR2(1000), output CLOB ); /Type created.CREATE OR REPLACE FUNCTION fintech_response_handler(function_response IN CLOB) RETURN fintech_rt IS l_comp fintech_rt; l_json_obj JSON_OBJECT_T; status VARCHAR2(1000); output CLOB; BEGIN l_json_obj := JSON_OBJECT_T.parse(function_response); status := l_json_obj.get('STATUS').to_string; output := l_json_obj.get('RESPONSE_BODY').to_string; l_comp := fintech_rt(status,output); RETURN l_comp; END; /Function created.次に、SQLラッパー・ファンクションの手動作成時に、このタイプおよびレスポンス・ハンドラを使用します。
VAR input_param CLOB; VAR l_return_type VARCHAR2(100); VAR l_response_handler VARCHAR2(1000); -- Define function parameters exec :input_param := TO_CLOB('{"command": "VARCHAR2", "value": "VARCHAR2"}');PL/SQL procedure successfully completed.exec :l_return_type := 'fintech_rt';PL/SQL procedure successfully completed.exec :l_response_handler := 'fintech_response_handler';PL/SQL procedure successfully completed.BEGIN DBMS_CLOUD_FUNCTION.CREATE_FUNCTION ( credential_name => 'OCI_CRED', catalog_name => 'OCI_DEMO_CATALOG', function_name => 'FINTECH_FUNCTION', function_id => 'ocid1.fnfunc.oc1.phx.aaabbbcccc_example', input_args => :input_param, return_type => :l_return_type, response_handler => :l_response_handler ); END; /DBA_CLOUD_FUNCTIONビュー・ビューおよびUSER_CLOUD_FUNCTIONビュー・ビューを問い合せて、データベース内のすべてのファンクションのリストを取得できます。
詳細は、CREATE_FUNCTIONプロシージャを参照してください。
関数が作成されると、関数をDESCRIBEしてその戻り詳細を取得できます。
DESC fintech_fun COLUMN STATUS format a30 COLUMN OUTPUT format a30その後、ファンクションを起動して、入力パラメータの値を指定できます。
SET SERVEROUTPUT ON DECLARE l_comp fintech_rt; BEGIN l_comp := fintech_fun(command=>'tokenize',value => 'PHI_INFORMATION'); DBMS_OUTPUT.put_line ('Status of the function = '|| l_comp.status); DBMS_OUTPUT.put_line ('Response of the function = '|| l_comp.output); END; /これにより、
OCI_DEMO_CATALOGカタログのファンクション参照oocid1.funfn.oci.phx.aaaaaa_exampleをコールして、fintech_funクラウド・ファンクションが起動されます。
-
-
DROP_FUNCTIONプロシージャを使用して、既存のファンクションを削除できます。
BEGIN DBMS_CLOUD_FUNCTION.DROP_FUNCTION ( catalog_name => 'OCI_DEMO_CATALOG', function_name => 'fintech_fun'); END; /これにより、
OCI_DEMO_CATALOGカタログからFINTECH_FUNファンクションが削除されます。詳細は、DROP_FUNCTIONプロシージャを参照してください。
-
既存のカタログは、DROP_CATALOGプロシージャを使用して削除できます。
BEGIN DBMS_CLOUD_FUNCTION.DROP_CATALOG ( catalog_name => 'OCI_DEMO_CATALOG' ); END; /これにより、データベースから
OCI_DEMO_CATALOGが削除されます。詳細は、DROP_CATALOGプロシージャを参照してください。
SQL関数としてのAWSラムダ関数の起動
Autonomous AI Database on Dedicated Exadata InfrastructureでAWSリモート関数をSQL関数として呼び出すステップを示します。
これらのステップに進む前に、AWSテナンシにAWSラムダ・ファンクションを作成してデプロイしたと想定しています。詳細は、AWS Lambdaを参照してください。
AWSラムダ関数にアクセスするには、Oracle Cloud Infrastructureで必要なポリシーを構成する必要があります。詳細は、AWS LambdaリソースにアクセスするためのIAMポリシーの作成およびラムダに対するリソースベースのポリシーの使用を参照してください。
AWSラムダ・ファンクションが機能したら、DBMS_CLOUDおよびDBMS_CLOUD_FUNCTION PL/SQL APIを使用して、APIエンドポイントを介してそれぞれのクラウド・ファンクションを参照およびコールするSQLラッパー・ファンクションのカタログをAutonomous AI Databaseに作成します。DBMS_CLOUD_FUNCTION APIを使用して、データベース・アプリケーションからファンクションを管理します。
-
資格証明オブジェクトとしてAWS秘密キーを使用して、プロシージャDBMS_CLOUD.CREATE_CREDENTIALを使用して資格証明を作成します。
SET DEFINE OFF BEGIN DBMS_CLOUD.CREATE_CREDENTIAL ( credential_name => 'AWS_CRED', username => 'access_key_ID', -- ID of Secret Key password => 'secret_access_key' -- Secret Key password ); END; /これにより、
AWS_CRED資格証明オブジェクトが作成されます。詳細は、「CREATE_CREDENTIALプロシージャ」を参照してください。
-
DBMS_CLOUD_FUNCTION.CREATE_CATALOGプロシージャを使用してカタログ・オブジェクトを作成します。
カタログは、APIエンドポイントを介してそれぞれのクラウド・ファンクションを参照およびコールするラッパー・ファンクションのコレクションです。資格証明オブジェクト、クラウド・サービス・プロバイダ名(この例ではAWS)およびAWSラムダ関数が配置されているAWSリージョンID (この例では
ap-northeast-1)を指定します。BEGIN DBMS_CLOUD_FUNCTION.CREATE_CATALOG ( credential_name => 'AWS_CRED', catalog_name => 'AWS_DEMO_CATALOG', service_provider => 'AWS', cloud_params => '{"region_id":"ap-northeast-1"}' ); END; /これにより、
AWS_DEMO_CATALOGカタログ・オブジェクトが作成されます。詳細は、CREATE_CATALOGプロシージャを参照してください。DBA_CLOUD_FUNCTION_CATALOGビューおよびUSER_CLOUD_FUNCTION_CATALOGビューを問い合せて、データベース内のすべてのカタログのリストを取得できます。
ステップ/操作のリスト(LIST_FUNCTIONSプロシージャ、SYNC_FUNCTIONSプロシージャ、CREATE_FUNCTIONプロシージャ、DROP_FUNCTIONプロシージャおよびDROP_CATALOGプロシージャ)は、OCIクラウド関数での説明と同じ使用方法を持ちます。OCI Cloud FunctionsのSQL関数としての起動を参照してください。
外部プロシージャの概要
外部プロシージャの概要と、専用インフラストラクチャ上のAutonomous AI Databaseアプリケーションでのそれらの使用について説明します。
外部プロシージャは、第3世代言語で記述され、SQLファンクションまたはPL/SQLプロシージャまたはファンクションとして起動されるファンクションです。SQLおよびPL/SQLは、データベースでの高速で効率的なデータおよびトランザクション処理に最適です。外部プロシージャは、専用の外部VMで計算およびメモリー集中型のタスクを実行し、結果をデータベースに戻すことで、SQLおよびPL/SQLを補完できます。このようなタスクの典型的な例は、Linux OSに計算ライブラリが存在する(データプラットフォームに簡単に移植できない)、オフラインデータ分析、リアルタイムデバイスとプロセスの制御など、科学的およびエンジニアリング上の問題です。
ユーザー定義関数を使用して、Autonomous AI Databaseで外部プロシージャを起動して使用できます。これらのプロシージャをデータベース内で実行するのではなく、Cプログラム、シェル・スクリプトおよびPythonスクリプトを実行するためのコンテナおよびランタイムとともにプロビジョニングされた専用のカスタムOCI Linux VMに、データベースからのリモートSQL実行を有効にするためのOracle SQL\*Netライブラリとともに実行可能コードを配置します。
ノート:外部プロシージャのリモート・ホストは、OCI Marketplaceからプロビジョニングされ、適切なOCI Virtual Cloud Network (VCN)で構成されたOCI Linux EXTPROC VMである必要があります。
OCI Linux EXTPROC VMでのリモート実行は、バージョン19.30以降のOracle Public Cloud上の専用Exadataインフラストラクチャ上のAutonomous AI Databaseと、バージョン23.26.1以降のOracle Database 26aiでのみサポートされています。この機能は、Exadata Cloud@Customer (ExaCC)上のAutonomous AI Database on Dedicated Exadata Infrastructureデータベースではまだサポートされていません。
外部プロシージャおよびスクリプトのシステム構成
EXTPROC VMをプロビジョニングするステップと、外部プロシージャを実行するためにOCIネットワークおよびコンピュートを構成するステップを示します。
少なくとも、アーキテクチャは次のリソースで構成されます。
-
OCIテナンシのOCIコンパートメントにプロビジョニングされたOCI Virtual Cloud Network。
-
Autonomous AI Databaseは、Autonomous Exadata VMクラスタ(AVMC)からプロビジョニングされたAutonomous Container Database (ACD)でインスタンスとして作成され、Oracle Public Cloud上のExadata Infrastructureに作成されます。
-
OCI MarketplaceからのEXTPROCスタックの一部としてプロビジョニングされたEXTPROC VM。
ベスト・プラクティスとして、AVMクラスタはVCNのプライベート・サブネットに配置されます。デフォルト・ルート表およびVCNのセキュリティ・リストは、OCIテナンシのAutonomous AI Database要件に従って構成されます。VCNには、デフォルト・ルート表と1つのデフォルト・セキュリティ・リストがあり、すべてのルーティング・ルールおよびセキュリティ・ルールを定義できます。Autonomous AI Databaseアプリケーションおよびプライベート・サブネット内の他のリソースにインターネットへのエグレス・アクセスが必要な場合は、オプションで、VCNをNATゲートウェイで構成できます。
ExtProc VMをこのトポロジに導入する場合は、次の最小限のOCIネットワーキング構成ステップに従います。
-
ExtProc VMにログインして、C/C++で実装された外部プロシージャを使用して共有ライブラリ(ドットソ)を構築し、VMおよびコンテナを検査および構成し、その他の操作を実行できる必要があります。
-
一般的な演習では、EXTPROC VMをVCNのパブリック・サブネットに配置するように構成します。この場合、VCNにインターネット・ゲートウェイを作成する必要があります(管理者がまだ構成していない場合)。
ノート: EXTPROC VMは、CIDR範囲が10.x.x.xのサブネット内に存在しないでください。EXPROC VMのIPアドレスが10.x.x.xの場合、Autonomous AI Databaseと通信できません。
-
ポート22を介したVMへのSSHログイン・アクセスを許可するには、VCNのセキュリティ・リストにイングレス・ルールを定義する必要があります。また、VCNのセキュリティ・リストにエグレス・ルールを定義して、ADBDが宛先ポート16000へのアクセスを、通常、特定の宛先ポートまたはすべての宛先ポートにできるようにする必要があります。OCI Networkingのアクセスおよびセキュリティを参照してください。
-
EXTPROC VMスタックのプロビジョニングの一環として、AVMCのすべてのクライアントIPアドレスを指定します。これらのIPv4クライアントIPアドレスは、AVMクラスタのOCIダッシュボードから取得します。
-
その後、プロビジョニング・ツールによって、nsg_aclという名前のネットワーク・セキュリティ・グループ(NSG)が自動的に作成されます。このNSGには、ポート16000宛先にアクセスできる唯一のソースとしてAutonomous Database専用クライアントIPアドレスを許可するイングレス・ルールがあります。
高度なトピック
-
ExtProc VMおよびAutonomous AI Databaseをホストするサブネットが同じVCN内にある場合は、VCNのルーティング表に特別なルーティング・ルールを指定する必要はありません。ExtProc VMとADBDをホストするサブネットが異なるVCNsにある場合は、VCNピアリングを実装する必要があります。VCNピアリングを参照してください。
-
ExtProc VMをプライベート・サブネットに構成することを選択した場合、要塞/ジャンプオフ・サーバーを介してVMにログインし、ExtProc VMへのイングレスのみを有効にし、Autonomous AIデータベースなどのプライベート・サブネット内の他のリソースへのセキュアなアクセスを有効にできる必要があります。詳細は、OCIネットワーキング・ガイドを参照してください。
外部プロシージャを使用したユーザー定義関数の実装
-
OCI MarketPlaceからのEXTPROC VMのプロビジョニングおよび構成
a. OCIコンソール(http://cloud.oracle.com)にサインインします。詳細は、Oracle Cloud Infrastructure Consoleへのサインインを参照してください。
b. Oracle Cloud Infrastructureの左側のナビゲーション・メニューから、「マーケットプレイス」にドロップダウンし、「マーケットプレイス」で「すべてのアプリケーション」をクリックします。
c. 検索バーに「EXTPROC」と入力し、「検索」をクリックします。2つのウィジェット(1つはStack、もう1つはImageというラベル)が表示されます。
d. 「スタック」という名前のウィジェットを選択します(これは重要です)。これにより、スタックに関するスタックのバージョン、リリース日およびリリース・ノートを示すOracle Autonomous Database EXTPROC Agentの詳細ページに移動します。このページで、「スタックの起動」ボタンをクリックします。これにより、次の「スタックの起動」ページが表示されます。
e. 「スタックの起動」ページで、次の手順を実行します。
-
「バージョン」ドロップダウン・リストから、スタックのパッケージ・バージョンを選択します。
-
「コンパートメント」ドロップダウン・リストから、EXTPROC VMをプロビジョニングするコンパートメントの名前を選択します。特定の理由がないかぎり、ADBDと同じコンパートメントを選択します(ベスト・プラクティスとして、リソースのルート・コンパートメントは避けてください)。
-
条件に同意し、「スタックの起動」をクリックします。
「スタックの作成」ウィザードの次のページに移動します。
f. このページでは、name、description、Compartmentname、TerraformバージョンおよびTag情報を指定します。コンパートメント名は必須であり、最も重要なことは、このページのウィザードへの入力です。「次」をクリックします。
g これにより、EXTPROC VM (EXTPROCエージェントとも呼ばれる)の構成変数ページに移動します。このページの最初の部分では、EXTPROCライブラリおよびウォレット・パスワードに関する情報が収集されます。
-
外部ライブラリの場合、専用インフラストラクチャ上のAutonomous AI Databaseから起動できるようにするライブラリのリストをカンマ(、)で区切って指定します。これらの共有ライブラリには、C/C++で記述された外部プロシージャが含まれます。このプロシージャは、VM自体に(アーキテクチャおよび環境と一致するように)理想的にコンパイルおよび構築されます。
ノート: EXTPROC VMの作成中である場合は、ここで指定する共有ライブラリの名前を書き留めます。VMが使用可能で、C/C++で外部プロシージャを開発する場合は、前述の正確な名前でライブラリ/ライブラリをコンパイルおよびビルドすることを忘れないでください。
-
「Walletパスワード」に、ExtProc VMで作成されるウォレット・ファイルのパスワードを指定します。Autonomous AI Database on Dedicated InfrastructureとEXTPROC Agent VMの間の相互TLS認証のために、ウォレットおよび自己署名証明書が生成されます。
こんにちは。構成変数ページの2番目の部分には、EXTPROC VMのネットワーク構成が含まれます。
-
「コンパートメント」で、プルダウン・メニューからVCNのコンパートメント名を選択します。前述の例では、これはadbdとして示されています。異なる(プライベートおよびパブリック)サブネットにある場合でも、Autonomous AI DatabaseとEXTPROC VMが同じVCNにコロケーションされることが理想的です。
-
「ネットワーク戦略」で、「既存のVCNおよびサブネットの使用」を選択します。前の項で説明したように、ExtProc開発作業のこの段階では、VCN、AVMCおよびAutonomous AI Databaseでシステム・アーキテクチャが整備されている場合があります。
Note: The other choice is to create a new VCN and Subnet with its own configuration strategy for the EXTPROC VM Agent.If you choose to place the EXTPROC VM in a VCN different than that of the Autonomous AI Database, you must peer the VCNs.
-
EXTPROCエージェント・アクセス・タイプの次のエントリをスキップします。このフィールドは、専用Exadataインフラストラクチャ上のAutonomous AI Databaseには適用されません。
i 次に、「プライベート・エンドポイントIPアドレス」というラベルのフィールドに、データベースが構成されているAVMCのすべてのクライアントIPアドレスを入力します。これらのクライアントIPアドレスは、AVMCのOCIコンソール・ダッシュボードから取得できます。
-
Virtual Cloud Networkには、EXTPROC VMエージェントを作成するVCNの名前を指定します。
-
EXTPROCサブネットには、EXTPROC VMエージェントを作成するサブネットの名前を指定します。
[j] 次に、VCNおよびサブネットの詳細を指定します。
ノート: EXTPROC VMは、CIDR範囲が10.x.x.xのサブネット内に存在しないでください。EXPROC VMのIPアドレスが10.x.x.xの場合、Autonomous AI Databaseと通信できません。
k。構成ページの最後の部分には、EXTPROC VM Agentの計算構成が含まれます。
-
「コンパートメント」で、プルダウン・メニューからコンパートメント名を選択します。トラブルシューティングを最小限に抑えるために、VMを専用インフラストラクチャ上のAutonomous AI Database、VCNおよびサブネットと同じコンパートメントに配置することをお薦めします。
-
「シェイプ」、「OCPUの数」および「メモリー・サイズ(GB)」に、外部プロシージャのワークロード特性に基づいて値を入力します。
-
「SSHキーの追加」では、Linux OS、MacOSまたはWindowsシステムでSSH公開キーおよび秘密キー・ファイルを生成します。端末ウィンドウを開き、次のいずれかのコマンドを実行します(ED25519は最新の安全なアルゴリズムで、古いシステムではRSA暗号化アルゴリズムをサポートしています)。
ssh-keygen -t ed25519 -C "your_email@example.com" (OR) ssh-keygen -t rsa -b 4096 -C "your_email@example.com"これにより、秘密キー・ファイルssh-key-<date-time-id>.keyおよび公開キー・ファイルssh-key-<date-time-id>.key.pubが生成されます。SSH公開キーの内容をウィンドウにコピー・ペーストするか、.pubファイルをウィンドウにドラッグ・ドロップします。
-
「次」をクリックします。
l これにより、レビュー・ページに移動します。すべての入力を確認し、「適用の実行」チェック・ボックスを選択して、「作成」をクリックします。
これにより、OCI Resource Managerが起動され、EXTPROC VMスタックが作成されます。ORMジョブが正常に完了すると、EXTPROC VMが作成されて実行されます。
-
-
DBMS_CLOUD_FUNCTION API入力用のEXTPROC VMシステム情報を収集します
データベースから外部プロシージャを起動できるようにするには、Autonomous AI DatabaseのDBMS_CLOUD_FUNCTION APIへの入力としてEXTPROC VMシステム情報を指定する必要があります。
a. Oracle Cloud Infrastructureの左側のナビゲーション・メニューから、「Compute」にドロップダウンし、EXTPROC VMプロビジョニング用に指定したコンパートメントを選択し、コンパートメント内のすべてのVMをリストするダッシュボードを確認します。ORMジョブにより、標準名EXTPROC-agentまたはEXTPROC-agent-<setofnumbers>のEXTPROC VMが作成されます。これはEXTPROC VMインスタンスのホスト名になります。このエントリをクリックすると、システムの詳細(IPV4パブリック・アドレスとプライベート・アドレス(IPv4とIPv6)、サブネットおよびイメージの詳細)を示すページが表示されます。
b. ExtProcスタックの作成時に指定したSSHキーとIPアドレスを使用して、ExtProc VMにログインします。VMのデフォルトのユーザーはopc. sudoで、ユーザーoracleになります。
~ ssh -i ssh-key-<date-time-id>.key opc@<Public-IP-Address>Wed Nov 19 10:46:25 GMT 2025: EXTPROC Agent intialization completed. Activate the web console with: systemctl enable --now cockpit.socket Last login: Thu Nov 20 20:10:54 2025 from <client-IP-address>[opc@extproc-agent-170798 ~]$ whoamiopc [opc@extproc-agent-170798 ~]$ sudo su - oracle Last login: Wed Nov 19 19:07:24 GMT 2025 on pts/0EXTPROC VMには、Oracle SQL*Netリスナーを備えた実行中のPodmanコンテナがあります。コンテナ内では、sqlnet.ora、listener.oraなどの必要な構成ファイルを含むOracleクライアント環境と、Autonomous AI Databaseとのセキュアな通信のためのウォレット・ファイルを使用できます。
c. PL/SQL APIに必要なシステム情報を収集します(OSレベル、次にVMで構成されているPodmanコンテナから)。コンテナは、Oracle Listenerを実行して、Autonomous AI Database上のSQLおよびPL/SQLアプリケーションからリモート実行リクエストを受信し、外部プロシージャのランタイム実行エンジンです。
-
Linux OSから、EXTPROC VMホストのFQDN (完全修飾ドメイン名)。
-
Podmanコンテナから、リスナー・ステータスから、データベースがVMに接続するEXTPROC VM上のポート。
-
Podmanコンテナのsqlnet.ora仕様から、ウォレット・ファイルの場所を指定します。
-
orapkiツールを使用したウォレット・ファイルの検査から、ウォレット証明書の識別名(DN)パラメータ値。
[oracle@extproc-agent-170798 ~]$ hostname -f extproc-agent-170798.subnet-name.vcn-name.oraclevcn.com [oracle@extproc-agent-170798 ~]$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 86d81c4df6ff ghcr.io/oracle/adb-extproc:latest 23 hours ago Up 23 hours (healthy) adb-extproc [oracle@extproc-agent-170798 ~]$ podman exec -it 86d81c4df6ff bash (base) [oracle@extproc-agent-170798 admin]$ lsnrctl status LSNRCTL for Linux: Version 23.26.0.0.0 - for Oracle Cloud and Engineered Systems on 20-NOV-2025 09:25:54 Copyright (c) 1991, 2025, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 23.26.0.0.0 - for Oracle Cloud and Engineered Systems Start Date 19-NOV-2025 17:19:58 Uptime 0 days 16 hr. 5 min. 55 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/product/23.0.0.0/client_1/network/admin/listener.ora Listener Log File /u01/app/oracle/diag/tnslsnr/extproc-agent-170798/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=0.0.0.0)(PORT=16000))) Services Summary... Service "extproccontainer.com" has 1 instance(s). Instance "extproccontainer", status UNKNOWN, has 1 handler(s) for this service... The command completed successfully (base) [oracle@extproc-agent-170798 /]$ cd $ORACLE_HOME/network/admin (base) [oracle@extproc-agent-170798 admin]$ cat sqlnet.ora NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT) WALLET_LOCATION =(SOURCE = (METHOD = FILE)(METHOD_DATA = (DIRECTORY = /u01/app/oracle/wallets/extproc_wallet))) tcp.invited_nodes=(20.63.19.141,20.63.19.141,20.63.19.143,20.63.19.144) tcp.validnode_checking=yes (base) [oracle@extproc-agent-170798 admin]$ orapki wallet display -wallet /u01/app/oracle/wallets/extproc_wallet/cwallet.sso Oracle PKI Tool Release 23.0.0.0.0 - Production Version 23.0.0.0.0 Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved. Requested Certificates: User Certificates: Subject: CN=extproc-agent-170798 Trusted Certificates: Subject: CN=extproc-agent-170798 (base) [oracle@extproc-agent-170798 admin]$ exit exit前述の例では、DBMS_CLOUD_FUNCTION.CREATE_CATALOG APIに対して次の入力を収集しました。
-
FQDN +ポート番号によって形成される文字列は、
library_listener_urlパラメータの入力になります。この例では、'extproc-agent-170798.subnet-name.vcn-name.oraclevcn.com:16000'です。 -
sqlnet.oraには、VM内のウォレット・ファイルの場所(/u01/app/oracle/wallets/extproc_wallet/cwallet.sso)が含まれます。
tcp.invited_nodesのIPアドレス・リストを確認します。これには、EXTPROC VMスタックの作成時にネットワーク構成の入力として指定したクライアントIPアドレスのリストが含まれている必要があります。 -
証明書識別名(DN)は、
library_ssl_server_cert_dnパラメータ'CN=extproc-agent-170798'の入力になります。
-
-
Cライブラリを構築し、EXTPROC VMファイルシステム内の指定された場所に配置します
C関数をコーディングし、ビルドして、ExtProc Agent VMのファイル・システム内の指定されたディレクトリにライブラリを配置します。
ライブラリの名前は、ExtProcスタックの作成時に指定した名前と完全に一致する必要があります。間違って配置した場合は、次に示すように、ExtProcコンテナinitextproccontainer.oraファイルのEXTPROC_DLLSエントリ、またはExtProcスタックを作成したORM (Oracle Resource Manager)ジョブの「変数」セクションにあります。ライブラリをEXTPROCエージェントVMの
/u01/app/oracle/extproc_libsディレクトリにコピーする必要があります。- フル・ファイル・パス名(この例では/u01/app/oracle/extproc_libs/helloCextproc.so)は、DBMS_CLOUD_FUNCTION.CREATE_CATALOG()のパラメータlibrary_remote_pathへの入力です。
(base) [oracle@extproc-agent-170798 client_1]$ cat $ORACLE_HOME/hs/admin/initextproccontainer.ora SET TRACE_LEVEL=ON SET _EXTPROC_REMOTE=TRUE SET WHOAMI=FROMDOCKER SET LD_LIBRARY_PATH=/u01/app/oracle/product/23.0.0.0/client_1/lib:/u01/app/oracle/extproc_libs:/opt/conda/lib SET EXTPROC_DLLS=ONLY:/u01/app/oracle/product/extprocutils.so:/u01/app/oracle/product/23.0.0.0/client_1/lib/libgsfextproc.so:/u01/app/oracle/extproc_libs/helloCextproc.so SET PYTHONHOME=/opt/conda SET SCRIPTS_FOLDER_LOC_ENV=/u01/app/oracle/extproc_scripts SET TRACE_FILE_LOC_ENV=/u01/app/oracle/extproc_logs SET PYTHONPATH=/tmp:/u01/app/oracle/extproc_scripts (base) [oracle@extproc-agent-170798 client_1]$ exit [oracle@extproc-agent-170798 ~]$ cat > helloCextproc.c #include <stdio.h> const char* helloCextproc() { return ("\nHello C Extproc from FQDN: extproc-agent-170798.subnet-name.vcn-name.oraclevcn.com\n"); } ^D [oracle@extproc-agent-170798 ~]$ gcc -shared -fPIC -o /u01/app/oracle/extproc_libs/helloCextproc.so helloCextproc.c [oracle@extproc-agent-170798 ~]$ ls -al /u01/app/oracle/extproc_libs/ total 8 drwxr-xr-x. 2 oracle oinstall 30 Nov 19 11:14 . drwxr-xr-x. 6 root root 91 Nov 14 02:19 .. -rwxr-xr-x. 1 oracle oinstall 8184 Nov 19 11:14 helloCextproc.so [oracle@extproc-agent-170798 ~]$これにより、データベース・アプリケーションでカタログ/ライブラリ・オブジェクトを作成するために必要なすべてのパラメータ入力が完了します。
-
ExtProc VMからOCI Object Storageへのウォレット・ファイルのアップロード
自己署名ウォレットは、EXTPROCエージェント・アプリケーションの作成の一部として作成されます。このウォレットを使用すると、
Extprocエージェント・インスタンスにアクセスできます。EXTPROCエージェント・インスタンスでリモート・プロシージャを実行するには、Autonomous AI DatabaseとEXTPROCエージェントがMutual Transport Layer Security (mTLS)を使用して接続します。相互Transport Layer Security (mTLS)を使用する場合、クライアントは、標準のTLS 1.2を信頼できるクライアント認証局(CA)証明書とともに使用して、TCPS (セキュアTCP)データベース接続を介して接続します。
ノート:認証局(CA)によって発行されたパブリック証明書を取得して使用することもできます。
前提条件として、ウォレットをEXTPROCが実行されているVMの
/u01/app/oracle/extproc_walletディレクトリからOCIオブジェクト・ストレージにエクスポートする必要があります。ノート:
- ウォレット・ファイルを保護します。ウォレット・ファイルは、データベース・ユーザーIDおよびパスワードとともに、EXTPROCエージェント・インスタンスへのアクセスを提供します。ウォレット・ファイルを安全な場所に格納し、認可されたユーザーのみと共有します。
- ウォレット・ファイルの名前を変更しないでください。Object Storageのウォレット・ファイルには、
cwallet.ssoという名前を付ける必要があります。
-
カタログの作成、SQLファンクションの定義、およびSQLファンクションとしての外部プロシージャの起動
前のステップから、DBMS_CLOUD_FUNCTION APIでSQLまたはPL/SQLデータベース・アプリケーションからリモート・プロシージャを実行するために必要なすべての入力があります。
次に、オブジェクト・ストレージからEXTPROCエージェント・インスタンスの証明書を含むウォレット
cwallet.ssoをAutonomous AIデータベースのDIRECTORYにインポートします。ウォレット・ファイルcwallet.ssoを格納したオブジェクト・ストレージにアクセスするための資格証明を作成します。様々なオブジェクト・ストレージ・サービスのusernameおよびpasswordパラメータの詳細は、「CREATE_CREDENTIALプロシージャ」を参照してください。
データベースにDIRECTORYオブジェクトを作成し、DBMS_CLOUD.GET_OBJECT APIを使用してウォレットをディレクトリにダウンロードします。
SET DEFINE OFF BEGIN DBMS_CLOUD.CREATE_CREDENTIAL ( credential_name => 'OCI_CREDENTIAL', user_ocid => '<oci_user_ocid>', tenancy_ocid => '<oci_tenancy_ocid>', private_key => '<API-key-dot-pem-file-contents>', fingerprint => '<fingerprint-created-with-API-key>'); END; / CREATE DIRECTORY extprocwalletdir AS 'extprocwalletdir';Directory created.SELECT directory_name, directory_path FROM dba_directories WHERE directory_name LIKE '%EXTPROC%';DIRECTORY_NAME DIRECTORY_PATH ---------------- ------------------------------------------------------------------------- EXTPROCWALLETDIR /u02/data/dbfs/<adbd-name>/42E945D608E16DF9E0630301000AF88D/extprocwalletdirBEGIN DBMS_CLOUD.GET_OBJECT ( credential_name => 'OCI_CREDENTIAL', object_uri => 'https://objectstorage.us-ashburn-1.oraclecloud.com/p/aN.../n/zr.../b/bucket-name-20260129/o/cwallet.sso', directory_name => 'EXTPROCWALLETDIR' ); END; /次に、前のステップで収集した入力パラメータを使用して、ExtProcのCライブラリを表すデータベース内にライブラリ・オブジェクトを作成します。
BEGIN DBMS_CLOUD_FUNCTION.CREATE_CATALOG ( library_name => 'EXTPROC_LIBRARY', library_listener_url => 'extproc-agent-170798.subnet-name.vcn-name.oraclevcn.com:16000', library_wallet_dir_name => 'EXTPROCWALLETDIR', library_ssl_server_cert_dn => 'CN=extproc-agent-170798', library_remote_path => '/u01/app/oracle/extproc_libs/helloCextproc.so' ); END; /PL/SQL procedure successfully completed.SELECT catalog_name from DBA_CLOUD_FUNCTION_CATALOG WHERE catalog_name LIKE '%EXTPROC%';CATALOG_NAME --------------- EXTPROC_LIBRARYExtProc C関数にマップされたSQL関数を作成します。前述のプログラムからC関数の名前を参照してください。
CREATE OR REPLACE FUNCTION HELLOCEXTPROC RETURN VARCHAR2 AS LANGUAGE C LIBRARY EXTPROC_LIBRARY NAME "helloCextproc"; /Function created.SQLファンクションを起動します。これは正常に実行されます(前述のCルーチンのC関数の本体を参照)。
SELECT HELLOCEXTPROC() FROM dual;HELLOCEXTPROC() ---------------------------------------------------------------------------------- Hello C Extproc from FQDN: extproc-agent-170798.subnet-name.vcn-name.oraclevcn.com