以前、Autonomous AI DatabaseのSelect AIからOpenAI APIを呼び出し、自然言語でデータベースへ問い合わせてみました。
前回は、OpenAI APIを使ってSelect AIを「動かす」ところまでを確認しました。
実際に動かしたあとで、次に気になったのが、OpenAI APIキーをどこへ置き、どのように運用するかです。
既存の構成では、OpenAI APIキーをDBMS_CLOUD.CREATE_CREDENTIALのpasswordへ指定しています。
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'OPENAI_CRED',
username => 'OPENAI',
password => '<OpenAI APIキー>'
);
END;
/
作成されたCredentialはデータベース内へ暗号化形式で保存されます。
ただし、登録するときにはOpenAI APIキーそのものをSQLへ記述するため、次のような場所へ残らないように注意が必要です。
- SQLスクリプト
- SQLclやシェルの履歴
- SQL Worksheetの実行履歴
- ログ
- Gitリポジトリ
- Blog用のスクリーンショット
Select AIが動くところまで確認できても、APIキーがSQLやスクリプトに残る構成では、継続的な運用へ持っていきにくくなります。
以前、OCI Generative AIを利用したときは、Resource Principalを使用することで、OCIユーザーのAPI署名鍵をデータベースへ登録せずにSelect AIを実行できました。
一方で、OpenAI APIはOCI IAMのResource Principalでは直接認証できません。OpenAI APIキーそのものは引き続き必要です。
大事なのは、APIキーをなくすことではなく、APIキーを安全な場所へ分離し、必要な権限を持つAutonomous AI Databaseだけが参照できる構成にすることでした。
そこで今回は、OpenAI APIキーをOCI VaultのSecretへ保存し、Autonomous AI DatabaseからResource Principalを使用して参照します。
Select AIのプロバイダーとモデルは変更せず、既存Blogと同じOpenAI APIおよびgpt-4o-miniをそのまま使用します。変更するのは、OpenAI APIキーの管理方法だけです。
ということで、OpenAI APIキーをSQLへ直接記述せず、OCI VaultとResource Principalを使用してSelect AIしてみてみます。
■ 今回の構成
今回の認証経路は、Vault Secret Credentialの作成・更新時と、Select AIの実行時で分けて考えると分かりやすくなります。
Autonomous AI Database
│
│ Resource Principal
▼
OCI Vault Secret
OpenAI APIキーの最新Version
│
▼
OPENAI_VAULT_CRED
SELECT AI
│
▼
DBMS_CLOUD_AIプロファイル
provider : openai
model : gpt-4o-mini
│
▼
OPENAI_VAULT_CRED
DBMS_CLOUD Vault Secret Credential
│
│ Authorization: Bearer <OpenAI APIキー>
▼
OpenAI API
api.openai.com
Resource Principalの役割は、OpenAI APIへ直接認証することではありません。
| 通信区間 | 認証方法 |
|---|---|
| Autonomous AI DatabaseからOCI Vault | OCI Resource Principal |
| Autonomous AI DatabaseからOpenAI API | Vaultから取得したOpenAI APIキー |
つまり、Resource PrincipalでOpenAI APIキーを不要にするのではなく、Resource Principalを使ってOCI VaultからOpenAI APIキーを安全に取得します。
なお、OCI VaultがSelect AIの実行ごとに参照されるわけではありません。
Vault Secret Credentialは、OCI Vaultに登録されたSecretを12時間ごとに更新します。Secret Versionをすぐに反映したい場合は、DBMS_CLOUD.REFRESH_VAULT_CREDENTIALを実行します。
■ 前提条件
今回の手順では、次の環境を使用します。
| 項目 | 内容 |
|---|---|
| Database | Autonomous AI Database |
| リージョン | Japan East(Tokyo)/ap-tokyo-1
|
| Select AI実行ユーザー | ADB_USER |
| AI Provider | OpenAI |
| Model | gpt-4o-mini |
| Secret管理 | OCI Vault/Secret Management |
| Network |
api.openai.comへ接続できるNetwork ACL |
このほか、OCI Vaultのマスター暗号化キー、OpenAI APIキー、既存のSelect AI用OpenAIプロファイルが必要です。
既存Blogで作成したOpenAIプロファイルを、そのまま利用します。
Provider : openai
Model : gpt-4o-mini
■ OCI VaultへOpenAI APIキーを登録
● Vaultを作成
OCIコンソールから、OCI VaultのVaultを作成します。
すでに利用できるVaultがある場合は、新しく作成せず既存のVaultを使用できます。
● マスター暗号化キーを作成
Vault内に、Secretを暗号化するためのマスター暗号化キーを作成します。
マスター暗号化キーのProtection Modeには、SoftwareとHSMがあります。検証環境ではSoftware保護キーを使用でき、より高いセキュリティ要件がある場合はHSM保護キーを選択できます。キーの保護モードやローテーション方針は、組織のセキュリティ要件に応じて設定します。
● Secretを作成
OpenAI APIキーを格納するSecretを作成します。
Secretの内容には、OpenAI APIキー文字列を登録します。
sk-proj-xxxxxxxxxxxxxxxxxxxxxxxx
Vault Secret Credentialでは、Secretから取得した値が通常のCredentialにおけるpasswordとして使用されるため、今回の用途では、次のようなJSON形式にはせず、APIキーの文字列だけを登録します。
{
"api_key": "sk-proj-xxxxxxxxxxxxxxxxxxxxxxxx"
}
| 画面項目 | 設定値 | 補足 |
|---|---|---|
| Create in compartment | POC |
検証ではADBと同じコンパートメントへ配置します。本番では組織の分離方針に従います |
| Name | openai-select-ai-api-key |
用途が分かる名前を設定します |
| Description | 任意 | 例:OpenAI API key used by Select AI
|
| Vault compartment | POC |
Vault01が存在するコンパートメントです |
| Vault | Vault01 |
Secretを格納するVaultです |
| Encryption key compartment | POC |
ADW-Keyが存在するコンパートメントです |
| Encryption key | ADW-Key |
Vault01内に作成した対称キーを指定します |
| Secret Generation | Manual secret generation | OpenAIが発行した既存APIキーを登録するため選択します |
| Secret Type Template | Plain-Text | Manualを選択すると表示されます |
| Secret Contents | OpenAI APIキーそのもの |
sk-proj-...などをそのまま貼り付けます |
| Cross-region replication | OFF | 今回の検証では使用しません |
| Secret rotation | 未設定 | OpenAI側のAPIキー発行・無効化と合わせて管理します |
| Rules | 未設定 | 今回の検証では使用しません |
作成後、SecretのOCIDを控えます。
ocid1.vaultsecret.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxx
■ Dynamic Groupを作成
Autonomous AI DatabaseがResource PrincipalとしてOCI Vaultへアクセスできるように、Dynamic Groupを作成します。
OCIコンソールで、対象のAutonomous AI Databaseだけを含むMatching Ruleを設定します。
resource.id = '<Autonomous AI DatabaseのOCID>'
例:
resource.id = 'ocid1.autonomousdatabase.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxx'
コンパートメント内のすべてのAutonomous AI Databaseを対象にすることもできますが、今回は最小権限にするため、特定のAutonomous AI DatabaseのOCIDへ限定します。
Dynamic Group名の例は、次のとおりです。
ADB_OPENAI_VAULT_DG
■ IAM Policyを作成
Dynamic Groupに対して、OCI VaultのSecretを読み取る権限を付与します。
今回は、OpenAI APIキーを格納した特定のSecretだけを読み取れるように制限します。
Allow dynamic-group ADB_OPENAI_VAULT_DG to read secret-bundles
in compartment <Secretを配置したCompartment名>
where target.secret.id = '<OpenAI APIキーを格納したSecretのOCID>'
例:
Allow dynamic-group ADB_OPENAI_VAULT_DG to read secret-bundles
in compartment MyCompartment
where target.secret.id = 'ocid1.vaultsecret.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxx'
このPolicyにより、対象のAutonomous AI Databaseは、指定したOpenAI APIキー用Secretだけを参照できます。
■ Resource Principalを有効化
ADMINユーザーでAutonomous AI Databaseへ接続し、Resource Principalを有効化します。
BEGIN
DBMS_CLOUD_ADMIN.ENABLE_RESOURCE_PRINCIPAL();
END;
/
PL/SQL procedure successfully completed.
Select AIをADB_USERで実行する場合は、対象ユーザーにもResource Principal Credentialへのアクセスを付与します。
BEGIN
DBMS_CLOUD_ADMIN.ENABLE_RESOURCE_PRINCIPAL(
username => 'ADB_USER'
);
END;
/
PL/SQL procedure successfully completed.
OCI Generative AIのResource Principal検証と同じAutonomous AI Databaseおよび同じデータベース・ユーザーを使用している場合は、すでに設定済みの可能性があります。
必要に応じて、対象ユーザーへDBMS_CLOUDおよびDBMS_CLOUD_AIの実行権限を付与します。
GRANT EXECUTE ON DBMS_CLOUD TO ADB_USER;
GRANT EXECUTE ON DBMS_CLOUD_AI TO ADB_USER;
■ Vault Secret Credentialを作成
ADB_USERで接続し、OCI VaultのSecretを参照するCredentialを作成します。
OpenAI APIキーそのものではなく、SecretのOCIDを指定します。
このSQLにOpenAI APIキーは含まれません。
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'OPENAI_VAULT_CRED',
params => JSON_OBJECT(
'username' VALUE 'OPENAI',
'secret_id' VALUE
'ocid1.vaultsecret.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxx'
)
);
END;
/
PL/SQL procedure successfully completed.
SQLスクリプトや実行履歴へ記録されるのは、OCI Vault SecretのOCIDだけです。
今回の手順では、Vault Secret CredentialとSelect AIプロファイルを同じADB_USERで作成・使用します。AIプロファイルの属性変更も、プロファイルを所有するユーザーで実行します。
● Vault Secret Credentialを即時更新
DBMS_CLOUD.REFRESH_VAULT_CREDENTIALは、OCI Vaultから最新VersionのSecretを即時取得し、Vault Secret Credentialを更新する処理です。
通常は12時間間隔で自動更新されるため、Vault側のSecretを変更した場合、Autonomous AI Databaseへ反映されるまで最大12時間かかることがあります。すぐに最新Versionを反映したい場合は、次を実行します。
BEGIN
DBMS_CLOUD.REFRESH_VAULT_CREDENTIAL(
credential_name => 'OPENAI_VAULT_CRED'
);
END;
/
PL/SQL procedure successfully completed.
■ 既存のSelect AIプロファイルを変更
既存Blogで作成したSelect AIプロファイルのCredentialを、Vault Secret Credentialへ変更します。
ここでは、既存プロファイル名をOPENAIとします。
BEGIN
DBMS_CLOUD_AI.SET_ATTRIBUTE(
profile_name => 'OPENAI',
attribute_name => 'credential_name',
attribute_value => 'OPENAI_VAULT_CRED'
);
END;
/
PL/SQL procedure successfully completed.
変更するのは、credential_nameだけです。
次の設定は変更しません。
{
"provider": "openai",
"model": "gpt-4o-mini"
}
そのため、持ち込みのOpenAI APIモデルgpt-4o-miniをそのまま利用できます。
● プロファイル設定を確認
プロファイルの属性を確認します。
SELECT attribute_name,
attribute_value
FROM user_cloud_ai_profile_attributes
WHERE profile_name = 'OPENAI'
AND attribute_name IN (
'provider',
'model',
'credential_name'
)
ORDER BY attribute_name;
ATTRIBUTE_NAME ATTRIBUTE_VALUE
__________________ ____________________
credential_name OPENAI_VAULT_CRED
model gpt-4o-mini
provider openai
■ Select AIを実行
使用するSelect AIプロファイルを設定します。
BEGIN
DBMS_CLOUD_AI.SET_PROFILE('OPENAI');
END;
/
PL/SQL procedure successfully completed.
まず、自然言語から生成されるSQLを確認します。
SELECT AI SHOWSQL 顧客は全部で何人ですか?;
RESPONSE
_______________________________________________
SELECT COUNT("CUST_ID") AS "Total_Customers"
FROM "SH"."CUSTOMERS" c
WHERE "CUST_VALID" = 'Y'
続いて、Select AIを実行します。
SELECT AI 顧客は全部で何人ですか?;
Total_Customers
__________________
0
既存Blogと同じ結果が返れば、OpenAI APIキーをOCI Vaultから取得してSelect AIを実行できています。
OpenAI APIへの接続先は変わらないため、既存Blogで設定したapi.openai.comへのNetwork ACLは引き続き必要です。
■ OpenAI APIキーをローテーション
OCI Vaultを利用するメリットの1つが、OpenAI APIキーをSelect AIプロファイルから分離して管理できることです。
OpenAI APIキーを更新するときは、次の順序で実施します。
1) OpenAIで新しいAPIキーを作成
OpenAI側で、新しいAPIキーを作成します。
2) OCI Vaultへ新しいSecret Versionを追加
既存のSecretへ、新しいOpenAI APIキーをSecret Versionとして追加します。

