7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Autonomous AI Databaseの Resource Principalで、API署名鍵を使わずにSelect AIしてみてみた

7
Last updated at Posted at 2026-09-01

説明絵.png

Oracle Cloud Infrastructure(OCI)の リソース・プリンシパル(Resource Principal) とは、Resource PrincipalをサポートするOCIリソース自身を、IAM上のPrincipal(認証主体)として扱う認証方式です。

人間のOCIユーザーとして認証する代わりに、Autonomous AI Database、OCI Functions、Data Science Notebook SessionなどのOCIリソース自体がIdentityとなり、許可されたOCIサービスへアクセスします。

Resource Principalは、有効期限の短いセッション・トークンと保護された認証情報を使用します。リソースの認証に使用する証明書はOCIによって作成、割当て、ローテーションされるため、利用者がOCIユーザーのAPI署名秘密鍵をダウンロードし、コードやデータベースCredentialへ保存して管理する必要がありません。

主なメリットは次です。

  • ユーザー管理の長期認証情報が不要:OCIユーザーのAPI署名鍵、秘密鍵、Fingerprintをアプリケーションやデータベースへ登録せずにOCIサービスへアクセスできます。
  • 認証情報のライフサイクルをOCIが管理:証明書とセッション・トークンはOCIによって作成、管理、ローテーションされます。
  • きめ細かなアクセス制御:Dynamic GroupとIAM Policyを使用し、権限を付与するOCIリソースと実行可能なAPI操作を限定できます。
  • 秘密鍵漏洩リスクを低減:長期間使用するユーザー秘密鍵を、ローカル・ファイル、ソースコード、SQL、データベースCredentialへ保存する必要がありません。

OCIがResource Principalをサポートしているサービス間接続では、まず「秘密鍵をどこへ保管するか」ではなく、「秘密鍵を使わない構成にできないか」を検討することができます。
本記事では、このResource PrincipalをAutonomous AI DatabaseのSelect AIへ適用し、OCI Generative AIを呼び出します。

Autonomous AI DatabaseのSelect AIで使用する場合、
Select AIからOCI Generative AIへ接続する場合、OCIユーザーのAPI署名鍵をCredentialへ登録する方法があります。ただし、この方式では次の情報を作成・管理する必要があります。

  • OCI User OCID
  • Tenancy OCID
  • API署名秘密鍵
  • 公開鍵のFingerprint
  • API署名鍵を格納するデータベースCredential

Autonomous AI Databaseでは、データベース自身をOCI IAM上のIdentityとして扱うResource Principalを使用できます。Resource Principalを使用すると、OCIユーザーのAPI署名秘密鍵をAutonomous AI Databaseへ登録せず、Dynamic GroupとIAM PolicyでOCI Generative AIへのアクセスを認可できます。

Select AI Profileでは、ユーザーが作成したOCI Credentialの代わりに、システム定義のOCI$RESOURCE_PRINCIPALを指定します。

ということで、Autonomous AI DatabaseのResource Principalを使用して、API署名鍵なしでSelect AIからOCI Generative AIへ接続してみてみます。

■ 今回のポイント

今回の構成では、次の設定を行います。

  • 対象のAutonomous AI Database 1台だけがDynamic Groupのメンバーになるよう、OCIDを使用してMatching Ruleを設定
  • Dynamic GroupへOCI Generative AIのChat APIを実行する最小権限を付与
  • Autonomous AI DatabaseでResource Principalを有効化
  • ADB_USEROCI$RESOURCE_PRINCIPALの使用権限を付与
  • Select AI Profileのcredential_nameOCI$RESOURCE_PRINCIPALを指定
  • OCI Generative AIのcohere.command-a-03-2025をSelect AIから実行

今回の実行経路では、OCIユーザーのAPI署名鍵を使用しません。また、OCI Generative AIへの接続では外部ホスト向けのNetwork ACLも追加しません。

■ OCI API署名鍵方式とResource Principal方式の違い

Select AIからOCI Generative AIへ接続する方法の1つとして、OCIユーザーのAPI署名鍵をデータベースCredentialへ登録する方式があります。一方、Resource Principalを使用すると、Autonomous AI Database自身をOCI IAM上の認証主体として扱い、ユーザーのAPI署名鍵を登録せずにOCI Generative AIへアクセスできます。

ここでいうAPI署名鍵は、OCI APIリクエストをOCIユーザーとして署名するための秘密鍵です。OpenAI APIキーなど、外部AIプロバイダーが発行するAPIキーとは別の認証情報です。

本記事でいう「API署名鍵」は、User OCID、Tenancy OCID、秘密鍵、Fingerprintを使用するOCIユーザーのAPI署名鍵です。OCI Generative AI専用のAPI Keyや、OpenAIなど外部AIプロバイダーのAPIキーとは別の認証情報です。

項目 OCIユーザーのAPI署名鍵方式 Autonomous AI Database Resource Principal方式
OCI APIの実行主体 OCIユーザー Autonomous AI Database
OCI Generative AIへのIAM認可先 OCIユーザーが所属するGroup 対象ADBが所属するDynamic Group
OCI User OCID 必要 不要
Tenancy OCID 必要 不要
API署名秘密鍵 必要 不要
Fingerprint 必要 不要
ユーザー作成Credential 必要 不要
Select AI Profileのcredential_name ユーザー作成OCI Credential OCI$RESOURCE_PRINCIPAL
Dynamic Group 不要 必要
IAM Policy User Groupへ付与 Dynamic Groupへ付与
秘密鍵ローテーション 利用者側で実施 Resource Principal用証明情報をOCIが管理・ローテーション
権限の限定方法 OCIユーザーの権限に依存 対象ADBと許可するOCI APIをPolicyで限定
権限の制御方法 OCIユーザーが所属するGroupのIAM Policyで制御 対象ADBが所属するDynamic GroupのIAM Policyで制御
認証主体の単位 人間またはサービス用OCIユーザー Autonomous AI Databaseリソース
権限主体と処理実体 OCIユーザーとADBが別 権限主体が対象ADB自身

