

SnowflakeをAzure DevOpsで自動リリースしてみた
こんにちは。プラットフォーム技術部の森内です。
2021年10月にSnowflake(クラウド型DWH)の稼働基盤にAzure東日本リージョンが追加になったのは記憶に新しいですが、Snowflakeとはデータ活用基盤の次世代ソリューションです。DBaaSとしてサービス提供型のクラウドネイティブなDWHとなり、主要3大パブリッククラウド(AWS/Azure/GCP)に対応しています。SaaS的なクラウドサービスのため、試用版も5分ほどで利用できます。
ガートナー社のマジック・クアドラント・レポートでは「分析のためのデータ管理ソリューション」分野においてリーダーとしての地位であると評価されています。データ活用基盤を初めて導入される場合や既存のデータ活用基盤に課題(コストやパフォーマンスなど)がある場合にお薦めです。Snowflakeの詳細は、こちらを参照ください。
Snowflakeを効率的に利用するには、システム運用の自動化が必要です。実際には頻繁なリリース作業の効率化、作業ミスによる手戻りの防止など、保守開発プロセスを最適化するために、DevOpsという開発手法を用いて実現することが多く、AzureでのDevOpsはAzure DevOpsサービス群で提供されています。これらのうち、Azure ReposとAzure Pipelinesを使って、Snowflakeに対して自動リリース(CI/CD)してみたいと思います。
DevOpsとは
DevOpsは開発者と運用担当者の壁をなくし、協力し合いながら、ビジネスの価値を実現していくという概念です。一般的には「人」と「ツール」の2つの観点から開発と運用の現場を改善していきます。
Azure DevOpsの詳細は、こちらを参照ください。
Azure Reposとは
コードのバージョン管理ツールです。ソース管理用にGitリポジトリまたはTeam Foundationバージョン管理(TFVC)を提供しています。
Azure Reposの詳細は、こちらを参照ください。
Azure Pipelinesとは
アプリの継続的インテグレーション(CI)と配信をサポートするビルドおよびリリース(CD)サービスを提供しています。
Azure Pipelinesの詳細は、こちらを参照ください。
今回想定するシナリオ
Azure DevOpsを利用してSnowflakeに対して管理者がテーブルを作成し、作業者は作成されたテーブルに対して新しい列を追加します。リリース資材の管理は、Azure ReposのGitを利用し、リリースの自動化(CI/CD)は、リリース資材の修正・承認を契機として、Azure PipelinesからSnowflakeへ自動反映します。
■シナリオイメージ


前提
- SnowflakeとAzureはすでに利用できるものとします。
- 作業用パソコンへのGitインストールとGitHubアカウントは作成済みとします。
- Gitのブランチ戦略はシンプルなものとし、メインブランチと機能ブランチを使用します。
- メインブランチ(mainとします)
- テストやリリース済みの最新版を管理します。
- 機能ブランチ(feature1とします)
- メインブランチから分離し、すべての新機能とバグの修正に利用し、プル要求を使用して修正内容が承認されたものをメインブランチにマージします。
- メインブランチ(mainとします)
- Snowflakeは試用版を利用するため、Azure Private Linkは使用できません。Snowflakeへのプライベート接続には、SnowflakeのBusiness Criticalエディション(またはそれ以上)の利用が必要です。そのため、Azure DevOpsとSnowflake間の通信は、パブリックインターネットを経由します。セキュリティを考慮するとSnowflake側で接続元のIPアドレスを制限できますが、Azure DevOpsは、デフォルトでは動的IPアドレスとなるため、Azure DevOpsのIPアドレスをレンジ指定で許可するか、IPアドレスを固定にするかを検討する必要があります。ここでは適切にセキュリティ対策ができているものとして、詳細の手順は割愛します。
Snowflakeの作業
まずはSnowflakeに自動リリース対象となるデータベースを作成するために、Snowflakeにウェブアクセスしサインインします。


画面右上のアカウント名をクリックし、「ロールを切り替え」からデータベース作成権限が付与されているロールに切り替えます。(今回はSYSADMINにしています)


