メインコンテンツへスキップ

はじめに

Snowflakeは、すべてのデータを簡単にまとめて、分析する必要のあるすべてのユーザーとシステムが利用できるようにするData Warehouseソフトウェアです。DomoのSnowflake Using Key Pair Authenticationコネクターを使用すると、指定したウェアハウス、データベース、そしてデータベーススキーマから、SQL クエリを入力することでデータを取得できるようになります。Snowflake API の詳細については、 https://docs.snowflake.net/manuals を参照してください。 このバージョンのSnowflakeコネクターは、通常のユーザー名/パスワード認証ではなくキーペア認証の使用をサポートしていることを除いて、基本的に標準の Snowflakeコネクター と同じです。この認証方式では2048ビット(最小)のRSAキーペアが必要です。OpenSSLを使用してパブリックキーとシークレットキーのペアを生成することができます。キーペアを生成するステップは以下のとおりです。パブリックキーは、Snowflakeクライアントを使用するSnowflakeユーザーに割り当てられます。 Snowflake Using Key Pair Authenticationコネクターは「データベース」コネクターであり、クエリを使用してデータベースからデータを取得します。Data Centerでは、ウィンドウ上部のツールバーで [データベース] をクリックし、これを含むほかのデータベースコネクターのページにアクセスできます。 このトピックでは、Snowflake Using Key Pair Authenticationコネクターのユーザーインターフェースに固有のフィールドとメニューについて説明します。DataSetの追加、更新スケジュールの設定およびDataSet情報の編集に関する一般的な情報は、「 コネクターを使用してDataSetを追加する 」を参照してください。

必要条件

Snowflakeデータベースに接続し、DataSetを作成するには、以下が必要です。
  • アカウントのフルネーム(Snowflakeが提供)。これは、Snowflake URLの https:// の直後に続く部分です。 アカウントのフルネームには、アカウントがホストされる地域とクラウドプラットフォームを識別する追加のセグメントが含まれる場合があることに注意してください。以下の表に、クラウドプラットフォームまたは地域別のアカウント名の例を示します。各行に対して、アカウント名が「xy12345」であると仮定しています。
    snowflake_account_names.png
  • Snowflakeホストに接続するために使用されるユーザー名
  • Snowflakeシークレットキー
  • 暗号化された鍵を作成した場合にシークレットキーファイルを暗号化するために使用するパスフレーズ

パブリックキーペア/シークレットキーペアの設定

