概要
- 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