Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Go×RLSで複数テナントのデータを安全に扱う/secure-data-access-with...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Sh0He1666
October 02, 2023
Programming
1k
0
Share
Go×RLSで複数テナントのデータを安全に扱う/secure-data-access-with-go-rls-in-multi-tenant-environment
Sh0He1666
October 02, 2023
More Decks by Sh0He1666
See All by Sh0He1666
ログ調査で分からなかった原因が、New Relicのトランザクションで一瞬で解決した話
sh0he1666
0
25
Other Decks in Programming
See All in Programming
ローカルLLMでどこまでコードが書けるか / How much code can be written on a local LLM
kishida
2
410
Cloudflare で始める Data Platform
ta93abe
0
300
開発体験を左右するライブラリの API 設計 - GraphQL スキーマ構築ライブラリから考える #tskaigi
izumin5210
2
520
Hive Metastoreを通して学ぶIceberg REST Catalog ― 仕様から実装まで
okumin
0
280
AIエージェントの隔離技術の徹底比較
kawayu
0
430
TSKaigi 2026 TypeScriptバックエンドのオブザーバビリティ戦略 — Datadog × NestJSの実践
taiseiyamamotoan
1
190
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
6
1.7k
AI駆動開発で崩れていくコードベースを立て直す
kyoko_nr_nr
1
360
技術記事、AIに書かせるか、自分で書くか? 〜それでも私が自分の手で書く理由〜 / #QiitaConference
jnchito
2
470
過去のレビュー知見をSkillsで資産化した話
pkshadeck
PRO
1
2.3k
Stage 3 Decorators でできること / できないこと / TSKaigi 2026
susisu
1
1k
TSKaigi2026-静的解析への投資がAI時代のコード品質を支える ── カスタムESLintルールの設計と運用
hayatokudou
6
1.1k
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.7k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
350
Java REST API Framework Comparison - PWX 2021
mraible
34
9.3k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
340
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
A designer walks into a library…
pauljervisheath
211
24k
Building an army of robots
kneath
306
46k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Raft: Consensus for Rubyists
vanstee
141
7.4k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
360
Transcript
Go×RLSで複数テナントのデータを安全に扱う 2023/09/28 golang.Tokyo#33 スプリームシステム株式会社 プロダクトディベロップメント部 徳丸 翔平
自己紹介 • 徳丸 翔平(@shohei36) • 普段の業務では主にJavaやGoを使ってバックエンド開発をやってます • Go歴はもう少しで1年といったところ • 低レイヤーに興味あり
モノリスからマイクロサービスへ https://acropolium.com/blog/migrating-monolith-to-microservices/
マルチテナントのデータベース戦略 https://medium.com/one9-tech/which-database-structure-to- use-in-multi-tenant-application-6f1b9af09634
マルチテナントのデータベース戦略 https://medium.com/one9-tech/which-database-structure-to- use-in-multi-tenant-application-6f1b9af09634
データベース の Row-Level Security(RLS)機能 データの読み込み時にテーブルの行レベルでアクセスを制御するデータベースの機能 テナントID ID NAME tenant01 1000
Bob tenant02 1000 Alice tenant03 1000 Taro tenant03 1000 Hanako SELECT ID, NAME FROM SOME_TABLE WHERE ID = ‘1000’ 「tenant02」が接続
プログラム側も工夫が必要… 🤔 RLSが効いたコネクションを正しく制御するには? 🤔 DBに依存せずにトランザクションをどのように表現するか? 🤔 テナント追加時の作業をゼロにしたい、、
プログラム設計方針 以下のアプローチによって実現 • データベースセッションの環境変数にセットしたテナントIDでアク セス権を制御 • Context 経由で sql.Tx を
リポジトリ にパスする
プログラム設計方針 以下のアプローチによって実現 • データベースセッションの環境変数にセットしたテナントIDでアク セス権を制御 • Context 経由で sql.Tx を
リポジトリ にパスする こちらのサンプルコードを使用して説明します https://github.com/shohei36/go-rls
環境 • WSL2 Ubuntu 20.04 on Windows • PostgreSQL 13.2
• Go 1.20
サンプルコードの構成 // アプリケーション固有のビジネスルール // トランザクション // DBなど外部システムとのアダプター // ドメインモデル //
Main関数(controllerも兼ねる) ※サンプルコードの構成 Clean Architecture
例)会員情報を更新するユースケース
登場人物
DoInTxを実行 usecase.go
sql.DB からコネクション(sql.Conn)を取得 transaction.go db.go
DBセッションの環境変数にテナントIDをセット db.go
補足:テーブルにRLSを適用するDDL pgsql/init/001_ddl.sql
sql.DBのコネクションはスレッドセーフ sql.DB の仕組み https://please-sleep.cou929.nu/go-sql-db-connection-pool.html 公式ドキュメント https://pkg.go.dev/database/sql#DB
トランザクション(sql.Tx)開始 transaction.go DoInTx
Context に sql.Tx をセット transaction.go DoInTx Sql.Tx を取り出すときに使うKey
トランザクション内の処理を実行 transaction.go DoInTx usecase.go
リポジトリのUpdateメソッドをCall usecase.go
DoInTx内でContextにセットしたsql.Txを取得 transaction.go repository.go
Update文を発行 repository.go ※RLSが効いているので、SQLのWhereの条件にtenant_idは不要
トランザクションをコミット transaction.go DoInTx
コネクションをsql.DBに返却 transaction.go DoInTx https://pkg.go.dev/database/sql#Conn.Close
まとめ • Context経由でsql.Txを渡すことで、DBに依存しない形でユースケースで トランザクションの定義が可能に • 参考:https://qiita.com/arkuchy/items/659a11767912c2ec266d • データベースセッションの環境変数にセットしたテナントIDでアクセス権 を制御 •
テナントのロールを追加する必要がなく、基本的にはテナント追加時の作業が不要 • sql.DBで管理するコネクションがスレッドセーフ • (感想)Goはマイクロサービス向きの言語であることを実感
Thank you for listening!