ECS/dbt Job Intermittent Failure due to Snowflake Connector OCSP/JWT Timeout

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 については多くのユーザが遭遇しているようです

  1. 不具合: SnowflakeコネクタがTLS証明書のOCSP検証を行う際、環境によっては不要なリトライやタイムアウトが発生し、接続処理全体を大幅に遅延させている
  2. 影響: 鍵認証を使用している場合、この遅延によって認証プロセスが遅延し、生成されたJWTトークンの有効期限(通常は短い)が切れてしまい、「JWT token is invalid」エラーが発生する
  3. 既知の状況: この問題は**snowflake-connector-python v3.17で修正済み**ですが、現在のdbt-coreのバージョンが参照しているSnowflakeコネクタのバージョンがまだ修正版に更新されていないため、問題が解消していません

対応策

今のところ以下の2つの対応策がある

対応策内容効果留意点
1. dbt-coreの更新を待つdbt-coreが、修正版のsnowflake-connector-pythonを参照する新しいバージョンをリリースするのを待機する根本的な問題が解消し、JWT認証のまま遅延なしで成功するようになるリリース時期は未定。問題解決まで時間がかかる可能性がある
2. 認証方式を変更Snowflakeへの認証方式を鍵認証からパスワード認証に変更する認証トークンの有効期限切れによるエラー(JWT token is invalid)は回避できるため、ジョブの失敗はなくなるOCSPのWARNINGと処理開始までの遅延は引き続き発生する(ジョブ全体の処理時間は長くなる)
セキュリティ的に弱い

最後

また進展があれば書きます!