dbt-snowflakeを使っていてちょっと面倒なエラーに遭遇したので途中経過だけ残しておきます
発生した問題
概要
dbtをAWS ECS上で実行し、Snowflakeに対してデータ変換(dbt run)を行っている際に、断続的に接続認証エラー
成功する場合でも、dbtの実行開始から実際のモデル実行が始まるまでに長い遅延(約4分20秒)が生じており、これが失敗の原因となっていると考えてます
発生している現象とログ分析
1. 長時間の遅延と大量のWARNING
成功時のログでは、dbtの依存関係の解決と解析が完了した後、モデル実行開始までに約4分間(08:26:32から08:30:35まで)かかっています
この間に、Snowflakeコネクタ起因の以下のWARNINGが大量に出力されています
WARNING:snowflake.connector.vendored.urllib3.connectionpool:Retrying (...) after connection broken by 'NewConnectionError(...): Failed to establish a new connection: [Errno 101] Network is unreachable')': /ocsp_response_cache.json- 原因: ネットワーク到達不能エラー。
WARNING:snowflake.connector.vendored.urllib3.connectionpool:Retrying (...) after connection broken by 'ConnectTimeoutError(..., 'Connection to ocsp.digicert.com timed out. (connect timeout=10)')': /- 原因: 接続タイムアウトエラー。
これらのWARNINGは、SnowflakeコネクタがTLS証明書の失効状態を確認するためのOCSP (Online Certificate Status Protocol) サーバー(例: ocsp.digicert.com)への接続に失敗し、リトライを繰り返している… らしい
2. 処理が失敗する場合のエラー
断続的に発生する失敗ケースでは、以下の認証エラーが発生しています
Runtime Error Database error while listing schemas in database "SAMPLE_DATABASE" Database Error 250001 (08001): Failed to connect to DB: XXXXX-ABC12345.snowflakecomputing.com:443. JWT token is invalid. [xxxxxxxx-f5b9-4ec7-bf3c-11848041eb51]
- エラー内容: Snowflakeへの接続認証プロセス中にJWTトークンが無効になった
- 推測される原因: dbtが鍵認証方式でSnowflakeに接続しているため、上記のOCSPチェックによる不要な遅延が発生し、その間にSnowflakeの認証トークン(JWT)の有効期限が切れてしまう
環境と根本原因
実行環境
- dbt Coreバージョン: $1.10.13$
- dbt Snowflakeアダプターバージョン: $1.9.2$
- 使用パッケージ:
elementary-data/elementary($0.20.0$),dbt-labs/dbt_utils($1.3.1$) - 実行環境: AWS ECS
根本原因
dbtコミュニティslackを漁っていると、根本原因は**snowflake-connector-pythonの特定のバージョンにおけるOCSPチェックの不具合**のようです
[Bug] With snowflake-connector-python >= 3.17 dbt output includes a ton of urllib warnings.
JWT token is invalid についての議論は見当たりませんでしたが、Failed to establish a new connection については多くのユーザが遭遇しているようです
- 不具合: SnowflakeコネクタがTLS証明書のOCSP検証を行う際、環境によっては不要なリトライやタイムアウトが発生し、接続処理全体を大幅に遅延させている
- 影響: 鍵認証を使用している場合、この遅延によって認証プロセスが遅延し、生成されたJWTトークンの有効期限(通常は短い)が切れてしまい、「
JWT token is invalid」エラーが発生する - 既知の状況: この問題は**
snowflake-connector-pythonv3.17で修正済み**ですが、現在のdbt-coreのバージョンが参照しているSnowflakeコネクタのバージョンがまだ修正版に更新されていないため、問題が解消していません
対応策
今のところ以下の2つの対応策がある
| 対応策 | 内容 | 効果 | 留意点 |
| 1. dbt-coreの更新を待つ | dbt-coreが、修正版のsnowflake-connector-pythonを参照する新しいバージョンをリリースするのを待機する | 根本的な問題が解消し、JWT認証のまま遅延なしで成功するようになる | リリース時期は未定。問題解決まで時間がかかる可能性がある |
| 2. 認証方式を変更 | Snowflakeへの認証方式を鍵認証からパスワード認証に変更する | 認証トークンの有効期限切れによるエラー(JWT token is invalid)は回避できるため、ジョブの失敗はなくなる | OCSPのWARNINGと処理開始までの遅延は引き続き発生する(ジョブ全体の処理時間は長くなる) セキュリティ的に弱い |
最後
また進展があれば書きます!