どちらの方式でもIAM Policyによる最小権限化は可能です。Resource Principalの主な違いは、権限主体がOCIユーザーではなく、実際に処理を実行するAutonomous AI Database自身になる点です。

API署名鍵方式では、秘密鍵を安全に保管しても、鍵ペア、公開鍵登録、Fingerprint、Credentialの更新を管理する必要があります。

Resource Principal方式では、秘密鍵の保管場所を変更するのではなく、OCIユーザーのAPI署名鍵を実行経路からなくします。今回のように認証元と接続先がどちらもOCIリソースである場合に、構成と鍵管理を単純化できます。

■ 検証環境

項目 設定値
Autonomous AI Database Serverless
Database Version Autonomous AI Database 26ai
ADBリージョン Japan East(Tokyo)/ap-tokyo-1
OCI Generative AIリージョン Japan Central(Osaka)/ap-osaka-1
モデル cohere.command-a-03-2025
SQLクライアント SQLcl 26.2.1

■ 構成

認証・認可の流れは次のとおりです。

  1. ADB_USERがSelect AIを実行
  2. Select AI ProfileがOCI$RESOURCE_PRINCIPALを使用
  3. Autonomous AI DatabaseがResource Principalの一時トークンでOCIへ認証
  4. Dynamic GroupのMatching Ruleによって対象ADBであることを判定
  5. IAM Policyで許可されたOCI Generative AI Chat APIを実行

■ 前提

今回は、前回の次の記事で作成した環境を引き続き使用します。

  • Autonomous AI Database Serverlessを作成済み
  • データベース・ユーザーADB_USERを作成済み
  • SHサンプル・スキーマを利用可能
  • ADB_USERから次の表を参照可能
    • SH.CUSTOMERS
    • SH.SALES
    • SH.PRODUCTS
    • SH.COUNTRIES
  • OCIでDynamic GroupとIAM Policyを作成できる権限を保有
  • OCI Generative AIの呼出しに使用するコンパートメントを作成済み

今回使用するモデルは、次とします。

cohere.command-a-03-2025

本記事の主題はLLMの性能比較ではなく、Autonomous AI DatabaseのResource Principalを使用して、OCIユーザーのAPI署名鍵なしでOCI Generative AIへ接続する方法の確認です。

今回は、次の理由からCohere Command Aを使用します。

・ 日本中央部(大阪)リージョンでオンデマンド利用できる
・ Dedicated AI Clusterと専用Endpointを作成せずに検証できる
・ 長いコンテキストを扱える
・ Tool Use、Agent、RAGなどのEnterprise AI用途を想定したモデルである
・ 多言語に対応している

今回はSelect AIのCHAT、SHOWSQL、通常実行、EXPLAINSQL、NARRATEを確認します。

本記事ではRAGそのものの精度検証は実施しませんが、今後、Autonomous AI DatabaseのAI Vector SearchやSelect AI RAGを組み合わせる場合も候補にしやすいモデルです。

Cohere Command Aは日本中央部(大阪)リージョンでオンデマンド利用できます。オンデマンド・モデルを使用するため、Dedicated AI Clusterと専用Endpointは作成しません。

■ 設定値

記事中では、次の設定値を使用します。

項目 設定値
Dynamic Group名 ADB_SELECT_AI_RP_DG
IAM Policy名 ADB_SELECT_AI_GENAI_POLICY
データベース・ユーザー ADB_USER
Select AI Profile名 OCI_GENAI_RP
OCI Generative AIリージョン ap-osaka-1
OCI Generative AIモデル cohere.command-a-03-2025
ADB OCID <ADB_OCID>
OCI Generative AI呼出し用コンパートメント名 <GENAI_COMPARTMENT_NAME>
OCI Generative AI呼出し用コンパートメントOCID <GENAI_COMPARTMENT_OCID>
Identity Domain名 <IDENTITY_DOMAIN_NAME>

■ 設定値確認

● Autonomous AI DatabaseのOCID確認

1) OCI Consoleへログイン

OCI Consoleへログインし、ナビゲーション・メニューから、次を選択

Oracle Database
  └ Autonomous AI Database

01_ADB画面01.jpg

2) 対象のAutonomous AI DatabaseからOCIDをコピー

Select AIを実行するAutonomous AI Databaseを選択し、OCIDをコピー

OCID
ocid1.autonomousdatabase.oc1.ap-tokyo-1.<...>

01_ADB画面02.jpg

このOCIDは、Dynamic GroupのMatching Ruleで使用します。

● OCI Generative AIのリージョンとモデル確認

・ OCI Generative AIのリージョン確認

今回は、Japan Central (Osaka)のOCI Generative AIを選択します。

リージョン名: Japan Central (Osaka)
リージョン識別子: ap-osaka-1
リージョン・キー: KIX

日本東部(東京、ap-tokyo-1/NRT)のAutonomous AI Databaseから呼び出す場合でも、Select AI Profileのregionap-osaka-1を指定することで、大阪リージョンのOCI Generative AIへ接続できます。

・モデル確認

1) Consoleのリージョンを大阪へ切替

OCI Console右上のリージョンを、次へ切り替え

Japan Central (Osaka)

02_GenAI画面00.jpg

2) Generative AI Playgroundを表示

ナビゲーション・メニューから、次をクリック

Analytics & AI
  └ Generative AI
      └ Playground