3) Vault Secret Credentialを更新
新しいSecret Versionを即時反映したい場合は、次を実行します。
BEGIN
DBMS_CLOUD.REFRESH_VAULT_CREDENTIAL(
credential_name => 'OPENAI_VAULT_CRED'
);
END;
/
PL/SQL procedure successfully completed.
Vault Secretの変更は定期的に再取得されますが、ローテーション直後に動作確認する場合は明示的に更新します。
4) Select AIの動作を確認
SELECT AI SHOWSQL 顧客は全部で何人ですか?;
RESPONSE
_______________________________________________
SELECT COUNT("CUST_ID") AS "Total_Customers"
FROM "SH"."CUSTOMERS" c
WHERE "CUST_VALID" = 'Y'
SELECT AI 顧客は全部で何人ですか?;
Total_Customers
__________________
0
5) OpenAI側で古いAPIキーを無効化
新しいAPIキーで正常に動作することを確認した後、OpenAI側で古いAPIキーを無効化します。
6) 古いAPIキーの無効化後に最終確認
古いAPIキーを無効化した状態で、もう一度Select AIを実行します。
SELECT AI SHOWSQL 顧客は全部で何人ですか?;
ここでもSQLが生成されれば、Vault Secret Credentialが新しいOpenAI APIキーへ切り替わったことを確認できます。
OCI VaultがOpenAI APIキーを自動発行するわけではありません。
役割分担は、次のようになります。
| 操作 | 実施するサービス |
|---|---|
| 新しいAPIキーの発行 | OpenAI |
| APIキーの安全な保管 | OCI Vault |
| Autonomous AI Databaseへの反映 | OCI Vault / DBMS_CLOUD |
| 古いAPIキーの無効化 | OpenAI |
■ 旧Credentialを削除
Vault Secret Credentialへ切り替え、Select AIが正常に動作することを確認した後、OpenAI APIキーを直接登録していた旧Credentialを削除します。
BEGIN
DBMS_CLOUD.DROP_CREDENTIAL(
credential_name => 'OPENAI_CRED'
);
END;
/
PL/SQL procedure successfully completed.
安全に移行するため、次の順序で実施します。
既存のOPENAI_CREDを残す
↓
OPENAI_VAULT_CREDを新規作成
↓
Select AIプロファイルを切り替える
↓
Select AIの動作を確認する
↓
旧OPENAI_CREDを削除する
最初に旧Credentialを削除するよりも、新しいCredentialの動作を確認してから削除する方が、問題発生時に切り戻しやすくなります。
■ セキュリティ上のポイント
今回の構成では、次のように権限と利用範囲を限定します。
- OpenAI側ではSelect AI専用のProject APIキーを使用する
- OpenAI APIキーの権限を必要最小限にする
- OpenAI側で利用上限やUsageを監視する
- Dynamic Groupは特定のAutonomous AI Databaseへ限定する
- IAM Policyは特定のVault Secretへ限定する
-
DBMS_CLOUDとDBMS_CLOUD_AIの権限を必要なユーザーだけに付与する - OpenAI APIキーをSQL、Git、ログ、スクリーンショットへ記録しない
- APIキーを定期的にローテーションする
また、今回利用しているのは、OCI VaultのSecret管理機能です。
Oracle AI DatabaseのDatabase Vaultとは、名前が似ていますが別の機能です。
| サービス/機能 | 主な用途 |
|---|---|
| OCI Vault | 暗号化キーやSecretの保管・管理 |
| Oracle AI Database Vault | データベース内の特権アクセス制御 |
■ OCI Generative AIとの違い
OCI Generative AIとOpenAI APIでは、Resource Principalの使用方法が異なります。
| 項目 | OCI Generative AI | OpenAI API |
|---|---|---|
| AIサービスへの認証 | Resource Principal | OpenAI APIキー |
| APIキー | 不要 | 必要 |
| APIキーの保管先 | なし | OCI Vault Secret |
| Autonomous AI DatabaseからVaultへの認証 | 不要 | Resource Principal |
| Select AIのProvider | oci |
openai |
OCI Generative AIでは、Resource PrincipalがAIサービスへの認証に直接使用されます。
OpenAI APIでは、Resource PrincipalはOCI Vaultへアクセスするために使用され、OpenAI APIへの認証にはVaultから取得したOpenAI APIキーを使用します。
■ まとめ
今回は、既存Blogで使用したOpenAI APIおよびgpt-4o-miniを変更せず、OpenAI APIキーの管理方法だけをOCI Vaultへ変更しました。
今回確認できたポイントは、次のとおりです。
- OpenAI APIキーそのものは引き続き必要
- OpenAI APIキーをOCI VaultのSecretへ保存
- Autonomous AI DatabaseからOCI VaultへResource Principalでアクセス
- Select AIプロファイルではVault Secret Credentialを使用
- SQLへOpenAI APIキーを直接記述しない
- APIキーのローテーション時にSelect AIプロファイルを作り直す必要がない
- IAM Policyによって参照できるAutonomous AI DatabaseとSecretを限定できる
Resource PrincipalでOpenAI APIキーが不要になるわけではありません。
それでも、APIキーをSQLやスクリプトからOCI Vaultへ分離し、誰が参照できるのかをIAM Policyで制御し、ローテーション時にはCredentialだけを更新できるようになりました。
今回あらためて感じたのは、AI機能を「使えるようにする」ことと、「運用できる形に整える」ことは別だということです。
Select AIで自然言語からSQLを生成できても、APIキーをどこへ置き、誰が参照でき、どのようにローテーションするのかまで整理して、ようやく実際の運用へ近づきます。
また、Oracleだけですべてを閉じるのではなく、データとSQLはAutonomous AI Database、AIモデルはOpenAI、Secret管理はOCI Vaultと、それぞれの得意なところをつなげて使えるのも、今回面白いと感じたところです。
Oracle Databaseを長く触ってきた立場から見ると、AIが動くことだけでなく、既存のCredentialやIAMの仕組みを使って運用まで組み立てられるところには、かなりグッとくるものがあります。
DBMS_CLOUDのVault Secret Credentialは、OCI Vaultだけでなく、Azure Key Vault、AWS Secrets Manager、GCP Secret Managerにも対応しています。
今回はOCI Vaultで検証しましたが、次回はこの仕組みをMulti Cloudへ広げ、それぞれのCloudで管理しているSecretをAutonomous AI Databaseからどのように利用できるのか、試してみてみたいです。
■ 参考情報
- OpenAI APIを使用して自然言語でSelect AIしてみてみた
- Use Vault Secret Credentials with Autonomous Database
- DBMS_CLOUD Package
- DBMS_CLOUD_AI Package
- Manage Select AI Profiles
- Enable Resource Principal on Autonomous Database
- Secret Management Service
- Creating a Master Encryption Key
- Details for Vault, Key Management, and Secret Management Service
- OpenAI API Key Safety Best Practices
- Assign API Key Permissions
- OpenAI Production Best Practices
- GPT-4o Mini Model




















