クラウド・ファンクションおよび外部プロシージャの起動

オンプレミスの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などのクラウドでサーバーレス・コンピュート・サービスを呼び出すSQL関数を記述できるようにすることで、ユーザー定義の関数機能をクラウドに拡張しますC/C++ルーチン、シェルまたはPythonスクリプトを含むファンクションおよびAWSラムダ・ファンクションまたは外部プロシージャ- 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関数としての起動

OCIクラウド関数を専用Exadataインフラストラクチャ上のAutonomous AI DatabaseのSQL関数として起動するステップを示します。

これらのステップに進む前に、OCIテナンシおよびコンパートメントにOCIファンクションを作成してデプロイしたと想定しています。詳細は、OCI関数を参照してください。

OCIファンクションを操作したら、DBMS_CLOUDおよびDBMS_CLOUD_FUNCTION PL/SQL APIを使用して、APIエンドポイントを介してそれぞれのクラウド・ファンクションを参照およびコールするSQLラッパー・ファンクションのカタログをAutonomous AI Databaseに作成します。DBMS_CLOUD_FUNCTION APIを使用して、データベース・アプリケーションからファンクションを管理します。

  1. 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プロシージャ」を参照してください。

  2. 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ビューを問い合せて、データベース内のすべてのクラウド・ファンクション・カタログのリストを取得できます。

  3. 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;
    /
    
    PL/SQL procedure successfully completed.
    
    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プロシージャを参照してください。

  4. SQLラッパー関数を作成します。次の2つの方法のいずれかを使用して、カタログからラッパーSQL関数を作成し、それぞれのクラウド関数をコールできます。

    • DBMS_CLOUD_FUNCTIONを使用できます。カタログ・オブジェクトからSQLラッパーを生成するSYNC_FUNCTIONSプロシージャ。
    • DBMS_CLOUD_FUNCTIONを使用して、個々のラッパー・ファンクションを手動で作成できます。CREATE_FUNCTIONプロシージャ。
    1. SYNC_FUNCTIONS: SYNC_FUNCTIONSは、カタログ内のラッパー・ファンクションを、カタログが作成されたリージョン、コンパートメントおよびテナンシで定義されたクラウド・ファンクションの完全なリストと自動的に同期(作成または更新)します。
      BEGIN
       DBMS_CLOUD_FUNCTION.SYNC_FUNCTIONS (
              catalog_name => 'OCI_DEMO_CATALOG'
       );
      END;
      /

      これにより、カタログに新しいファンクションを追加したり、カタログから削除されたファンクションのラッパーを削除するためのPL/SQLラッパーが作成されます。

      特定の現行ユーザーについて、次の問合せを使用して同期結果を検証できます。

      SHOW user
      TEST_USER
      
      SELECT 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プロシージャを参照してください。

    2. 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のみが、この参照を作成するために考慮されます。
    3. 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クラウド・ファンクションが起動されます。

  5. 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プロシージャを参照してください。

  6. 既存のカタログは、DROP_CATALOGプロシージャを使用して削除できます。

    BEGIN
        DBMS_CLOUD_FUNCTION.DROP_CATALOG (
            catalog_name => 'OCI_DEMO_CATALOG'
      );
    END;
    /

    これにより、データベースからOCI_DEMO_CATALOGが削除されます。

    詳細は、DROP_CATALOGプロシージャを参照してください。

SQL関数としてのAWSラムダ関数の起動

専用Exadataインフラストラクチャ上のAutonomous AI DatabaseでSQL関数としてAWSリモート関数を呼び出すステップを示します。

これらのステップに進む前に、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を使用して、データベース・アプリケーションからファンクションを管理します。

  1. 資格証明オブジェクトとして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プロシージャ」を参照してください。

  2. 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での外部プロシージャおよびスクリプトのシステム構成を参照してください。

OCI Linux EXTPROC VMでのリモート実行は、バージョン19.30以降のOracle Public Cloud上のAutonomous AI Database on Dedicated Exadata Infrastructureおよびバージョン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 Container Database (ACD)でインスタンスとして作成されたAutonomous AI Database。Autonomous Exadata VMクラスタ(AVMC)からプロビジョニングされ、Oracle Public Cloud上のExadataインフラストラクチャに作成されます。
  • 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 Databaseなどのプライベート・サブネット内の他のリソースへのセキュアなアクセスを有効にできる必要があります。詳細は、OCIネットワーキング・ガイドを参照してください。