02_GenAI画面01.jpg

3) Generative AI Overview画面
[Playground]をクリック
02_GenAI画面02.jpg

4) Cohere Command Aを確認

ChatモデルとしてCohere Command Aを選択できることを確認

OCIモデル名は次です。

cohere.command-a-03-2025

02_GenAI画面03.jpg

Select AI Profileのregionを省略した場合、OCIプロバイダーのデフォルト・リージョンはus-chicago-1です。今回は日本から大阪のモデルを使用するため、ap-osaka-1を明示します。

■ Dynamic Groupの作成

Autonomous AI Database自身へOCI IAMの権限を付与するため、対象ADBをDynamic Groupへ所属させます。

今回は最小権限にするため、コンパートメント内のすべてのADBではなく、対象ADB 1台のOCIDを指定します。

● Dynamic Group作成画面を表示

1) Identity Domainを表示

OCI Consoleのナビゲーション・メニューから、次を選択します。

Identity & Security
  └ Domains

03_DynamicGroup画面01.jpg

2) Identity Domainを選択

Dynamic Groupを作成するIdentity Domainを選択

通常、Default Identity Domainを使用している場合はDefaultを選択

03_DynamicGroup画面02.jpg

3) Dynamic groupsを選択

Identity Domainの詳細画面で、次を選択します。

Dynamic groups
  └ Create dynamic group

03_DynamicGroup画面03.jpg

● Dynamic Groupを作成

次の値を入力し、Create dynamic groupをクリック

項目 設定値
Name ADB_SELECT_AI_RP_DG
Description Resource Principal for Select AI to call OCI Generative AI
Matching Rule resource.id = '<ADB_OCID>'

03_DynamicGroup画面04.jpg

● Identity Domainを明示する場合

Autonomous AI DatabaseがDefault以外のIdentity Domainに関連付けられている環境では、Oracle公式ドキュメントの例に従って、Identity Domain名を含めます。

resource.id = '<IDENTITY_DOMAIN_NAME>/<ADB_OCID>'

例です。

resource.id = 'MyDomain/ocid1.autonomousdatabase.oc1.ap-tokyo-1.<...>'

Default Identity Domainで最初のルールが正常に動作する環境では、Identity Domain名の追加は不要です。

■ IAM Policyの作成

Dynamic Groupに所属したAutonomous AI Databaseへ、OCI Generative AIを呼び出す権限を付与します。

● 最小権限のPolicy

Select AIでCohere Command AなどのChatモデルを呼び出すために必要なAPI操作は、OCI Generative AIのChatです。

OCI IAMのResource Typeは、次です。

generative-ai-chat

必要なVerbは、次です。

use

そのため、本記事では次のPolicyを使用します。

Allow dynamic-group ADB_SELECT_AI_RP_DG to use generative-ai-chat in compartment <GENAI_COMPARTMENT_NAME>

● IAM Policyを作成

1) OCI コンソール Policies画面

OCI Consoleのナビゲーション・メニューから、次を選択

Identity & Security
  └ Policies

04_Policy画面01.jpg

2) Policy画面

対象のGenerative AI呼出し用コンパートメントを参照できる、ルート・コンパートメントまたは親コンパートメントを選択し、[Create Policy]をクリック

検証環境で構成を単純にする場合は、ルート・コンパートメントへPolicyを作成します。
04_Policy画面02.jpg

3) Create Policyを選択

設定 Policy
Allow dynamic-group ADB_SELECT_AI_RP_DG to use generative-ai-chat in compartment <GENAI_COMPARTMENT_NAME>

次の値を入力し、Createをクリック

項目 設定値
Name ADB_SELECT_AI_GENAI_POLICY
Description Allow one Autonomous AI Database to call OCI Generative AI Chat API
Policy Builder Manual editor
Policy Statement Allow dynamic-group ADB_SELECT_AI_RP_DG to use generative-ai-chat in compartment

04_Policy画面03.jpg

● Default以外のIdentity Domainを使用する場合

PolicyのSubjectへIdentity Domain名を追加します。

Allow dynamic-group <IDENTITY_DOMAIN_NAME>/ADB_SELECT_AI_RP_DG to use generative-ai-chat in compartment <GENAI_COMPARTMENT_NAME>

Default Identity DomainのDynamic Groupは、Identity Domain名を省略できます。

Dynamic Group名ではなくOCIDを使用することもできます。

Allow dynamic-group id <DYNAMIC_GROUP_OCID> to use generative-ai-chat in compartment <GENAI_COMPARTMENT_NAME>

manage generative-ai-familyを使用しない理由

Select AIのサンプルやSandbox向けの例では、次のような広いPolicyを見かけることがあります。

Allow dynamic-group ADB_SELECT_AI_RP_DG to manage generative-ai-family in compartment <GENAI_COMPARTMENT_NAME>

manage generative-ai-familyは、Chatの実行だけでなく、Generative AI関連リソースに対する広い管理権限を含みます。

今回は既存のオンデマンドChatモデルを呼び出すだけなので、次の最小権限にします。

use generative-ai-chat

● Embeddingを使用する場合の追加権限

OCI Generative AIのEmbeddingモデルを使用する場合は、用途に応じて次の権限を追加します。

Allow dynamic-group ADB_SELECT_AI_RP_DG to use generative-ai-text-embedding in compartment <GENAI_COMPARTMENT_NAME>

今回のNL2SQL、SHOWSQLRUNSQLEXPLAINSQLNARRATECHATの検証では、Chatモデルを使用するため、この権限は追加しません。

Resource Principalのトークンは最大2時間キャッシュされます。Dynamic GroupやIAM Policyを変更した直後は、変更内容の反映に最大2時間かかる場合があります。

