👻

Snowflake のワークシートが見えなくなったときの話

に公開

はじめに

本記事はSnowflake Advent Calendar 2022 24日目の記事になります。

みなさま、ある日突然 Snowflake のワークシートを復元・保存できなくなったことはありますか?私はあります。今回はそんなお話です。

現象

まずは、こちらの画面をご覧ください。

アクセス元で、ある設定を変更して、上と同じ Snowflake 環境にアクセスすると...

ワークシートが1つもないですね。全滅です。
さらに、次の画像のとおり、ワークシートを保存することもできません。

何が起こったのでしょうか?

どうしてこうなった

ワークシートを保存・復元するとき、クラシック UI では、クラウドストレージの URL に対してリクエストが発生します。(下の画像では Amazon S3)

したがって、クラウドストレージの URL がファイアウォールでブロック対象になると、リクエストがブロックされてしまい、ワークシートを復元することも保存することもできなくなってしまいます。
ワークシートが見えなくなったとき、アクセス元環境ではファイアウォールの設定変更が行われていました。どうやら、クラウドストレージへのアクセスをブロックするように設定が変更されていたため、復元も保存もできなくなってしまったようです。なんてこった。

どうすればよい?

クラウドストレージへのアクセスを許可すればよいわけですが「とりあえず全部許可してくれ!」というのは、環境のセキュリティ要件によってはまかり通らないのではないかと思います。Snowflake が利用するホストに絞りましょう。
Snowflake を使用する環境において、許可が必要なホストは SYSTEM$ALLOWLIST() で取得できます。

https://docs.snowflake.com/ja/sql-reference/functions/system_allowlist.html

クエリ例
select
    t.value:type::varchar as type,
    t.value:host::varchar as host,
    t.value:port as port
from
    table(
        flatten(
            input => parse_json(system$allowlist())
        )
    ) as t;

出力例(AWS 東京リージョンを利用している場合)

+---------------------------------+-------------------------------------------------------------+------+
| TYPE                            | HOST                                                        | PORT |
+---------------------------------+-------------------------------------------------------------+------+
| SNOWFLAKE_DEPLOYMENT            | <account_locator>.ap-northeast-1.aws.snowflakecomputing.com | 443  |
| SNOWFLAKE_DEPLOYMENT_REGIONLESS | <organization>-<account_name>.snowflakecomputing.com        | 443  |
| STAGE                           | sfc-xxxxx-stage.s3.ap-northeast-1.amazonaws.com             | 443  |
| :                               | :                                                           | 443  |
| SNOWSQL_REPO                    | sfc-repo.snowflakecomputing.com                             | 443  |
| OUT_OF_BAND_TELEMETRY           | client-telemetry.snowflakecomputing.com                     | 443  |
| OCSP_CACHE                      | ocsp.snowflakecomputing.com                                 | 80   |
| DUO_SECURITY                    | api-c91593a0.duosecurity.com                                | 443  |
| OCSP_RESPONDER                  | ocsp.rootg2.amazontrust.com                                 | 80   |
| OCSP_RESPONDER                  | ocsp.sca1b.amazontrust.com                                  | 80   |
| OCSP_RESPONDER                  | ocsp.rootca1.amazontrust.com                                | 80   |
| OCSP_RESPONDER                  | o.ss2.us                                                    | 80   |
| SNOWSIGHT_DEPLOYMENT            | app.snowflake.com                                           | 443  |
| SNOWSIGHT_DEPLOYMENT            | apps-api.c1.ap-northeast-1.aws.app.snowflake.com            | 443  |
+---------------------------------+-------------------------------------------------------------+------+

SYSTEM$ALLOWLIST() の出力で「TYPE」が STAGE になっているものを見ると、「HOST」が sfc-xxxxx-stage.s3.ap-northeast-1.amazonaws.com となっています。このホストを許可してもらいましょう。

なお、クラシックUIでのワークシートは内部ステージに保存されており、見えなくなったとしても削除されてしまったわけではありません。

Snowflake が利用しているホストへのアクセスが許可されれば、ワークシート達と再会を果たすことができます。

まとめ

  • クラシック UI では、ワークシートを保存・復元するとき、クラウドストレージにアクセスします
  • Snowflake がアクセスするホストとポートは SYSTEM$ALLOWLIST() で取得できます
  • ファイアウォールを設定する際は SYSTEM$ALLOWLIST() で得られるホストを許可してもらうようにしましょう

ワークシート保存・復元時の挙動を知らず、サポートケースで問い合わせたりしたので、まとめてみました。どなたかのお役に立ちますように🙏
(サポートさん、いつも爆速で対応いただき、ありがとうございます!)

Discussion