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
0
1k
Go×RLSで複数テナントのデータを安全に扱う/secure-data-access-with-go-rls-in-multi-tenant-environment
Sh0He1666
October 02, 2023
Tweet
Share
More Decks by Sh0He1666
See All by Sh0He1666
ログ調査で分からなかった原因が、New Relicのトランザクションで一瞬で解決した話
sh0he1666
0
16
Other Decks in Programming
See All in Programming
Nostalgia Meets Technology: Super Mario with TypeScript
manfredsteyer
PRO
0
110
ファインチューニングせずメインコンペを解く方法
pokutuna
0
210
「接続」—パフォーマンスチューニングの最後の一手 〜点と点を結ぶ、その一瞬のために〜
kentaroutakeda
4
2.1k
仕様漏れ実装漏れをなくすトレーサビリティAI基盤のご紹介
orgachem
PRO
7
3.2k
飯MCP
yusukebe
0
390
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
710
The free-lunch guide to idea circularity
hollycummins
0
380
存在論的プログラミング: 時間と存在を記述する
koriym
5
550
GoのDB アクセスにおける 「型安全」と「柔軟性」の両立 - Bob という選択肢
tak848
0
280
野球解説AI Agentを開発してみた - 2026/02/27 LayerX社内LT会資料
shinyorke
PRO
0
370
脱 雰囲気実装!AgentCoreを良い感じにWEBアプリケーションに組み込むために
takuyay0ne
3
410
我々はなぜ「層」を分けるのか〜「関心の分離」と「抽象化」で手に入れる変更に強いシンプルな設計〜 #phperkaigi / PHPerKaigi 2026
shogogg
2
650
Featured
See All Featured
sira's awesome portfolio website redesign presentation
elsirapls
0
200
The SEO Collaboration Effect
kristinabergwall1
0
410
Embracing the Ebb and Flow
colly
88
5k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
330
Documentation Writing (for coders)
carmenintech
77
5.3k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.2k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
320
How to train your dragon (web standard)
notwaldorf
97
6.6k
Everyday Curiosity
cassininazir
0
180
4 Signs Your Business is Dying
shpigford
187
22k
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!