■ ADB_USERの権限確認

本記事では、Select AI ProfileをADB_USERが所有し、通常のSelect AI実行にもADB_USERを使用します。

● DBMS_CLOUD_AIの実行権限を確認

1) ADMINユーザーで接続

sql admin/<ADMIN_PASSWORD>@ADW

接続ユーザーを確認します。

SHOW USER
実行結果
USER is "ADMIN"

2) ADB_USERの権限を確認

SQL
SELECT grantee,
       owner,
       table_name,
       privilege
FROM   dba_tab_privs
WHERE  grantee = 'ADB_USER'
AND    table_name = 'DBMS_CLOUD_AI';
SQL実行結果
GRANTEE     OWNER               TABLE_NAME       PRIVILEGE
----------- ------------------- ---------------- ----------
ADB_USER    C##CLOUD$SERVICE    DBMS_CLOUD_AI    EXECUTE

前回の記事で設定済みのため、今回は追加のGRANTを実行しません。

結果が0件の場合だけ、ADMINユーザーで次を実行します。

GRANT EXECUTE ON DBMS_CLOUD_AI TO ADB_USER;

● SHサンプル・スキーマを参照できることを確認

ADB_USERへ接続し直します。

sql adb_user/<ADB_USER_PASSWORD>@ADW
SQL
SELECT COUNT(*)
FROM   SH.CUSTOMERS;
SQL実行結果
   COUNT(*)
-----------
      55500

Autonomous AI DatabaseのSHSSBは、読み取り専用のサンプル・スキーマとして提供され、データベース・ユーザーは追加設定なしで問合せできます。

そのため、本記事では次のようなGRANT SELECTを実行しません。

-- 実行しない
GRANT SELECT ON SH.CUSTOMERS TO ADB_USER;

Oracle管理のサンプル・スキーマに対してADMINから権限付与を試みると、ORA-01031: insufficient privilegesになることがあります。自作スキーマの表をSelect AIで使用する場合は、その表の所有者または権限を持つ管理者から、実行ユーザーへ必要なSELECT権限を付与します。

● 今回作成しない設定

Resource Principalを使用するため、OCIユーザーのAPI署名鍵を格納するCredentialは作成しません。

-- 今回は実行しない
BEGIN
    DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'GENAI_CRED',
        user_ocid       => '<USER_OCID>',
        tenancy_ocid    => '<TENANCY_OCID>',
        private_key     => '<PRIVATE_KEY>',
        fingerprint     => '<FINGERPRINT>'
    );
END;
/

今回のOCI Generative AI Resource Principal構成では、前回のOpenAI API版で使用したapi.openai.comなど、外部AIプロバイダーのホストへ接続するためのNetwork ACLは使用しません。

■ Resource Principalの有効化

OCI IAM側のDynamic GroupとPolicyを作成した後、Autonomous AI Database側でResource Principalを有効化します。

● ADB_USERでResource Principalを使用可能にする

ADMINユーザーでAutonomous AI Databaseへ接続し、次を実行します。

BEGIN
    DBMS_CLOUD_ADMIN.ENABLE_PRINCIPAL_AUTH(
        provider => 'OCI',
        username => 'ADB_USER'
    );
END;
/
SQL実行結果
PL/SQL procedure successfully completed.

provider => 'OCI'はOCI Resource Principalを有効化する指定です。username => 'ADB_USER'を指定することで、Select AI Profileを作成・実行するADB_USEROCI$RESOURCE_PRINCIPALの使用権限を付与します。

ENABLE_PRINCIPAL_AUTHは指定したProviderのPrincipal認証を有効化するプロシージャです。Resource Principal専用のENABLE_RESOURCE_PRINCIPALも提供されていますが、OracleのSelect AI+OCI Generative AI公式例ではENABLE_PRINCIPAL_AUTH(provider => 'OCI')が使用されているため、本記事もこの形式にしています。

すでにResource Principalが有効な環境では、再実行時に「すでに有効」であることを示すエラーになる場合があります。その場合は、次の確認SQLでCredentialとADB_USERへの権限が存在することを確認します。

● Resource Principal Credentialを確認

ADMINユーザーで確認します。

SQL
SELECT owner,
       credential_name
FROM   dba_credentials
WHERE  credential_name = 'OCI$RESOURCE_PRINCIPAL'
AND    owner = 'ADMIN';
SQL実行結果
OWNER    CREDENTIAL_NAME
-------- -----------------------
ADMIN    OCI$RESOURCE_PRINCIPAL

OCI$RESOURCE_PRINCIPALはシステム定義のCredentialです。OCIユーザーの秘密鍵を格納したユーザー作成Credentialではありません。

● ADB_USERへの使用権限を確認

ADB_USERで接続し、次を実行します。

SQL
SELECT grantee,
       table_schema,
       table_name,
       grantor
FROM   all_tab_privs
WHERE  grantee = 'ADB_USER'
AND    table_name = 'OCI$RESOURCE_PRINCIPAL'
AND    table_schema = 'ADMIN';
SQL実行結果
GRANTEE     TABLE_SCHEMA    TABLE_NAME                GRANTOR
----------- --------------- ------------------------- ----------
ADB_USER    ADMIN           OCI$RESOURCE_PRINCIPAL    ADMIN

これで、ADB_USERがSelect AI ProfileからOCI$RESOURCE_PRINCIPALを参照できる状態になりました。

■ Select AI Profileの作成

ADB_USERでAutonomous AI Databaseへ接続します。

1) ADB_USERで接続

sql adb_user/<ADB_USER_PASSWORD>@ADW

● 既存の同名Profileを削除

同名のProfileを作り直す場合は、先に削除します。

