Autonomous Databaseインスタンスでの汎用スクリプトの起動

Autonomous Databaseで、BASH、CまたはPythonタイプの汎用スクリプトを起動できます。

Autonomous Databaseでの汎用スクリプトの実行について

Autonomous Databaseインスタンスから、Bash、CまたはPythonで記述されたスクリプトを含む汎用スクリプトを起動できます。

Autonomous Databaseインスタンスで汎用スクリプトを直接実行することはできません。かわりに、スクリプトは、Oracle Cloud Infrastructure Virtual Cloud Network (VCN)で実行されているOracle Autonomous Database Extprocコンテナ・イメージにリモートでホストされます。Oracle Schedulerジョブを使用して、Autonomous Databaseから汎用スクリプトを起動します。作成するOracle Schedulerジョブは、実行可能ジョブである必要があります。実行可能ジョブは、シェル・スクリプトまたはその他の実行可能ファイルを実行できます。

ノート

この機能は、Oracleデータベース・リリース19cでのみサポートされます。

Autonomous Databaseからの汎用スクリプトは、データベースがプライベート・エンドポイントにある場合にのみサポートされます。汎用スクリプトを実行するには、EXTPROCエージェントがインストールされた状態でOracle Autonomous Databaseコンテナ・イメージを取得、インストールおよび構成する必要があります。Autonomous DatabaseのEXTPROCコンテナ・イメージを使用すると、BASH、CまたはPythonで記述された外部プロシージャおよびスクリプトをAutonomous Databaseからコールできます。EXTPROCエージェント・インスタンスはプライベート・サブネットでホストされ、Autonomous Databaseはリバース接続エンドポイント(RCE)を介してEXTPROCエージェントにアクセスします。

汎用スクリプトは、次を使用してデプロイされます。

  • EXTPROCエージェントがインストールされたOracle提供のAutonomous Databaseコンテナ・イメージ。Oracleは、GitHubパッケージにコンテナ・イメージを提供します。

    EXTPROCコンテナ・イメージを取得および構成する手順は、GitHub READMEを参照してください。

    EXTPROCエージェント・インスタンスは、Oracle Cloud Infrastructure Virtual Cloud Network (VCN)で実行されているコンテナ・イメージでリモートでホストされます。Autonomous DatabaseとEXTPROCエージェント・インスタンス間のセキュアな通信は、プライベート・エンドポイントで実行されているAutonomous DatabaseインスタンスからEXTPROCエージェント・インスタンスへのトラフィックが許可されるように、ネットワーク・セキュリティ・グループ(NSG)ルールを設定することで保護されます。EXTPROCエージェント・イメージは、ポート16000で外部プロシージャをホストおよび実行するように事前構成されています。

  • エンドポイント環境を登録し、登録されたエンドポイントに対する権限を管理するPL/SQLプロシージャ。詳細は、DBMS_CLOUD_FUNCTION_ADMINパッケージを参照してください。

  • 汎用スクリプトを起動するスケジューラ・ジョブおよびプログラムを作成および管理するためのPL/SQLプロシージャ。

    詳細は、DBMS_SCHEDULERを参照してください。

次のステップに従って、Autonomous Databaseインスタンスから汎用スクリプトを実行します:

WalletのアップロードによるEXTPROCエージェント・インスタンスへのセキュアな接続の作成

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

EXTPROCエージェント・インスタンスで汎用スクリプトを実行するには、Autonomous DatabaseおよびEXTPROCエージェントは、Mutual Transport Layer Security (mTLS)を使用して接続します。mTLSを使用してEXTPROCエージェントに接続する場合、信頼できるクライアント認証局(CA)証明書で標準のTLS 1.2を使用してTCPS (セキュアなTCP)データベース接続を使用します。詳細は、Autonomous Databaseインスタンスへの接続についてを参照してください。

ノート

認証局(CA)によって発行されたパブリック証明書を取得して使用することもできます。

前提条件として、EXTPROCが実行されているVMの/u01/app/oracle/wallets/extproc_wallet/ディレクトリからオブジェクト・ストレージにウォレットをエクスポートする必要があります。これにより、Autonomous Databaseはウォレットを使用してEXTPROCに安全にアクセスできます。

