LoginSignup
1
0

【メタデータ管理】Streamlitの自作データカタログのメタデータ更新を自動化してみた

Posted at

前置き

こんにちは。データエンジニアの山口歩夢です!

以前、以下の記事にて、
Terraformを使ってStreamlitで作ったデータカタログのメタデータ管理する方法
について投稿いたしました。

今回はそちらの機能に追加で、
メタデータの更新をGitHub Actionsを使って自動化した話をしようと思います!

早速実装

ディレクトリの用意

まずは以下のディレクトリ構成にします。
前回に続き、今回追加するのは以下です!

  • .githubディレクトリ以下
  • backend.tf
  • variables.tf

※他の部分の実装方法は前回の記事をご覧ください。

.github/
├─workflows
│  └─workflow_data_definition.yaml
terraform/
├─modules
│  └─schema/
│     ├─tables.tf        # yamlをループ処理で読み込む
│     └─tables/          # テーブル毎にyamlを作成
│         ├─[テーブル名1].yaml
│         ├─[テーブル名2].yaml
│         └─[テーブル名3].yaml
└─tfroot
   ├─main.tf
   ├─provider.tf
   ├─backend.tf
   └─variables.tf

S3バケットの用意

backend.tfが参照するS3バケットを作成しておきます。
tfstateファイルを配置するためのものになります。

Terraformの作成

backend.tf

上記で作成したS3バケット内のtfstateファイルをGitHub Actionsが編集できるようにするためのものです。
これによって、GitHub Actionsから$ terraform initをした場合に、S3に配置されているtfstateファイルを編集する形になります。

terraform {
  required_version = "~> 1.5.0"
  backend "s3" {
    bucket = "${var.bucket}"
    region = "${var.region}"
    key    = "key/terraform.tfstate"
  }
}

resource "aws_s3_bucket" "dwh_terraform_state" {
  bucket = "${var.bucket}"
}

resource "aws_s3_bucket_versioning" "versioning" {
  bucket = aws_s3_bucket.dwh_terraform_state.id
  versioning_configuration {
    status = "Enabled"
  }
}

variables.tf

backend.tfに渡す変数を用意します。

variable "bucket" {
  type = string
}

variable "region" {
  type = string
}

GitHub Actionsの作成

Secretsの準備

以下の項目をGitHubのSecretsに設定しておきます。
GitHub Actionsが使用するAWSやSnowflakeの認証情報を設定です!

  • AWS_REGION
  • AWS_IAM_ROLE_ARN
  • SNOWFLAKE_ACCOUNT
  • SNOWFLAKE_REGION
  • SNOWFLAKE_USER
  • SNOWFLAKE_PASSWORD

コードの作成

workflow_data_definitioin.yamlにコードを書きます。

paths:で該当のyamlのメタデータが更新された場合のみ、merge時にterraform applyが走ようにしてあります!

name: workflow for Terraform Data Definition

# mainブランチにPRがマージされた時 or mainブランチに直接pushされた時に実行
# yamlファイルを変更したときに実行される。
on:
 push:
   branches:
     - main
   paths:
     - 'terraform/modules/schema/tables/*.yaml'

permissions:
 id-token: write
 contents: read

env:
 TF_VERSION: 1.5.6
 AWS_REGION: ${{ secrets.AWS_REGION }}
 AWS_IAM_ROLE_ARN: ${{ secrets.AWS_IAM_ROLE_ARN }}
 # Snowflakeの認証情報
 SNOWFLAKE_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }}
 SNOWFLAKE_REGION: ${{ secrets.SNOWFLAKE_REGION }}
 SNOWFLAKE_USER: ${{ secrets.SNOWFLAKE_USER }}
 SNOWFLAKE_PASSWORD: ${{ secrets.SNOWFLAKE_PASSWORD }}

jobs:
 main:
   name: main
   runs-on: ubuntu-latest
   strategy:
     matrix:
       workdir: [terraform/tfroot]
   # backendをS3に設定している場合は、AWSの認証情報が必要
   steps:
     - uses: actions/checkout@v3
     - name: Configure AWS Credentials
       uses: aws-actions/configure-aws-credentials@v1-node16
       with:
         role-to-assume: ${{ env.AWS_IAM_ROLE_ARN }}
         aws-region: ${{ env.AWS_REGION }}
     - name: terraform setup
       uses: hashicorp/setup-terraform@v2
       with:
         terraform_version: ${{ env.TF_VERSION }}
     - name: init
       working-directory: ${{ matrix.workdir }}
       run: terraform init
     - name: Terraform plan -target="module.meta_data_definition"
       working-directory: ${{ matrix.workdir }}
       run: terraform plan -no-color -target="module.meta_data_definition"
     - name: Terraform apply -target="module.meta_data_definition"
       working-directory: ${{ matrix.workdir }}
       run: terraform apply -auto-approve -no-color

以上で実装が完了になります!

これでyamlをmainにmergeすると、
GitHub Actionsによって$ terraform applyが実行され、
メタデータが一括で更新・追加されるようになります。

まとめ

以上でStreamlitで作成したデータカタログのメタデータを自動で更新できる機能の作成ができました。
メタデータの管理〜更新まで、かなり手間を減らすことができました!

yamlでメタデータの編集をすることができるので、
データエンジニア以外のデータカタログユーザーが、メタデータのアップデート依頼をかけやすくなったという点も良かったなと感じています!

採用

GENDAデータチームではプロダクトのデータ解析や機械学習プロジェクトを推進できるデータサイエンティストを募集しています。
興味を持っていただけましたら、是非ご連絡いただけると幸いです!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0