force => TRUEを指定すると、Profileが存在しない場合のエラーを無視できます。

SQL
BEGIN
    DBMS_CLOUD_AI.DROP_PROFILE(
        profile_name => 'OCI_GENAI_RP',
        force        => TRUE
    );
END;
/
SQL実行結果
PL/SQL procedure successfully completed.

● Resource Principalを使用するProfileを作成

次のSQLでSelect AI Profileを作成します。

<GENAI_COMPARTMENT_OCID>は、OCI Generative AIの呼出しに使用するコンパートメントOCIDへ置き換えます。

SQL
BEGIN
    DBMS_CLOUD_AI.CREATE_PROFILE(
        profile_name => 'OCI_GENAI_RP',
        attributes   => q'~
        {
            "provider": "oci",
            "credential_name": "OCI$RESOURCE_PRINCIPAL",
            "oci_compartment_id": "<GENAI_COMPARTMENT_OCID>",
            "region": "ap-osaka-1",
            "model": "cohere.command-a-03-2025",
            "object_list": [
                {"owner": "SH", "name": "CUSTOMERS"},
                {"owner": "SH", "name": "SALES"},
                {"owner": "SH", "name": "PRODUCTS"},
                {"owner": "SH", "name": "COUNTRIES"}
            ],
            "object_list_mode": "all",
            "enforce_object_list": true,
            "comments": false,
            "constraints": true,
            "temperature": 0
        }
        ~',
        status      => 'enabled',
        description => 'OCI Generative AI using Autonomous AI Database Resource Principal'
    );
END;
/
SQL実行結果
PL/SQL procedure successfully completed.

今回指定した主な属性です。

属性 設定値 内容
provider oci OCI Generative AIを使用
credential_name OCI$RESOURCE_PRINCIPAL ADBのResource Principalで認証
oci_compartment_id <GENAI_COMPARTMENT_OCID> OCI Generative AI呼出しの認可対象コンパートメント
region ap-osaka-1 大阪リージョンを明示
model cohere.command-a-03-2025 Cohere Command Aを使用
object_list SHの4表 LLMへ送信する対象メタデータを限定
object_list_mode all 指定した4表のメタデータを使用
enforce_object_list true 指定外の表をSQL生成対象にしない
comments false 表・列コメントをLLMへ送信しない
constraints true 主キー・外部キーなどの関係をSQL生成に使用
temperature 0 SQL生成結果のばらつきを抑制

object_list_modeautomatedにすると、関連オブジェクト選択用のVector Indexが自動作成される場合があります。今回はEmbedding権限を追加せず、構成を単純にするためallを指定しています。

● Profileを確認

・ Profileの状態確認

SELECT profile_name,
       status,
       description
FROM   user_cloud_ai_profiles
WHERE  profile_name = 'OCI_GENAI_RP';
SQL実行結果
PROFILE_NAME    STATUS     DESCRIPTION
_______________ __________ ____________________________________________________________________
OCI_GENAI_RP    ENABLED    OCI Generative AI using Autonomous AI Database Resource Principal

・ Profileの属性確認

SELECT profile_name,
       attribute_name,
       attribute_value
FROM   user_cloud_ai_profile_attributes
WHERE  profile_name = 'OCI_GENAI_RP'
ORDER BY attribute_name;

特に、次の値を確認します。

credential_name = OCI$RESOURCE_PRINCIPAL
provider        = oci
region          = ap-osaka-1
model           = cohere.command-a-03-2025
SQL実行結果
PROFILE_NAME    ATTRIBUTE_NAME         ATTRIBUTE_VALUE
_______________ ______________________ ___________________________________________________________________________________
OCI_GENAI_RP    comments               false
OCI_GENAI_RP    constraints            true
OCI_GENAI_RP    credential_name        OCI$RESOURCE_PRINCIPAL
OCI_GENAI_RP    enforce_object_list    true
OCI_GENAI_RP    model                  cohere.command-a-03-2025
OCI_GENAI_RP    object_list            [{"owner":"SH","name":"CUSTOMERS"},{"owner":"SH","name":"SALES"},{"owner":"SH","
OCI_GENAI_RP    object_list_mode       all
OCI_GENAI_RP    oci_compartment_id     <GENAI_COMPARTMENT_OCID>
OCI_GENAI_RP    provider               oci
OCI_GENAI_RP    region                 ap-osaka-1
OCI_GENAI_RP    temperature            0

11 rows selected.

■ Select AI Profileを現在のセッションへ設定

1) Select AI Profile設定
DBMS_CLOUD_AI.SET_PROFILEは、Select AIを実行するデータベース・セッションごとに実行します。

BEGIN
    DBMS_CLOUD_AI.SET_PROFILE(
        profile_name => 'OCI_GENAI_RP'
    );
END;
/

SQLclでは、次のようにも実行できます。

EXEC DBMS_CLOUD_AI.SET_PROFILE('OCI_GENAI_RP');
SQL実行結果
PL/SQL procedure successfully completed.

2) Profileの確認

現在のProfileを確認します。

SELECT DBMS_CLOUD_AI.GET_PROFILE()
FROM   dual;
SQL実行結果
DBMS_CLOUD_AI.GET_PROFILE()
______________________________
"ADB_USER"."OCI_GENAI_RP"

本記事ではADB_USERでProfileを作成したため、所有者もADB_USERと表示されます。ADMINと表示される場合は、ProfileをADMINユーザーで作成しています。

■ Select AIを実行

LLMが生成するSQLは、モデル、モデルの更新、データベースのメタデータ、プロンプトによって変わる場合があります。

本番データへ適用する前に、最初にSHOWSQLでSQLを確認します。

● OCI Generative AIへの接続確認