パブリック/シークレットキーペアを設定するには、以下のステップに従ってください。
  1. ターミナルウィンドウのコマンドラインからシークレットキーを生成します。 シークレットキーの暗号化バージョンも、シークレットキーの暗号化されていないバージョンも生成できます。
    • 暗号化されていないバージョンを生成するには、以下のコマンドを使用します。 $ openssl genrsa -out rsa_key.pem 2048
    • 暗号化されたバージョンを生成するには、以下のコマンドを使用します。 $ openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 通常、暗号化されたバージョンを生成する方が安全です。 2番目のコマンドを使用してシークレットキーを暗号化する場合、OpenSSLが、シークレットキーファイルの暗号化に使用されるパスフレーズの入力を求めてきます。シークレットキーを保護するために強力なパスフレーズを使用することを推奨します。このパスフレーズを安全な場所に記録します。Snowflakeに接続するときにパスフレーズを入力します。パスフレーズはシークレットキーの保護にのみ使用され、Snowflakeに送信されることはないことに注意してください。 PEMシークレットキーの例を以下に示します。
      -----BEGIN ENCRYPTED PRIVATE KEY-----
      
      MIIE6TAbBgkqhkiG9w0BBQMwDgQILYPyCppzOwECAggABIIEyLiGSpeeGSe3xHP1
      
      wHLjfCYycUPennlX2bd8yX8xOxGSGfvB+99+PmSlex0FmY9ov1J8H1H9Y3lMWXbL
      
      ...
      
      -----END ENCRYPTED PRIVATE KEY-----
      
  2. コマンドラインからシークレットキーを参照してパブリックキーを生成します。シークレットキーが暗号化され、「rsa_key.p8」という名前のファイルに含まれていると仮定して、次のコマンドを使用します。 $ openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub 以下がPEMパブリックキーのサンプルです。
    -----BEGIN PUBLIC KEY-----
    
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy+Fw2qv4Roud3l6tjPH4
    
    zxybHjmZ5rhtCz9jppCV8UTWvEXxa88IGRIHbJ/PwKW/mR8LXdfI7l/9vCMXX4mk
    
    ...
    
    -----END PUBLIC KEY-----
    
  3. パブリックキーファイルとシークレットキーファイルをローカルディレクトリにコピーして保存します。ファイルのパスを記録します。シークレットキーはPKCS#8(公開鍵暗号標準)フォーマットを使用して保存され、前のステップで指定したパスフレーズで暗号化されることに注意してください。ただし、OSが提供するファイル許可機構を使用して、ファイルを不正アクセスから保護する必要があります。使用されていないときにファイルをセキュリティ保護するのはユーザーの責任です。
  4. ALTERUSER を使用して、Snowflakeユーザーにパブリックキーを割り当てます。例: alter user jsmith set rsa_public_key='MIIBIjANBgkqh...';
    注記:
    • セキュリティ管理者(例えばSECURITYADMIN権限を持つユーザー)以上がユーザーを変更できます。
    • SQLステートメント内のパブリックキーヘッダーとフッターを除外します。
  5. DESCRIBEUSERを使用してユーザーのパブリックキーの指紋を確認します。
    プロパティ デフォルト 説明
    名前 JSMITH NULL値 名前
    RSA_PUBLIC_KEY_FP SHA256:nvnONUsfiuycCLMXIEWG4eTp4FjhVUZQUQbNpbSHXiA= NULL値 ユーザーのRSAパブリックキーの指紋。
    RSA_PUBLIC_KEY_2_FP NULL値 NULL値 ユーザーの2番目のRSAパブリックキーの指紋。
    注記: RSA_PUBLIC_KEY_2_FPプロパティの詳細については、「 キーローテーション 」を参照してください。
  6. 下のサンプルコードを修正して実行します。このコードはシークレットキーファイルを復号してSnowflakeドライバーに渡し、接続を作成します。
    • セキュリティパラメーターを更新:
      • <path>は作成したシークレットキーファイルへのローカルパスを指定します。
    • セッションのパラメーターを更新:
      • <user>はSnowflakeログイン名を指定します。
      • <account>はアカウントの名前を指定します(Snowflakeにより提供される)。
    • サンプルコードは以下のとおりです。
      import java.util.Properties;
        
      import java.sql.Connection;
        
      import java.sql.Statement;
        
      import java.sql.ResultSet;
        
      import java.sql.DriverManager;
        
      import java.io.File;
        
      import java.io.FileInputStream;
        
      import java.io.DataInputStream;
        
      import java.util.Base64;
        
      import java.security.spec.PKCS8EncodedKeySpec;
        
      import java.security.KeyFactory;
        
      import java.security.PrivateKey;
        
      import javax.crypto.EncryptedPrivateKeyInfo;
        
      import javax.crypto.SecretKeyFactory;
        
      import javax.crypto.spec.PBEKeySpec;`
      
      `public class TestJdbc
        
      {
        
      public static void main(String[] args)
        
      throws Exception
        
      {
        
      File f = new File("<path>/rsa_key.p8");
        
      FileInputStream fis = new FileInputStream(f);
        
      DataInputStream dis = new DataInputStream(fis);
        
      byte[] keyBytes = new byte[(int) f.length()];
        
      dis.readFully(keyBytes);
        
      dis.close();`
      
      `String encrypted = new String(keyBytes);
        
      String passphrase = System.getenv("PRIVATE_KEY_PASSPHRASE");
        
      encrypted = encrypted.replace("-----BEGIN ENCRYPTED PRIVATE KEY-----", "");
        
      encrypted = encrypted.replace("-----END ENCRYPTED PRIVATE KEY-----", "");
        
      EncryptedPrivateKeyInfo pkInfo = new EncryptedPrivateKeyInfo(Base64.getMimeDecoder().decode(encrypted));
        
      PBEKeySpec keySpec = new PBEKeySpec(passphrase.toCharArray());
        
      SecretKeyFactory pbeKeyFactory = SecretKeyFactory.getInstance(pkInfo.getAlgName());
        
      PKCS8EncodedKeySpec encodedKeySpec = pkInfo.getKeySpec(pbeKeyFactory.generateSecret(keySpec));
        
      KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        
      PrivateKey encryptedPrivateKey = keyFactory.generatePrivate(encodedKeySpec);`
      
      `String url = "jdbc:snowflake://<account>. snowflakecomputing.com ";
        
      Properties prop = new Properties();
        
      prop.put("user", "<user>");
        
      prop.put("account", "<account>");
        
      prop.put("privateKey", encryptedPrivateKey);`
      
      `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();
        
      }
        
      }```
      

キーローテーション

Snowflakeは、中断しないローテーションができるように、複数のアクティブキーをサポートします。内部で従っている有効期限スケジュールにもとづき、パブリックキーとシークレットキーをローテーションし、置換します。 現在、ALTER USERではRSA_PUBLIC_KEYとRSA_PUBLIC_KEY_2のパラメーターを使用して、最大2つのパブリックキーを1人のユーザーに関連付けることができます。 キーをローテーションするには、以下の手順を実行します。
  1. キーペア使用認証のステップを完了します…
    • 新しいシークレットキーとパブリックキーのセットを生成します。
    • ユーザーにパブリックキーを割り当てます。パブリックキーの値を RSA_PUBLIC_KEY または RSA_PUBLIC_KEY_2 (どちらでも、キーの値が現在使用されていないもの)に設定します。 例: alter user jsmis set rsa_public_key_2='JERUE Htcve...';
  2. コードを更新してSnowflakeに接続します。新しいシークレットキーを指定します。 Snowflakeは、接続情報とともに送信されたシークレットキーにもとづいて、認証用の正しいアクティブなパブリックキーを検証します。
  3. ユーザープロフィールから古いパブリックキーを削除します。例: alter user jsmith unset rsa_public_key;

Snowflakeアカウントに接続する

このセクションでは、Snowflake Using Key Pair Authenticationコネクターページの [認証情報] および [詳細] ペインのオプションについて説明します。このページ内のほかのペインに含まれるコンポーネントである [スケジュール設定][DataSetに名前を付け、説明を入力] に関しては、ほとんどのタイプのコネクターで共通しています。詳細については「 コネクターを使用してDataSetを追加する 」を参照してください。

[認証情報]ペイン

このペインには、Snowflakeアカウントに接続するための認証情報を入力するフィールドがあります。下表は、各フィールドに必要な内容を説明しています。

フィールド

説明

Account Name

Snowflakeアカウント名を入力します。アカウント名を検索する方法については、「 必要条件 」を参照してください。

Username

Snowflakeアカウントに関連するユーザー名を入力します。

Private Key

シークレットキーを入力します。シークレットキーの生成の詳細については、「 パブリックキー/シークレットキーペアの設定 」を参照してください。

Passphrase 暗号化された鍵を作成した場合、シークレットキーファイルの暗号化に使用したパスフレーズを入力します。
Role ユーザー権限を入力します。
有効なSnowflakeの認証情報を入力しておくと、いつでもDomoで同じアカウントを使用してSnowflake Using Key Pair Authentication DataSetを作成することができます。コネクターのアカウントは Data Center の [アカウント] タブで管理できます。このタブの詳細については、「 コネクター/アダプターアカウントを管理する 」を参照してください。

[詳細]ペイン

このペインには、SQLクエリを入力したり、取得するデータの場所を指定したりするための多数のフィールドとメニューがあります。

パラメーター

説明

Query

データを取得するために使用するSQLクエリを入力します。 [Query Helper] パラメーターを使用して、使用可能なSQLクエリを記述できます。 [Query Helper] を使用するには、以下を実行します。

  1. 各メニューで、目的のウェアハウス、データベース、データベーススキーマ、データベース表、表の列を選択します。

  2. [Query Helper] フィールドに表示されるSQLステートメントをコピーします。

  3. コピーしたSQLステートメントを [Query] フィールドに貼り付けます。

Warehouses

取得したいデータが格納されているウェアハウスを選択します。このリストには、認証情報にもとづいてアクセスできるすべてのウェアハウスが表示されます。

Databases

取得したいデータが格納されているデータベースを選択します。このリストには、認証情報にもとづいてアクセスできるすべてのデータベースが表示されます。

Database Schema

取得したいデータが含まれているデータベーススキーマを選択します。このリストには、認証情報にもとづいてアクセスできるすべてのスキーマが表示されます。

Database Tables(オプション)

取得するデータベース表を選択します。このリストには、認証情報にもとづいてアクセスできるすべての表が表示されます。データベース表を選択しない場合は、コネクターはデータベーススキーマ全体を取得します。

Table Columns(オプション)

取得する表の列を選択します。このリストには、認証情報にもとづいてアクセスできるすべての列が表示されます。表の列を選択しないと、コネクターは選択したデータベース表全体を取得します。

Query Helper(オプション)

上のメニューから、ウェアハウス、データベース、スキーマ、表などを選択すると、利用可能なSQLクエリがこのフィールドに作成されます。このフィールドのSQLステートメントをコピーして、 [Query] フィールドに貼り付けます。詳細については、上記の「 Query 」を参照してください。

Fetch Size(オプション) メモリのパフォーマンスのフェッチサイズを入力します。空白にすると、デフォルトサイズの1000が適用されます。DataSetに「メモリ不足」エラーが発生した場合は、フェッチサイズの縮小を試みます。
Convert Null Values to empty string これを選択すると、Snowflakeのソースの表のすべてのnull値がDomoの空の文字列に変更されます。
Convert Timezone ここでタイムゾーンを選択すると、コネクターにソースデータのタイムゾーンが通知されます。コネクターは、この情報を使用して、選択したタイムゾーンのタイムスタンプ値をUTCに変換します。

その他のペイン

スケジュール設定、再試行、更新に関するオプションなど、コネクターインターフェースのその他のペインに表示されるオプションについては、「 コネクターを使用してDataSetを追加する 」を参照してください。

よくある質問

制限は使用するサーバー構成によって異なります。
必要に応じて更新されます。
すべての単語、表名、フィールド名が正しく記述されていることを確認します。クエリのヘルプについては、[Query Helper]フィールドを参照してください。
Snowflakeデータベースに接続する前に、接続するポート上のデータベースサーバーにある多数のIPアドレスをホワイトリストに登録する必要があります。IPアドレスの詳細なリストは、「 ネットワーク接続にDomoのIPアドレスを許可する 」を参照してください。
このコネクターは、中小規模のDataSetと、大規模なDataSetのコンセプト実証作業のために設計されています。
Snowflakeでアカウントに入力されたユーザー権限にもとづいてアクセスできるコンテンツのみが表示されます。目的のものが見つからない場合は、権限がそのウェアハウス、データベース、表などにアクセスできることを確認してください。Snowflakeで権限を入力しない場合、デフォルトではSYSADMIN権限が使用されます。