its affiliates. All rights reserved. "デリバリー速度"の獲得 • マイクロサービスの最大のメリットは ビジネス変化に対応する"デリバリー速度"の獲得 • でも API で作ったサービスは頻繁な変更に対応するのは難しい • なぜなら API にはインターフェース契約があるから • そこで、”疎結合” にマイクロサービス を組み立てる、 イベントドリブンアーキテクチャという手法もある • それでも API とは向き合っていく必要がある 5
its affiliates. All rights reserved. API のバージョン管理の重要性 14 v1 v2 Client API の破壊的変更に対する Client への影響を最小化する 複数バージョンの API を同時稼働させ、Client ごとに異なるタイミングで新バージョンに移行させる Client Client
its affiliates. All rights reserved. セマンティックバージョニング 16 https://semver.org v1.2.3 メジャーバージョン マイナーバージョン パッチバージョン APIの変更に互換性のない場合に上げる 後⽅互換性を伴うバグ修正をした場合に上げる 後⽅互換性があり、機能性を追加した場合に上げる
its affiliates. All rights reserved. API Gateway で複数バージョンを管理するパターン 19 v1 API Gateway v2 v2 v2 v1 v1 v1 v2 1. API Gateway の Stage を使用する 2. API Gateway の API 自体を分ける
its affiliates. All rights reserved. API Gateway を IaC 管理する要素 24 AWS CDK AWS CloudFormation または + または AWS SAM API 定義 REST API 定義の規格(OpenAPI)の宣言ファイル(YAML or JSON)と インフラコード管理のテンプレートである AWS CDK(または CloudFormation や SAM)を併用する
its affiliates. All rights reserved. API Gateway で複数バージョンを管理するパターン 29 v1 API Gateway v2 v2 v2 v1 v1 v1 v2 1. API Gateway の Stage を使用する 2. API Gateway の API 自体を分ける Infrastructure as Code で、どのようにデプロイしていくか?
its affiliates. All rights reserved. 1. API Gateway の Stage を使用する 30 API Gateway の定義の宣言は1つとなるため、ダウンストリームのリソースも 同じコードベースで管理した方が都合が良いケースが多い API Gateway v1 Stage v2 https://xxx.execute-api.region.amazonaws.com/v1 https://xxx.execute-api.region.amazonaws.com/v2 AWS Lambda v1 AWS Lambda v2 /v1/users /v2/users GitHub main branch デプロイの最小単位(スタック) AWS CDK AWS CloudFormation AWS SAM Open API Spec など deploy
its affiliates. All rights reserved. ここまでのまとめ 34 • API Gateway の Stage を使用してバージョンを管理する § シンプルに構成を大きく変えずにデリバリする場合は有効となりうる § 複数チームが独立し、デリバリのパイプラインが分かれるシーンでは不向き • API Gateway の API 自体をバージョンごとに分けて管理する § 構成が大きく変わる場合でも対応しやすい § ダウンストリームの構成のデリバリを分割しやすい
its affiliates. All rights reserved. モデルケース1 SPA (React) + API Gateway 41 • Backend の API は破壊的変更を伴うバージョンアップがあったものの、 Frontend の SPA アプリでブラウザのリロードを促すダイアログを表示することで システムダウンという印象をユーザに与えることなく、バージョンの更新を行うことができた
its affiliates. All rights reserved. API Gateway + NLB + ECS という黄金パターン 44 Amazon API Gateway API Gateway のプライベート統合を使って internal な NLB – ECS Service に接続する Web API Client Virtual private cloud (VPC) VPC Link Network Load Balancer Service ECS Fargate ※説明の簡単化のために、サブネットや冗長化などは一部簡略化して表記しています。 Internet (HTTPS)
its affiliates. All rights reserved. パッチバージョンアップする場合 45 Amazon API Gateway v1.0.0 API のインターフェース定義(リクエストパラメータやレスポンススキーマなど)が変わらず、 ECS Service として稼働するアプリのバグ改修など、パッチバージョンアップの場合を考える。 Client Virtual private cloud (VPC) VPC Link Network Load Balancer Service v1.0.0 ECS Fargate ※説明の簡単化のために、サブネットや冗長化などは一部簡略化して表記しています。 Internet (HTTPS)
its affiliates. All rights reserved. ECS Service で稼働するアプリケーション 46 例)ユーザ登録(POST /users)API の Service クラスのロジックにおいてバグがあった API のインターフェースの変更、データベースのスキーマ変更は伴わないケース Controller GET /users (ユーザ一覧取得) POST /users (ユーザ登録) getUsers() postUser(User) Service Model Database Logic Logic Client バグ例)Request Body に メールアドレスが無くても 登録できてしまう!
its affiliates. All rights reserved. パッチバージョンアップする場合 47 Amazon API Gateway v1.0.0 → v1.0.1 インターフェース変更、破壊的変更はないため、 API Gateway, ECS Service のどちらを先に更新しても問題はない Client Virtual private cloud (VPC) VPC Link Network Load Balancer Service v1.0.0 → v1.0.1 ECS Fargate ※説明の簡単化のために、サブネットや冗長化などは一部簡略化して表記しています。 Internet (HTTPS) インターフェース変更が無くても アプリ内部の振る舞いが変わることを Client が分かるようにバージョンをアップデートする (あえて、サイレントアップデートという手法をとることも・・・) API Gateway のインターフェース変更はないため、 リソース間の依存関係、リリース順を意識せず、デプロイを行うことができる
its affiliates. All rights reserved. 対策2)インフラ・アプリデプロイの境界線を分ける場合 52 A)ECS Service 単位でチームの責務を分離する AWS Account VPC Subnet ECS Cluster ECS Service A Task Task ECS Service B Task Task ECR ECR Service B Application Dockerfile, CloudFormation Spring Boot など Infra Repository AWS CDK AWS CloudFormation など Service A Application Dockerfile, CDK Ruby on Rails など Service A 開発チーム Service B 開発チーム インフラ チーム ownership ownership ownership deploy deploy deploy
its affiliates. All rights reserved. 対策2)インフラ・アプリデプロイの境界線を分ける場合 54 B)コンテナイメージ単位でチームの責務を分離する AWS Account VPC Subnet ECS Cluster ECS Service A Task Task ECS Service B Task Task ECR ECR Infra Repository AWS CDK AWS CloudFormation など Service A Application Dockerfile Ruby on Rails など Service A 開発チーム インフラ チーム ownership ownership deploy push
its affiliates. All rights reserved. 対策2)インフラ・アプリデプロイの境界線を分ける場合 55 B)コンテナイメージ単位でチームの責務を分離する AWS Account VPC Subnet ECS Cluster ECS Service A Task Task ECS Service B Task Task ECR ECR Infra Repository AWS CDK AWS CloudFormation など Service A Application Dockerfile Ruby on Rails など Service A 開発チーム インフラ チーム ownership ownership deploy push コンテナイメージをビルド、 PUSHするまでを責務とする ❶ インフラチームにリリース対象の コンテナイメージのリビジョンを連携する ❷ リリース対象のコンテナイメージの リビジョンを指定してデプロイ ❸
its affiliates. All rights reserved. API Gateway は誰が管理する? VPC Subnet ECS Cluster API Gateway Infra Repository deploy Service A Application deploy インフラ管理用のリポジトリで API Gateway も管理するべき? ECS Service A Task Task ECS Service B Task Task ECR ECR NLB NLB
its affiliates. All rights reserved. API Gateway は誰が管理する? VPC Subnet ECS Cluster ECS Service A Task Task ECS Service B Task Task ECR ECR API Gateway Infra Repository deploy Service A Application deploy リソースの依存関係、デプロイの順序は下から上 であればリポジトリを分けてライフサイクルを分けた方が都合が良い ネットワーク系 リソースのデプロイ ❶ API Gateway 層の デプロイ ❸ アプリケーション層の デプロイ ❷ deploy API Repository NLB NLB
its affiliates. All rights reserved. API Gateway は誰が管理する? VPC Subnet ECS Cluster API Gateway Infra Repository deploy Service A Application deploy リソースのライフサイクルの切れ目でリポジトリを分けていく チームはリポジトリと1対1で分けても良いし、1対多にしても良い ネットワーク系 リソースのデプロイ ❶ API Gateway 層の デプロイ ❸ アプリケーション層の デプロイ ❷ deploy API Repository インフラ チーム ownership Service A 開発チーム ownership リポジトリさえ分割しておけば 管理主体のチームは分けても分けなくても良い ECS Service A Task Task ECS Service B Task Task ECR ECR NLB NLB
its affiliates. All rights reserved. デプロイの最小単位、どう決める? 67 VPC Subnet ECS Cluster API Gateway ECS Service A Task Task ECS Service B Task Task ECR ECR NLB NLB Step Functions Lambda Web用 Lambda Step Functions 用 Dynamo DB ? ? ? ?
its affiliates. All rights reserved. 外部に API をどう使ってもらうか、 内部で API をどう管理するか 73 API Gateway Client サービスA API サービスB API サービスC API サービスD API Client Client Product Owner サービスA サービスB サービスC サービスD マイクロチームは 開発から運用まで担当する • 設計 • 技術選定 • 採用 • 開発 • テスト(CI) • リリース(CD) • オンコール対応 • 利用者からの問い合わせ etc.. プロダクト全体の意思決定を担当する • ユーザへの価値を最大化するために どんな機能を、いつ、どのボリュームで提供するか決定する • One way door / Two way door の判断 • etc.. 顧客価値の 最大化 開発チーム との調整
its affiliates. All rights reserved. 内部で API をどう管理するか(Product Owner目線) 75 各チームの技術は知る必要がない。 API の仕様と、プロダクトバックログで会話できるようにしていく。 開発チームは API の公開と同時に、 APIドキュメントも最新化する。 API ドキュメントもシステムの一部であると考える。 常に Web UI として公開されている状態を目指す。
its affiliates. All rights reserved. API ドキュメント の公開フロー 77 決済サービス Repository Amazon API Gateway v1.0.0 Amazon CloudFront Amazon S3 HTML CSS, JS AWS Lambda API ドキュメントの アップロード API の公開 Client 開発者や ProcductOwner JSON Webサイトとして公開された API ドキュメント API のリリースと同時に、API ドキュメントも自動生成して更新する AWS CDK AWS CloudFormation AWS SAM Open API Spec など
its affiliates. All rights reserved. まとめ 78 • 開発組織の規模に応じてアーキテクチャを進化させていく • リリースのパイプラインは、リソースの依存関係に留意して、 チーム体制ではなくリソースのライフサイクルに着目して分ける • 技術カットではなくドメインカットで責務を分けていく • サービスチームごとに意思決定可能なアーキテクチャを目指す ※ VPC Link など一部簡略化して表現しています