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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
AIエージェントの隔離技術の徹底比較
kawayu
0
460
tsserverとは何だったのか、これからどうなるのか
nowaki28
1
440
TSKaigi 2026 TypeScriptバックエンドのオブザーバビリティ戦略 — Datadog × NestJSの実践
taiseiyamamotoan
2
270
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
160
次世代リンターで探る、tsgo 時代における型認識カスタムルールの現実解
ytakahashii
3
1.4k
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
430
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
150
SPMマルチモジュールで テストカバレッジを取得する技法
yosshi4486
0
140
Swiftのレキシカルスコープ管理
kntkymt
0
210
Technical Debt: Understanding it Rightly, Engaging it Rightly #LaravelLiveJP
shogogg
0
190
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
570
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.1k
Featured
See All Featured
We Are The Robots
honzajavorek
0
240
GraphQLとの向き合い方2022年版
quramy
50
15k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
600
Heart Work Chapter 1 - Part 1
lfama
PRO
7
36k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
530
Navigating Weather and Climate Data
rabernat
0
210
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
340
Are puppies a ranking factor?
jonoalderson
1
3.5k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
220
Game over? The fight for quality and originality in the time of robots
wayneb77
1
190
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!