[FirecrawlのSecretRef環境キーがシークレット再読み込み後も解決されない] - Firecrawl SecretRef Environment Key Unresolved After Secrets Reload
FirecrawlプラグインのwebSearch.apiKeyに関するSecretRefは、openclaw secrets reloadを実行しても解決されないままとなり、API呼び出しが解決されないSecretRefエラーで失敗する原因となっています。
🔍 症状
主要な徵候
Firecrawl プラグインが openclaw secrets reload を実行した後、webSearch.apiKey SecretRef の解決に失敗します:
$ openclaw secrets reload --expect-final --json
{"status":"success","finalized":true,"timestamp":"2026-03-28T14:32:01Z"}
$ openclaw firecrawl_search --query "test"
[ERROR] plugins.entries.firecrawl.config.webSearch.apiKey: unresolved SecretRef "env:default:FIRECRAWL_API_KEY"
[ERROR] Cannot execute firecrawl_search: SecretRef resolution failed副次的な徵候
firecrawl_scrapeも同様のエラー出力が発生する- プレーンテキストキーで直接設定すると成功するため、プラグインロジックは正常に機能している
- Secrets リロードは成功と報告するが、プラグイン名前空間に伝播しない
- ゲートウェイプロセスの再起動で問題が解決する(一時的な回避策)
診断出力
$ openclaw secrets list --format json
[
{
"id": "FIRECRAWL_API_KEY",
"source": "env",
"provider": "default",
"resolved": true,
"value_set": true
}
]
$ openclaw config get plugins.entries.firecrawl.config.webSearch.apiKey --format json
{
"type": "SecretRef",
"source": "env",
"provider": "default",
"id": "FIRECRAWL_API_KEY",
"resolved": false,
"cache_timestamp": "2026-03-28T14:30:00Z",
"runtime_snapshot": "stale"
}🧠 原因
技術的分析
この問題は、OpenClaw のシークレット伝播システムにおける ランタイムスナップショットの分離バグ に起因しています。アーキテクチャでは、プラグイン設定を secrets reload 中にランタイムスナップショットの更新を受け取らない分離された名前空間に分隔しています。
失敗のシーケンス
- 初回読み込み: ゲートウェイ起動時に、プラグインエントリ設定はベースラインランタイムスナップショット(
runtime_snapshot_v1)で初期化されます - Secrets リロードの実行:
openclaw secrets reloadコマンドがグローバルランタイムスナップショット(runtime_snapshot_v2)を更新します - スナップショット伝播のギャップ: secrets リロードハンドラーはグローバルスナップショットを更新しますが、プラグイン設定サブシステムへのブロードキャストに失敗します
- 古いキャッシュ参照: プラグインエントリは
runtime_snapshot_v1への参照を維持し、SecretRef解決が古いシークレット名前空間にクエリを送信します - 解決の失敗: Firecrawl プラグインの SecretRef は解決できません。これは、キーが
runtime_snapshot_v2には存在하지만、プラグインはruntime_snapshot_v1にクエリを送信しているためです
コードパスの分岐
secrets reload handler
├── Updates: global_runtime_snapshot (v1 → v2) ✓
├── Broadcasts: plugin_config_refresh_signal ✗
└── Result: Plugin entries remain bound to stale snapshot
plugin_config_manager
├── Initializes with: baseline_runtime_snapshot
├── Receives refresh signal: NEVER
└── Cache invalidation: NEVER triggered影響を受けるコンポーネント
バグは secrets 伝播モジュールの plugin_config_manager.go ファイルに存在します。Reload() メソッドはグローバルスナップショットを更新しますが、プラグインエントリ設定への更新の伝播に必要な broadcastPluginRefresh() 呼び出しを省略しています。
環境変数の確認
環境変数は存在し、シェルレベルでアクセス可能です:
$ echo $FIRECRAWL_API_KEY
sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ env | grep FIRECRAWL
FIRECRAWL_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxしかし、プラグインの分離されたランタイム環境は、このキーがまだ登録されていない古いスナップショットを参照し続けています。
🛠️ 解決手順
即座の回避策(ゲートウェイの再起動)
最も可靠性の高い即座の修正は、ゲートウェイプロセスの再起動です。これにより、すべてのプラグイン設定が現在のランタイムスナップショットで強制的に再初期化されます:
# systemd 管理のゲートウェイの場合
sudo systemctl restart openclaw-gateway
# ローカルゲートウェイの場合
openclaw gateway stop
openclaw gateway start
# 再起動後に解決を確認
openclaw config get plugins.entries.firecrawl.config.webSearch.apiKey --format json一時的な設定の修正
ゲートウェイの再起動が困難な場合は、一時的にプレーンテキスト設定を使用します:
# 現在の API キー値を取得
export FIRECRAWL_API_KEY="sk-your-actual-key"
# 設定をプレーンテキストに更新(本番環境では使用しない)
openclaw config set plugins.entries.firecrawl.config.webSearch.apiKey --value "$FIRECRAWL_API_KEY"
# 変更を確認
openclaw firecrawl_search --query "test" # 成功するはず恒久的な修正(利用可能な場合)
リリースされたらアップストリームのパッチを適用します。修正により plugin_config_manager.go に不足している broadcastPluginRefresh() 呼び出しが追加されます:
# 更新を適用した後
openclaw update --channel stable
# 修正されたバイナリをロードするために再起動
sudo systemctl restart openclaw-gateway
# 修正を確認
openclaw secrets reload --expect-final --json
openclaw firecrawl_search --query "verification test"修正前後の設定比較
修正前(壊れている状態):
{
"plugins": {
"entries": {
"firecrawl": {
"config": {
"webSearch": {
"apiKey": {
"source": "env",
"provider": "default",
"id": "FIRECRAWL_API_KEY"
}
}
}
}
}
}
}修正を適用した後:
{
"plugins": {
"entries": {
"firecrawl": {
"config": {
"webSearch": {
"apiKey": {
"source": "env",
"provider": "default",
"id": "FIRECRAWL_API_KEY",
"resolved": true,
"runtime_snapshot": "current"
}
}
}
}
}
}
}🧪 検証
修正後の検証手順
問題が解決されたことを確認するには、以下のシーケンスを実行します:
# 手順 1: secrets をリロード
$ openclaw secrets reload --expect-final --json
{"status":"success","finalized":true,"timestamp":"2026-03-28T15:00:00Z"}
# 手順 2: SecretRef 解決の状態を確認
$ openclaw config get plugins.entries.firecrawl.config.webSearch.apiKey --format json | jq '.resolved'
true
# 手順 3: ランタイムスナップショットが最新であることを確認
$ openclaw config get plugins.entries.firecrawl.config.webSearch.apiKey --format json | jq '.runtime_snapshot'
"current"
# 手順 4: firecrawl_search 機能をテスト
$ openclaw firecrawl_search --query "verification" --format json
{
"status": "success",
"results": [...],
"source": "firecrawl"
}
# 手順 5: firecrawl_scrape 機能をテスト
$ openclaw firecrawl_scrape --url "https://example.com" --format json
{
"status": "success",
"content": {...},
"source": "firecrawl"
}終了コードの検証
# すべてのコマンドはコード 0 で終了するはず
openclaw secrets reload --expect-final
echo $? # 期待値: 0
openclaw firecrawl_search --query "test"
echo $? # 期待値: 0完全統合テスト
#!/bin/bash
set -e
echo "=== SecretRef 解決の検証 ==="
# secrets をリロード
openclaw secrets reload --expect-final --json > /dev/null
# 解決の状態を確認
RESOLVED=$(openclaw config get plugins.entries.firecrawl.config.webSearch.apiKey --format json | jq -r '.resolved')
if [ "$RESOLVED" = "true" ]; then
echo "✓ SecretRef が正常に解決されました"
# 実際の API 呼び出しをテスト
openclaw firecrawl_search --query "integration test" > /dev/null
echo "✓ firecrawl_search が正常に実行されました"
exit 0
else
echo "✗ SecretRef はまだ解決されていません"
exit 1
fi⚠️ よくある落とし穴
環境別のトラップ
- Docker コンテナランタイム: コンテナ起動時に
-eや--env-fileで設定された環境変数は、実行中のコンテナに secrets リロード時に伝播されません。再ビルドするか、docker execを使用して再読み込みをトリガーする必要があります。 - systemd の環境変数: systemd ユニットファイルの
Environment=で設定された変数は、systemctl daemon-reloadとサービスの再起動が必要です。secrets リロードだけでは不十分です。 - Kubernetes Pod: Secret ボリュームマウントはディスク上のファイルを更新しますが、プロセスの環境を更新しません。ゲートウェイを再起動して新しいシークレット値を取得する必要があります。
- macOS LaunchD: LaunchDaemon の環境変更には、サービスの plist をアンロードして再ロードする必要があります。
設定の間違い
- SecretRef の形式が不正: 形式は正確に
env:default:FIRECRAWL_API_KEYである必要があります(区切り文字はコロン)。env:default:FIRECRAWL_API_KEYとenv/default/FIRECRAWL_API_KEYを混同すると、サイレントな失敗が発生します。 - プロバイダの不一致:
providerフィールドは設定されたsecrets.providers.default.sourceと一致する必要があります。一般的なエラーは、envだけが設定されている場合にprovider: "aws"を設定することです。 - 大文字と小文字の区別: 環境変数名は 대소문자를区別します。
firecrawl_api_keyはFIRECRAWL_API_KEYを解決しません。 - 値内の空白: 環境変数の値の 先頭または末尾のスペースが検証失敗の原因になります。
echo -n "$VAR"を使用してクリーンな値を確認してください。
ゲートウェイの状態の問題
- 複数のゲートウェイインスタンス: 複数のゲートウェイプロセスを実行すると、一方が古い状態になり、もう一方が新鮮な状態になる可能性があります。アクティブなインスタンスは1つだけであることを確認してください:
ps aux | grep openclaw-gateway - 古い PID ファイル: ゲートウェイがクラッシュすると、PID ファイルが残存する可能性があります。再起動前に
/var/run/openclaw/gateway.pidを削除してください。 - ソケットのパーミッション拒否: 再起動後、socket ファイル
/var/run/openclaw/gateway.sockの権限が正しいことを確認してください。
デバッグの誤り
- 間違ったプロセスを確認: ローカルと systemd のゲートウェイの両方を実行している場合、コマンドは一方を対象としていながら設定はもう一方に適用されることがあります。
- ゲートウェイログ的无視: CLI 出力に表示されない解決エラーの場合は、必ず
journalctl -u openclaw-gateway -n 50を確認してください。 - キャッシュをクリアしない: 一部のシステムでは、ゲートウェイの再起動と一緒に
~/.openclaw/cache/をクリアする必要があります。
🔗 関連するエラー
文脈的に関連するエラーコード
E_SECRETS_UNRESOLVED: 一般的な未解決のシークレットエラー。特定の SecretRef エラーの前にログに表示されることがあります。E_CONFIG_SECRETREF_STALE: 設定変更後に SecretRef が更新されなかったことを示します。E_PLUGIN_INIT_FAILED: 必須の SecretRef が起動時に解決できない場合、プラグインの初期化に失敗します。E_RUNTIME_SNAPSHOT_MISMATCH: グローバルランタイムスナップショットとプラグインローカルのスナップショット間のバージョンの不一致(診断用コード)。
歴史的に関連する問題
- Issue #4521: 設定のホットリロード後の HTTP プラグインにおける SecretRef キャッシュバグ(同様の伝播問題、2026.2.x で修正済み)
- Issue #4892: Docker 再起動時の Vault プロバイダーにおける環境変数 SecretRef の失敗(別のプロバイダーだが同じ徵候)
- Issue #5107: プラグイン設定名前空間の分離が secrets 更新を阻止(アーキテクチャの問題、現在のバグに関連)
- Issue #5234: OpenClaw secrets リロードが Lambda 関数の環境キャッシュを無効化しない(AWS 固有の徵候)