[Snowflake] Troccoを使ってS3にあるデータをSnowflakeに転送してみた

S3においてあるデータをSnowflakeにimportするまでの作業をやってみました。

# 前提

|resource|status|
|--|--|
|AWSアカウント|作成済み|
|S3バケット|作成済み|
|Snowflakeに転送するCSVファイル|S3に保存済み|
|Snowflakeアカウント|作成済み|
|S3からimportするデータの保存先Table|なし|
|Trocco|フリープランの契約あり|

# Troccoの設定
Troccoの利用開始直後の画面は以下のようになっています。
S3にあるCSVファイルのデータをSnowflakeへ転送するには以下の設定を行う必要があります。
1. 接続情報の作成 (S3への接続設定)
1. 接続情報の作成 (Snowflakeへの接続設定)
1. 転送設定の作成 (S3のどのファイルを、SnowflakeのどのTableに転送するかを設定)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510106/1f1d11bb-54ec-3418-6369-abaa42216d91.png)

## 接続情報の設定
接続情報の設定は画面左のメニューの接続情報から行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510106/460df9c9-79fc-2ea6-8922-1b93e9823bdb.png)

### S3の接続情報の設定
表示されているサービス一覧からS3を選択すると以下の画面が表示されます。
この画面で以下を設定します。

|項目名|設定内容|
|--|--|
|名前|S3への接続情報の名前として任意の名前を記載します。S3のバケット名を入れておくとわかりやすいでしょう。今回はテストなので適当な値を入れています。|
|接続情報|AWSの認証方式を選び必要事項を記入します。今回はIAMユーザでの認証を選択肢、AWSアクセスキーとAWSシークレットアクセスキーを入力しています。IAMロールでの設定も可能なようです。|

上記を入力して保存するとS3への接続情報が保存され、設定が完了します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510106/1c224b6c-b41e-3f48-11f3-a68e2425d5fb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510106/30ef6356-8b74-768c-5d35-313f8cfa0d59.png)

### Snowflakeの接続情報の設定
表示されているサービス一覧からSnowflakeを選択すると以下の画面が表示されます。
この画面で以下を設定します。

|項目名|設定内容|
|--|--|
|名前|S3への接続情報の名前として任意の名前を記載します。接続先のSnowflakeのアカウント名や役割が入っていると分かり易いでしょう。|
|ホスト| 今回使用しているSnowflakeはAWS上にあるので、 `{account_id}.ap-northeast-1.aws.snowflakecomputing.com` を入力します。|
|ユーザ|Snowflakeへのデータの投入に使用するSnowflakeのユーザ名を記入します|
|認証方式|転送設定ではユーザ・パスワード認証しか使えなさそうなのでそれを使用します|
|パスワード|上記で記載したSnowflakeユーザのパスワードです|
|ロール|データの投入に使用するロールを設定します。未入力の場合、上記のユーザのデフォルトロールが使用されるようです|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510106/c6899441-c5d1-446d-31ff-b1ef7ceb6ea4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510106/b5912cf2-d032-43b9-b04e-e8760f1f1f2b.png)

## 転送設定
必要な接続情報の設定が完了したので、それを利用し、実際にデータをS3からSnowflakeへ転送するための設定を行います。
左のメニューのデータ転送から行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510106/1f1d11bb-54ec-3418-6369-abaa42216d91.png)

### 転送設定の新規作成
新規作成画面で、転送元、転送先の両方を指定します。
今回はS3からSnowflakeへの設定なので添付の様になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510106/95e08375-31eb-5754-bbda-617270119078.png)

#### 転送元の設定
次の画面へ遷移すると、接続情報を選択する欄があるので、ここで先程作成した接続情報を使用します。
S3バケット名の設定も必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510106/5f3194c5-fe43-45ce-6b17-e69ce385c324.png)

指定したバケット内のどのファイルを転送するかの設定は以下のようにパスプレフィックスと正規表現を組み合わせて指定することができます。
例えば正規表現で `[0-9]{4}-[0-9]{2}-[0-9]{2}.csv$` と記載すれば YYYY-MM-DD.csv という表記のファイルだけが転送対象になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510106/d057332f-31e0-b041-4ac9-debd2a766c7f.png)

転送方法で差分転送を選択すると、前回転送したファイルよりも文字列比較で後に来るファイルが転送対象になるようです。
e.g. 前回取り込んだファイルが `2023-01-01.csv` であれば、翌日は `2023-01-02.csv` が取り込み対象になる。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510106/b5b80e61-6978-c25f-1b77-9b28aa92091c.png)


#### 転送先の設定
転送先であるSnofwlakeの設定も同様に先程作成した設定情報を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510106/2b9c23ea-a7f8-116b-02ab-0b53820cef5c.png)

転送先設定では、データをimportする Database, Schema, Tableの情報が必要です。
今回はTableは事前に作成していないので、作成したいTable名を記載すると、その名前のTableが作成されます。

なお、転送モードにはこれだけの種類がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510106/391ea63f-d10c-02a5-666a-b021b68b802a.png)

### 転送設定の詳細設定
次の画面へ遷移する際に、自動データ設定を実行 or 自動データ設定をスキップの2種類が選択できます。
前者を選択すると、カラム名やデータ型が自動的に判断されるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510106/d0835a57-4562-3877-1c3e-177562f13553.png)

今回は自動データ設定をスキップしました。
遷移後の画面では以下のようにデータのプレビューを見ながらカラムの定義やフィルター設定などを行うことができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510106/6f259b9d-4a68-bd38-affc-97b3230d5697.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510106/ed5abe23-255a-00aa-f66d-f62dbd9a3fbb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510106/9cfcac26-e13b-5c14-cea7-c295bc502928.png)

転送日時カラム設定は、テーブルに1列追加し、importした時間を記録してくれるようです。
これで転送設定は完了です。

次の画面に進み、実行ボタンをクリックすると設定したとおりにデータ転送が行われます。
どうやら実行するたびにembulkのcontainerが立ち上がるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510106/c00c045c-c661-1ac3-4c8a-48dace4d15cb.png)

これで転送設定と実行が完了しました。
SnowflakeをみるときちんとTableが作成され、データがimportされていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510106/c16a6000-058f-5129-fc69-81e926e74621.png)