Snowflake Rookies Camp No.2 に参加 ~実践的で勉強になった！

2025年4月4日、Snowflake初心者向けの勉強会「Snowflake Rookies Camp」に参加しました。本記事では、その第2回の内容についてまとめます。

この勉強会は、**業種の異なる企業に所属されている有志の方々が運営**されており、Snowflake初心者を対象とした非常に丁寧な内容となっていました。前回（第1回）から引き続きの参加させていただきました。

### Snowflake Rookies Campについてはこちら
https://zenn.dev/rookiescamp

---

## 今回の題材：Frosty Friday Week3（Basic）

第2回では、[Frosty Friday Week3 - Basic](https://frostyfriday.org/blog/2022/07/15/week-3-basic/)のお題に取り組みました。

お題の概要は以下のとおりです：

- **AWS S3に保存されたCSVファイル**をSnowflakeにロード
- 指定された条件に基づいて**データを集計**

Zennにて公開されている[回答例](https://zenn.dev/rookiescamp/articles/5e185de59dbe04)も参考にさせていただきながら進めることができたため、非常に取り組みやすい内容でした。

---

## 利用環境とクラウド基盤の違いについての補足

勉強会の中では、以下のような質問をさせていただきました。
対年丁寧にご回答いただき本当にありがとうございます。

> **Q：TrialアカウントでAzureを選んでしまったのですが、AWS S3からデータを外部ステージ経由で取り込むことに制約はありますか？**  
>
> **A：クラウドプロバイダーに関係なく、AWS S3を外部ステージとして利用することは可能です。**  
> ただし、各クラウドプラットフォームごとに一部仕様や設定が異なるため、公式ドキュメントや検証記事を確認しながらの対応が推奨されます。

参考リンク：

- [Snowflake公式：クラウド基盤ごとの違い](https://docs.snowflake.com/ja/user-guide/intro-cloud-platforms)  
- [クラスメソッド社の解説記事](https://dev.classmethod.jp/articles/snowflake-external-stage-on-each-cloud-platform/#Microsoft%2520Azure)

---

## 印象的だったポイント

この勉強会の特徴は、技術的な深さに加えて**初心者に対する配慮が非常に行き届いている**点です。

- 第1回の振り返りにも軽く触れていただき、初参加者でもキャッチアップしやすい構成
- 解説のスピードは速すぎず、一呼吸おいて説明いただけるため理解がしやすい
- 「正規表現が初めての方もいるかもしれません」といった、参加者のスキルを前提としない丁寧なガイダンス

特に、**「初心者に安心してもらう」ことを意識した運営姿勢**が全体を通して伝わってきました。

---

## 技術的に学んだこと

### 🔹 外部ステージの利用と`PATTERN`オプション

Snowflakeでのファイル読み込み時に指定する`PATTERN`は、**あくまでファイル名やパスに対して正規表現を使ってフィルタリングするためのオプション**であるという点を学びました（データの中身までフィルタできるものかと勘違いしていた）

こちらも質問させていただき即回答いただけました：

> **Q：PATTERNに、ファイル内のデータに基づいた条件を指定することは可能でしょうか？**  
> → **A：PATTERNはファイル名のフィルタリングに用いるもので、ファイル内のデータには影響しません。**

📄 参考ドキュメント：  
https://docs.snowflake.com/ja/user-guide/querying-stage

※自分でドキュメントを調べるべきかとも悩んだのですが、それだとハンズオンについていくことができず、ついつい甘えてしまいました。すみません。

---

## その他の学び

- `CONTAINS`関数の活用方法（文字列の部分一致検索に有用）
　`table_search_week3.filename`のように、「テーブル名.カラム名」という指定方法に慣れる必要がある

- trial accountはおなじメールアドレスで複数回払い出せる
- 
---

## まとめ

なんとかトライアルアカントでおなじコマンドをうち、ゴールのアウトプットまで出すことができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000419/2c37d774-d221-4798-95e8-c19af1a0fed4.png)



第2回の勉強会も非常に有意義な時間となりました。初心者にも配慮された進行と、実務でそのまま活かせる内容のハンズオン形式で、学びが深まったと感じています。

次回以降も引き続き参加し、より理解を深めていきたいと思います。

 勉強会の運営・開催に関わってくださった皆さま、本当にありがとうございました。

---

## 勉強会後の自己学習と疑問
上記のとおりハンズオンにて、S3上のCSVファイルをSnowflakeにロードする操作を体験しました。

```sql
create or replace stage stage_week3
  url = 's3://frostyfridaychallenges/challenge_3/';
```

上記のように、S3バケットに対して `STORAGE_INTEGRATION` や認証情報を指定せずに外部ステージを作成し、`LIST @stage_week3;` などのクエリが問題なく実行できました。

このとき、**Snowflake側で特別な認証設定を行っていないのにもかかわらず、S3バケットの内容を参照できた**ことに疑問を持ちました。以下、自分なりに調べた内容をまとめてみます。

---

## S3バケットがパブリック設定だったはず

今回のように認証なしでS3からデータを読み取れたのは、**対象のS3バケットが「パブリックアクセス可能」な設定になっていた**ためと考えられます。

実運用ではデータをパブリックアクセスOKにするケースは少ないと思いますので、実務ではどのようにS3からロードするのでしょうか。
ここは自力で探すのが難しくchatgptに聞いてみました。合っているかどうかわかりません

# chatgptの回答

S3バケットには以下のようなアクセス制御の方法が存在しており、それに応じてSnowflake側でも異なる対応が必要となります。

**S3のアクセス制御パターンと、Snowflakeでの対応方法**

| S3バケットの設定 | Snowflakeでの指定方法 | 補足 |
|-------------------|-------------------------|------|
| **① パブリックアクセス許可（匿名アクセス）** | 認証なし（URLのみ指定）<br>`create stage ... url='s3://...';` | 簡易的な検証用途では有効。セキュリティ的には非推奨。 |
| **② IAM Role（AssumeRole）を使用** | `STORAGE INTEGRATION` を作成し、<br>`storage_integration` を指定 | Snowflake推奨の方法。IAMロールと信頼関係を構成。 |
| **③ アクセスキーを直接指定** | `credentials=(aws_key_id=..., aws_secret_key=...)` をステージ作成時に指定 | 機能的には有効だが、キーの管理や漏洩リスクのため非推奨。 |
| **④ Pre-signed URL を利用** | Snowflakeでは非対応 | 一時的なアクセス用途には使えるが、Snowflakeは未対応。 |


STORAGE INTEGRATION を用いた IAM ロール連携の概要

セキュアな連携を行う場合、Snowflakeが用意している `STORAGE INTEGRATION` 機能を使い、AWS側にIAMロールを用意するのが一般的です。

以下はその基本的な構成です：

```sql
-- Snowflake 側：STORAGE INTEGRATION の作成
create storage integration my_s3_integration
  type = external_stage
  storage_provider = s3
  enabled = true
  storage_aws_role_arn = 'arn:aws:iam::123456789012:role/my-s3-access-role'
  storage_allowed_locations = ('s3://my-secure-bucket/data/');

-- ステージの作成
create or replace stage my_secure_stage
  url = 's3://my-secure-bucket/data/'
  storage_integration = my_s3_integration;
```

この構成に加えて、**AWS側でSnowflakeアカウントからのAssumeRoleを許可するIAM信頼ポリシー**を設定する必要があります。

---

以上がchatgptに聞いた結果です。残念ながらS3環境をもっていないので試すことができません。しかしSTORAGE INTEGRATIONという機能がキーになりそうです。調べてみました。

https://docs.snowflake.com/ja/user-guide/data-load-s3-config-storage-integration

まさにこれが、知りたかった手順のようです。IAMロールの作成と、Snowflake側でcreate storage integrationをすることでセキュアに外部データ（S3)をロードできると理解しました。

Snowflake Rookies Camp のおかげで、勉強をするきっかけとモチベーションに繋がり本当に感謝しております。
次回以降もぜひ参加させていただきます。

---

本記事はあくまで現時点での個人的な理解を整理したものであり、誤りなどあればご指摘いただけると幸いです。