~ Oracle Database 連携 × 4パターン対応版 ~
📋 前提条件
| 項目 | 内容 |
|---|---|
| OCIアカウント | 有効なOCIテナント |
| 権限 | 管理者権限またはVault/Compute/Functionsの操作権限 |
| OCI CLI | インストール済み・設定済み(oci setup config 完了) |
| Java環境(Javaパターン) | JDK 11以上、Maven |
| PowerShell環境(PSパターン) | PowerShell 7以上、OCI PowerShell モジュール |
OCI CLI のセットアップ確認
oci --version
oci iam region list # 接続確認
🗂️ 全体構成図
[OCI Vault]
│
│ (プリンシパル認証でアクセス)
├──── IaaS (Compute VM) ──── Java アプリ [インスタンス・プリンシパル]
├──── IaaS (Compute VM) ──── PowerShell スクリプト [インスタンス・プリンシパル]
├──── PaaS (OCI Functions) ── Java アプリ [リソース・プリンシパル]
└──── PaaS (OCI Functions) ── PowerShell スクリプト [リソース・プリンシパル]
│
▼
[Oracle Database (DB接続文字列)]
Azure との用語対比
| Azure | OCI | 説明 |
|---|---|---|
| Azure Key Vault | OCI Vault | シークレット管理サービス |
| マネージド ID(VM用) | インスタンス・プリンシパル | VMが自分自身を証明する仕組み |
| マネージド ID(SaaS用) | リソース・プリンシパル | FunctionsなどのSaaSリソースが自分自身を証明する仕組み |
| RBAC ロール割り当て | 動的グループ + ポリシー | アクセス権限の付与方法 |
STEP 1:共通 OCI リソースの作成
すべてのパターンで共通して使うリソースを先に作成します。
1-1. コンパートメントの確認
# コンパートメントの一覧を確認
oci iam compartment list --all
# 使用するコンパートメントのOCIDをメモしておく
export COMPARTMENT_ID="ocid1.compartment.oc1..xxxxxxxxxx"
1-2. OCI Vault の作成
# Vault(コンテナ)の作成
oci kms management vault create \
--compartment-id $COMPARTMENT_ID \
--display-name "handson-vault" \
--vault-type DEFAULT \
--region ap-tokyo-1
# 作成されたVaultのOCIDをメモ
export VAULT_ID="ocid1.vault.oc1.ap-tokyo-1.xxxxxxxxxx"
export VAULT_ENDPOINT="https://xxxxxxxxxx-management.kms.ap-tokyo-1.oraclecloud.com"
1-3. マスター暗号化キーの作成
oci kms management key create \
--compartment-id $COMPARTMENT_ID \
--display-name "handson-master-key" \
--key-shape '{"algorithm":"AES","length":32}' \
--endpoint $VAULT_ENDPOINT
# 作成されたキーのOCIDをメモ
export KEY_ID="ocid1.key.oc1.ap-tokyo-1.xxxxxxxxxx"
1-4. Vault にシークレット(DB接続情報)を登録
OCI Vault のシークレットは Base64エンコード して登録する必要があります。
# DB接続文字列をBase64エンコードして登録
DB_CONN_STR="jdbc:oracle:thin:@//your-db-host:1521/ORCLPDB1"
DB_CONN_B64=$(echo -n "$DB_CONN_STR" | base64)
oci vault secret create-base64 \
--compartment-id $COMPARTMENT_ID \
--vault-id $VAULT_ID \
--key-id $KEY_ID \
--secret-name "DbConnectionString" \
--secret-content-content "$DB_CONN_B64"
# DBパスワードも登録
DB_PASS="YourDBPassword123!"
DB_PASS_B64=$(echo -n "$DB_PASS" | base64)
oci vault secret create-base64 \
--compartment-id $COMPARTMENT_ID \
--vault-id $VAULT_ID \
--key-id $KEY_ID \
--secret-name "DbPassword" \
--secret-content-content "$DB_PASS_B64"
# 作成されたシークレットのOCIDをメモ
export SECRET_ID_CONN="ocid1.vaultsecret.oc1.ap-tokyo-1.xxxxxxxxxx"
export SECRET_ID_PASS="ocid1.vaultsecret.oc1.ap-tokyo-1.yyyyyyyyyy"
⚠️ OCI Vault では取得時に必ず Base64デコード が必要です。Azureとの大きな違いです。
STEP 2:IaaS (Compute VM) の準備
パターン1(IaaS + Java)とパターン2(IaaS + PowerShell)で共通の手順です。
2-1. Compute VM の作成
# 利用可能なイメージを確認
oci compute image list \
--compartment-id $COMPARTMENT_ID \
--operating-system "Oracle Linux" \
--query 'data[0].id'
# VMの作成
oci compute instance launch \
--compartment-id $COMPARTMENT_ID \
--display-name "vm-handson" \
--availability-domain "<利用可能ドメイン名>" \
--shape "VM.Standard.E4.Flex" \
--shape-config '{"ocpus":1,"memoryInGBs":4}' \
--image-id "<イメージOCID>" \
--subnet-id "<サブネットOCID>" \
--ssh-authorized-keys-file ~/.ssh/id_rsa.pub
# 作成されたVMのOCIDをメモ
export INSTANCE_ID="ocid1.instance.oc1.ap-tokyo-1.xxxxxxxxxx"
2-2. 動的グループの作成(インスタンス・プリンシパル用)
OCI ではマネージドIDの代わりに「動的グループ」でVMを識別します。
# 動的グループの作成
oci iam dynamic-group create \
--name "handson-vm-dynamic-group" \
--description "IaaS VM用の動的グループ" \
--matching-rule "instance.id = '$INSTANCE_ID'"
💡 複数のVMをまとめる場合はコンパートメント単位で指定できます:
All {instance.compartment.id = '<コンパートメントOCID>'}
2-3. ポリシーの設定(Vault アクセス権限)
# Vaultへのアクセスを許可するポリシーを作成
oci iam policy create \
--compartment-id $COMPARTMENT_ID \
--name "handson-vault-policy" \
--description "VMからVaultへのアクセスポリシー" \
--statements '[
"Allow dynamic-group handson-vm-dynamic-group to read secret-bundle in compartment id '"$COMPARTMENT_ID"'",
"Allow dynamic-group handson-vm-dynamic-group to read vaults in compartment id '"$COMPARTMENT_ID"'"
]'
2-4. サービス・ゲートウェイの確認
インターネットを経由せずVCN内部からVaultにアクセスするため、サービス・ゲートウェイが必要です。
# VCN内のサービス・ゲートウェイを確認
oci network service-gateway list \
--compartment-id $COMPARTMENT_ID
# なければ作成
oci network service-gateway create \
--compartment-id $COMPARTMENT_ID \
--vcn-id "<VCNのOCID>" \
--services '[{"serviceId":"<OCIサービスのID>"}]' \
--display-name "handson-service-gateway"
パターン 1:IaaS (Compute VM) + Java
手順概要
- VMにSSH接続
- Java環境とOCI SDKのセットアップ
- サンプルJavaアプリを作成・実行
3-1. VMにSSH接続
# VMのパブリックIPを取得
VM_IP=$(oci compute instance list-vnics \
--instance-id $INSTANCE_ID \
--query 'data[0]."public-ip"' \
--raw-output)
ssh opc@$VM_IP
3-2. Java環境のセットアップ(VM上で実行)
sudo yum install -y java-17-openjdk java-17-openjdk-devel maven
java -version
mvn -version
3-3. Mavenプロジェクトの作成(VM上で実行)
mvn archetype:generate \
-DgroupId=com.handson \
-DartifactId=oci-vault-demo \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false
cd oci-vault-demo
3-4. pom.xml に依存関係を追加
<dependencies>
<!-- OCI Java SDK コア -->
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-common</artifactId>
<version>3.35.0</version>
</dependency>
<!-- OCI Secrets サービス -->
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-secrets</artifactId>
<version>3.35.0</version>
</dependency>
<!-- HTTP クライアント(Jersey) -->
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-common-httpclient-jersey</artifactId>
<version>3.35.0</version>
</dependency>
<!-- Oracle JDBC ドライバー -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc11</artifactId>
<version>23.4.0.24.05</version>
</dependency>
</dependencies>
3-5. Javaコードの作成
src/main/java/com/handson/App.java を以下の内容に置き換えます。
package com.handson;
import com.oracle.bmc.auth.InstancePrincipalsAuthenticationDetailsProvider;
import com.oracle.bmc.secrets.SecretsClient;
import com.oracle.bmc.secrets.model.Base64SecretBundleContentDetails;
import com.oracle.bmc.secrets.requests.GetSecretBundleRequest;
import com.oracle.bmc.secrets.responses.GetSecretBundleResponse;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Base64;
public class App {
public static void main(String[] args) throws Exception {
// シークレットのOCIDを設定(環境変数から取得するのが推奨)
String secretIdConn = System.getenv("SECRET_ID_CONN");
String secretIdPass = System.getenv("SECRET_ID_PASS");
// ① インスタンス・プリンシパル認証プロバイダーを作成
// VM上では構成ファイル不要で自動認証されます
System.out.println("インスタンス・プリンシパル認証を開始...");
InstancePrincipalsAuthenticationDetailsProvider provider =
InstancePrincipalsAuthenticationDetailsProvider.builder().build();
// ② Secrets クライアントを作成
SecretsClient secretsClient = SecretsClient.builder().build(provider);
// ③ DB接続文字列のシークレットを取得
String connectionString = getSecret(secretsClient, secretIdConn);
System.out.println("✅ OCI Vault から接続文字列の取得に成功しました");
// ④ DBパスワードのシークレットを取得
String dbPassword = getSecret(secretsClient, secretIdPass);
System.out.println("✅ OCI Vault からパスワードの取得に成功しました");
// ⑤ Oracle Database に接続
System.out.println("Oracle Database への接続を開始...");
try (Connection conn = DriverManager.getConnection(connectionString, "ADMIN", dbPassword);
Statement stmt = conn.createStatement()) {
ResultSet rs = stmt.executeQuery("SELECT SYSDATE FROM DUAL");
if (rs.next()) {
System.out.println("✅ Oracle Database への接続成功!");
System.out.println("サーバー時刻: " + rs.getString(1));
}
}
secretsClient.close();
}
/**
* OCI Vault からシークレットを取得してBase64デコードする
* ※ OCI Vault の値は必ずBase64エンコードされているため、デコードが必須
*/
private static String getSecret(SecretsClient client, String secretId) {
GetSecretBundleRequest request = GetSecretBundleRequest.builder()
.secretId(secretId)
.build();
GetSecretBundleResponse response = client.getSecretBundle(request);
Base64SecretBundleContentDetails content =
(Base64SecretBundleContentDetails) response.getSecretBundle().getSecretBundleContent();
// Base64デコード(Azure Key VaultとのAzureとの違いに注意)
byte[] decodedBytes = Base64.getDecoder().decode(content.getContent());
return new String(decodedBytes, StandardCharsets.UTF_8);
}
}
3-6. 環境変数の設定とビルド・実行
# 環境変数にシークレットOCIDを設定
export SECRET_ID_CONN="ocid1.vaultsecret.oc1.ap-tokyo-1.xxxxxxxxxx"
export SECRET_ID_PASS="ocid1.vaultsecret.oc1.ap-tokyo-1.yyyyyyyyyy"
# ビルド
mvn package -DskipTests
# 実行
mvn exec:java -Dexec.mainClass="com.handson.App"
✅ 期待される出力
インスタンス・プリンシパル認証を開始...
✅ OCI Vault から接続文字列の取得に成功しました
✅ OCI Vault からパスワードの取得に成功しました
Oracle Database への接続を開始...
✅ Oracle Database への接続成功!
サーバー時刻: 2026-04-12
パターン 2:IaaS (Compute VM) + PowerShell
4-1. VMにSSH接続
ssh opc@$VM_IP
4-2. PowerShell のインストール(VM上で実行)
# Oracle Linux への PowerShell 7 インストール
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
sudo curl -o /etc/yum.repos.d/microsoft.repo \
https://packages.microsoft.com/config/rhel/8/prod.repo
sudo yum install -y powershell
pwsh --version
4-3. OCI PowerShell モジュールのインストール(PowerShell内で実行)
pwsh
PowerShell プロンプトに切り替わったら:
# OCI PowerShell モジュールのインストール
# 全モジュール(推奨)
Install-Module OCI.PSModules -Force -AllowClobber
# または Vault/Secrets のみ(軽量)
Install-Module OCI.PSModules.Vault -Force
Install-Module OCI.PSModules.Secrets -Force
# インストール確認
Get-Module -ListAvailable OCI*
4-4. サンプルスクリプトの作成と実行
@'
# ① インスタンス・プリンシパルで認証
# -AuthType InstancePrincipal を指定するだけで自動認証
Write-Host "インスタンス・プリンシパル認証を開始..." -ForegroundColor Cyan
$secretIdConn = $env:SECRET_ID_CONN
$secretIdPass = $env:SECRET_ID_PASS
# ② OCI Vault からDB接続文字列を取得
$bundleConn = Get-OCISecretsSecretBundle `
-SecretId $secretIdConn `
-AuthType InstancePrincipal
# ③ Base64デコード(OCI Vaultは必ずBase64エンコードされている)
$b64Conn = $bundleConn.SecretBundleContent.Content
$connectionString = [System.Text.Encoding]::UTF8.GetString(
[System.Convert]::FromBase64String($b64Conn)
)
Write-Host "✅ 接続文字列の取得成功" -ForegroundColor Green
# ④ DBパスワードを取得
$bundlePass = Get-OCISecretsSecretBundle `
-SecretId $secretIdPass `
-AuthType InstancePrincipal
$b64Pass = $bundlePass.SecretBundleContent.Content
$dbPassword = [System.Text.Encoding]::UTF8.GetString(
[System.Convert]::FromBase64String($b64Pass)
)
Write-Host "✅ パスワードの取得成功" -ForegroundColor Green
# ⑤ Oracle Database に接続
Add-Type -Path "/path/to/ojdbc11.jar" # Oracle JDBC ドライバーのパス
$connString = "User Id=ADMIN;Password=$dbPassword;Data Source=$connectionString"
$conn = New-Object Oracle.ManagedDataAccess.Client.OracleConnection($connString)
$conn.Open()
$cmd = $conn.CreateCommand()
$cmd.CommandText = "SELECT SYSDATE FROM DUAL"
$result = $cmd.ExecuteScalar()
Write-Host "✅ Oracle Database への接続成功!" -ForegroundColor Green
Write-Host "サーバー時刻: $result"
$conn.Close()
'@ | Set-Content -Path ./oci-vault-demo.ps1
# 環境変数を設定してスクリプトを実行
$env:SECRET_ID_CONN = "ocid1.vaultsecret.oc1.ap-tokyo-1.xxxxxxxxxx"
$env:SECRET_ID_PASS = "ocid1.vaultsecret.oc1.ap-tokyo-1.yyyyyyyyyy"
./oci-vault-demo.ps1
✅ 期待される出力
インスタンス・プリンシパル認証を開始...
✅ 接続文字列の取得成功
✅ パスワードの取得成功
✅ Oracle Database への接続成功!
サーバー時刻: 04/12/2026 00:00:00
STEP 3:SaaS (OCI Functions) の準備
パターン3(SaaS + Java)とパターン4(SaaS + PowerShell)で共通の手順です。
5-1. OCI Functions のセットアップ
# Fn CLI のインストール(ローカルPCで実行)
curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh
# OCI Functions コンテキストの作成
fn create context ap-tokyo-1 --provider oracle
fn use context ap-tokyo-1
# コンテキストの設定
fn update context oracle.compartment-id $COMPARTMENT_ID
fn update context api-url https://functions.ap-tokyo-1.oraclecloud.com
fn update context registry nrt.ocir.io/<テナントの名前空間>/<リポジトリ名>
5-2. アプリケーション(Functions グループ)の作成
# OCI Functionsアプリケーションの作成
oci fn application create \
--compartment-id $COMPARTMENT_ID \
--display-name "handson-functions-app" \
--subnet-ids '["<サブネットOCID>"]'
export APP_ID="ocid1.fnapp.oc1.ap-tokyo-1.xxxxxxxxxx"
5-3. 動的グループの作成(リソース・プリンシパル用)
# Functions用の動的グループを作成
oci iam dynamic-group create \
--name "handson-functions-dynamic-group" \
--description "OCI Functions用の動的グループ" \
--matching-rule "resource.type = 'fnfunc', resource.compartment.id = '$COMPARTMENT_ID'"
5-4. ポリシーの設定
oci iam policy create \
--compartment-id $COMPARTMENT_ID \
--name "handson-functions-vault-policy" \
--description "FunctionsからVaultへのアクセスポリシー" \
--statements '[
"Allow dynamic-group handson-functions-dynamic-group to read secret-bundle in compartment id '"$COMPARTMENT_ID"'",
"Allow dynamic-group handson-functions-dynamic-group to read vaults in compartment id '"$COMPARTMENT_ID"'"
]'
5-5. Functions の設定変数にシークレットOCIDを登録
# アプリケーションレベルで環境変数を設定
oci fn application update \
--application-id $APP_ID \
--config '{
"SECRET_ID_CONN": "ocid1.vaultsecret.oc1.ap-tokyo-1.xxxxxxxxxx",
"SECRET_ID_PASS": "ocid1.vaultsecret.oc1.ap-tokyo-1.yyyyyyyyyy"
}'
パターン 3:SaaS (OCI Functions) + Java
6-1. Fn プロジェクトの作成(ローカルPCで実行)
fn init --runtime java17 oci-vault-java-func
cd oci-vault-java-func
6-2. pom.xml に依存関係を追加
<dependencies>
<!-- OCI Functions Java SDK -->
<dependency>
<groupId>com.fnproject.fn</groupId>
<artifactId>api</artifactId>
<version>1.0.186</version>
</dependency>
<!-- OCI Java SDK(Secrets) -->
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-secrets</artifactId>
<version>3.35.0</version>
</dependency>
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-common-httpclient-jersey</artifactId>
<version>3.35.0</version>
</dependency>
<!-- Oracle JDBC -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc11</artifactId>
<version>23.4.0.24.05</version>
</dependency>
</dependencies>
6-3. Javaコードの作成
src/main/java/com/example/HelloFunction.java を以下の内容に置き換えます。
package com.example;
import com.oracle.bmc.auth.ResourcePrincipalAuthenticationDetailsProvider;
import com.oracle.bmc.secrets.SecretsClient;
import com.oracle.bmc.secrets.model.Base64SecretBundleContentDetails;
import com.oracle.bmc.secrets.requests.GetSecretBundleRequest;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.util.Base64;
public class HelloFunction {
// クライアントを使い回すためにstaticフィールドに保持(コールドスタート対策)
private static SecretsClient secretsClient;
static {
// ① リソース・プリンシパル認証プロバイダーを作成
// FunctionsではResourcePrincipalを使用(IaaSのInstancePrincipalとの違い)
ResourcePrincipalAuthenticationDetailsProvider provider =
ResourcePrincipalAuthenticationDetailsProvider.builder().build();
secretsClient = SecretsClient.builder().build(provider);
}
public String handleRequest(String input) {
try {
// ② 環境変数からシークレットOCIDを取得
String secretIdConn = System.getenv("SECRET_ID_CONN");
String secretIdPass = System.getenv("SECRET_ID_PASS");
// ③ OCI Vault からシークレットを取得
String connectionString = getSecret(secretIdConn);
String dbPassword = getSecret(secretIdPass);
// ④ Oracle Database に接続
try (Connection conn = DriverManager.getConnection(
connectionString, "ADMIN", dbPassword);
var stmt = conn.createStatement()) {
ResultSet rs = stmt.executeQuery("SELECT SYSDATE FROM DUAL");
if (rs.next()) {
return "✅ OCI Functions(Java) から DB 接続成功!サーバー時刻: " + rs.getString(1);
}
}
} catch (Exception e) {
return "❌ エラー: " + e.getMessage();
}
return "処理完了";
}
private String getSecret(String secretId) {
var request = GetSecretBundleRequest.builder().secretId(secretId).build();
var response = secretsClient.getSecretBundle(request);
var content = (Base64SecretBundleContentDetails)
response.getSecretBundle().getSecretBundleContent();
// Base64デコード(必須)
byte[] decoded = Base64.getDecoder().decode(content.getContent());
return new String(decoded, StandardCharsets.UTF_8);
}
}
6-4. デプロイと実行
# OCIRへのログイン(コンテナレジストリ)
docker login nrt.ocir.io \
-u "<テナントの名前空間>/<ユーザー名>" \
-p "<認証トークン>"
# Functionのデプロイ
fn --verbose deploy --app handson-functions-app
# 実行テスト
fn invoke handson-functions-app oci-vault-java-func
✅ 期待される出力
✅ OCI Functions(Java) から DB 接続成功!サーバー時刻: 2026-04-12
パターン 4:SaaS (OCI Functions) + PowerShell
OCI FunctionsはデフォルトでPowerShellをサポートしていないため、カスタムDockerイメージを使って実現します。
7-1. Fn プロジェクトの作成(ローカルPCで実行)
fn init --runtime docker oci-vault-ps-func
cd oci-vault-ps-func
7-2. Dockerfile の作成
FROM mcr.microsoft.com/powershell:7.4-ubuntu-22.04
# OCI PowerShell モジュールのインストール
RUN pwsh -c "Install-Module OCI.PSModules.Secrets -Force -AcceptLicense"
# Fn サーバーのインストール(HTTP経由でFnと通信するため)
RUN apt-get update && apt-get install -y curl
RUN curl -LSs https://raw.githubusercontent.com/fnproject/fdk-go/master/install | sh
# スクリプトのコピー
COPY func.ps1 /function/func.ps1
WORKDIR /function
ENTRYPOINT ["pwsh", "-File", "/function/func.ps1"]
7-3. func.ps1 の作成
#!/usr/bin/env pwsh
# Fn Frameworkからの入力を受け取る
$input = $env:FN_INPUT
Write-Host "OCI Functions (PowerShell) 起動"
try {
# ① 環境変数からシークレットOCIDを取得
$secretIdConn = $env:SECRET_ID_CONN
$secretIdPass = $env:SECRET_ID_PASS
# ② リソース・プリンシパルで認証してシークレットを取得
# -AuthType ResourcePrincipal を指定(IaaSのInstancePrincipalとの違い)
$bundleConn = Get-OCISecretsSecretBundle `
-SecretId $secretIdConn `
-AuthType ResourcePrincipal
# ③ Base64デコード(必須)
$connectionString = [System.Text.Encoding]::UTF8.GetString(
[System.Convert]::FromBase64String($bundleConn.SecretBundleContent.Content)
)
Write-Host "✅ 接続文字列を取得しました"
$bundlePass = Get-OCISecretsSecretBundle `
-SecretId $secretIdPass `
-AuthType ResourcePrincipal
$dbPassword = [System.Text.Encoding]::UTF8.GetString(
[System.Convert]::FromBase64String($bundlePass.SecretBundleContent.Content)
)
Write-Host "✅ パスワードを取得しました"
# ④ Oracle Database への接続(Oracle.ManagedDataAccessを利用)
Add-Type -Path "/opt/oracle/lib/Oracle.ManagedDataAccess.dll"
$conn = New-Object Oracle.ManagedDataAccess.Client.OracleConnection(
"User Id=ADMIN;Password=$dbPassword;Data Source=$connectionString"
)
$conn.Open()
$cmd = $conn.CreateCommand()
$cmd.CommandText = "SELECT SYSDATE FROM DUAL"
$result = $cmd.ExecuteScalar()
$conn.Close()
$response = "✅ OCI Functions(PowerShell) から DB 接続成功!サーバー時刻: $result"
} catch {
$response = "❌ エラー: $_"
}
# Fn FrameworkへHTTPレスポンスを返す
Write-Output $response
7-4. func.yaml の作成
schema_version: 20180708
name: oci-vault-ps-func
version: 0.0.1
runtime: docker
7-5. デプロイと実行
# デプロイ
fn --verbose deploy --app handson-functions-app
# 実行テスト
fn invoke handson-functions-app oci-vault-ps-func
✅ 期待される出力
✅ OCI Functions(PowerShell) から DB 接続成功!サーバー時刻: 04/12/2026 00:00:00
🔒 セキュリティ強化オプション(応用)
サービス・ゲートウェイによるプライベートアクセス
# ルートテーブルにサービス・ゲートウェイ経由のルートを追加
oci network route-table update \
--rt-id "<ルートテーブルOCID>" \
--route-rules '[{
"destination": "all-nrt-services-in-oracle-services-network",
"destinationType": "SERVICE_CIDR_BLOCK",
"networkEntityId": "<サービス・ゲートウェイのOCID>"
}]'
シークレットのローテーション設定
# シークレットのローテーションルールを設定(90日ごと)
oci vault secret update \
--secret-id $SECRET_ID_PASS \
--secret-rules '[{
"ruleType": "SECRET_EXPIRY_RULE",
"timeOfAbsoluteExpiry": "2026-12-31T00:00:00Z",
"isSecretContentRetrievalBlockedOnExpiry": false
}]'
ポリシーの最小権限化
# 特定のシークレットのみ読み取り可能にする(より厳格な設定)
oci iam policy create \
--compartment-id $COMPARTMENT_ID \
--name "handson-least-privilege-policy" \
--description "最小権限ポリシー" \
--statements '[
"Allow dynamic-group handson-vm-dynamic-group to read secret-bundle in compartment id '"$COMPARTMENT_ID"' where target.secret.name = '"'"'DbPassword'"'"'"
]'
🧹 リソースのクリーンアップ
ハンズオン終了後は、コストを止めるためリソースを削除してください。
# Compute VMの削除
oci compute instance terminate --instance-id $INSTANCE_ID --force
# Functions アプリの削除
oci fn application delete --application-id $APP_ID --force
# Vaultのシークレット削除(削除スケジュールを設定)
oci vault secret schedule-secret-deletion \
--secret-id $SECRET_ID_CONN \
--time-of-deletion "$(date -d '+1 day' --utc +%Y-%m-%dT%H:%M:%SZ)"
oci vault secret schedule-secret-deletion \
--secret-id $SECRET_ID_PASS \
--time-of-deletion "$(date -d '+1 day' --utc +%Y-%m-%dT%H:%M:%SZ)"
# Vaultの削除(削除スケジュールを設定)
oci kms management vault schedule-vault-deletion \
--vault-id $VAULT_ID \
--time-of-deletion "$(date -d '+7 day' --utc +%Y-%m-%dT%H:%M:%SZ)" \
--endpoint $VAULT_ENDPOINT
# ポリシーと動的グループの削除
oci iam policy delete --policy-id "<ポリシーOCID>" --force
oci iam dynamic-group delete --dynamic-group-id "<動的グループOCID>" --force
📊 各パターンの比較まとめ
| # | 環境 | 言語 | 認証方式 | シークレット取得方法 | Base64デコード |
|---|---|---|---|---|---|
| 1 | IaaS (Compute VM) | Java | インスタンス・プリンシパル | OCI Java SDK (SecretsClient) |
必要 |
| 2 | IaaS (Compute VM) | PowerShell | インスタンス・プリンシパル | Get-OCISecretsSecretBundle -AuthType InstancePrincipal |
必要 |
| 3 | SaaS (OCI Functions) | Java | リソース・プリンシパル | OCI Java SDK (ResourcePrincipalAuthenticationDetailsProvider) |
必要 |
| 4 | SaaS (OCI Functions) | PowerShell | リソース・プリンシパル | Get-OCISecretsSecretBundle -AuthType ResourcePrincipal |
必要 |
Azure Key Vault との主な違い
| 項目 | Azure Key Vault | OCI Vault |
|---|---|---|
| 認証(IaaS) | マネージド ID | インスタンス・プリンシパル |
| 認証(SaaS) | マネージド ID | リソース・プリンシパル |
| 権限設定 | RBAC ロール割り当て | 動的グループ + ポリシー |
| シークレット取得値 | 平文で返される | Base64エンコードで返される(デコード必須) |
| SaaS PowerShell | App Service / Functions で標準サポート | カスタムDockerイメージが必要 |
| 環境変数注入 | Key Vault 参照(コード変更不要) | Functions 設定変数(OCIDを渡す形式) |
💡 最重要ポイント: OCI Vault はシークレット値が 常にBase64エンコード されて返されます。Azureと異なり、必ずデコード処理を実装してください。