PulumiでSnowflakeの仮想ウェアハウスを作成してみた

2022.06.13

こんにちは!DA(データアナリティクス)事業本部 サービスソリューション部の大高です。

Infrastructure as Code のツール「Pulumi」はSnowflakeにも対応しており、下記の通りSnowflake用のパッケージが提供されています。

今回は、こちらのパッケージを利用してSnowflakeの仮想ウェアハウス作成を試してみたいと思います。

前提

Snowflakeのアカウントは既にセットアップ済みで利用できるものとします。

また、Pulumiについては下記のようにHomebrew経由でインストールされていることを前提としています。

% brew install pulumi
% pulumi version
v3.34.1

プロジェクトのセットアップ

まずは今回作成するプロジェクト用のフォルダを作成して移動します。

% mkdir pulumi-snowflake && cd pulumi-snowflake

次に、Pulumiのセットアップをするのですが、今回作成したい「Snowflake x Typescript」用のテンプレートは存在しないようでした。

そのため、代わりにpulumi new typescriptで、TypeScript用テンプレートを利用してプロジェクトを初期化しておきます。

% pulumi new typescript
This command will walk you through creating a new Pulumi project.

Enter a value or leave blank to accept the (default), and press <ENTER>.
Press ^C at any time to quit.

project name: (pulumi-snowflake) 
project description: (A minimal TypeScript Pulumi program) 
Created project 'pulumi-snowflake'

Please enter your desired stack name.
To create a stack in an organization, use the format <org-name>/<stack-name> (e.g. `acmecorp/dev`).
stack name: (dev) 
Created stack 'dev'

Installing dependencies...


added 111 packages, and audited 112 packages in 5s

37 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
Finished installing dependencies

Your new project is ready to go! ✨

To perform an initial deployment, run 'pulumi up'

プロジェクトを初期化したら、Snowflake用のパッケージを追加します。

% yarn add  @pulumi/snowflake

また、以下のような感じでSnowflake用の設定も追加します。今回の例ではregionroleap-northeast-1.awsSYSADMINを指定していますが、それぞれ適切なものを指定します。

% pulumi config set snowflake:account [アカウント名]
% pulumi config set snowflake:region ap-northeast-1.aws
% pulumi config set snowflake:username [ユーザー名]
% pulumi config set snowflake:password [パスワード]
% pulumi config set snowflake:role SYSADMIN

ここでの注意点としては、 region の設定になるかと思います。 PulumiがSnowflakeに接続する際には、以下の形式のURLへアクセスしようとします。

https://[account].[region].snowflakecomputing.com:443/

このため、regionにはap-northeast-1だけではなく、クラウドプロバイダのawsも含めています。

また、roleには接続に利用するロール名を指定しています。ここで明示的に指定をしていない場合には、Snowflakeユーザーの規定のロール(DEFAULT_ROLE)が利用されるようです。

なお、実はsnowflake:browserAuthという設定もあり「ブラウザ認証ができるかな?」と試してみたのですが、2022/06現在では私の環境ではうまく動かすことができなかったので、パスワード認証で試しています。

仮想ウェアハウスを作成するコードを記述する

では、準備ができたのでドキュメントを参考にしながら、以下のようにindex.tsを記述します。

index.ts

import * as snowflake from "@pulumi/snowflake";

const warehouse = new snowflake.Warehouse("warehouse", {
  name: "vwh-via-pulumi",
  comment: "ootaka-pulumi-test",
  warehouseSize: "xsmall",
  autoSuspend: 60,
});

// Export Warehouse Info
export const warehouseInfo = warehouse;

Warehouseのオプションとして指定したnameが仮想ウェアハウスの名前になります。また、今回は明示的に自動サスペンドのパラメータautoSuspendを60秒に指定してみました。

デプロイしてみる

では、早速デプロイしてみます。デプロイにはpulumi upコマンドを実行します。

% pulumi up
Previewing update (dev)

