0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OCI Vault 対応 IaaS×PaaS

0
Last updated at Posted at 2026-04-12

~ 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

手順概要

  1. VMにSSH接続
  2. Java環境とOCI SDKのセットアップ
  3. サンプル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と異なり、必ずデコード処理を実装してください。

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?