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
Open Feature 面白いぞ
Search
SatohJohn
February 19, 2025
Programming
0
110
Open Feature 面白いぞ
Jagu'e'r Cloud Native ハイブリッド Meetup# 17 の 5分LT の発表の内容です
SatohJohn
February 19, 2025
Tweet
Share
More Decks by SatohJohn
See All by SatohJohn
お前も Gemini CLI extensions を作らないか?
satohjohn
0
110
検索システムにおけるセキュリティ
satohjohn
0
76
Feature Flag 開発を標準化し、加速させる OpenFeature を導入する
satohjohn
4
2.4k
ADK Java が出たので AI Agent を作ろう
satohjohn
0
160
NotebookLM + Agentspace を使った(開発)体験
satohjohn
1
840
Workforce Identity を使った 権限管理で Cloud Run を動かしてみた
satohjohn
0
760
Gemini + Vertex AI を使って作業を自動化「していく」
satohjohn
0
100
Cloud_Run_GPU___Gemma_2_を使った_LLM_アプリケーション開発のススメ.pdf
satohjohn
0
41
Firebase Authenticationのセッション管理術
satohjohn
2
2.5k
Other Decks in Programming
See All in Programming
Nitro v3
kazupon
2
320
flutter_kaigi_2025.pdf
kyoheig3
1
360
しっかり学ぶ java.lang.*
nagise
1
440
『実践MLOps』から学ぶ DevOps for ML
nsakki55
2
470
Phronetic Team with AI - Agile Japan 2025 closing
hiranabe
2
670
開発生産性が組織文化になるまでの軌跡
tonegawa07
0
190
CloudNative Days Winter 2025: 一週間で作る低レイヤコンテナランタイム
ternbusty
7
1.7k
分散DBって何者なんだ... Spannerから学ぶRDBとの違い
iwashi623
0
110
Microservices Platforms: When Team Topologies Meets Microservices Patterns
cer
PRO
0
520
モデル駆動設計をやってみよう Modeling Forum2025ワークショップ/Let’s Try Model-Driven Design
haru860
0
180
なあ兄弟、 余白の意味を考えてから UI実装してくれ!
ktcryomm
1
310
AI 時代だからこそ抑えたい「価値のある」PHP ユニットテストを書く技術 #phpconfuk / phpcon-fukuoka-2025
shogogg
1
590
Featured
See All Featured
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
36
6.1k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.4k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
980
We Have a Design System, Now What?
morganepeng
54
7.9k
Visualization
eitanlees
150
16k
Facilitating Awesome Meetings
lara
57
6.6k
Side Projects
sachag
455
43k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.5k
Making Projects Easy
brettharned
120
6.5k
Transcript
Open Feature面白いぞ Jagu'e'r Cloud Native ハイブリッド Meetup# 17 株式会社スリーシェイク 佐藤慧太
Copyright © 3-shake, Inc. All Rights Reserved.
自己紹介 佐藤 慧太@SatohJohn • 2012/4 フリュー株式会社 入社 ToC 向けのアプリケーション開発を 10年ほど経験
リードエンジニアとして 0からサービスを 設計開発運用を経験 • 2023/1 株式会社スリーシェイク 入社 SRE として労苦 <Toil>を減らす仕事に従事 Google Cloud Partner Top Engineer ’24、’25 生成 AI とかやってます
What’s Open Feature 01 Copyright © 3-shake, Inc. All Rights
Reserved.
そもそも Feature Flag について 1. Trunk ベース開発など高速なリリースにおける痛みを和らげる a. AB テスト、カナリアテストのように切り替える
b. kill スイッチのように特定の機能を無効化する c. チェックができておらずマージできない など 2. Permission のようなパラメータ管理 https://speakerdeck.com/biwashi/cloudnative-days-summer-2024-declarative-aggregated-management-of -feature-flags-using-openfeature-and-auto-generation OpenFeatureと自動生成を活用したフィーチャーフラグの宣言的集約管理
Open Feature について 1. ベンダー中立性 a. Provider で抽象化(ConfigCat、など) 2. Feature
Flag について標準化 a. Spec をまとめて新しい Provider の作成に役立てる 3. 様々な言語での実装 https://openfeature.dev/
HotoUse(Flag Evaluation) 1. Flagd Provider 2. Node.js services: server: build:
./app environment: NODE_ENV: production FLAGD_HOST: flagd PORT: 3333 ports: - 3333:3333 flagd: image: ghcr.io/open-feature/flagd:latest volumes: - type: bind source: ./flagd/flags.flagd.json target: /etc/flagd/flags.flagd.json ports: - 8013:8013 command: ["start", "--uri", "file:/etc/flagd/flags.flagd.json"]
HotoUse(Flag Evaluation) 1. Flagd Provider 2. Node.js { "flags": {
"welcome-message": { "variants": { "on": true, "off": false }, "state": "ENABLED", "defaultVariant": "on" } } } • Flagd がファイルを watch し続けているのでdefault value を変更すると アプリケーションでも変更が伝わる • Variants に無いものを設定するとエラーになるがアプリケーション側では 前回の値になっている • このあたりのエラー状態については、 https://openfeature.dev/specification/sections/events#requirement-535 https://flagd.dev/reference/monitoring/
HotoUse(Flag Evaluation) 1. Flagd Provider 2. Node.js import express from
"express"; import Router from "express-promise-router"; import { OpenFeature } from "@openfeature/server-sdk"; import { FlagdProvider } from "@openfeature/flagd-provider"; OpenFeature.setProvider(new FlagdProvider({ host: process.env.FLAGD_HOST || "localhost" })); const client = OpenFeature.getClient(); const app = express(); const routes = Router(); app.use((_, res, next) => { res.setHeader("content-type", "text/plain"); next(); }, routes); routes.get("/", async (_, res) => { const showWelcomeMessage = await client.getBooleanValue( "welcome-message", false ); if (showWelcomeMessage) { res.send("Express + TypeScript + OpenFeature Server"); } else { res.send("Express + TypeScript Server"); } }); const port = process.env.PORT || 3333; app.listen(port, () => { console.log(`Server running at http://localhost:${port}`); }); https://openfeature.dev/specification/sections/flag-eval uation/
HotoUse(GKE) apiVersion: core.openfeature.dev/v1beta1 kind: FeatureFlag metadata: name: flags labels: app:
open-feature spec: flagSpec: flags: welcome-message: state: ENABLED variants: 'on': true 'off': false defaultVariant: 'off' --- # Feature flag source custom resource, configuring flagd to source flags from FeatureFlag CRDs apiVersion: core.openfeature.dev/v1beta1 kind: FeatureFlagSource metadata: name: flag-sources labels: app: open-feature spec: sources: - source: flags provider: kubernetes 1. GKE 2. K8s operator
HotoUse(GKE) # Deployment of a app using our custom resources
apiVersion: apps/v1 kind: Deployment metadata: name: open-feature-deployment labels: app: open-feature spec: replicas: 1 selector: matchLabels: app: open-feature template: metadata: labels: app: open-feature annotations: openfeature.dev/enabled: 'true' openfeature.dev/featureflagsource: 'flag-sources' spec: containers: 1. GKE 2. K8s operator
HotoUse(Tracking) 1. Devcycle (Flagd では未実装っぽい) 2. Node.js const devcycleClient =
initializeDevCycle("id") OpenFeature.setProviderAndWait(await devcycleClient.getOpenFeatureProvider()); client.track("welcomemessage_trackingid", context); https://openfeature.dev/specification/sections/flag-eval uation/
Provider の自作 • Providerの 仕様 にしたがって メソッドを記載していくと 作れる • Firebase
Remote Config 周りで挑戦してみても 良いかもしれない https://openfeature.dev/specification/ class MyProvider implements Provider { readonly hooks: Hook[] = [new MyProviderHook()]; void initialize(EvaluationContext initialContext) { /* A hypothetical initialization function: make an initial call doing some bulk initial evaluation, start a worker to do periodic updates */ this.flagCache = this.restClient.bulkEvaluate(initialContext); this.startPolling(); } getProviderHooks(): Hook[] { return [new MyProviderHook()]; } void dispose() { // close connections, terminate threads or timers, etc... } /** * Record a tracking event. */ void track(String trackingEventName, EvaluationContext context, TrackingEventDetails details): void; }
まとめ 1. Feature Flag を使っているプロジェクトであれば使っていくのは良さそう a. いろんなプロジェクトがあって困るみたいなときに良さそう b. ちょっと Provider
作れないかなーという感じ 2. Tracking がサポートされている Provider が少ないので作って! 作るかー!
Thank you Copyright © 3-shake, Inc. All Rights Reserved.