JDBC ドライバーを構成する

このトピックでは、ドライバーを使用してSnowflakeに接続する方法など、 JDBC ドライバーを構成する方法について説明します。

このトピックの内容:

JDBC ドライバークラス

JDBC アプリケーションでドライバークラスとして net.snowflake.client.jdbc.SnowflakeDriver を使用します。

注釈

  • アプリケーションコード内で他のSnowflakeクラスまたはメソッドを参照しないでください。将来、改善および修正を実装するために変更される可能性があります。

  • 以前のドライバークラス com.snowflake.client.jdbc.SnowflakeDriver は引き続きサポートされますが、非推奨です(つまり、将来の TBDリリースで削除されます)。そのため、以前のクラス名を参照するコードは引き続き機能しますが、変更が実装されているため、新しいクラス名を参照するように、コードを更新する必要があります。

JDBC ドライバー接続文字列

JDBC ドライバーを使用してSnowflakeに接続するには、次の構文の接続文字列が必要です。

構文

jdbc:snowflake://<account_name>.snowflakecomputing.com/?<connection_params>

接続パラメーター

<アカウント名>

アカウントのフルネームを指定します(Snowflakeが提供)。完全なアカウント名には、アカウントがホストされている 地域 および クラウドプラットフォーム を識別する 追加 のセグメントが含まれている場合があります。

地域別のアカウント名の例

アカウント名が xy12345 の場合、

クラウドプラットフォーム/地域

完全なアカウント名

AWS

US 西部(オレゴン)

xy12345

US 東部(オハイオ)

xy12345.us-east-2.aws

US 東部(バージニア北部)

xy12345.us-east-1

US 東部(商業組織、バージニア政府北部)

xy12345.us-east-1-gov.aws

カナダ(中部)

xy12345.ca-central-1.aws

ヨーロッパ(ロンドン)

xy12345.eu-west-2.aws

EU (アイルランド)

xy12345.eu-west-1

EU (フランクフルト)

xy12345.eu-central-1

アジア太平洋(東京)

xy12345.ap-northeast-1.aws

アジア太平洋(ムンバイ)

xy12345.ap-south-1.aws

アジア太平洋(シンガポール)

xy12345.ap-southeast-1

アジア太平洋(シドニー)

xy12345.ap-southeast-2

GCP

US 中央部1(アイオワ)

xy12345.us-central1.gcp

ヨーロッパ西部2(ロンドン)

xy12345.europe-west2.gcp

ヨーロッパ西部4(オランダ)

xy12345.europe-west4.gcp

Azure

西 US 2(ワシントン)

xy12345.west-us-2.azure

東 US 2(バージニア)

xy12345.east-us-2.azure

US 政府バージニア

xy12345.us-gov-virginia.azure

カナダ中央部(トロント)

xy12345.canada-central.azure

西ヨーロッパ(オランダ)

xy12345.west-europe.azure

スイス北部(チューリッヒ)

xy12345.switzerland-north.azure

東南アジア(シンガポール)

xy12345.southeast-asia.azure

オーストラリア東部(ニューサウスウェールズ)

xy12345.australia-east.azure

重要

次のいずれかの条件に該当する場合、完全なアカウント名は、上記の例の構造とは異なります。

  • Snowflake Editionが VPS の場合、アカウント名の詳細については Snowflakeサポート にお問い合わせください。

  • アカウントで AWS PrivateLink またはAzure Private Linkが有効になっている場合、アカウント名には、地域セグメントの代わりに privatelink セグメントが 必要 です。詳細については、以下をご参照ください。

<地域ID> --- 廃止

アカウントが存在する 地域 の ID を指定します。

必要に応じて地域情報が完全なアカウント名の一部として含まれるため、このパラメーターは使用されなくなりました。ここでは、下位互換性のためにのみ文書化されています。

<接続パラメーター>

一連の1つ以上のパラメーターを <パラメーター>=<値> の形式で指定します。各パラメーターはアンパサンド文字(&)で区切られ、接続文字列のどこにもスペースはありません。

user=<ログイン名>

接続のためのユーザーのログイン名を指定します。

password=<文字列>

指定したユーザーのパスワードを指定します。