EXTPROCウォレットをAutonomous Databaseインスタンスにアップロードします:

  1. Autonomous Databaseのオブジェクト・ストレージから、EXTPROCエージェント・インスタンスの証明書を含むウォレットcwallet.ssoをインポートします。ウォレット・ファイルについて次の点に注意してください。
    • ウォレット・ファイルは、データベース・ユーザーIDとパスワードとともに、EXTPROCエージェント・インスタンスへのアクセスを提供します。ウォレット・ファイルを安全な場所に格納し、認可されたユーザーのみと共有します。

    • ウォレット・ファイルの名前を変更しないでください。オブジェクト・ストレージのウォレット・ファイルには、cwallet.ssoという名前を付ける必要があります。

  2. 資格証明を作成して、ウォレット・ファイルcwallet.ssoを格納するオブジェクト・ストレージにアクセスします。様々なオブジェクト・ストレージ・サービスのユーザー名およびパスワード・パラメータの詳細は、「CREATE_CREDENTIALプロシージャ」を参照してください。
    リソース・プリンシパル資格証明を有効にする場合、Oracle Cloud Infrastructureオブジェクト・ストアにアクセスするための資格証明の作成は必要ありません。詳細は、リソース・プリンシパルを使用したOracle Cloud Infrastructureリソースへのアクセスについてを参照してください。
  3. ウォレット・ファイルcwallet.ssoのディレクトリをAutonomous Databaseに作成します。
    CREATE DIRECTORY wallet_dir AS 'directory_location';

    ディレクトリの作成の詳細は、Autonomous Databaseでのディレクトリの作成を参照してください。

  4. DBMS_CLOUD.GET_OBJECTを使用して、オブジェクト・ストレージからウォレットをダウンロードします。たとえば:
    BEGIN
      DBMS_CLOUD.GET_OBJECT (
        credential_name     => 'DEF_CRED_NAME',
        object_uri          => 'https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname/o/cwallet.sso',
        directory_name      => 'WALLET_DIR'
    );
    END;
    /

    この例では、namespace-stringはOracle Cloud Infrastructure Object Storageネームスペースで、bucketnameはバケット名です。詳細は、「オブジェクト・ストレージ・ネームスペース」を参照してください。

    ウォレットは、前のステップWALLET_DIRで作成したディレクトリにコピーされます。EXTPROCエージェント・インスタンスに接続できるウォレットが、Autonomous Databaseインスタンスで使用できるようになりました。

汎用スクリプトを起動する手順

Autonomous Databaseで汎用スクリプトを起動するステップを示します。

汎用スクリプトを実行するようにEXTPROCエージェント・インスタンスを構成した後、リモート・エンドポイントを登録し、汎用スクリプトをコールするスケジューラ・ジョブを作成します。

次に、Autonomous Databaseで汎用スクリプトを起動するための前提条件を示します:

  • 汎用スクリプトをEXTPROCエージェント・インスタンスにコピーする必要があります。詳細は、GitHub READMEを参照してください。

  • スケジューラ・ジョブを作成して管理し、ADMIN以外のユーザーで汎用スクリプトを起動するには、次の権限が必要です。

    • MANAGE SCHEDULER

    • CREATE JOB

    • 登録済リモート・エンドポイントの権限

トピック

Autonomous Databaseでのリモート・エンドポイントの登録および管理

ADMINユーザーとして、次のステップを実行して、Autonomous Databaseのリモート・エンドポイントを登録および管理します。

リモート・エンドポイントの登録

DBMS_CLOUD_FUNCTION_ADMIN.REGISTER_REMOTE_EXECUTION_ENVを使用して、リモート・エンドポイントを登録します。

例:

BEGIN
 DBMS_CLOUD_FUNCTION_ADMIN.REGISTER_REMOTE_EXECUTION_ENV (
        remote_endpoint_name => 'rem_executable',
        remote_endpoint_url  => 'remote_extproc_hostname:16000',
        wallet_dir           => 'WALLET_DIR',
        remote_cert_dn       => 'CN=MACHINENAME'
);
END;
/

この例では、rem_executableライブラリを作成し、Autonomous Databaseのremote_urlパラメータで指定されたEXTPROCエージェント・インスタンスを登録します。EXTPROCエージェント・インスタンスは、ポート16000で汎用スクリプトをホストするように事前構成されています。

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

登録済エンドポイントの権限の管理

このステップはオプションであり、ADMIN以外のユーザーがAutonomous Databaseから汎用スクリプトを起動する必要がある場合にのみ必要です。

DBMS_CLOUD_FUNCTION_ADMIN.GRANT_REMOTE_EXECUTION_ENVを使用して、登録済エンドポイントに対する権限をADMIN以外のユーザーに付与します。

例:

BEGIN
 DBMS_CLOUD_FUNCTION_ADMIN.GRANT_REMOTE_EXECUTION_ENV (   
    remote_endpoint_name => 'REM_EXECUTABLE',
    user_name            => 'username');
END;
/

この例では、REM_EXECUTABLEに対する権限を指定されたユーザーに付与します。詳細は、GRANT_REMOTE_EXECUTION_ENVプロシージャを参照してください。

登録済エンドポイントに対する権限を付与した後、DBMS_CLOUD_FUNCTION_ADMIN.REVOKE_REMOTE_EXECUTION_ENVを使用して、登録済エンドポイントに対する権限をユーザーから取り消すことができます。

例:

