この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは!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用の設定も追加します。今回の例ではregion
とrole
はap-northeast-1.aws
とSYSADMIN
を指定していますが、それぞれ適切なものを指定します。
% 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プラグインは色々なリソースに対応しているので、また試してみたいと思います。
どなたかのお役に立てば幸いです。それでは!