Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
Daichi Koike
2,950 views
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
kamakura.go #5 の発表資料です
Engineering
◦
Read more
0
Save
Share
Embed
Download
Download to read offline
1
/ 54
2
/ 54
Most read
3
/ 54
4
/ 54
Most read
5
/ 54
6
/ 54
7
/ 54
8
/ 54
9
/ 54
10
/ 54
11
/ 54
12
/ 54
Most read
13
/ 54
14
/ 54
15
/ 54
16
/ 54
17
/ 54
18
/ 54
19
/ 54
20
/ 54
21
/ 54
22
/ 54
23
/ 54
24
/ 54
25
/ 54
26
/ 54
27
/ 54
28
/ 54
29
/ 54
30
/ 54
31
/ 54
32
/ 54
33
/ 54
34
/ 54
35
/ 54
36
/ 54
37
/ 54
38
/ 54
39
/ 54
40
/ 54
41
/ 54
42
/ 54
43
/ 54
44
/ 54
45
/ 54
46
/ 54
47
/ 54
48
/ 54
49
/ 54
50
/ 54
51
/ 54
52
/ 54
53
/ 54
54
/ 54
More Related Content
PDF
Keycloak拡張入門
by
Hiroyuki Wada
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
by
Hiroshi Tokumaru
PDF
Docker Compose 徹底解説
by
Masahito Zembutsu
PPTX
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
by
NTT DATA Technology & Innovation
PDF
AWSのログ管理ベストプラクティス
by
Akihiro Kuwano
PDF
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
by
Amazon Web Services Japan
PDF
マイクロサービス 4つの分割アプローチ
by
増田 亨
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
by
Yahoo!デベロッパーネットワーク
Keycloak拡張入門
by
Hiroyuki Wada
SPAセキュリティ入門~PHP Conference Japan 2021
by
Hiroshi Tokumaru
Docker Compose 徹底解説
by
Masahito Zembutsu
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
by
NTT DATA Technology & Innovation
AWSのログ管理ベストプラクティス
by
Akihiro Kuwano
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
by
Amazon Web Services Japan
マイクロサービス 4つの分割アプローチ
by
増田 亨
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
by
Yahoo!デベロッパーネットワーク
What's hot
PPTX
KeycloakでAPI認可に入門する
by
Hitachi, Ltd. OSS Solution Center.
PDF
マイクロサービスバックエンドAPIのためのRESTとgRPC
by
disc99_
PDF
マルチテナント化で知っておきたいデータベースのこと
by
Amazon Web Services Japan
PPTX
NGINXをBFF (Backend for Frontend)として利用した話
by
Hitachi, Ltd. OSS Solution Center.
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
by
Takuto Wada
PPTX
Spring Boot ユーザの方のための Quarkus 入門
by
tsukasamannen
PDF
Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26
by
Yahoo!デベロッパーネットワーク
PDF
開発速度が速い #とは(LayerX社内資料)
by
mosa siru
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
by
Masahito Zembutsu
PDF
Javaのログ出力: 道具と考え方
by
Taku Miyakawa
PPTX
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
by
NTT DATA Technology & Innovation
PDF
The Twelve-Factor Appで考えるAWSのサービス開発
by
Amazon Web Services Japan
PDF
マイクロにしすぎた結果がこれだよ!
by
mosa siru
PDF
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
by
naoki koyama
PDF
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
by
Yahoo!デベロッパーネットワーク
PDF
Infrastructure as Code (IaC) 談義 2022
by
Amazon Web Services Japan
PDF
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
by
NTT DATA Technology & Innovation
PDF
TLS, HTTP/2演習
by
shigeki_ohtsu
PDF
インフラエンジニアの綺麗で優しい手順書の書き方
by
Shohei Koyama
ODP
Guide To AGPL
by
Mikiya Okuno
KeycloakでAPI認可に入門する
by
Hitachi, Ltd. OSS Solution Center.
マイクロサービスバックエンドAPIのためのRESTとgRPC
by
disc99_
マルチテナント化で知っておきたいデータベースのこと
by
Amazon Web Services Japan
NGINXをBFF (Backend for Frontend)として利用した話
by
Hitachi, Ltd. OSS Solution Center.
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
by
Takuto Wada
Spring Boot ユーザの方のための Quarkus 入門
by
tsukasamannen
Micrometer/Prometheusによる大規模システムモニタリング #jsug #sf_26
by
Yahoo!デベロッパーネットワーク
開発速度が速い #とは(LayerX社内資料)
by
mosa siru
コンテナの作り方「Dockerは裏方で何をしているのか?」
by
Masahito Zembutsu
Javaのログ出力: 道具と考え方
by
Taku Miyakawa
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
by
NTT DATA Technology & Innovation
The Twelve-Factor Appで考えるAWSのサービス開発
by
Amazon Web Services Japan
マイクロにしすぎた結果がこれだよ!
by
mosa siru
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
by
naoki koyama
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
by
Yahoo!デベロッパーネットワーク
Infrastructure as Code (IaC) 談義 2022
by
Amazon Web Services Japan
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
by
NTT DATA Technology & Innovation
TLS, HTTP/2演習
by
shigeki_ohtsu
インフラエンジニアの綺麗で優しい手順書の書き方
by
Shohei Koyama
Guide To AGPL
by
Mikiya Okuno
Similar to OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
PDF
こんなに使える!今どきのAPIドキュメンテーションツール
by
dcubeio
PDF
Swaggerでのapi開発よもやま話
by
KEISUKE KONISHI
PDF
Rest ful api設計入門
by
Monstar Lab Inc.
PDF
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
by
Akito Tsukahara
PPTX
10分でわかるOpenAPI V3
by
Kazuchika Sekiya
PDF
Swaggerで始めるモデルファーストなAPI開発
by
Takuro Sasaki
PDF
Apiドキュメンテーションツールを使いこなす【api blueprint編】
by
dcubeio
PPTX
RESTful API (JAX-RS) 書くだけで仕様書も自動で作られていく話 with MicroProfile Open API
by
Kohei Saito
PPTX
Open APIで定義しよう! 実践編
by
iPride Co., Ltd.
PDF
SwiftOpenAPIGenerator_YUMEMI_gow_LT_2025_07_27.pdf
by
koutaroda
PPTX
Swagger jjug ccc 2018 spring
by
kounan13
PDF
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
by
Tomoki Oyamatsu
PDF
【2018/09/11】PAYでのReact Nativeにおける APIクライアント実装 について
by
Natsuki Yamanaka
PDF
SwaggerとAPIのデザイン
by
Kazuhiro Hara
PDF
Api meetup LT
by
Daisuke Kasuya
PDF
カラーミーAPIドキュメントの今後
by
Joe_noh
PPTX
IOTS2021発表スライド:オントロジーを用いたOpenAPI Documentの制約推薦システム
by
Akira Shibata
PPTX
Create entity from swagger in drupal8
by
Kyotaro Kon
PPTX
APIドキュメントの話 #sphinxjp
by
Takeshi Komiya
PDF
Swaggerを利用した新規サービス開発
by
recotech
こんなに使える!今どきのAPIドキュメンテーションツール
by
dcubeio
Swaggerでのapi開発よもやま話
by
KEISUKE KONISHI
Rest ful api設計入門
by
Monstar Lab Inc.
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
by
Akito Tsukahara
10分でわかるOpenAPI V3
by
Kazuchika Sekiya
Swaggerで始めるモデルファーストなAPI開発
by
Takuro Sasaki
Apiドキュメンテーションツールを使いこなす【api blueprint編】
by
dcubeio
RESTful API (JAX-RS) 書くだけで仕様書も自動で作られていく話 with MicroProfile Open API
by
Kohei Saito
Open APIで定義しよう! 実践編
by
iPride Co., Ltd.
SwiftOpenAPIGenerator_YUMEMI_gow_LT_2025_07_27.pdf
by
koutaroda
Swagger jjug ccc 2018 spring
by
kounan13
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
by
Tomoki Oyamatsu
【2018/09/11】PAYでのReact Nativeにおける APIクライアント実装 について
by
Natsuki Yamanaka
SwaggerとAPIのデザイン
by
Kazuhiro Hara
Api meetup LT
by
Daisuke Kasuya
カラーミーAPIドキュメントの今後
by
Joe_noh
IOTS2021発表スライド:オントロジーを用いたOpenAPI Documentの制約推薦システム
by
Akira Shibata
Create entity from swagger in drupal8
by
Kyotaro Kon
APIドキュメントの話 #sphinxjp
by
Takeshi Komiya
Swaggerを利用した新規サービス開発
by
recotech
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
1.
OpenAPI 3.0 で microservice
の API 定義を試みてハマった話 小池 大地 kamakura.go #5 2019/06/22
2.
本日のおはなし • OpenAPI 3.0
の yaml ファイルを分割管理しようとし た • $ref で死にまくったので $ref を解決するツールをプロ ジェクトで自作した • 人間と機械でそれぞれ触る yaml を分けるという方法 をとった • OpenAPI のツールチェインはよく調べたほうがいい �2
3.
OpenAPI • Google、マイクロソフト、IBM などが立ち上げた
Open API Initiative が提唱する REST API の I/F 記述フォー マット(OpenAPI Specification) • Swagger がベース • 3.0 と 2.0 で大分仕様が違っており、今回は 3.0 の話 • https://github.com/OAI/OpenAPI-Specification �3
4.
OpenAPI https://github.com/OAI/OpenAPI-Specification/blob/master/examples/v3.0/petstore.yaml �4 paths: /pets: get: summary: List all
pets operationId: listPets tags: - pets parameters: - name: limit in: query description: How many items to return at one time (max 100) required: false schema: type: integer format: int32 responses: '200': description: A paged array of pets headers: x-next: description: A link to the next page of responses schema: type: string content: application/json: schema: $ref: "#/components/schemas/Pets"
5.
導入プロジェクト • 社内コーポレートエンジンの開発プロジェクト • 名簿、評価、サイコロ給、スマイルなど複数のサービス が連携して一つのプロダクトとして稼働する •
各サービス、フロントエンドは別々の開発者が開発する �5
6.
構成 �6
7.
導入経緯 • BFF、バックエンドサービス、フロントエンドが同時に開 発が進む • 先に各サービス間の
I/F を決め、レビューしてOKだった ら実装に着手するというワークフロー • よし API I/F を OpenAPI Spec で書こう • code generate や request/response の validate もできる • 世は大 OpenAPI 時代!! �7
8.
各 I/F を
OpenAPI で定義 �8
9.
�9 yaml 管理問題
10.
API は 2倍 •
認証は BFF が行うため全リクエストは BFF 経由する • つまり API は 2倍 必要 �10 /users/1
11.
yaml で病むる • 膨大な数の
API になるため yaml は分割して管理した い • 評価のシステムの管理画面だけで 40 API ある(BFF 含めると 80 API)。管理系だけで1万行になった • yaml 分けたいけど entity とか再定義するのはミスも 多発するだろうしいい感じに使いまわしたい • 2.0 は yaml マージツールがある https:// www.npmjs.com/package/multi-file-swagger �11
12.
components 3.0 では再利用する定義を components
に集約できる �12 https://www.openapis.org/news/blogs/2016/10/tdc-structural-improvements-explaining-30-spec-part-2
13.
�13 3.0 にしました
14.
プロジェクト自作 yaml merger •
node.js 製 • https://github.com/whitlockjc/json-refs を使い 別ファイルの $ref を解決してマージした yaml を生成 する • @dameleon++ �14
15.
もともとはこう �15 paths: /users/{id}: get: - - responses: "200": content: application/json: schema: $ref: "#/components/schemas/User" components: schemas: User: title:
MyUser type: object properties: id: type: integer name: type: string
16.
components 以下を切り出している �16 paths: /users/{id}: get: - - responses: "200": content: application/json: schema: $ref:
"./entities.yaml#/User"
17.
entities.yaml �17 User: title: MyUser type: object properties: id: type:
integer name: type: string
18.
merger で $ref
解決 �18 paths: '/users/{id}': get: - - responses: '200': content: application/json: schema: title: MyUser type: object properties: id: type: integer name: type: string
19.
ちょっとまった • $ref で別ファイルの定義を参照するのは
OpenAPI 3.0 の仕様にそもそもあるのでは?? • あります!! • ただしツールによってはサポートしていなかったり、多段 $ref はスルーされたりします • 他にも細かい制約があります �19 仕様: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#relative-references-in-urls
20.
多段 $ref 名簿側の User
の定義を BFF で使いまわしたい �20 /users/1
21.
たとえばこんなディレクトリ構成 �21 . !"" kamakura # !""
entities.yaml # $"" openapi.yaml !"" kamakura-bff $"" openapi.yaml
22.
kamakura/openapi.yaml �22 paths: /users/{id}: get: - - responses: "200": content: application/json: schema: $ref: "./entities.yaml#/User"
23.
kamakura-bff/openapi.yaml �23 paths: /users/{id}: get: - - responses: $ref: "../kamakura/openapi.yaml#/paths/ ~1users~1{id}/get/responses" response
のステータスコード、entity の定義を $ref で 引き込みたい ~1 は / のエスケープ文字
24.
Swagger UI で開くと
😱 �24
25.
merger で $ref
を解決すると 😊 �25
26.
多段 $ref 問題 •
kamakura-bff/openapi.yaml -> kamakura/ openapi.yaml -> kamakura/entities.yaml この $ref を Swagger UI は解決できない • ツールによっては最初の $ref で解決できなくて死ぬも のもある �26
27.
$ref 問題 • https://github.com/OpenAPITools/openapi- generator •
generate した model を使っている �27
28.
$ref を解決できない 😇 �28 $
openapi-generator validate -i kamakura/openapi.yaml Validating spec (kamakura/openapi.yaml) Errors: -attribute paths.'/users/ {id}'(get).responses.responses.$ref is not of type `object` [error] Spec has 1 errors.
29.
開発フロー • merger で生成された
$ref 解決済みの yaml に対し て validation をかけている • 人間が触る yaml と機械が 触る yaml を分ける • テストで request/response の validate に使いたい ので pre-commit hook で $ref 解決済み yaml を生 成して commit している • invalid な yaml が生成されても validation をすり抜 けることもあるので Swagger UI で表示してみて問題 ないか確認するのが良い �29
30.
�30 ところで
31.
(再掲)kamakura-bff/openapi.yaml �31 paths: /users/{id}: get: - - responses: $ref: "../kamakura/openapi.yaml#/paths/ ~1users~1{id}/get/responses"
32.
(再掲)kamakura-bff/openapi.yaml �32 paths: /users/{id}: get: - - responses: $ref: "../kamakura/openapi.yaml#/paths/ ~1users~1{id}/get/responses" これ
paths 以下を $ref で引き込めばいいのでは??
33.
この形 �33 paths: $ref: "../kamakura/openapi.yaml#/paths
34.
この形 �34 paths: $ref: "../kamakura/openapi.yaml#/paths これはできません
35.
paths 直下は $ref
を使えない �35 https://swagger.io/docs/specification/using-ref/
36.
この形ならいける �36 paths: /users/{id}: $ref: "../kamakura/openapi.yaml#/paths/ ~1users~1{id}
37.
ハマりポイント • JSON Schema
と完全に同じではない • JSON Schema では valid だが OpenAPI では invalid になることがある!! • 各ツールの仕様の網羅具合がまちまちなのもあり根気 強く向き合う覚悟がいる �37
38.
�38 何はともあれ merger で $ref
を解決すればいけそう?
39.
一部の定義だけ override したい •
バックエンドサービスとのやり取りで request ID やトレー シング用の trace ID をヘッダで引き回したい • code generate した際に BFF とバックエンドサービス の struct の名前が重複するので title(これが go の struct の名前になる) を変更したい • サービス側の定義を $ref で引き込みつつ、該当箇所 だけ定義を上書きするというやり方でこれらを実現した い • allOf を使うことで引き込んだ定義に手を加えることが できる �39
40.
parameters を override
したい �40 kamakura/openapi.yaml paths: /users/{id}: get: parameters: - name: id in: path required: true schema: type: integer format: int64 - name: request_id in: query required: true schema: type: string BFF 側で request_id を ヘッダに入れてバックエンド サービスに渡す
41.
parameters を override
したい �41 kamakura-bff/openapi.yaml paths: /users/{id}: get: allOf: - $ref: "../kamakura/openapi.yaml#/paths/ ~1users~1{id}/get" parameters: - name: id in: path required: true schema: type: integer format: int64 BFF 側は allOf で引き込んだ parameters に対して 後から override している
42.
request_id が消えないぞ?? �42 merger yaml paths: /users/{id}: get: parameters: -
name: id in: path required: true schema: type: integer format: int64 - name: request_id in: query required: true schema: type: string
43.
�43 実は parameters の先頭要素 だけ置き換わっている
44.
わざとらしく name: hoge
にする �44 kamakura-bff/openapi.yaml paths: /users/{id}: get: allOf: - $ref: "../kamakura/openapi.yaml#/paths/ ~1users~1{id}/get" parameters: - name: hoge in: path required: true schema: type: integer format: int64
45.
ほげええええ �45 merger yaml paths: /users/{id}: get: parameters: - name:
hoge in: path required: true schema: type: integer format: int64 - name: request_id in: query required: true schema: type: string
46.
最終的にこうなる �46 paths: /users/{id}: get: summary: $ref: "../kamakura/openapi.yaml#/paths/~1users~1{id}/get/responses" description: $ref: "../kamakura/openapi.yaml#/paths/~1users~1{id}/get/description" responses: $ref:
"../kamakura/openapi.yaml#/paths/~1users~1{id}/get/responses" parameters: - name: id in: path required: true schema: type: integer format: int64 上書きたい要素を引き込まずに再定義する
47.
yaml で病むる • microservices
をやろうとするとこうなってしまうので は…? • みなさんは一体どうやっているのか…もっといいやり方 あるのでは…? �47
48.
�48 code generate
49.
openapi-generator generate • model、api
client あたりの利用に留めておくのがよい という所感 • api client は interface は生成されないので generate されたコードに対して自前で interface を生 やすか生 struct をそのまま触ることになる • テストのときに mock するといったことがやりにくいので 悩ましい �49
50.
model_my_user.go �50 /* * kamakura BFF
API * * No description provided (generated by Openapi Generator https:// github.com/openapitools/openapi-generator) * * API version: 1.0.0 * Generated by: OpenAPI Generator (https://openapi-generator.tech) */ package openapi type MyUser struct { Id int32 `json:"id,omitempty"` Name string `json:"name,omitempty"` }
51.
generate まわり • 2.0
では https://github.com/go-swagger/go- swagger というのがあるので 2.0 ではこちらを検討し てもよいかも • コードや GoDoc から yaml を生成するという方法もあり • 人間のドキュメンテーション用など厳密な定義が必要な い場合は今回取り上げた内容でも許容できるところもあ ると思うので、チームとしてどこまで OpenAPI に求める か次第 �51
52.
お世話になっているもの • request/response validation https://github.com/getkin/kin-openapi •
mock server https://github.com/danielgtaylor/apisprout �52
53.
本日のおはなし • OpenAPI 3.0
の yaml ファイルを分割管理しようとし た • $ref で死にまくったので $ref を解決するツールをプロ ジェクトで自作した • 人間と機械でそれぞれ触る yaml を分けるという方法 をとった • OpenAPI のツールチェインはよく調べたほうがいい �53
54.
�54 ありがとうございました
Download