BEGIN
 DBMS_CLOUD_FUNCTION_ADMIN.REVOKE_REMOTE_EXECUTION_ENV (   
    remote_endpoint_name => 'REM_EXECUTABLE',
    user_name            => 'username');
END;
/

この例では、指定したユーザーからREM_EXECUTABLEに対する権限を取り消します。詳細は、REVOKE_REMOTE_EXECUTION_ENVプロシージャを参照してください。

DBA_CLOUD_FUNCTION_REMOTE_EXECUTION_GRANTを問い合せて、すべてのリモート・エンドポイントに付与されている権限をリストできます。詳細は、DBA_CLOUD_FUNCTION_REMOTE_EXECUTION_GRANTビューを参照してください。

登録済エンドポイントの削除

DBMS_CLOUD_FUNCTION_ADMIN.DEREGISTER_REMOTE_EXECUTION_ENVを使用して、登録済リモート・エンドポイントを削除します。

例:

BEGIN
 DBMS_CLOUD_FUNCTION_ADMIN.DEREGISTER_REMOTE_EXECUTION_ENV (   
    remote_endpoint_name => 'REM_EXECUTABLE');
END;
/

これにより、Autonomous Databaseからrem_executableリモート・エンドポイントが削除されます。詳細は、DEREGISTER_REMOTE_EXECUTION_ENVプロシージャを参照してください。

汎用スクリプトを起動するスケジューラ・ジョブの作成と管理

Autonomous Databaseから汎用スクリプトを起動するスケジューラ・ジョブを作成および管理するステップを示します。

ADMIN以外のユーザーとして次のステップを実行するには、必要な権限が必要です。詳細は、「汎用スクリプトを起動するステップ」を参照してください。
  1. DBMS_SCHEDULER.CREATE_JOBを使用して、ジョブ・タイプがexecutableのスケジューラ・ジョブを作成します。

    例:

    BEGIN
     DBMS_SCHEDULER.CREATE_JOB (
        job_name             => 'rem_exec_job',
        job_type             => 'executable',
        job_action           => 'script_location_in_remote_docker_image/name',
        number_of_arguments  => 1,
        enabled              => false,
        auto_drop            => true);
     END;
    /

    この例では、実行可能タイプのrem_exec_jobスケジューラ・ジョブを作成します。

    job_nameパラメータでは、ジョブの名前を指定します。

    job_typeパラメータは、ジョブ・アクション・タイプを指定します。Autonomous Databaseで汎用スクリプトを起動するには、実行可能ファイルとしてjob_typeを指定する必要があります。

    job_actionパラメータは、ジョブのインライン・アクションを指定します。これは、呼び出す必要があるリモート・エンドポイント上のスクリプトの場所です。

    number_of_argumentsパラメータは、ジョブ引数の数を指定します。

    enabledパラメータは、ジョブの作成直後にジョブを有効にするかどうかを示します。

    auto_dropパラメータは、完了後にジョブを削除するかどうかを示します。

  2. DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUEを使用して、ジョブ引数の値を設定します。

    例:

    BEGIN
     DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE (
        job_name          => 'rem_exec_job',
        argument_position => 1,
        argument_value    => 'param1');
     END;
    /
  3. DBMS_SCHEDULER.CREATE_JOBを使用して、rem_exec_jobジョブのdestination属性を変更します。

    例:

    BEGIN
     DBMS_SCHEDULER.SET_ATTRIBUTE (
          name       => 'rem_exec_job',
          attribute  => 'destination',
          value      => 'REMOTE_EXTPROC:remote_endpoint_name');
     END;
    /

    この例では、rem_exec_jobジョブのdestination属性を変更して、リモート・ライブラリ・パスを指定します。

    job_nameパラメータでは、ジョブの名前を指定します。

    attributeパラメータは、変更する属性を指定します。

    valueパラメータは、リモート・エンドポイント宛先を指定するためにdestination属性を変更します。

    このパラメータは、REMOTE_EXTPROC:remote_endpoint_name形式の文字列値を受け入れます。ここで、remote_endpoint_nameは登録済リモート・エンドポイントの名前です。

    指定したエンドポイントに対する権限がない場合、エラーが発生します。

    詳細は、DBMS_SCHEDULERサブプログラムを参照してください。

  4. スケジューラ・ジョブでDBMS_SCHEDULER.ENABLEを実行します。

    例:

    BEGIN
     DBMS_SCHEDULER.ENABLE (
        name => 'rem_exec_job');
     END; 
    /

    この例では、rem_exec_jobジョブを有効にします。詳細は、DBMS_SCHEDULERを参照してください。

    ジョブを有効にすると、スケジューラはジョブの実行を開始します。

    USER_CLOUD_FUNCTION_RUN_DETAILSビューおよびDBA_CLOUD_FUNCTION_RUN_DETAILSビューを問い合せて、スケジューラ・ジョブのステータスを表示します。