Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Atlas をプロジェクト導入してみた話

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Sugar Sato Sugar Sato
August 08, 2024
2.6k

Atlas をプロジェクト導入してみた話

Avatar for Sugar Sato

Sugar Sato

August 08, 2024
Tweet

Transcript

  1. 自己紹介 Sugar Sato (@satoIsSugar) • 2023年 BuySell Technologies入社 • 基盤チーム所属(Portal/Account/Approval)

    PjM ◦ アソシエイトマネージャー • Go / Angular / Serverless ◦ Go歴: 4年くらい • 熱帯植物 ◦ ビカクシダ • 猫 ◦ Lambda (♀ 2才)
  2. プロダクト群「バイセルリユースプラットフォーム Cosmos」の開発が進行中 リユースに必要なすべての機能を提供する 「リユースプラットフォーム Cosmos」の開発が進行中です。 Cosmosを活用して、バイセルグループ全体での業務効率改善やデータドリブン経営の深化を目指しています。 リユースプラットフォーム Cosmos 自社開発のリユース特化業務基幹システムでありサービス群の集合体 買取申込

    買取・査定 在庫管理 販売 多様なチャネルで収益最大化 CRM -顧客対応- 買取種別に応じた最適なシステム構築 Visit -訪問買取 - Store -店舗買取 - Promas -商材マスタ - Appraisal -専門査定 - Stock -在庫管理 - EXS -販売管理 - Core -会員管理- Portal -データ利用- Pocket -データ基盤- 買取 専門チームによる真贋・査定と連携 査定 申込 効率的な顧客対応 在庫 在庫管理の最適・効率化 販売 データ 各事業プロセスにある データを一元管理 :基幹システム
  3. • BST FY24 1day サマーインターンシップ ◦ 学生がコードを書くことに集中させるために特定の技術に依存し た課題をさけたかった ▪ そのため

    golang-migrate * (sqlboiler | ent) みたいな選 択肢はなかった • ORM は実装がシンプルな GORM を選定した ◦ Model をスキーマとして扱い開発を容易にしたかっ たから 導入背景
  4. • 不採用 ◦ Prisma エコシステムの一部 ◦ そもそもインターン課題では ORM として Prisma

    をつかってない ◦ Prisma 自体が CHECK 制約がスキーマ操作から自動生成をサ ポートしていない等 ▪ 反対に制約を外す際に SQL を実行しなければならずマイグ レーションで完結できない 技術選定 (Go Prisma)
  5. 技術選定 (goose / golang-migrate) • 不採用 ◦ 一般的な up /

    down の概念があって使いやすい ◦ ただスキーマの変更と model の変更を両方行わなきゃならな い ▪ もっと楽したいなぁ...
  6. • > manage your database schema as code ◦ hcl

    でスキーマや設定ファイルが記述ができる ▪ Terraform で使い慣れているので記述が楽 • ファイル ◦ 設定: atlas.hcl ◦ スキーマ定義: schema.hcl Atlas
  7. • 使い方 ◦ コマンド実行 ▪ $ atlas schema apply ▪

    $ atlas migrate (apply | down | new | hash | diff) • down の考え方が違い down ファイルは存在しない ◦ ❌ “pre-planned” ◦ ⭕ “computes a migration plan based on the current state of the database” Atlas
  8. • https://atlasgo.io/blog/2023/10/12/atlas-actions-v1 • “一部制約” があるものの公式アクションで CI/CD 可能 GitHub Actions Action

    Use Case ariga/setup-atlas Install Atlas from a GitHub Actions workflow ariga/atlas-action/migrate/lint CI for schema changes ariga/atlas-action/migrate/push Push your migration directory to Atlas Cloud (atlasgo.cloud) ariga/atlas-action/migrate/apply Deploy versioned migrations from GitHub Actions
  9. • ORM との親和性が高い ◦ 公式ドキュメント豊富 ▪ Go 意外にも広く対応している ▪ Atlas

    内にリンクはないが ent も公 式ドキュメントがある ◦ struct tags を使った開発が便利だった ▪ e.g. GORM よかったこと
  10. • Model の差分から自動生 成される ◦ 好きな ORM でこれがし たかった!! ◦

    SQL 編集後は下記実行 ▪ atlas migrate hash ▪ atlas migrate apply よかったこと
  11. • 共通化した struct に gorm の primaryKey が含まれている • 回避策

    ◦ スクリプトを作成すること ◦ 共通化せず愚直に記述すること ▪ ただ記述ミスなど発生する懸念があるが lint を使うことで回 避できる 不要なテーブルが生成される
  12. --dev-url の記述 • uuid-ossp などの module を使う場合には --dev-url は公式ドキュメ ント通りにいかない

    ◦ --dev-url "docker://postgres/15/dev?search_path=public" ▪ 当たり前だけど temporary database に module が含まれ ない ▪ 向き先を実際に使用する DB に向ける必要がある
  13. • Atlas Cloud の契約が必要 • 回避策 ◦ cli で回避すること ▪

    > If for any reason you cannot use the free Atlas Cloud tier, you can always simply call `atlas migrate lint` from any normal GitHub Actions Workflow and get a similar result. ariga/atlas-action/migrate/lint の制約
  14. • 前提: GORM • tag (primaryKey) 付きの struct を書く ◦

    tag は敢えて細かく書かない ◦ 生成されたマイグレーションファイルで整地していく ▪ 理由 • 他の ORM に変える可能性もあるので tag の習熟を極めても仕 方ないため ◦ tag の学習コストを下げて他のことに時間を使う • SQL(DDL) をレビューしたほうがレビュアーの負担が少なくなるた め 個人的に、しっくりきた運用方法
  15. まとめ • Atlas を使ってみて ◦ 公式のドキュメントが豊富でわかりやすい ◦ さまざまな ORM に対応していて開発者体験がよかった

    ◦ 一部課題はあったものの回避策を講じて、PoC からプロジェクト 導入まで漕ぎつけられた ▪ e.g. サマーインターン課題 → 基盤プロダクトのリプレイス
  16. • https://goprisma.org/ • https://pkg.go.dev/github.com/golang-migrate/migrate/v4 • https://pkg.go.dev/github.com/pressly/goose/v3 • https://atlasgo.io/ • https://atlasgo.io/blog/2023/10/12/atlas-actions-v1

    • https://github.com/prisma/prisma/issues/3388 • https://atlasgo.io/getting-started/#inspecting-our-database • https://entgo.io/ja/docs/versioned-migrations • https://atlasgo.io/versioned/down • https://github.com/ariga/atlas-action/issues/112#issuecomment-2040953705 引用