電通総研 テックブログ

電通総研が運営する技術ブログ

Azure DevOpsを用いたSnowflakeへの自動デプロイをやってみた

初めまして。エンタープライズ第三本部、2年目の松田知洋です。
本記事では、用いたSnowflakeの自動デプロイの仕組みを紹介します。Azure DevOpsを用いる事で、ソースコードの一元管理、バージョン管理に加え、パイプラインによる人的ミスが少なく、再現性の高い運用が出来ます。実際普段の業務でもこういった仕組みを利用していますが、勉強を兼ねて改めて整理したのが本記事になります。
以下はSnowflakeとAzure DevOpsに関する簡単な説明です。詳細に関してはリンクの弊社ブログ及び公式ドキュメントをご覧ください。

Snowflakeについて

Snowflakeは、クラウド上で提供されるデータウェアハウスプラットフォームであり、大量のデータを効率的に保存・管理・分析することが出来ます。また、Snowflakeは3大主要クラウドサービス(AWS/Azure/GCP)に対応しており、ユーザーのニーズに合わせて、柔軟にクラウド環境を選択できます。これにより、既存のインフラと容易に統合できる点も大きな魅力です。
詳細:https://itsol.dentsusoken.com/snowflake/blog/snowflake-vol001-2694/

Azure DevOpsについて

そもそもDevOpsという言葉は、「Development(開発)」と「Operations(運用)」を組み合わせた造語です。主にソフトウェア開発チームと運用チームが密に連携し、効率的かつ迅速にサービスやアプリケーションを提供するための方法論や文化を指します。Azure上でこれらを支援する様々なツールを提供するのがAzure DevOpsです。
詳細:https://azure.microsoft.com/ja-jp/products/devops

Azure Reposについて

Microsoftが提供するGitベースのソースコード管理サービスで、開発チームが効率的にコードを保存、共有、管理するためのツールです。
詳細(Repos):https://azure.microsoft.com/ja-jp/products/devops/repos

Azure Pipelinesについて

継続的インテグレーション(CI)と継続的デプロイメント(CD)を実現するための自動化ツールであり、Azure Repos上にあるコードを様々なサービスに対して自動的にデプロイできます。
詳細(Pipelines):https://azure.microsoft.com/ja-jp/products/devops/pipelines

前提

今回紹介する手順は、以下の環境が利用できることが前提となります。
(1)Azureの利用環境及びLinuxVMの準備
(2)Snowflakeの無料トライアル環境
(3)作業用PCへのGitのインストール/GitHubアカウントの作成
(1)、(3)に関しては、手順での紹介を省略させていただきます。

作業手順

手順1 Snowflakeトライアルアカウントの作成を作成する

Snowflakeのトライアルアカウントを作成します。
トライアルアカウントは1つのメールアドレスで何個でも作成することが出来ます。
以下のサイトにアクセスし、必要事項を記入して作成します。
https://signup.snowflake.com/
※会社名、ジョブタイトルは適当に入力しても問題ないです。EditionはEnterprise以上を、クラウドプロバイダーはAzureを選択してください。

手順2 Azure DevOpsの組織を作成する

Azure DevOpsを使用するために必要な、Azure DevOpsの組織を作成します。

手順2-1:Azure DevOps Organizationsを開く

ご自身のアカウントでAzureポータルへサインインし、Azure DevOps Organizationsを押下。

手順2-2:Organization作成画面を開く

遷移した画面でMy Azure DevOps Organizationsを押下。

手順2-3:Organizationを作成する

遷移した画面でCreate new organizationを押下。

手順2-4:Organizationの詳細を決める

認証画面が出てきたら、組織名とホストする地域を選択し、Continueを押下。

手順2-5:プロジェクトを作成する

プロジェクト作成画面に遷移するので、プロジェクト名と公開範囲を設定し、作成。

手順3 Azure Reposのリポジトリをローカルにコピーする

手順3-1:Azure Reposの情報をコピーする

作成したプロジェクトのReposからFilesを選び、Clone to your computerのURLをコピーします。

手順3-2:作業用PCにAzure Reposのリポジトリをコピーする

作業用のPCでターミナルを開き、リポジトリを作成したいフォルダーに移動し(私はD:\DEMOに作成しました)、以下のコマンドを実行します。YOUR URLの部分には先ほどコピーしたURLを入れてください。
git clone <YOUR URL>

手順3-3:ローカルのリポジトリにデプロイするファイルを作成する

