🤧

SnowflakeのStreamlitをNetwork PolicyでIP制限している中で使う方法

2024/12/10に公開

弊社環境では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