3.9K Views
October 20, 23
スライド概要
エンジニア
ゆるSRE勉強会 #2 TerraformでもSQLスキーマの管 理がしたい! 2023/10/20 小澤友彦 証券コード:2980 ©︎ 2023 SRE Holdings Corporation ©︎ 2023 SRE Holdings Corporation
SRE Holdings について ソニー新事業創出 プログラム第一号案件 2014年 ソニー子会社 として会社設立 2019年 社名を SREホールディングスに変 更 不動産 仲介/管理 不動産会社向け DX・ITツール アセット 開発 AIコンサル DX戦略コンサル ©︎ 2023 SRE Holdings Corporation 2
発表者紹介 • 小澤 友彦 ( • ソフトウェアエンジニア • 主な業務 @kota65535) ⁃ フロント・バックエンド設計・開発 ⁃ インフラ構築・管理 ⁃ アーキテクチャ設計 ⁃ CI/CD設計・実装 ⁃ 運用監視自動化 ©︎ 2023 SRE Holdings Corporation 3
SQLのスキーマ、どうやって管理していますか? ©︎ 2023 SRE Holdings Corporation
伝統的な手法 • フレームワークの機能 ⁃ Ruby on Rails • ⁃ Laravel • • rake db:migrate php artisan make:migration スタンドアローンツール • flyway/flyway • golang-migrate/migrate ©︎ 2023 SRE Holdings Corporation 5
伝統的な手法 • マイグレーションファイルと呼ばれるファイルを追加していく • ${version}_${description}.sql みたいなフォーマット ⁃ version • ⁃ description • • インクリメントする一意の数字(ツールによっては timestamp だったり) 単なる自由文字列 若いバージョンから順に実行 20221020_create_table.sql CREATE TABLE greeting ( `id` int AUTO_INCREMENT, `text` varchar(255), PRIMARY KEY (`id`) ); ©︎ 2023 SRE Holdings Corporation 20221021_create_table.sql ALTER TABLE greeting ADD COLUMN `language` varchar(255); 6
宣言的な手法 • k0kubun/sqldef ⁃ スキーマを修正 CREATE TABLE greeting ( `id` int AUTO_INCREMENT, `text` varchar(255), + `language` varchar(255), PRIMARY KEY (`id`) ); ⁃ コマンドを実行( --dry-run でドライラン) $ mysqldef -uroot test < schema.sql Run: ALTER TABLE greeting ADD COLUMN `language` varchar(255); ©︎ 2023 SRE Holdings Corporation 7
宣言的な手法 • ariga/atlas ⁃ HCL形式でスキーマを記述 ⁃ inspect コマンド • ⁃ diff コマンド • ⁃ 既存のDBからHCLに変換 差分とALTER文表示 apply コマンド • 適用 ©︎ 2023 SRE Holdings Corporation table "greeting" { schema = schema.example column "id" { null = false type = int auto_increment = true } column "text" { null = true type = varchar(255) } column "language" { null = true type = varchar(255) } primary_key { columns = [column.id] } } 8
自分も作ってみた ©︎ 2023 SRE Holdings Corporation
宣言的SQLスキーマ管理ツール(N番煎じ) • • • kota65535/alternator ⁃ ほぼ k0kubun/sqldef の下位互換 ⁃ MySQLのみ対応 モチベーション ⁃ Go勉強したい ⁃ SQLのパーサー作ってみたい ⁃ ツール作って公開したい いいところ ⁃ Diffの出力がイケてる(当社比) ⁃ Terraform Provider がある ©︎ 2023 SRE Holdings Corporation 10
デモ ©︎ 2023 SRE Holdings Corporation
Terraform Module
•
kota65535/alternator
provider "alternator" {
dialect = "mysql"
host
= "mydb.dev.example.com"
user
= "root"
}
©︎ 2023 SRE Holdings Corporation
resource "alternator_database_schema" "example" {
database = "example"
schema
= <<EOF
CREATE DATABASE example;
USE example;
CREATE TABLE users
(
id
int PRIMARY KEY,
name varchar(100)
);
CREATE TABLE blog_posts
(
id
int PRIMARY KEY,
title
varchar(100),
body
text,
author_id int,
FOREIGN KEY (author_id) REFERENCES users (id)
);
EOF
}
12
Mavenにリリース → スキーマ適用 ©︎ 2023 SRE Holdings Corporation 13
©︎ 2023 SRE Holdings Corporation