🎯 この記事で解決できること
- ✅
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制限 | ✅ 解決 | ✅ 解決 |
✨ この方法の利点
- シンプル - Terraform内で完結、追加リソース不要
- 確実 - Resource Managerで動作保証済み
- 高速 - ネットワーク経由のダウンロード不要
- 安全 - IAM設定不要、権限エラーのリスクなし
- 保守的 - ウォレット更新時も自動で再最適化
🔗 関連リンク
💬 まとめ
OCI Resource Managerの32KB制限は、data "external"を使ってウォレットから不要ファイルを削除することで解決できます。
- 追加のOCIリソース不要
- IAM設定不要
- 52%のサイズ削減
- 5分で実装可能
同じ問題で困っている方の参考になれば幸いです。