最初にCHATを実行し、OCI Generative AIのChat APIを呼び出せることを確認します。

SELECT AI CHAT
SELECT AI CHAT
Autonomous AI DatabaseResource Principalとは何ですか?;
SELECT AI CHAT実行結果
RESPONSE
________________________________________________________________________________
**Autonomous AI DatabaseのResource Principal**は、Oracle Cloud Infrastructure
(OCI)のセキュリティ機能の一つで、データベースが他のOCIリソースと
安全に通信するための認証メカニズムです。

主な特徴として、データベース内へユーザーのAPI署名鍵を保存せず、
IAM Policyで許可されたOCIリソースへアクセスできます。

...(応答の一部を省略)

CHATの応答が返ることでOCI Generative AIのChat APIへ接続できたことを確認できます。ただし、応答本文はモデルが生成した内容です。Resource Principalを使用したこと自体は、後述するProfile属性とCredential権限で確認します。

● SHOWSQLで生成SQLを確認

SELECT AI SHOWSQL
SELECT AI SHOWSQL 最も売れた商品と販売数量を表示してください;
SELECT AI SHOWSQL実行結果
RESPONSE
_____________________________________
SELECT
    p."PROD_NAME" AS 商品名,
    SUM(s."QUANTITY_SOLD") AS 販売数量
FROM
    "SH"."SALES" s
JOIN
    "SH"."PRODUCTS" p
ON
    s."PROD_ID" = p."PROD_ID"
GROUP BY
    p."PROD_NAME"
ORDER BY
    販売数量 DESC
FETCH FIRST 1 ROWS ONLY

想定する処理内容は、SH.SALESSH.PRODUCTSを結合し、商品ごとのQUANTITY_SOLDを集計して最大の行を取得するSQLです。

次を確認します。

  • 使用している表がobject_list内であること
  • SALES.PROD_IDPRODUCTS.PROD_IDを正しく結合していること
  • QUANTITY_SOLDSUMで集計していること
  • 降順に並べ、先頭1件を取得していること

● 自然言語からSQLを実行

SHOWSQLの内容を確認後、同じ問い合わせを実行します。

SELECT AI
SELECT AI 最も売れた商品と販売数量を表示してください;
SELECT AI実行結果
PROD_NAME       TOTAL_QUANTITY_SOLD
____________ ______________________
Mouse Pad                     29282

SHOWSQLと通常のSELECT AIは別々にモデルを呼び出すため、列別名やSQLの書式が異なる場合があります。処理内容と実行結果が期待どおりかを確認します。

● 生成SQLを説明

SELECT AI EXPLAINSQL
SELECT AI EXPLAINSQL
最も売れた商品と販売数量を表示してください;
SELECT AI EXPLAINSQL 実行結果
RESPONSE
__________________________________________________________________________________________________________________________________________
SELECT p."PROD_NAME", SUM(s."QUANTITY_SOLD") AS total_quantity_sold
FROM "SH"."SALES" s
JOIN "SH"."PRODUCTS" p ON s."PROD_ID" = p."PROD_ID"
GROUP BY p."PROD_NAME"
ORDER BY total_quantity_sold DESC
FETCH FIRST 1 ROWS ONLY;


**説明:**

1. **SELECT句:**
   - `p."PROD_NAME"`: 商品名を選択します。
   - `SUM(s."QUANTITY_SOLD") AS total_quantity_sold`: 各商品の販売数量を合計し、`total_quantity_sold` というエイリアスを付けます。

2. **FROM句:**
   - `"SH"."SALES" s`: `SALES` テーブルに `s` というエイリアスを付けます。
   - `"SH"."PRODUCTS" p`: `PRODUCTS` テーブルに `p` というエイリアスを付けます。

3. **JOIN句:**
   - `JOIN "SH"."PRODUCTS" p ON s."PROD_ID" = p."PROD_ID"`: `SALES` テーブルと `PRODUCTS` テーブルを `PROD_ID` 列で結合します。これにより、販売データと商品情報が関連付けられます。

4. **GROUP BY句:**
   - `GROUP BY p."PROD_NAME"`: 商品名ごとにデータをグループ化します。これにより、各商品の販売数量が合計されます。

5. **ORDER BY句:**
   - `ORDER BY total_quantity_sold DESC`: 販売数量の合計を降順に並べ替えます。

6. **FETCH FIRST 1 ROWS ONLY:** 最も売れた商品(販売数量が最も多い商品)のみを返します。

このクエリは、最も売れた商品とその販売数量を表示します。

● 問合せ結果を自然言語で説明

SELECT AI NARRATE
SELECT AI NARRATE 最も売れた商品と販売数量を説明してください;
SELECT AI NARRATE実行結果
RESPONSE
_______________________________________
最も売れた商品は「Mouse Pad」で、販売数量は29,282個です。

NARRATEはSQLの実行結果をLLMへ渡し、自然言語の説明を生成します。実データを使用する場合は、組織のデータ取扱いポリシーを確認してから使用します。

■ Resource Principalを使用できていることの確認

今回の認証方式は、Profile、Credential権限、未作成のOCI署名Credentialの3点で確認します。

● ProfileのCredentialを確認

SQL
SELECT attribute_value AS credential_name
FROM   user_cloud_ai_profile_attributes
WHERE  profile_name = 'OCI_GENAI_RP'
AND    attribute_name = 'credential_name';
SQL実行結果
CREDENTIAL_NAME
-----------------------
OCI$RESOURCE_PRINCIPAL

● ADB_USERのResource Principal権限を確認

SQL
SELECT grantee,
       table_schema,
       table_name