作業用のPCにAzure Reposのリポジトリがコピーされるので、新規フォルダーを作成し、その中に以下のようにSQLファイルを作成します(中身は自由に変更して下さい)。

CREATE OR REPLACE DATABASE DEVOPS_DB;
CREATE OR REPLACE SCHEMA DEVOPS_DB.DEVOPS_SCHEMA;
CREATE OR REPLACE TABLE DEVOPS_DB.DEVOPS_SCHEMA.DEVOPS_TABLE(
    ID NUMBER,
    NAME VARCHAR
    );

手順3-4:デプロイするファイルをリモートに反映する

手順3-2で作成したフォルダに移動したら、以下のコマンドを実行し、作業用PCのローカルで作成したSQLファイルをAzure Reposのメインブランチに反映します。

git add .
git commit -m "<コメント>"
git push origin main

ReposのFilesに先ほど作成したフォルダ及びファイルが作成されていることを確認します。

手順4 デプロイ用パイプラインで使用するSnowflakeへの接続情報を作成する。

Snowflakeへの接続情報をDevOpsに変数として設定します。

手順4-1:Variable groupを開く

PipelinesからLibraryを選択し、Variable groupを押下します。

手順4-2:Variable groupにSnowflakeへの接続情報を登録する

以下のように情報を登録し、Saveを押下します。パスワードは鍵アイコンをクリックし、伏字として登録しましょう。

Snowflakeの接続情報の詳細は、以下の場所から確認できます。
ロールは本来であれば接続用のシステムロールを作成するのが好ましいですが、今回はACCOUNTADMINとします。

5.デプロイ用のパイプラインを作成する

手順5-1:パイプライン作成画面を開く

PipelinesからPipelinesを選択し、Create Pipelinesを押下します。

手順5-2:パイプラインで使用するリポジトリの種類を選択する

Azure Repos Gitを選択します。

手順5-3:パイプラインで使用するリポジトリを選択する

作成したプロジェクトを選択します。

手順5-4:パイプラインの作成方法を選択する

Starter pipelineを選択します。

手順5-5:パイプラインを作成する

以下のスクリプトを張り付け、Save and runの隣のボタンを押下し、Saveを選択します。
スクリプトの中では、エージェントのVMにSnowSQL(SnowflakeCLI)をインストールしたのちに、デプロイ対象のフォルダの中のSQLファイルをリストアップし、SnowSQLで実行しています。

parameters:
  - name: deployFolderName
    displayName: Deploy Target Folder
    type: string

variables:
  - group: Snowflake

trigger: none

stages:
- stage: MainStage
  displayName: Run Snowflake Scripts
  jobs:
  - job: RunSnowSQL
    displayName: Execute all .sql scripts
    pool:
      name: 'MySelfHostedPool'

    variables:
      deployPath: '${{ parameters.deployFolderName }}'
      snowflakeAccount: '$(SNOWFLAKE_ACCOUNT)'
      snowflakeUser:    '$(SNOWFLAKE_USERNAME)'
      snowflakePassword: '$(SNOWFLAKE_PASSWORD)'
      snowflakeWarehouse: '$(SNOWFLAKE_WAREHOUSE)'
      snowflakeRole:    '$(SNOWFLAKE_ROLE)'

    steps:
    - checkout: self

    - task: Bash@3
      displayName: Install SnowSQL
      inputs:
        targetType: inline
        script: |
          #!/bin/bash
          sudo apt-get install unzip
          wget https://sfc-repo.snowflakecomputing.com/snowsql/bootstrap/1.3/linux_x86_64/snowsql-1.3.0-linux_x86_64.bash
          SNOWSQL_DEST=~/bin SNOWSQL_LOGIN_SHELL=~/.profile bash snowsql-1.3.0-linux_x86_64.bash

    - task: Bash@3
      displayName: List and Run SQL Scripts
      inputs:
        targetType: inline
        script: |
          #!/bin/bash

          # Add snowsql path
          source ~/.profile

          # Create Config Contents
          configContent=$(cat <<EOF
          [connections.my_snowflake_connection]
          accountname = "$(snowflakeAccount)"
          username = "$(snowflakeUser)"
          password = "$(snowflakePassword)"
          rolename = "$(snowflakeRole)"
          warehousename = "$(snowflakeWarehouse)"
          EOF
          )

          # Create SnowSQL Config File
          configPath="$HOME/.snowsql"
          mkdir -p "$configPath"

          # Write config content to file
          echo "$configContent" > "$configPath/config"

          # Execute SQL
          sqlScripts=$(find "$(deployPath)" -type f -name "*.sql" | sort)
          echo "Found $(echo "$sqlScripts" | wc -l) SQL scripts to execute"
          echo "SQL Scripts found:"
          for sqlScript in $sqlScripts; do
            echo "Executing SQL script: $sqlScript"
            snowsql -c my_snowflake_connection -f "$sqlScript"
          done

