前置き
こんにちは。データエンジニアの山口歩夢です!
以前、以下の記事にて、
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データチームではプロダクトのデータ解析や機械学習プロジェクトを推進できるデータサイエンティストを募集しています。
興味を持っていただけましたら、是非ご連絡いただけると幸いです!