外部プロシージャを使用したユーザー定義関数の実装

  1. OCI MarketPlaceからのEXTPROC VMのプロビジョニングおよび構成

    1. OCIコンソール(http://cloud.oracle.com)にサインインします。詳細は、Oracle Cloud Infrastructure Consoleへのサインインを参照してください。
    2. Oracle Cloud Infrastructureの左側のナビゲーション・メニューから、「マーケットプレイス」にドロップダウンし、「マーケットプレイス」で「すべてのアプリケーション」をクリックします。
    3. 検索バーに「EXTPROC」と入力し、「検索」をクリックします。2つのウィジェット(1つはStack、もう1つはImageというラベル)が表示されます。
    4. 「スタック」という名前のウィジェットを選択します(これは重要です)。これにより、スタックに関するスタック・バージョン、リリース日およびリリース・ノートを示すOracle Autonomous Database EXTPROC Agent詳細ページに移動します。このページで、「スタックの起動」ボタンをクリックします。これにより、次の「スタックの起動」ページが表示されます。
    5. 「スタックの起動」ページで、次の手順を実行します。

      • 「バージョン」ドロップダウン・リストから、スタックのパッケージ・バージョンを選択します。
      • 「コンパートメント」ドロップダウン・リストから、EXTPROC VMをプロビジョニングするコンパートメントの名前を選択します。特定の理由がないかぎり、ADBDと同じコンパートメントを選択します(ベスト・プラクティスとして、リソースのルート・コンパートメントは避けてください)。外部プロシージャおよびスクリプトのシステム構成を確認して、コンパートメントに適切な選択を行います。
      • 条件に同意し、「スタックの起動」をクリックします。

      「スタックの作成」ウィザードの次のページに移動します。

    6. このページでは、namedescriptionCompartmentname、TerraformバージョンおよびTag情報を指定します。コンパートメント名は必須であり、最も重要なことは、このページのウィザードへの入力です。「次」をクリックします。
    7. これにより、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認証のために、ウォレットおよび自己署名証明書が生成されます。
    8. 構成変数ページの2番目の部分には、EXTPROC VMのネットワーク構成が含まれます。
      • 「コンパートメント」で、プルダウン・メニューからVCNのコンパートメント名を選択します。前述の例では、これはadbdとして示されています。異なる(プライベートおよびパブリック)サブネットにある場合でも、Autonomous AI DatabaseとEXTPROC VMは同じVCNにコロケーションされることが理想的です。
      • 「ネットワーク戦略」で、「既存のVCNおよびサブネットの使用」を選択します。前の項で説明したように、ExtProc開発作業のこの段階では、VCN、AVMCおよびAutonomous AI Databaseでシステム・アーキテクチャが整備されている場合があります。

        ノート:

        もう1つの選択肢は、EXTPROC VM Agentに対する独自の構成戦略で新しいVCNおよびサブネットを作成することです。外部プロシージャおよびスクリプトのシステム構成で説明したように、EXTPROC VMをAutonomous AI Databaseとは異なるVCNに配置することを選択した場合、VCNsをピアリングする必要があります。
      • EXTPROCエージェント・アクセス・タイプの次のエントリをスキップします。このフィールドは、専用Exadataインフラストラクチャ上のAutonomous AI Databaseには適用されません。
    9. 次に、「プライベート・エンドポイントIPアドレス」というラベルのフィールドに、データベースが構成されているAVMCのすべてのクライアントIPアドレスを入力します。これらのクライアントIPアドレスは、AVMCのOCIコンソール・ダッシュボードから取得できます。
    10. 次に、VCNおよびサブネットの詳細を指定します。

      ノート:

      EXTPROC VMは、CIDR範囲が10.x.x.xのサブネット内に存在しないでください。EXPROC VMのIPアドレスが10.x.x.xの場合、Autonomous AI Databaseと通信できません。
    11. 構成ページの最後の部分には、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ファイルをウィンドウにドラッグ・ドロップします。

      • 「次へ」をクリックします。
    12. これにより、レビュー・ページに移動します。すべての入力を確認し、「適用の実行」チェック・ボックスを選択して、「作成」をクリックします。

      これにより、OCI Resource Managerが起動され、EXTPROC VMスタックが作成されます。ORMジョブが正常に完了すると、EXTPROC VMが作成されて実行されます。

  2. DBMS_CLOUD_FUNCTION API入力用のEXTPROC VMシステム情報を収集します

    データベースから外部プロシージャを起動できるようにするには、Autonomous AI DatabaseのDBMS_CLOUD_FUNCTION APIへの入力としてEXTPROC VMシステム情報を指定する必要があります。

    1. Oracle Cloud Infrastructureの左側のナビゲーション・メニューから、「Compute」にドロップダウンし、EXTPROC VMプロビジョニング用に指定したコンパートメントを選択し、コンパートメント内のすべてのVMをリストするダッシュボードを確認します。ORMジョブにより、標準名EXTPROC-agentまたはEXTPROC-agent-<setofnumbers>のEXTPROC VMが作成されます。これはEXTPROC VMインスタンスのホスト名になります。このエントリをクリックすると、システムの詳細(IPV4パブリック・アドレスおよびプライベート・アドレス(IPv4およびIPv6)、サブネットおよびイメージの詳細)を示すページが表示されます。
    2. 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 ~]$ whoami
      opc
      
      [opc@extproc-agent-170798 ~]$ sudo su - oracle
      Last login: Wed Nov 19 19:07:24 GMT 2025 on pts/0

      EXTPROC VMには、Oracle SQL*Netリスナーを備えた実行中のPodmanコンテナがあります。コンテナ内では、必要な構成ファイル(sqlnet.ora、listener.oraなど)を含むOracleクライアント環境と、Autonomous AI Databaseとのセキュアな通信のためのウォレット・ファイルを使用できます。

    3. 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'の入力になります。
  3. Cライブラリを構築し、EXTPROC VMファイルシステム内の指定された場所に配置します

    C関数をコーディングし、構築して、ライブラリをExtProcエージェント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 ~]$

    これにより、データベース・アプリケーションでカタログ/ライブラリ・オブジェクトを作成するために必要なすべてのパラメータ入力が完了します。

  4. ウォレット・ファイルをExtProc VMからOCIオブジェクト・ストレージにアップロードします

    自己署名ウォレットは、EXTPROCエージェント・アプリケーションの作成の一部として作成されます。このウォレットを使用すると、Extprocエージェント・インスタンスにアクセスできます。

    EXTPROCエージェント・インスタンスでリモート・プロシージャを実行するには、Autonomous AI DatabaseおよびEXTPROCエージェントが相互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という名前を付ける必要があります。
  5. カタログの作成、SQLファンクションの定義、およびSQLファンクションとしての外部プロシージャの起動

    前述のステップから、DBMS_CLOUD_FUNCTION APIでSQLまたはPL/SQLデータベース・アプリケーションからリモート・プロシージャを実行するために必要なすべての入力があります。

    次に、オブジェクト・ストレージからEXTPROCエージェント・インスタンスの証明書を含むウォレットcwallet.ssoを、Autonomous AI DatabaseのDIRECTORYにインポートします。

    ウォレット・ファイルcwallet.ssoを格納したオブジェクト・ストレージにアクセスするための資格証明を作成します。様々なオブジェクト・ストレージ・サービスのusernameおよびpasswordパラメータの詳細は、「CREATE_CREDENTIALプロシージャ」を参照してください。

    データベースにDIRECTORYオブジェクトを作成し、DBMS_CLOUD.GET_OBJECT APIを使用してウォレットをディレクトリにダウンロードします。

    SQL> SET DEFINE OFF
    
    SQL> 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;
    /
    
    SQL> CREATE DIRECTORY extprocwalletdir AS 'extprocwalletdir';
    
    Directory created.
    
    SQL> SELECT directory_name, directory_path FROM dba_directories WHERE directory_name LIKE '%EXTPROC%';
    
    DIRECTORY_NAME    DIRECTORY_PATH
    ----------------  -------------------------------------------------------------------------
    EXTPROCWALLETDIR  /u02/data/dbfs/<adbd-name>/42E945D608E16DF9E0630301000AF88D/extprocwalletdir
    
    SQL> BEGIN
      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ライブラリを表すライブラリ・オブジェクトをデータベースに作成します。

    SQL> 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.
    
    SQL> SELECT catalog_name from DBA_CLOUD_FUNCTION_CATALOG WHERE catalog_name LIKE '%EXTPROC%';
    
    CATALOG_NAME
    ---------------
    EXTPROC_LIBRARY

    ExtProc CファンクションにマップされたSQLファンクションを作成します。前述のプログラムからC関数の名前を参照してください。

    SQL> CREATE OR REPLACE FUNCTION HELLOCEXTPROC RETURN VARCHAR2 AS
        LANGUAGE C
        LIBRARY EXTPROC_LIBRARY
        NAME "helloCextproc";
    /
    
    Function created.
    
    SQL> 

    SQLファンクションを起動します。これは正常に実行されます(前述のCルーチンのC関数の本体を参照)。

    SQL> SELECT HELLOCEXTPROC() FROM dual;
    
    HELLOCEXTPROC()
    ----------------------------------------------------------------------------------
    Hello C Extproc from FQDN: extproc-agent-170798.subnet-name.vcn-name.oraclevcn.com