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

# 前置き
こんにちは。データエンジニアの山口歩夢です！

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

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

https://qiita.com/Ayumu-y/items/315b61c492bcc167d760

# 早速実装

## ディレクトリの用意
まずは以下のディレクトリ構成にします。
前回に続き、今回追加するのは以下です！
* `.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ファイルを編集する形になります。
```tf
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に渡す変数を用意します。
```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が走ようにしてあります！
```yaml
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データチームではプロダクトのデータ解析や機械学習プロジェクトを推進できるデータサイエンティストを募集しています。
興味を持っていただけましたら、是非ご連絡いただけると幸いです！

https://hrmos.co/pages/genda/jobs/1700006587045969926