画面左上の「データベース」ー「作成」をクリックします。


データベースの名前(今回はSF_DEMO_DBにしています)を入力し、「完了」をクリックします。


Azure DevOpsの作業
Azure Pipelinesを使うためには、Azure DevOpsの組織が必要です。そのため、まずAzure DevOpsの組織を作成します。
Azureポータルへサインインします。Azureサービスの「Azure DevOps organizations」をクリックします。


Azure DevOpsの画面に遷移しますので、「My Azure DevOps Organizations」をクリックします。


「新しい組織の作成」をクリックします。


作成する組織の名称とロケーションを設定し、画像認証が表示された場合は画像の文字列を入力し、「Continue」をクリックします。


次にAzure Pipelinesを使用するリポジトリとして、Azure DevOpsのプロジェクトを作成します。プロジェクト名(今回はDevOps_Snowflake)を入力し、公開範囲はPrivate(インターネットに公開せずプロジェクト内のみ)にし、「Create project」をクリックします。


次のサイトにアクセスし、作成したプロジェクトの利用を申請します。承認まで2~3営業日ほどかかります。
利用申請サイト:Azure DevOps Parallelism Request
Azure Reposの作業
Azure Reposのリポジトリをフォークして作業用パソコン(今回はWindows 10を使用します)のローカル環境にリポジトリのコピーを作成します。最初に作成したAzure DevOpsのプロジェクト(DevOps_Snowflake)を開きます。


左ペインから「Repos」を選択し、「Clone to your computer」のURLをコピーします。


作業用パソコンにてGit CMDを開き、任意の作業フォルダー(C:\work など)に移動し、以下のコマンドを実行します。URLには先ほど「Clone to your computer」でコピーしたURLを入力します。なお、作業用パソコンとAzure Repos間にプロキシを経由する場合は、Gitにプロキシ設定が必要ですが、ここでは割愛します。
git clone <URL>
作業用パソコンにAzure Reposのリポジトリのコピーが作成されるので、「migrations」(名前は任意です)という名前の新規フォルダーを作成します。migrationsフォルダー内に以下のSnowflakeのデータベース作成スクリプト(SQL)を作成します。HELLO_WORLDという単純なテーブルを作るスクリプトです。
CREATE SCHEMA DEMO;
CREATE TABLE HELLO_WORLD
(
FIRST_NAME VARCHAR
,LAST_NAME VARCHAR
);
Git CMDにて以下のコマンドを実行し、作業用パソコンのローカル環境で作成したデータベース作成スクリプト(SQL)をAzure Reposのメインブランチに反映します。
git add .
git commit -m "<コメント>"
git push origin main
Azure Reposを確認すると、migrationsフォルダーと作成したデータベース作成スクリプト(SQL)が表示されます。ファイル名はV1.1.1__initial_objects.sqlにしています。


Azure Pipelinesの作業
Azure PipelinesからSnowflakeへ接続するために、接続情報を変数として設定します。Azure DevOpsの左ペインから「Pipelines」ー「Library」を選択し、「Variable group」をクリックします。


以下の変数を設定し、「Demo-variables」と名前を付け、「Save」をクリックします。
変数名 | 変数値 |
PROJECT_FOLDER | $(System.DefaultWorkingDirectory) |
SF_ACCOUNT | <Snowflakeのアカウント名> |
SF_USERNAME | <Snowflakeのユーザー名> |
SF_PASSWORD | <Snowflakeのユーザーパスワード> |
SF_ROLE | <Snowflakeのロール名> |
SF_WAREHOUSE | <Snowflakeのウェアハウス名> |
SF_DATABASE | <Snowflakeのデータベース名> |


Azure DevOpsの左ペインから「Pipelines」ー「Pipelines」を選択し、「Create Pipeline」をクリックします。


「Azure Repos Git」をクリックします。


「DevOps-Snowflake」をクリックします。


「Starter pipeline」をクリックします。