FROM   all_tab_privs
WHERE  grantee = 'ADB_USER'
AND    table_name = 'OCI$RESOURCE_PRINCIPAL'
AND    table_schema = 'ADMIN';
SQL実行結果
GRANTEE     TABLE_SCHEMA    TABLE_NAME
----------- --------------- -------------------------
ADB_USER    ADMIN           OCI$RESOURCE_PRINCIPAL

● OCIユーザーのAPI署名鍵を登録していないことを確認

今回の手順では、次の情報をSelect AI Profileやユーザー作成Credentialへ登録していません。

  • OCI User OCID
  • Tenancy OCID
  • API署名秘密鍵
  • Fingerprint

Profileは次の組合せでOCI Generative AIを呼び出しています。

provider        = oci
credential_name = OCI$RESOURCE_PRINCIPAL
region          = ap-osaka-1
model           = cohere.command-a-03-2025

これにより、OCIユーザーのAPI署名鍵を作成、ダウンロード、SQLへ貼り付け、Credentialへ登録することなくSelect AIを実行できました。

■ Select AIでLLMへ送信される情報

Resource Principalは認証情報の管理を安全にする仕組みです。一方、LLMへ送信するプロンプト、メタデータ、問合せ結果の管理は別に必要です。

● NL2SQL/SHOWSQL/通常実行

Select AIは、自然言語からSQLを生成するため、対象表のメタデータでプロンプトを拡張します。メタデータには、設定に応じて次の情報が含まれます。

  • オブジェクト所有者名
  • 表名/ビュー名
  • 列名
  • データ型
  • 表・列コメント
  • Annotation
  • 主キー/外部キーなどの制約

今回のProfileでは、対象をSHスキーマの4表へ限定し、コメントは送信せず、制約をSQL生成に利用します。

{
    "object_list": [
        {"owner": "SH", "name": "CUSTOMERS"},
        {"owner": "SH", "name": "SALES"},
        {"owner": "SH", "name": "PRODUCTS"},
        {"owner": "SH", "name": "COUNTRIES"}
    ],
    "object_list_mode": "all",
    "enforce_object_list": true,
    "comments": false,
    "constraints": true
}

通常のNL2SQLでは、SQL生成の中心になるのは表のメタデータです。生成後のSQLはAutonomous AI Database内で実行されます。

● NARRATE

NARRATEは、データベースで実行したSQLの問合せ結果をLLMへ送り、自然言語の説明を生成します。

そのため、機密データ、個人情報、社外秘情報を含む問合せでNARRATEを使用する場合は、組織のデータ取扱いポリシーを確認します。

● CHAT

CHATは入力した自然言語プロンプトをLLMへ送信します。今回のProfileでは会話履歴を有効化していませんが、conversationを有効化する構成では、会話履歴に含まれる情報も考慮が必要です。

■ セキュリティ上のポイント

● Dynamic GroupはADB 1台に限定

Matching Ruleでは、対象ADBのOCIDを直接指定しました。

resource.id = '<ADB_OCID>'

コンパートメント内のすべてのADBを対象にするルールよりも、権限を与える対象を狭くできます。

● IAM PolicyはChat APIの実行だけに限定

Allow dynamic-group ADB_SELECT_AI_RP_DG
to use generative-ai-chat
in compartment <GENAI_COMPARTMENT_NAME>

OCI Generative AIのChat操作に必要なVerbはuseです。manage generative-ai-familyは使用していません。

● Select AI Profileの対象表を限定

object_listenforce_object_listを使用し、SQL生成対象をSHスキーマの4表へ限定しました。

ただし、最終的なデータアクセス制御はデータベース権限です。実業務のスキーマを使用する場合は、ADB_USERへ不要な表や列への権限を付与しないことも重要です。

● 最初にSHOWSQLで確認

自然言語から生成されたSQLを無条件に実行せず、最初にSHOWSQLで参照表、JOIN条件、WHERE条件、集計方法を確認します。

● Resource Principalとデータガバナンスは別管理

Resource PrincipalによってOCIユーザーの秘密鍵管理は不要になりますが、LLMへ送信するメタデータ、プロンプト、NARRATEの問合せ結果については、組織のデータガバナンスに従って管理します。

● 利用リージョンを明示

今回のProfileはregion: ap-osaka-1を明示しています。東京リージョンのADBから実行する場合でも、OCI Generative AIの推論処理先は指定した大阪リージョンです。利用リージョンとデータ取扱い要件を事前に確認します。

■ トラブルシューティング

症状 確認内容
OCI Generative AIの認可エラーになる Dynamic GroupのMatching Rule、IAM PolicyのSubject、対象コンパートメントを確認
NotAuthorizedOrNotFound相当のエラーになる Dynamic Group名、Identity Domain名、Policyの対象コンパートメント、ADB OCIDを確認
Policy変更後も同じエラーになる Resource Principalトークンが最大2時間キャッシュされるため、反映を待って再実行
モデルが見つからない regionmodelの組合せをOCI Generative AIのModels by Regionで確認
東京のADBから大阪モデルを呼び出せない Profileのregionap-osaka-1oci_compartment_idが正しい値になっているか確認
OCI$RESOURCE_PRINCIPALを使用できない ENABLE_PRINCIPAL_AUTHusernameがProfile所有者のADB_USERと一致しているか確認
DBMS_CLOUD_AIを実行できない ADMINでADB_USERへのEXECUTE権限を確認
GRANT SELECT ON SH...ORA-01031になる SHはOracle管理の読取り専用サンプル・スキーマのため追加GRANTは行わず、ADB_USERから直接SELECTして確認
GET_PROFILE()ADMIN所有を示す Profileを作成したユーザーを確認。ADB_USER所有にする場合はADB_USERでProfileを作成してSET_PROFILEを実行
Profileが見つからない Profileを作成したDBユーザーで接続しているか確認
Select AIでProfile未設定エラーになる セッションごとにDBMS_CLOUD_AI.SET_PROFILEを実行
意図しない表を使用するSQLが生成される object_listenforce_object_list、DBユーザーの権限を確認
JOIN条件が不正確 constraints: true、主キー/外部キー、表・列名を確認
日本語のSQL生成精度が安定しない プロンプトを具体化し、SHOWSQLで確認。同じ質問を複数回試して評価