サイドバーが出てくるのでSaveを押下。

手順6 作成したデプロイ用パイプラインに接続情報の使用権限を与える

作成したパイプラインで先ほど作成した接続情報を使用できるよう、権限を与える必要があります。

手順6-1:許可設定画面を開く

Libraryに戻り、先ほど作成した接続情報を選択し、右上のPipeline permissionsを押下します。

手順6-2:作成したパイプラインに権限を与える

+を押下し、先ほど作成したパイプラインを選択します。

作成したパイプラインが追加されていることを確認します。

手順7 デプロイ用パイプラインを実行するエージェントVMを作成する。

今回は、今までの作業で作成したパイプラインをAzureのLinuxVM上で実行します。
本手順ではそのための設定を行います。

手順7-1:エージェントプール作成画面を開く

まずは左下のProject SettingsからAgent Poolsを選択し、Add Poolを押下します。

手順7-2:エージェントプールを作成する

画像のように設定し(Nameは任意)、Createを押下します。
名前をMySelfHostedPool以外にする場合は、手順5-5のスクリプト内のPoolのNameを変更し、一致させてください。

手順7-3:エージェント作成画面を開く

作成したエージェントプールに遷移するので、New Agentを押下します。

手順7-4:エージェントを使用するVMに設定する

WindowsmacOSLinuxの三種類が表示されるので、今回はLinuxを選択します。
その後、LinuxVMにエージェントを作成・設定する手順が表示されるので、前提(1)にて用意したLinuxVMに作成・設定します。

手順8 作成したパイプラインをエージェント上で実行する。

いよいよパイプラインを実行します。
以下の手順は、手順7-4の3つ目のコマンドでエージェントがアクティブになっている状態であることが前提となります。

手順8-1:パイプライン実行画面を開く

Pipelinesから手順5で作成したパイプラインを選択し、Run pipelineを押下します。

手順8-2:パイプラインを実行する

実行画面が表示されるので、Deploy Target Folderに手順3で作成したフォルダ名を入力し、Runを押下します。

手順8-3:パイプライン実行画面を開く

実行が開始されるので、Excute all .sql scriptsを押下します。

手順8-4:パイプラインの実行結果を確認する(Azure DevOps)

実行が正常に完了したことを確認します。

手順8-5:パイプラインの実行結果を確認する(Snowflake)

Snowflakeにサインインし、SQLファイルが実行されていることを確認します。

クエリ履歴からも確認できます。

以上で終了です!
長い道のりでしたが無事デプロイ出来ました!

まとめ

初めてのブログということもあり、非常に読みづらい部分が多かったと思います。
最後まで読んでくださり、ありがとうございました。
本記事を通して、少しでもAzure DevOpsやSnowflakeに興味を持ってくれた方がいれば幸いです。
今回紹介したのは、ほんの一部の機能であり、Azure DevOpsやSnowflakeにはまだまだ多くの便利な機能が存在するので、是非皆さんの手で発掘してみてください。
最後になりますが、私自身、入社当時はほぼIT未経験であり、研修はもちろんのこと、配属されてからも悪戦苦闘しながら色々と実装してきました。
今回もブログを書くために、改めて1からこの自動デプロイの仕組みを作り直してみたのですが、かなりの時間を要しました...。特に、手順5-5のサンプルスクリプトを作成する際に、SnowSQL(SnowflakeCLI)に触るのが久しぶりだったため、記述すべき情報と記述の形式をかなり忘れており、作成→エラー→公式ドキュメント等で調査のループをかなり繰り返しました。
しかし、実際に手を動かしてものを作ってみると意外と何とかなることがあるので、私のようにIT経験が浅く、設計やアーキに自信がない方でも、とりあえずチャレンジしてみると面白いかもしれません。

私たちは一緒に働いてくれる仲間を募集しています!

電通総研 キャリア採用サイト 電通総研 新卒採用サイト

執筆:@matsuda.tomohiro
レビュー:Ishizawa Kento (@kent)
Shodoで執筆されました