2
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 Resource ManagerでADBウォレットが32KB制限を超える問題

2
Last updated at Posted at 2026-01-26

🎯 この記事で解決できること

  • Error: Metadata size is 35626 bytes and cannot be larger than 32000 bytes の解決
  • ✅ ADBウォレットを52%削減(31KB → 15KB)してcloud-initに収める方法
  • ✅ 追加のOCIリソース不要、IAM設定不要のシンプルな解決策

📊 結果比較

【Before】元のウォレット
├─ サイズ: 31KB (ZIP圧縮後)
└─ 結果: ❌ 32KB制限エラー

【After】最適化後のウォレット  
├─ サイズ: 15KB (ZIP圧縮後)
└─ 結果: ✅ 問題なくデプロイ成功

💡 解決策の概要

data "external" を使って不要ファイルを削除し、ウォレットを最適化

Terraform実行時
  ↓
① ADBウォレット生成(31KB、全ファイル含む)
  ↓
② bashスクリプトで最適化
   - README削除(-3KB)
   - Java用ファイル削除(-13KB)  
  ↓
③ 最適化版をcloud-initに埋め込み(15KB)
  ↓
✅ 32KB制限内でデプロイ成功

🚫 なぜ他の方法ではダメなのか

方法 問題点
❌ Object Storage経由 IAM Policy設定が必要、追加リソースが必要、ネットワーク依存

📝 実装コード(コピペOK)

Step 1: ウォレット生成と最適化

# adb.tf
resource "oci_database_autonomous_database" "generated_database_autonomous_database" {
  db_name    = var.adb_name
  db_version = "23ai"
  # ... その他の設定
}

resource "oci_database_autonomous_database_wallet" "generated_autonomous_data_warehouse_wallet" {
  autonomous_database_id = oci_database_autonomous_database.generated_database_autonomous_database.id
  password               = var.db_password
  base64_encode_content  = true
  generate_type          = "SINGLE"
}

# ⚠️ 重要:content_base64を使う(contentだとバイナリ破損)
resource "local_file" "wallet_zip" {
  content_base64 = oci_database_autonomous_database_wallet.generated_autonomous_data_warehouse_wallet.content
  filename       = "${path.module}/wallet_full.zip"
}

# 🔧 ウォレット最適化(不要ファイル削除)
data "external" "wallet_files" {
  depends_on = [local_file.wallet_zip]
  program = ["bash", "-c", <<-EOT
    set -e
    WORK_DIR="${path.module}"
    cd "$WORK_DIR"
    
    # 一時ディレクトリを作成
    rm -rf wallet_extracted
    mkdir -p wallet_extracted
    
    # ZIPを展開
    unzip -q wallet_full.zip -d wallet_extracted
    
    # 不要ファイルを削除(README、Java関連ファイル)
    rm -f wallet_extracted/README
    rm -f wallet_extracted/keystore.jks
    rm -f wallet_extracted/truststore.jks
    rm -f wallet_extracted/ojdbc.properties
    rm -f wallet_extracted/ewallet.pem
    
    # 小さいZIPを作成
    cd wallet_extracted
    zip -q ../wallet_small.zip *
    cd ..
    
    # 小さいZIPをbase64エンコード(-w 0で改行なし)
    WALLET_CONTENT=$(base64 -w 0 wallet_small.zip)
    
    # JSONとして出力(data "external"の要件)
    echo "{\"wallet_content\":\"$WALLET_CONTENT\"}"
    
    # クリーンアップ
    rm -rf wallet_extracted wallet_full.zip wallet_small.zip
  EOT
  ]
}

Step 2: cloud-init設定

# datasources.tf
data "template_file" "cloud_init_file" {
  template = file("./cloud_init/bootstrap.template.yaml")

  vars = {
    oci_database_autonomous_database_wallet_content = data.external.wallet_files.result.wallet_content
    # ... その他の設定
  }
}
# cloud_init/bootstrap.template.yaml
#cloud-config

# ... その他の設定

write_files:
  - path: "/u01/aipoc/props/wallet.zip"
    permissions: "0644"
    encoding: base64
    content: |
      ${oci_database_autonomous_database_wallet_content}

# ... その他の設定

Step 3: Compute Instance作成

# compute.tf
resource "oci_core_instance" "generated_oci_core_instance" {
  depends_on = [
    oci_database_autonomous_database.generated_database_autonomous_database,
    data.external.wallet_files
  ]
  
  # ... その他の設定
  
  metadata = {
    user_data           = data.template_cloudinit_config.cloud_init.rendered
    ssh_authorized_keys = var.ssh_authorized_keys
  }
}

🔍 削除されるファイルと削減効果

ファイル サイズ 用途 削除可否
README 3KB 説明文 ✅ 削除OK
keystore.jks 3.1KB Java用 ✅ Python/Node.jsなら不要
truststore.jks 2.9KB Java用 ✅ Python/Node.jsなら不要
ojdbc.properties 0.7KB JDBC設定 ✅ Python/Node.jsなら不要
ewallet.pem 6.8KB PEM形式 ✅ P12があれば不要
cwallet.sso 6.2KB 自動ログイン ⚠️ 必須
ewallet.p12 6.2KB パスワード認証 ⚠️ 必須
sqlnet.ora 0.1KB ネットワーク設定 ⚠️ 必須
tnsnames.ora 1.3KB 接続文字列 ⚠️ 必須

削減効果: 16.5KB削減 → 全体で52%のサイズ削減

⚙️ さらに削減したい場合(オプション)

tnsnames.oraから必要な接続タイプのみ抽出:

# bashスクリプト内に追加
if [ -f wallet_extracted/tnsnames.ora ]; then
  # _high接続のみ残す(1.3KB → 0.4KB)
  grep -E '^[^#]*_high\s*=' wallet_extracted/tnsnames.ora > wallet_extracted/tnsnames_temp.ora || true
  mv wallet_extracted/tnsnames_temp.ora wallet_extracted/tnsnames.ora
fi

注意: アプリが _low_medium も使う場合は削除しないこと

📊 方法別比較

data "external" Object Storage
サイズ削減 ✅ 52% ❌ なし
追加リソース ✅ なし ❌ 必要
IAM設定 ✅ 不要 ❌ 必要
ネットワーク依存 ✅ なし ❌ あり
複雑度 ✅ 低 ❌ 高
32KB制限 ✅ 解決 ✅ 解決

✨ この方法の利点

  1. シンプル - Terraform内で完結、追加リソース不要
  2. 確実 - Resource Managerで動作保証済み
  3. 高速 - ネットワーク経由のダウンロード不要
  4. 安全 - IAM設定不要、権限エラーのリスクなし
  5. 保守的 - ウォレット更新時も自動で再最適化

🔗 関連リンク

💬 まとめ

OCI Resource Managerの32KB制限は、data "external"を使ってウォレットから不要ファイルを削除することで解決できます。

  • 追加のOCIリソース不要
  • IAM設定不要
  • 52%のサイズ削減
  • 5分で実装可能

同じ問題で困っている方の参考になれば幸いです。

2
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
2
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?