パスワードを指定するには2つの方法があります。

  • 最初の方法は、ユーザー ID とパスワードを getConnection メソッドに直接渡すことです。

    String user = "<user>";          // replace "<user>" with your user name
    String password = "<password>";  // replace "<password>" with your password
    Connection con = DriverManager.getConnection("jdbc:snowflake://<account>.snowflakecomputing.com/", user, password);
    
  • 2番目の方法は、 Properties オブジェクトを作成し、パスワードでオブジェクトを更新し、オブジェクトを getConnection メソッドに渡すことです。

    String user = "<user>";          // replace "<user>" with your user name
    String password = "<password>";  // replace "<password>" with your password
    Properties props = new Properties();
    props.put("user", user);
    props.put("password", password);
    Connection con = DriverManager.getConnection("jdbc:snowflake://<account>.snowflakecomputing.com/", props);
    

注意

Snowflakeへの接続に文字列を使用するクライアントアプリケーションによってパスワードが誤って公開される可能性があるため、 JDBC 接続文字列にユーザーパスワードを直接 含めない ように強くお勧めします。代わりに、アプリケーションが提供するインターフェイスを使用してユーザーパスワードを指定します。

authenticator=<文字列>

ユーザーのログイン認証情報の確認に使用する認証方式を指定します。

  • snowflake は、内部Snowflake認証方式を使用します。

  • externalbrowser から 自分のウェブブラウザーを使用 して、Okta、ADFS、またはアカウントに定義されている他のSAML 2.0準拠の識別プロバイダー(IdP)を認証します。

  • https://<Oktaのアカウント名>.okta.com (つまり、ご使用のOktaのURLエンドポイント)から ネイティブOktaを介して認証 します(IdPがOktaの場合にのみサポート)。

  • OAuthを使用して認証する oauth。OAuth が認証コードとして指定されている場合は、 OAuth トークンを指定するために token パラメーターも設定する必要があります( 以下を参照)。

  • キーペア認証を使用した snowflake_jwt の認証。キーペア認証の詳細については、 キーペア認証の使用およびキーローテーション をご参照ください。

  • username_password_mfa は MFA トークンキャッシングで認証します。詳細については、 多要素認証の使用 (このトピック内)をご参照ください。

デフォルトは snowflake です。

接続文字列がキーペアを指定する場合、認証方式パラメーターが設定されていないか、「snowflake」に設定されている場合でも、キーペア認証が使用されます。

認証の詳細については、 フェデレーション認証の管理/使用 および OAuth のクライアント、ドライバー、およびコネクター をご参照ください。

token=<文字列>

認証に使用する OAuth トークンを指定します。 <文字列> はトークンです。このパラメーターは、 authenticator=oauth パラメーターが設定されている場合にのみ必要です。

デフォルトはありません。

role=<名前>

ドライバーによって開始されたSnowflakeセッションで使用する、デフォルトのアクセス制御ロールを指定します。指定されたロールは、ドライバーのために指定されたユーザーに既に割り当てられている既存のロールでなければなりません。指定されたロールがユーザーにまだ割り当てられていない場合、ドライバーによってセッションが開始されるときにロールは使用されません。

接続後、 USE ROLE コマンドを実行して、セッションに別のロールを設定できます。

ロールとアクセス制御の詳細については、 Snowflakeのアクセス制御 をご参照ください。

db=<名前>

接続後に使用するデフォルトのデータベース、または空の文字列を指定します。指定されたデータベースは、指定された既定のロールが権限をもつ、既存のデータベースである必要があります。

接続後、 USE DATABASE コマンドを実行して、セッションに別のデータベースを設定できます。

schema=<名前>

接続後に指定されたデータベースに使用するデフォルトのスキーマ、または空の文字列を指定します。指定されたスキーマは、指定された既定のロールが権限をもつ、既存のスキーマでなければなりません。

接続後、 USE SCHEMA コマンドを実行して、セッションに別のスキーマを設定できます。

warehouse=<名前>

接続後に使用する仮想ウェアハウス、または空の文字列を指定します。指定されたウェアハウスは、指定された既定のロールが権限をもつ、既存のウェアハウスでなければなりません。

接続後、 USE WAREHOUSE コマンドを実行して、セッションに別のウェアハウスを設定できます。

tracing=<文字列>

ドライバーのログレベルを指定します。ドライバーは、標準のJavaログユーティリティを使用します。ログレベルの有効な値は次のとおりです。

OFFSEVEREWARNINGINFOCONFIGFINEFINERFINESTALL.

