SnowflakeのStreamlitをNetwork PolicyでIP制限している中で使う方法
弊社環境ではVPNを通してSnowflakeにアクセスしており、その際にNetwork Policyでwhitelistしているわけですが、その折にStreamlit in Snowflakeが発表され、是非とも使いたいとなりました。
しかし何度設定や条件を確認しても以下のエラーが出ます。
Could not reload streamlit files. Error: 092806 (P0002): The specified Streamlit was not found
原因:
Snowflake WebSocket 接続がアプリケーションに関連付けられたエンドポイントに到達できません。
解決策:
組織のファイアウォール構成の許可リストに *.snowflake.app を追加します。
このエラーを見すぎて気が狂いそうになったこともあります。
これに対してSnowflake側に何度も問い合わせ技術者とも話し合いますが、結局は弊社側のdomainやIP許可がされていないからということでした。
背景
弊社VPNではDNSによって特定のDomainとのやりとりは全てVPNに通すというルーティングをしています。
この時ぱっと見のやりとりはapp.snowflake.com
というドメインからやり取りをしており、あたかもDNSルーティングはできているように見えてます。
しかしStreamlitはSnowflakeの機能である一方、実際にはapp.snowflake.com
とは別のサブドメイン(*.snowflake.app
など)にてSnowflakeと通信しています。そのため、VPN経由では*.snowflake.app
への通信が制限され、WebSocketがブロックされてしまいます。
この問題に気づくまでに2024年5月からすでに3ヶ月経ってます(笑)
地域に依存するサブドメイン
Snowflakeはリージョンごとにユニークなサブドメインを持っています。
例えば、*.region.snowflake.app
といったドメインになります。(AWSリージョンや使ってるCloudで異なりますが)
まずは、自分が利用するSnowflake環境のリージョンに合わせたサブドメインを確認してください。
これはCDN技術と同じで、CNAME(Canonical Name)が別途設定されているわけです。見かけ上はapp.snowflake.com
だが実際にやりとりしているサーバーは別で、そのサーバーのDomainに関係するものがVPN通っていないからこの問題が起きるわけです。
Canonical NameとロードバランサーのIPアドレス確認方法
リージョン固有の*.snowflake.app
を特定したら、Macであればnslookup
コマンドを使ってCanonical NameやロードバランサーのIPアドレスを確認できます。
Terminalを開いて適当に
nslookup *.region.snowflake.app
と打ってEnterです。この時「*」はなんでもいいです。そうすると
Non-authoritative answer:
canonical name = a6f088ade3ae55b5e27464116fb2dd9d-26f2842687cb0ecf.elb.region.amazonaws.com
Name: a6f088ade3ae55b5e27464116fb2dd9d-26f2842687cb0ecf.elb.region.amazonaws.com
Address: **.***.**.**
Name: a6f088ade3ae55b5e27464116fb2dd9d-26f2842687cb0ecf.elb.region.amazonaws.com
Address: **.***.**.***
Name: a6f088ade3ae55b5e27464116fb2dd9d-26f2842687cb0ecf.elb.region.amazonaws.com
Address: **.***.***.***
a6f088ade3ae55b5e27464116fb2dd9d-26f2842687cb0ecf の部分はめちゃくちゃ適当に打ってます笑
この時ロードバランサーのIPアドレスそれぞれを取得してVPNに通す設定にします。
これにより、*.snowflake.app
を経由するWebSocket通信がVPN経由でも許可され、StreamlitやNotebookが正常動作するようになります。
Discussion