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

はじめに

Snowflake Key Pair Authentication Writebackコネクターを使用すると、すべてのデータをDomoに格納して正規化した後にSnowflakeに送り返し、同時にクエリでもそれを利用可能にすることが簡単になります。データウェアハウジングソリューションとして既にSnowflakeを使用している場合、このコネクターは、SnowflakeとDomoを併用してデータを最大限に活用するために役立ちます。このコネクターを使用するには、Snowflakeアカウント名、Snowflakeホストへの接続に使用しているユーザー名、シークレットキー、パスフレーズ、およびDomoデベロッパーアカウントの認証情報(クライアントIDとクライアントシークレット)が必要になります。DomoのSnowflake Key Pair Authentication Writebackコネクターを使用すると、DomoのDataSetからSnowflakeアカウントにデータをエクスポートできます。Snowflake APIの詳細については、 https://docs.snowflake.com/ja にアクセスしてください。 このトピックでは、Snowflake Key Pair Authentication Writebackコネクターのユーザーインターフェースに固有のフィールドとメニューについて説明します。DataSetの追加や更新スケジュールの設定、DataSet情報の編集に関する一般的な情報は、「 コネクターを使用してDataSetを追加する 」を参照してください。
注記: Writeback DataSetの所有者は、入力DataSetの所有者または共同所有者である必要があります。

必要条件

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

パブリック/シークレットキーペアを設定する

パブリック/シークレットキーペアを設定するには、以下のステップに従ってください。
  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. ALTER USERを使用して、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プロパティの詳細については、「 キーローテーション 」を参照してください。
  1. 下のサンプルコードを修正して実行します。このコードはシークレットキーファイルを復号してSnowflakeドライバーに渡し、接続を作成します。
    • セキュリティパラメーターを更新:
      • <path>は作成したシークレットキーファイルへのローカルパスを指定します。
    • セッションのパラメーターを更新:
      • <user>はSnowflakeログイン名を指定します。
      • <account>はアカウントの名前(Snowflakeが提供)を指定します。
    • サンプルコードは以下のとおりです。
      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 Key Pair Authentication Writeback コネクターページの [認証情報] ペインと [詳細] ペインのオプションについて説明します。このページのほかのペインの項目である [スケジュール設定][DataSetに名前を付け、説明を入力] に関しては、ほとんどのタイプのコネクターで共通しています。詳細については、「 コネクターを使用してDataSetを追加する 」を参照してください。

[認証情報]ペイン

このペインには、DomoデベロッパーアカウントとSnowflakeアカウントの認証情報を入力するフィールドがあります。以下の表は、各フィールドに必要な内容を説明しています。

フィールド

説明

Account Name アカウントのフルネーム(Snowflakeが提供)を入力します。米国西部地域は account_name 、その他の全地域は account_name.region_id です。
Username Snowflakeホストへの接続に使用するユーザー名を入力します。
Private Key シークレットキーを入力します。
Passphrase シークレットキーを暗号化する場合、OpenSSLが、シークレットキーファイルの暗号化に使用されるパスフレーズの入力を求めてきます。パスフレーズをここに入力します。
Role 権限を入力します。
有効な認証情報を一度入力しておくと、随時同じアカウントを使用して新しいDomo-Snowflake接続を作成できます。コネクターアカウントは、Data Centerの [アカウント] タブで管理できます。このタブの詳細については、「 コネクター/アダプターアカウントを管理する 」を参照してください。

[詳細]ペイン

このペインには、メインとなる [Reports] メニューのほか、選択したレポートタイプに応じて表示/非表示になる様々なメニューが含まれています。

メニュー

説明

Input DataSet ID

SnowflakeにコピーするDataSetのDataSet ID(GUID)を入力します。Data CenterでDataSetの詳細ビューを開き、URLの「datasources/」に続く部分でIDを見つけることができます。例えば、URLが https://mycompany.domo.com/datasources/845305d8-da3d-4107-a9d6-13ef3f86d4a4/details/overview であれば、DataSet IDは「845305d8-da3d-4107-a9d6-13ef3f86d4a4」になります。

Select Table Name

データがコピーされるテーブルの命名方法を選択します。

  • 入力DataSet GUIDを使用する 。テーブルの名前は、 [Input DataSet ID] に入力した番号になります。

  • テーブルの名前を入力する [Enter Table Name] フィールドにテーブルのカスタム名を入力します。

Enter Table Name

データをコピーするSnowflakeテーブルの名前を入力します(スペースや特殊文字はアンダースコアに置き換えられます)。

Warehouses

ウェアハウスを選択します。

Databases

データベースを選択します。

Database Schema

スキーマを選択します。

Use All Caps for Column Names and Table Name 列名とテーブル名がすべて大文字で書き戻されます。そのため、Snowflakeでは大文字と小文字の区別がありません。
How do you want to update your data in snowflake?

テーブルのオプション

説明

Drop Table and Load Data

テーブルが存在する場合は、既存のテーブルを削除して新しいテーブルを作成します。

Truncate Table and Load Data

テーブルが既に存在する場合は、既存のテーブルを切り捨てて新しいデータを読み込みますこのオプションが選択されている場合、コネクターは既存のテーブルのスキーマを保持します。

Append Data to the existing table

既存のデータにデータを追加します。

Choose the Escape character 入力データセットのエスケープ文字を選択します。

よくある質問

このコネクターを使用すると、ローカルのユーザー名とシークレットキーを使って、データをDomo DataSetからSnowflakeインスタンスに書き込めます。
Snowflakeでは、CREATE TABLE、COPY INTO、PUT、CREATE FILE FORMAT、REMOVE、LISTの権限が必要です。
アカウント名(Snowflakeが提供)、Snowflakeのユーザー名、シークレットキーが必要です。暗号化されたシークレットキーを作成する場合は、シークレットキーファイルの暗号化に使用されるパスフレーズが必要になります。自分の権限名を入力することもできます。
必要に応じた頻度で行われます。
制限は使用するサーバー構成によって異なります。
はい。
Snowflakeデータベースに接続する前に、接続するポート上のデータベースサーバーにあるいくつかのIPアドレスをホワイトリストに登録する必要があります。IPアドレスの詳細なリストは、「 ネットワーク接続にDomoのIPアドレスを許可する」を参照してください。
Domoの入力DataSet IDは、データのエクスポート元となるDataSetのURLで見つけられます。例: https://customer.domo.com/datasources/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/details/settings

その他のペイン

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