デフォルト値は INFO です。

passcode=<文字列>

多要素認証に使用するパスコードを指定します。

多要素認証の詳細については、 多要素認証(MFA) をご参照ください。

passcodeInPassword=<文字列>

多要素認証のパスコードをパスワードに追加するかどうかを指定します。

  • on (または true)は、パスコードが追加されることを指定します。

  • off (または false)またはその他の値は、パスコードが追加されないことを指定します。

デフォルトは off です。

loginTimeout

ログイン失敗エラーを返す前に、Snowflakeサービスに接続する際の応答を待機する時間を指定します。

デフォルトは60秒です。

networkTimeout

Snowflakeサービスと対話するときにエラーを返すまでの応答を待機する時間を指定します。ゼロ(0)は、ネットワークタイムアウトが設定されていないことを示します。

デフォルトは0秒です。

queryTimeout=<数値>

エラーを返す前に、クエリが完了するまで待機する時間を指定します。ゼロ(0)は無期限に待機することを示します。

デフォルトは0秒です。

application=<文字列>

Snowflakeパートナーによる使用のみ : JDBC を介して接続するパートナーアプリケーションの名前を指定します。

disableSocksProxy=<文字列>

Javaシステムオプション(指定されている場合)で指定された SOCKS プロキシ構成をドライバーが無視するかどうかを指定します。

  • on (または true)は、プロキシを無視することを指定します。

  • off (または false)またはその他の値は、プロキシの使用を指定します。

デフォルトは off です。

注意 :この接続パラメーターを設定すると、同じ JVM (Java仮想マシン)にあるすべての接続の動作が変更されます。

stringsQuotedForColumnDef=<ブール値>

このパラメーターが true に設定されている場合は、 DatabaseMetaData .getColumns()および DatabaseMetaData.getProcedureColumns()が COLUMN_DEF 列に String 型の値を返すとき、その値は一重引用符に埋め込まれます。(値のデータ型が String ではない場合、このパラメーターの設定に関係なく、値は引用符で囲まれません。)

  • true は、文字列値を一重引用符で埋め込むことを指定します(引用符は区切り文字ではなく文字列の一部)。これは JDBC 標準に準拠しています。

  • false は、文字列値が一重引用符で埋め込まれないことを指定します。

デフォルトは false です。

その他のパラメーター

任意のセッションパラメーターを接続文字列に含めることができます。例:

CLIENT_SESSION_KEEP_ALIVE=<ブール値>

非アクティブな状態が一定時間続いた後、現在のセッションをアクティブのままにするか、ユーザーに再度ログインさせるかを指定します。値が true の場合、Snowflakeは、ユーザーからのアクティビティがない場合でも、セッションを無期限にアクティブに保ちます。値が false の場合、ユーザーは4時間の非アクティブ後に再度ログインする必要があります。

デフォルトは false です。

すべてのセッションパラメーターの説明については、 パラメーター をご参照ください。

US 西にあるアカウント:

jdbc:snowflake://xy12345.snowflakecomputing.com/?user=peter&warehouse=mywh&db=mydb&schema=public

EU にあるアカウント(フランクフルト):

jdbc:snowflake://xy12345.eu-central-1.snowflakecomputing.com/?user=peter&warehouse=mywh&db=mydb&schema=public

認証でのシングルサインオン(SSO)の使用

シングルサインオン(SSO)を使用するようにSnowflakeを構成 している場合、認証に SSO を使用するようにクライアントアプリケーションを構成できます。詳細については Snowflakeに接続するクライアントアプリケーションでの SSO の使用 をご参照ください。

多要素認証の使用

Snowflakeは、 MFA トークンキャッシングと SSO の組み合わせを含む、 MFA トークンのキャッシングをサポートしています。

詳細については、 MFA トークンキャッシングを使用して認証中のプロンプトの数を最小限に抑える --- オプション をご参照ください。

キーペア認証の使用およびキーローテーション

Snowflake JDBC ドライバーは、キーペア認証とキーローテーションをサポートしています。この認証方法には、2048ビット(最小)の RSA キーペアが必要です。

開始するには、 キーペア認証およびキーペアローテーション に示すように、キーペア認証の初期構成を完了します。