View Live: https://app.pulumi.com/ootaka-daisuke/pulumi-snowflake/dev/previews/c56f6397-bf6f-40f6-b71f-fdb4d28fc7d4

     Type                          Name                  Plan       
 +   pulumi:pulumi:Stack           pulumi-snowflake-dev  create     
 +   └─ snowflake:index:Warehouse  warehouse             create     
 
Resources:
    + 2 to create

Do you want to perform this update?  [Use arrows to move, enter to select, type to filter]
  yes
> no
  details

作成リソースのプレビュー後にyesを選択し、成功すると以下のように表示されます。

Do you want to perform this update? yes
Updating (dev)

View Live: https://app.pulumi.com/ootaka-daisuke/pulumi-snowflake/dev/updates/1

     Type                          Name                  Status      
 +   pulumi:pulumi:Stack           pulumi-snowflake-dev  created     
 +   └─ snowflake:index:Warehouse  warehouse             created     
 
Outputs:
    warehouseInfo: {
        autoResume                     : true
        autoSuspend                    : 60
        comment                        : "ootaka-pulumi-test"
        id                             : "vwh-via-pulumi"
        maxClusterCount                : 1
        maxConcurrencyLevel            : 8
        minClusterCount                : 1
        name                           : "vwh-via-pulumi"
        resourceMonitor                : "null"
        scalingPolicy                  : "STANDARD"
        statementQueuedTimeoutInSeconds: 0
        statementTimeoutInSeconds      : 172800
        urn                            : "urn:pulumi:dev::pulumi-snowflake::snowflake:index/warehouse:Warehouse::warehouse"
        warehouseSize                  : "X-Small"
    }

Resources:
    + 2 created

Duration: 4s

実際にsnowsqlを利用してSQLで仮想ウェアハウスの情報を確認してみます。

SHOW WAREHOUSES LIKE 'vwh-via-pulumi';
+----------------+-----------+----------+---------+-------------------+-------------------+------------------+---------+--------+------------+------------+--------------+-------------+-----------+--------------+-----------+-------+-------------------------------+-------------------------------+-------------------------------+----------+--------------------+------------------+---------+----------+--------+-----------+----------+----------------+
| name           | state     | type     | size    | min_cluster_count | max_cluster_count | started_clusters | running | queued | is_default | is_current | auto_suspend | auto_resume | available | provisioning | quiescing | other | created_on                    | resumed_on                    | updated_on                    | owner    | comment            | resource_monitor | actives | pendings | failed | suspended | uuid     | scaling_policy |
|----------------+-----------+----------+---------+-------------------+-------------------+------------------+---------+--------+------------+------------+--------------+-------------+-----------+--------------+-----------+-------+-------------------------------+-------------------------------+-------------------------------+----------+--------------------+------------------+---------+----------+--------+-----------+----------+----------------|
| vwh-via-pulumi | SUSPENDED | STANDARD | X-Small |                 1 |                 1 |                0 |       0 |      0 | N          | N          |           60 | true        |           |              |           |       | 2022-06-12 23:46:17.998 -0700 | 2022-06-12 23:46:18.341 -0700 | 2022-06-12 23:46:18.341 -0700 | SYSADMIN | ootaka-pulumi-test | null             |       0 |        0 |      0 |         1 | 11796761 | STANDARD       |
+----------------+-----------+----------+---------+-------------------+-------------------+------------------+---------+--------+------------+------------+--------------+-------------+-----------+--------------+-----------+-------+-------------------------------+-------------------------------+-------------------------------+----------+--------------------+------------------+---------+----------+--------+-----------+----------+----------------+
1 Row(s) produced. Time Elapsed: 0.543s

想定どおり作成できていますね!

なお、後片付けをするときには同様にpulumi destroyコマンドで仮想ウェアハウスを削除できます。簡単ですね。

まとめ

以上、PulumiでSnowflakeの仮想ウェアハウスを作成してみました。

今回はお試しで仮想ウェアハウスだけを作成してみましたが、その他にもPulumiのSnowflakeプラグインは色々なリソースに対応しているので、また試してみたいと思います。

どなたかのお役に立てば幸いです。それでは!