● 確認用SQL

-- 現在のSelect AI Profile
SELECT DBMS_CLOUD_AI.GET_PROFILE()
FROM dual;

-- Profileの状態
SELECT profile_name,
       status,
       description
FROM user_cloud_ai_profiles;

-- Profileの属性
SELECT profile_name,
       attribute_name,
       attribute_value
FROM user_cloud_ai_profile_attributes
WHERE profile_name = 'OCI_GENAI_RP'
ORDER BY attribute_name;

-- Resource Principal Credential(ADMINで実行)
SELECT owner,
       credential_name
FROM dba_credentials
WHERE credential_name = 'OCI$RESOURCE_PRINCIPAL'
AND owner = 'ADMIN';

-- ADB_USERへのResource Principal権限
SELECT grantee,
       table_schema,
       table_name,
       grantor
FROM all_tab_privs
WHERE grantee = 'ADB_USER'
AND table_name = 'OCI$RESOURCE_PRINCIPAL'
AND table_schema = 'ADMIN';

■ 検証環境を片付ける場合

検証環境を片付ける場合は、Profile、データベース・ユーザーのResource Principal使用権限、OCI IAM設定の順に削除します。

● Select AI Profileを削除

ADB_USERで接続し、現在のセッションに設定しているProfileをクリアします。

BEGIN
    DBMS_CLOUD_AI.CLEAR_PROFILE;
END;
/

続けて、ADB_USERが所有するSelect AI Profileを削除します。

BEGIN
    DBMS_CLOUD_AI.DROP_PROFILE(
        profile_name => 'OCI_GENAI_RP',
        force        => TRUE
    );
END;
/

● ADB_USERのResource Principal使用権限を削除

ADMINユーザーで接続し、ADB_USERからOCI Resource Principalの使用権限を外します。

BEGIN
    DBMS_CLOUD_ADMIN.DISABLE_PRINCIPAL_AUTH(
        provider => 'OCI',
        username => 'ADB_USER'
    );
END;
/

これにより、ADB_USERからOCI$RESOURCE_PRINCIPALを使用できなくなります。

● Autonomous AI Database全体でResource Principalを無効化する場合

ほかのDBユーザーやDBMS_CLOUD処理がResource Principalを使用していないことを確認した場合だけ、ADMIN用のResource Principalも無効化します。

BEGIN
    DBMS_CLOUD_ADMIN.DISABLE_PRINCIPAL_AUTH(
        provider => 'OCI'
    );
END;
/

共有環境では、ほかの処理へ影響するため、利用状況を確認せずに実行しないようにします。

● OCI IAM設定を削除

ほかの処理から使用していないことを確認して、次をOCI Consoleから削除します。

  1. IAM Policy ADB_SELECT_AI_GENAI_POLICY
  2. Dynamic Group ADB_SELECT_AI_RP_DG

Dynamic Groupの削除時にメンバーが存在することを示すエラーになる場合は、先にMatching Ruleを変更し、対象ADBがDynamic Groupへ所属しない状態にしてから削除します。

■ まとめ

Autonomous AI DatabaseのResource Principalを使用し、API署名鍵なしでSelect AIからOCI Generative AIへ接続しました。

今回の構成では、次を確認できました。

  • OCIユーザーのAPI署名秘密鍵をAutonomous AI Databaseへ登録しない
  • OCI User OCID、Tenancy OCID、FingerprintをSelect AI用Credentialへ登録しない
  • 秘密鍵をダウンロード、ローカル保存、SQLへ貼り付けしない
  • OCIユーザーのAPI署名鍵を手動ローテーションしない
  • 対象ADB 1台をDynamic Groupで指定する
  • OCI Generative AIのChat APIだけを最小権限で許可する
  • ADB_USEROCI$RESOURCE_PRINCIPALの使用権限を付与する
  • Select AI Profileでcohere.command-a-03-2025を使用する
  • CHATSHOWSQL、通常実行、EXPLAINSQLNARRATEを実行する

Resource Principalは、OCIユーザーの秘密鍵を安全な場所へ移す方法ではありません。Autonomous AI Database自身をOCI IAM上のIdentityとして扱い、ユーザーのAPI署名鍵を不要にする仕組みです。

Oracle DatabaseからOCIサービスへ接続するために、ユーザーの秘密鍵をデータベースへ預けるのではなく、Autonomous AI Database自身をIdentityとして扱う。

単にCredentialの作成手順が減るだけでなく、「実際に処理するリソース」と「IAM上の認証主体」が同じになるところが、今回一番すっきりしたと感じたところです。Oracle Databaseを長く触ってきた人ほど、この鍵管理から解放される構成にはグッとくるものがあると思います。

一方、OpenAIなど外部AIプロバイダーへ接続する場合は、外部APIキーの管理が引き続き必要です。次回は、そのAPIキーをOCI Vaultで安全に管理しながらSelect AIから使用する構成を検証してみてみたいです。

いいじゃない、Resource PrincipalでSelect AI!

■ 解説

初心者でもわかりやすく解説してます。
セールストークにどーぞ

■ おまけ

おまけ.png

■ 参考

● 前回記事

● Autonomous AI Database / Select AI

● OCI IAM

● OCI Resource Principal

● OCI Generative AI

おまけ.png

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?