そして、次に挙げる3つのオプションのいずれかを選択して、 JDBC 接続プロパティまたは JDBC 接続文字列を構成します。

  1. 接続プロパティのprivateKeyプロパティを介して秘密キーを指定します。

  2. 接続プロパティで個別のプロパティとして、そのファイルの秘密キーファイル名とパスワードを指定します。

  3. 接続文字列の一部として、そのファイルの秘密キーファイル名とパスワードを指定します。

これらのオプションについては、次の3つのセクションで詳しく説明します。

接続プロパティの privateKey プロパティ

このセクションでは、 privateKey プロパティをファイルの秘密キーに設定する例を示します。

この例では、 Bouncy Castle暗号化 APIs を使用しています。この例をコンパイルして実行するには、クラスパスに次の JAR ファイルを含める必要があります。

  • プロバイダー JAR ファイル( bcprov-jdkバージョン.jar

  • PKIX / CMS / EAC / PKCS / OCSP / TSP / OPENSSL JAR ファイル( bcpkix-jdkバージョン.jar

ここで、 バージョン は、 JAR ファイルがサポートする JDK のバージョンを指定します。

この例を使用するには、

  1. 以下のサンプルコード をコピーし、次のプレースホルダー値を置き換えます。

    プレースホルダー

    説明

    パス/rsa_key.p8

    これを前に生成した秘密キーファイルのパスと名前に設定します。

    秘密キーパスフレーズ

    暗号化されたキーを生成した場合は、 getPrivateKeyPassphrase() メソッドを実装して、そのキーを復号化するためのパスフレーズを返します。

    アカウント

    これをアカウントの名前に設定します(Snowflakeが提供)。

    ユーザー

    これをSnowflakeのログイン名に設定します。

    データベース名

    これを、使用するデータベースの名前に設定します。

    スキーマ名

    これを、使用するスキーマの名前に設定します。

    ウェアハウス名

    これを、使用するウェアハウスの名前に設定します。

    ロール

    これを、使用するロールの名前に設定します。

  2. サンプルコードをコンパイルして実行します。クラスパスにBouncy Castle JAR ファイルを含めます。

    たとえば、Linuxおよび macOS の場合、

    javac -cp bcprov-jdk<versions>.jar:bcpkix-jdk<versions>.jar TestJdbc.java
    
    java -cp .:snowflake-jdbc-<ver>.jar:bcprov-jdk<versions>.jar:bcpkix-jdk<versions>.jar TestJdbc.java
    

    Windowsの場合、

    javac -cp bcprov-jdk<versions>.jar;bcpkix-jdk<versions>.jar TestJdbc.java
    
    java -cp .;snowflake-jdbc-<ver>.jar;bcprov-jdk<versions>.jar;bcpkix-jdk<versions>.jar TestJdbc.java
    

サンプルコード

import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
import org.bouncycastle.openssl.jcajce.JceOpenSSLPKCS8DecryptorProviderBuilder;
import org.bouncycastle.operator.InputDecryptorProvider;
import org.bouncycastle.operator.OperatorCreationException;
import org.bouncycastle.pkcs.PKCS8EncryptedPrivateKeyInfo;
import org.bouncycastle.pkcs.PKCSException;

import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Paths;
import java.security.PrivateKey;
import java.security.Security;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.DriverManager;
import java.util.Properties;

public class TestJdbc
{
  // Path to the private key file that you generated earlier.
  private static final String PRIVATE_KEY_FILE = "/<path>/rsa_key.p8";

  public static class PrivateKeyReader
  {

    // If you generated an encrypted private key, implement this method to return
    // the passphrase for decrypting your private key.
    private static String getPrivateKeyPassphrase() {
      return "<private_key_passphrase>";
    }

    public static PrivateKey get(String filename)
            throws Exception
    {
      PrivateKeyInfo privateKeyInfo = null;
      Security.addProvider(new BouncyCastleProvider());
      // Read an object from the private key file.
      PEMParser pemParser = new PEMParser(new FileReader(Paths.get(filename).toFile()));
      Object pemObject = pemParser.readObject();
      if (pemObject instanceof PKCS8EncryptedPrivateKeyInfo) {
        // Handle the case where the private key is encrypted.
        PKCS8EncryptedPrivateKeyInfo encryptedPrivateKeyInfo = (PKCS8EncryptedPrivateKeyInfo) pemObject;
        String passphrase = getPrivateKeyPassphrase();
        InputDecryptorProvider pkcs8Prov = new JceOpenSSLPKCS8DecryptorProviderBuilder().build(passphrase.toCharArray());
        privateKeyInfo = encryptedPrivateKeyInfo.decryptPrivateKeyInfo(pkcs8Prov);
      } else if (pemObject instanceof PrivateKeyInfo) {
        // Handle the case where the private key is unencrypted.
        privateKeyInfo = (PrivateKeyInfo) pemObject;
      }
      pemParser.close();
      JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider(BouncyCastleProvider.PROVIDER_NAME);
      return converter.getPrivateKey(privateKeyInfo);
    }
  }

  public static void main(String[] args)
      throws Exception
  {
    String url = "jdbc:snowflake://<account>.snowflakecomputing.com";
    Properties prop = new Properties();
    prop.put("user", "<user>");
    prop.put("privateKey", PrivateKeyReader.get(PRIVATE_KEY_FILE));
    prop.put("db", "<database_name>");
    prop.put("schema", "<schema_name>");
    prop.put("warehouse", "<warehouse_name>");
    prop.put("role", "<role_name>");

    Connection conn = DriverManager.getConnection(url, prop);
    Statement stat = conn.createStatement();
    ResultSet res = stat.executeQuery("select 1");
    res.next();
    System.out.println(res.getString(1));
    conn.close();
  }
}

接続プロパティとしての秘密キーファイル名とパスワード

秘密キーファイル名とパスワードを個別の接続プロパティとして指定できます。次に例を示します。

Properties props = new Properties();
props.put("private_key_file", "/tmp/rsa_key.p8");
props.put("private_key_file_pwd", "dummyPassword");
Connection connection = DriverManager.getConnection(properties, "jdbc:snowflake://exampleaccount.snowflake.com");

private_key_file および private_key_file_pwd パラメーターを指定する場合、接続プロパティで privateKey パラメーターを指定しないでください。

接続文字列の秘密キーファイル名とパスワード

以下に示すように、接続文字列で秘密キーファイル名とパスワードを指定できます。

Connection connection = DriverManager.getConnection(properties,
    "jdbc:snowflake://exampleaccount.snowflake.com/?private_key_file=/tmp/rsa_key.p8&private_key_file_pwd=dummyPassword");

接続文字列で秘密キーとパスワードを指定する場合は、接続プロパティでパラメーター private_key_fileprivate_key_file_pwd、または privateKey を指定しないでください。

SnowCD を使用したSnowflakeへのネットワーク接続の検証

ドライバーを設定したら、 SnowCD を使用して、Snowflakeへのネットワーク接続を評価およびトラブルシューティングできます。

初期設定プロセス中にオンデマンドで SnowCD をいつでも使用して、Snowflakeへのネットワーク接続を評価およびトラブルシューティングできます。

プロキシサーバーを使用した接続

Snowflake JDBC ドライバーでプロキシサーバーを使用するには、2つの方法があります。

  • クライアントアプリケーションの JVM (Java仮想マシン)オプションにパラメーターを追加します。

  • プロキシホストとポート情報を JDBC 接続文字列または DriverManager.getConnection()メソッドに渡されたプロパティに含めます。

両方の手法を以下に文書化します。

JVM オプションの設定によるプロキシサーバーの指定

プロキシサーバーを介して接続するには、コード内でオプションを設定するか、コマンドラインパラメーターをクライアントアプリケーション JVM (Java仮想マシン)に渡します。2つの手法は同等です。

コード内でオプションを指定するには、次の手順を実行します。

System.setProperty("http.useProxy", "true");
System.setProperty("http.proxyHost", "proxyHost Value");
System.setProperty("http.proxyPort", "proxyPort Valure");
System.setProperty("https.proxyHost", "proxyHost HTTPS Value");
System.setProperty("https.proxyPort", ""proxyPort HTTPS Value"")

コマンドラインパラメーターを使用して JVMにオプションを指定するには、次の手順を実行します。

-Dhttp.useProxy=true
-Dhttps.proxyHost=<proxy_host>
-Dhttp.proxyHost=<proxy_host>
-Dhttps.proxyPort=<proxy_port>
-Dhttp.proxyPort=<proxy_port>

1つ以上の IP アドレスまたは URLsのプロキシをバイパスするには、場所を JVM オプションに追加します。各要素は縦棒で区切られています。要素には、ワイルドカード文字としてアスタリスク(「*」)を含めることができます。例:

-Dhttp.nonProxyHosts="*.my_company.com|localhost|xy12345.snowflakecomputing.com|192.168.91.*"

JDBC 接続文字列によるプロキシサーバーの指定

プロキシサーバーの IP アドレスとポート番号は、 JDBC 接続文字列で直接指定できます。

jdbc:snowflake://<アカウント>.<地域ID>.snowflakecomputing.com/?warehouse=<ウェアハウス名> &useProxy=true&proxyHost=<IPアドレス>&proxyPort=<ポート>&proxyUser=test&proxyPassword=test

例:

jdbc:snowflake://xy12345.us-east-1.snowflakecomputing.com/?warehouse=DemoWarehouse1 &useProxy=true&proxyHost=172.31.89.76&proxyPort=8888&proxyUser=test&proxyPassword=test

プロキシサーバーが認証を必要としない場合は、proxyUserおよびproxyPassword情報を省略できます。

注釈

上記の例には、読みやすいように空白が含まれています。これらの例をコピーして貼り付ける場合は、余分な空白を削除してください。

注釈

URL の一部としてプロキシ情報を指定すると、プロキシ情報を指定する他の方法よりも安全性が低くなります。

ちなみに

Snowflakeのセキュリティモデルは、Secure Sockets Layer(SSL)プロキシを許可しません( HTTPS 証明書を使用)。プロキシサーバーは、公的に利用可能な認証機関(CA)を使用する必要があり、侵害されたプロキシを介した MITM (Man In The Middle)攻撃などの潜在的なセキュリティリスクを低減します。

SSL プロキシを使用する 必要 がある場合は、通信中に証明書が変更されないように、サーバーポリシーを更新してSnowflake証明書を渡すことを強くお勧めします。

オプションで NO_PROXY を使用して、特定の通信のプロキシをバイパスできます。たとえば、 NO_PROXY=".amazonaws.com" を指定すると、Amazon S3アクセスをバイパスできます。

OCSP

ドライバーが接続すると、Snowflakeは証明書を送信して、Snowflakeを偽装しているホストではなく、Snowflakeへの接続であることを確認します。ドライバーはその証明書を OCSP (オンライン証明書状態プロトコル)サーバーに送信し、証明書が失効していないことを確認します。

ドライバーが証明書を確認するために OCSP サーバーに到達できない場合、ドライバーは "fail open" or "fail closed" できます。

フェールオープンまたはフェールクローズモードの選択

JDBC 3.8.0より前のドライバーバージョンは、デフォルトでフェールクローズになります。バージョン3.8.0以降はデフォルトでフェールオープンになります。次のいずれかの方法でデフォルトの動作を上書きできます。

  • 接続プロパティ ocspFailOpentrue または false に設定します。例: . Properties connection_properties = new Properties(); . connection_properties.put("ocspFailOpen", "false"); . ... . connection = DriverManager.getConnection(connectionString, connection_properties);

  • システムプロパティ net.snowflake.jdbc.ocspFailOpentrue または false に設定します。例: . Properties p = new Properties(System.getProperties()); . p.put("net.snowflake.jdbc.ocspFailOpen", "false"); . System.setProperties(p);

OCSP コネクタ-またはドライバーバージョンの確認

ドライバーまたはコネクタのバージョン、構成、および OCSP の動作の詳細については、 OCSP 設定 をご参照ください。

OCSP 応答キャッシュサーバー

注釈

OCSP 応答キャッシュサーバーは現在、Snowflake JDBC ドライバー3.6.0以降でサポートされています。

Snowflakeクライアントは、実際にデータを転送する前に安全な接続を確立する「ハンドシェイク」を使用して、Snowflakeサービスエンドポイントへのすべての接続を開始します。ハンドシェイクの一部として、クライアントはサービスエンドポイントの TLS/SSL 証明書を認証します。証明書の失効ステータスは、 CA (認証機関)の OCSP (オンライン証明書ステータスプロトコル)サーバーの1つにクライアント証明書リクエストを送信することにより確認されます。

OCSP サーバーからの応答が妥当な時間を超えて遅延すると、接続エラーが発生します。次のキャッシュは失効ステータスを保持し、これらの問題の軽減に役立ちます。

  • プロセスの存続期間中保持されるメモリキャッシュ。

  • ファイルキャッシュ。キャッシュディレクトリ(例: ~/.cache/snowflake または ~/.snowsql/ocsp_response_cache)が削除されるまで保持します。

  • Snowflake OCSP 応答キャッシュサーバー。 CA の OCSP サーバーから OCSP 応答を1時間ごとに取得し、24時間保存します。クライアントは、このサーバーキャッシュから特定のSnowflake証明書の検証ステータスを要求できます。

    重要

    サーバーポリシーでほとんどまたはすべての外部 IP アドレスおよびウェブサイトへのアクセスが拒否された場合、通常のサービス操作を許可するには、キャッシュサーバーアドレスを 必ず ホワイトリストに登録する必要があります。キャッシュサーバーのホスト名は ocsp*.snowflakecomputing.com:80 です。

    何らかの理由でキャッシュサーバーを無効化する必要がある場合は、 SF_OCSP_RESPONSE_CACHE_SERVER_ENABLED 環境変数を false に設定します。値は大文字と小文字が区別され、小文字にする 必要がある ことに注意してください。

キャッシュレイヤーに OCSP 応答が含まれていない場合、クライアントは CAの OCSP サーバーから検証ステータスを直接取得しようとします。

ファイルキャッシュ

使いやすさを向上させるために、ドライバーは認証と OCSP 応答にファイルキャッシュを使用します。デフォルトでは、これらのファイルは次のディレクトリに保存されます。

Linux

~/.cache/snowflake

macOS

~/Library/Caches/Snowflake

Windows

%USERPROFILE%AppDataLocalSnowflakeCaches

JDBC アプリケーションユーザーのローカルオペレーティングシステムにユーザープロファイルがない場合、ドライバーはキャッシュファイルを一時ディレクトリに保存しようとします。次の環境変数を使用して、キャッシュファイルを別のディレクトリに書き込むようにドライバーを構成できます。

SF_TEMPORARY_CREDENTIAL_CACHE_DIR=文字列

ローカルディレクトリ内の一時的な認証情報キャッシュファイルの場所を指定します。これは、起動時に JVM オプション -Dnet.snowflake.jdbc.temporaryCredentialCacheDir=文字列 で構成することもできます。

SF_OCSP_RESPONSE_CACHE_DIR=文字列

ローカルディレクトリ内の OCSP 応答キャッシュファイルの場所を指定します。これは、起動時に JVM オプション -Dnet.snowflake.jdbc.ocspResponseCacheDir=文字列 で構成することもできます。

詳細については、このトピックの OCSP 応答キャッシュサーバー をご参照ください。

JVM オプションは、プログラムではなく( System.setProperty() を介して)起動時に設定する必要があります。環境変数と JVM オプションの両方が提供されている場合、 JVM オプションが使用されます。

JDBC ログ記録の構成

バージョン3.0.4以降、 JDBC ドライバーは2つのログ記録フレームワークをサポートしています。

  • Javaコアログ記録機能

  • Simple Logging Facade for Java

Javaコアログ記録機能(java.util.logging

このロガーを使用するには、 JVM に次のオプションを指定します。

-Dnet.snowflake.jdbc.loggerImpl=net.snowflake.client.log.JDK14Logger

次に、ロガーのアプリケーションプログラミングインターフェイス(API)を使用して、ログ記録の構成をカスタマイズできます。詳細については、 java.util.loggingパッケージのドキュメント をご参照ください。

たとえば、次の内容を含む logging.properties という名前のファイルを作成します。

###########################################################
#   Default Logging Configuration File
#
# You can use a different file by specifying a filename
# with the java.util.logging.config.file system property.
# For example java -Djava.util.logging.config.file=myfile
############################################################

############################################################
#   Global properties
############################################################

# "handlers" specifies a comma-separated list of log Handler
# classes.  These handlers will be installed during VM startup.
# Note that these classes must be on the system classpath.
# ConsoleHandler and FileHandler are configured here such that
# the logs are dumped into both a standard error and a file.
handlers = java.util.logging.ConsoleHandler, java.util.logging.FileHandler

# Default global logging level.
# This specifies which kinds of events are logged across
# all loggers.  For any given facility this global level
# can be overriden by a facility specific level.
# Note that the ConsoleHandler also has a separate level
# setting to limit messages printed to the console.
.level = INFO

############################################################
# Handler specific properties.
# Describes specific configuration information for Handlers.
############################################################

# default file output is in the tmp dir
java.util.logging.FileHandler.pattern = /tmp/snowflake_jdbc%u.log
java.util.logging.FileHandler.limit = 5000000000000000
java.util.logging.FileHandler.count = 10
java.util.logging.FileHandler.level = INFO
java.util.logging.FileHandler.formatter = net.snowflake.client.log.SFFormatter

# Limit the messages that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = net.snowflake.client.log.SFFormatter

# Example to customize the SimpleFormatter output format
# to print one-line log message like this:
#     <level>: <log message> [<date/time>]
#
# java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n

############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

# Snowflake JDBC logging level.
net.snowflake.level = INFO
net.snowflake.handler = java.util.logging.FileHandler

コマンドラインで JVM パラメーターを指定します。

java -jar application.jar -Dnet.snowflake.jdbc.loggerImpl=net.snowflake.client.log.JDK14Logger -Djava.util.logging.config.file=logging.properties

application.jar は JDBC ドライバーのアプリケーションコードを参照します。ログファイルは /tmp/snowflake_jdbc* にあります。

Simple Logging Facade for Java(org.slf4j

ロガー実装パッケージ(つまり、 org.sl4j:sl4j-jdk14 または org.sl4j:slf4j-log4j12)またはカスタムロガー(つまり独自の org.slf4j.impl.StaticLoggerBinder クラス)がクラスパスで定義されている場合、ドライバーはこのロガーを自動的に使用します。

次の JVM オプションを指定して、このロガーを使用することを明示的に選択することもできます。

-Dnet.snowflake.jdbc.loggerImpl=net.snowflake.client.log.SLF4JLogger

詳細については、 Simple Logging Facade for Java(SLF4J)のドキュメント をご参照ください。

注釈

上記の JVM オプションのいずれかを使用してドライバーのロガーを明示的に指定せず、クラスパスでカスタムロガーを定義していない場合(または3.0.4より前のドライバーバージョンを使用している場合)、ドライバーデフォルトで java.util.logging を使用します。ただし、次のデフォルトの動作が適用されます。

  • ログファイルの書き込まれる場所を指定することはできません。常に java.io.tmpDir システムプロパティで指定されたディレクトリに書き込まれます。

    • Linuxおよび macOS 環境では、デフォルトのディレクトリは通常、 /tmp または /var/tmp のいずれかです。

    • Windows環境では、デフォルトのディレクトリは通常、 C:\temp です。

  • ログレベルは、 tracing 接続パラメーターによって決定されます(上記を参照)。

トラブルシューティングのヒント

プロパティが正しく設定されていることを確認してください

DriverManager.getConnection() メソッドは、特定の事前定義された名前(「password」、「account」など)に一致するプロパティパラメーターの値のみを読み取ります。プロパティ名のスペルを間違えたり、余分なプロパティを含めたりすると、ドライバーはエラーまたは警告メッセージを出さずにそれらのプロパティを無視します。これにより、小さなスペルミスの検出が困難になる場合があります。

接続文字列とアカウントに正しい値を使用する

接続の問題の一般的な原因は、アカウント、アカウント名、または接続文字列を求められたときに、提供する情報が多すぎるか少なすぎることです。

通常、アカウント情報は、アカウントがホストされている地域とクラウドプラットフォームに応じて、次の構造を持ちます。

  • アカウント

  • アカウント.地域ID

  • アカウント.地域ID.プラットフォーム

例:

  • xy12345

  • xy12345.us-east-1

  • xy12345.east-us-2.azure

通常、 JDBC 接続文字列は次のようになります。

  • jdbc:snowflake://xy12345.east-us-2.azure.snowflakecomputing.com

アカウント情報が予想されるときに接続文字列を使用(またはその逆)すると、デバッグが困難な問題が発生する可能性があります。

アカウントを求められたときに接続を確立できない場合は、最小形式(例: xy12345)、および完全なアカウント名(例: jdbc:snowflake://、ただし xy12345.east-us-2.azure を含まない)、の両方を試して、 .snowflakecomputing.com 文字列を 含めない ようにしてください。

JDBC 接続文字列を要求されたときに接続を確立できない場合は、上記の接続文字列の完全な形式を使用します。

アカウント名の詳細については、 接続パラメーター をご参照ください。