表示された「azure-pipelines.yml」のコードを以下のように書き換え、画面右上の「Save and run」をクリックします。実行内容に問題がなければ、再度「Save and run」をクリックします。
# Deploy database changes using schemachange
# https://github.com/Snowflake-Labs/schemachange
# (see https://aka.ms/yaml for the YAML schema reference)
trigger:
branches:
include:
- main
paths:
include:
- /migrations
pool:
vmImage: 'ubuntu-latest'
variables:
- group: demo-variables
steps:
- task: UsePythonVersion@0
displayName: 'Use Python 3.8.x'
inputs:
versionSpec: '3.8.x'
- task: Bash@3
inputs:
targetType: 'inline'
script: |
echo 'Starting bash task'
echo "PROJECT_FOLDER $(PROJECT_FOLDER)"
python --version
echo 'Step 1: Installing schemachange'
pip install schemachange --upgrade
echo 'Step 2: Running schemachange'
schemachange -f $(PROJECT_FOLDER)/migrations -a $(SF_ACCOUNT) -u $(SF_USERNAME) -r $(SF_ROLE) -w $(SF_WAREHOUSE) -d $(SF_DATABASE) -c $(SF_DATABASE).SCHEMACHANGE.CHANGE_HISTORY --create-change-history-table
env:
SNOWFLAKE_PASSWORD: $(SF_PASSWORD)


Summaryが表示されるので、実行した結果が「Success」になることを確認します。約5分ほどかかります。その後、Snowflakeのデータベース(SF_DEMO_DB)に新しいテーブル(HELLO_WORLD)が追加されていることを確認します。




自動リリースしてみる
Git CMDにて以下のコマンドを実行しAzure Reposのリポジトリを作業用パソコンのローカル環境に同期します。
git pull
Git CMDにて以下のコマンドを実行し、機能ブランチ(feature1)を作成し、ブランチを切り替えます。
git branch feature1
git checkout feature1
git branch
作業用パソコンのローカル環境の「migrations」フォルダー内に列追加スクリプト(SQL) を作成します。テーブル(HELLO_WORLD)にAGE列を追加するスクリプトです。
USE SCHEMA DEMO;
ALTER TABLE HELLO_WORLD ADD COLUMN AGE NUMBER;
Git CMDにて以下のコマンドを実行し、作業用パソコンのローカル環境で作成した列追加スクリプト(SQL)をAzure Reposの機能ブランチ(feature1)に反映します。
git add .
git commit -m "<コメント>"
git push origin feature1
Azure Reposの機能ブランチ(feature1)に列追加スクリプト(SQL)が反映されたら、コード管理者に承認を依頼します。Azure DevOpsの左ペインから「Repos」を選択し、Contentsに表示されているfeature1の「Create a pull request」をクリックします。


「Title」と「Reviewers」(コード管理者)を設定し「Create」をクリックします。


コード管理者は、Azure DevOpsの左ペインから「Pull requests」を選択し、コードの変更内容を確認します。問題がなければ、画面右上にある「Complete」ー「Complete merge」クリックします。




Azure DevOpsの左ペインから「Repos」を選択し、メインブランチ(main)の「migrations」フォルダーに列追加スクリプト(SQL)が追加されていることを確認します。ファイル名はV1.1.2__updated_objects.sqlとしています。


Snowflakeのデータベース(SF_DEMO_DB)のテーブル(HELLO_WORLD) に列(AGE)が追加されていることを確認します。


最後に
SnowflakeをAzure DevOpsで自動リリースしてみました。簡易版であればすぐに実装できることがわかりました。昨今のDXの流れを受け「何となく流行っているからとりあえずツールを導入する」と失敗するケースが多いのではないでしょうか。その点いつでもやり直せるクラウドサービスを試用版や無料枠で組み合わせていろいろ検証できる環境をつくれることは非常にメリットがあります。まずは活用目的に即して、ツールやサービスに求める機能やコスト、保守開発の容易性などを十分に検討し検証した上で、現場への定着を見ながら徐々に展開し改善していくことが効果的なデータ活用基盤を実現するための重要なポイントだと思います。
DevOps、Azure環境についてお悩みがあれば、お客様のご要望に応じて最適なシステム構成を提案いたしますので、お気軽にご相談ください。