❄️

【Snowflake】Firewallのホワイトリスト設定とProxy越しに接続する方法 (SiSにはどうやら専用ドメイン有り)

2024/05/11に公開

本記事で参考になるケース

  • Firewallにてホワイトリストに登録が必要等
  • SnowflakeへProxy越しに接続したい

記事の概要

  • FirewallやProxy(aws network firewall やSquid等)越しにSnowflakeに接続したい

方法

  1. snowflake接続に必要なホスト名とポート情報を取得

USE ROLE SECURITYADMIN;
SYSTEM$ALLOWLIST()

出力されるホスト例

アカウント識別子.ap-northeast-1.aws.snowflakecomputing.com
組織名-アカウント名.snowflakecomputing.com
sfc-jp-ds1-9-customer-stage.s3.amazonaws.com
sfc-jp-ds1-9-customer-stage.s3.ap-northeast-1.amazonaws.com
sfc-jp-ds1-9-customer-stage.s3-ap-northeast-1.amazonaws.com
sfc-repo.snowflakecomputing.com
client-telemetry.snowflakecomputing.com
ocsp.snowflakecomputing.com
api-XXXXXX.duosecurity.com
組織名-アカウント名.registry.snowflakecomputing.com
組織名-アカウント名.registry.snowflakecomputing.com
o.ss2.us
ocsp.r2m01.amazontrust.com
ocsp.r2m02.amazontrust.com
ocsp.rootg2.amazontrust.com
ocsp.rootca1.amazontrust.com
apps-api.c1.ap-northeast-1.aws.app.snowflake.com
app.snowflake.com

注意!! Streamlit(SiS)をお使いの方 202405現在

*.snowflake.app

どうやら上記もSiS利用時には開ける必要があるっぽい.

注意が必要なのが、「-」と「.」で微妙にURLが異なる場合があること

時々ホストが増えます、特に新サービス追加時にホストに変化がある場合がありますので新サービス利用時に接続ができない or 立ち上がらない等ありましたら要確認です.

  1. ホスト名、ポート情報をもとにFirewallやProxyのホワイトリストに設定

出力された情報をホワイトリストに登録する
場合によっては*.snowflakecomputing.com等で登録すると登録数が減るが、当然ながら無関係のSnowflakeアカウントへの接続も許容してしまうかもしれないのでご注意を.

Proxy越しにWebブラウザからSnowsightへ接続

Proxy情報をPCに設定する

※注意
Google ChromeやWindows Edgeなどがあるが、大抵これらのブラウザは基本的にPC自体のプロキシ設定をもとに接続先を変更する. この場合,Proxyを通したくない他の通信に影響が出ることが予想される.
もちろんやりようはあるが、ブラウザ単位でProxyの設定ができるFirefoxなどはちょっとした検証に使うにはおすすめ.

FirefoxのProxy設定
https://support.mozilla.org/ja/kb/connection-settings-firefox

Proxy越しにdriver, snowsql から接続

環境変数にProxyの情報を設定しましょう

>export HTTP_PROXY=http://proxy:3128
>export HTTPS_PROXY=http://proxy:3128
>snowsql ....

Python接続の場合

import snowflake.connector
import os

os.environ["http_proxy"] = 'http://proxy:3128'
os.environ["https_proxy"] = 'http://proxy:3128'

conn =snowflake.connector.connect(
    user="XXXXXXX",
    password="XXXXXXX",
    account="組織名-アカウント名",
    warehouse="XXXXXXXX",
    database="XXXXXXXX",
    role="XXXXXXXX"
)

conn.cursor().execute("SELECT 1;")

Discussion