1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SnowflakeのHybrid TableをNode.jsから叩くまでの雑メモ

Posted at

概要

  • SnowflakeのHybrid Tableを外部のプログラムから叩きたくなった
  • その雑メモ。だけどNodeではまだたたけていない
  • Pythonで叩けた

メモ

Snowflake側でテーブルを作っておく

DockerでNode.jsを用意する

割愛

ドライバーをインストール

tsxも入れておいて、簡易検証できるようにしておく

$ yarn add snowflake-sdk
$ yarn add --dev tsx typescript
$ yarn tsx
> const snowflake = require('snowflake-sdk')
undefined
> snowflake
{
  ocspModes: {
    FAIL_CLOSED: 'FAIL_CLOSED',
    FAIL_OPEN: 'FAIL_OPEN',
    INSECURE: 'INSECURE'
  },
  createConnection: [Function: createConnection],
  createPool: [Function: createPool],
  deserializeConnection: [Function: deserializeConnection],
  serializeConnection: [Function: serializeConnection],
  configure: [Function: configure]
}

おk

接続してみる

だめでした!!!!!!

  • ユーザーパスワード認証 + MFAやるとクソハマる
  • ドキュメントの指定が結構揺れてる
    • あの記事はこう指定しているけど、こっちでは違う説明だったり
  • 「わからん!!!」ってみんなの前で 勇気をもって 発表したら、とあるイケてる分析会社のCTOから「秘密鍵がええよ」って教えてもらった

DockerでPython環境を用意する

割愛

秘密鍵を作る

こちらに習った

$ openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
$ openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
$ mv rsa_key.p* /root/.ssh/
$ chmod 400 -R /root/.ssh/

snowflake側に公開鍵を登録する(RSA_PUBLIC_KEY=...のところを自分の環境に置き換える)

$ cat /root/.ssh/rsa_key.pub # コピー
ALTER USER jsmith SET RSA_PUBLIC_KEY='...';

Pythonでやり直す

$ pip install snowflake-connector-python
>>> import snowflake.connector
... import os
... from cryptography.hazmat.backends import default_backend
... from cryptography.hazmat.primitives.asymmetric import rsa
... from cryptography.hazmat.primitives.asymmetric import dsa
... from cryptography.hazmat.primitives import serialization

>>> with open('/root/.ssh/rsa_key.p8', 'rb') as key:
...      kk = key.read()
>>> p_key = serialization.load_pem_private_key(kk, password=None, backend=default_backend())
>>> pkb = p_key.private_bytes(encoding=serialization.Encoding.DER, format=serialization.PrivateFormat.PKCS8, encryption_algorithm=serialization.NoEncryption())

>>> ctx = snowflake.connector.connect(user='user_name', account='xxx.ap-northeast-1.aws', private_key=pkb)
>>> cs = ctx.cursor()
>>> a = cs.execute('select 1')
>>> a.fetchall()
[(1,)]

# やったぜ!!!!

>>> a = cs.execute('use DS_DB;')
>>> a = cs.execute('use WAREHOUSE DS_WH;')
>>> a.fetchall()
[('ステートメントは正常に実行されました。',)]
>>> a = cs.execute('select * from icecream;')
>>> a.fetchall();
[(1, 'A1', 'B1'), (2, 'A2', 'B2'), (3, 'A3', 'B3'), (4, 'A4', 'B4')]

やったぜ!!!!(涙)

雑感

  • コミュニティすばらしい
  • あとでNode.jsで再チャレンジ

参考URL

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?