Slide 1

Slide 1 text

© 2024 Anti-Pattern Inc. All rights reserved. AWS CDK を活⽤した ⼤量 AWS アカウントへのプロビジョニング例 〜 SaaSus Platform の場合 〜 2024/10/23 於 JAWS-UG CDK⽀部 #17 ~⼤規模利⽤の神髄︓限界突破の秘訣~ ⽮ヶ崎哲宏

Slide 2

Slide 2 text

⾃⼰紹介 2 ⽮ヶ崎 哲宏(Akihiro YAGASAKI) 株式会社アンチパターン 取締役 CTO兼COO 役割︓⽇本のソフトウェアエンジニアを憧れの職業に するためのいろいろ 経歴︓アマゾン ウェブサービス ジャパン にて SaaSシニアパートナーソリューションアーキテクト Webメディア/SaaSベンダーにて技術責任者ボードメンバー ⼤⼿SIerグループ会社にて情シス責任者 アニメソングのコーラス など 2022, 2023, 2024 Japan AWS Top Engineers (Software) 1975年⽣まれ

Slide 3

Slide 3 text

© 2024 Anti-Pattern Inc. All rights reserved. 本⽇のお話 本⽇は、弊社のプロダクト SaaSus Platform での AWS CDK の活⽤例として そこそこな量の AWS アカウントへどのように適⽤をしていっているかをお話させていただきます • 軽く SaaSus Platform ってどんなものなの︖というご紹介 • 全体のアーキテクチャの概要 • AWS CDK を活⽤している部分の説明 • まとめ

Slide 4

Slide 4 text

© 2024 Anti-Pattern Inc. All rights reserved. 軽く SaaSus Platform ってどんなものなの︖ というご紹介

Slide 5

Slide 5 text

© 2024 Anti-Pattern Inc. All rights reserved. 業務ロジック 業務ナレッジ ベストプラクティス Control Plane as a Service - SaaSus Platform

Slide 6

Slide 6 text

© 2024 Anti-Pattern Inc. All rights reserved. Control Plane as a Service - SaaSus Platform 認証・認可 請求 料⾦プラン コミュニケーション セキュリティ 利⽤量計測 x テナント管理 分析 業務ロジック 業務ナレッジ ベストプラクティス SaaSの直接的な価値を⽣む ここの実装に集中︕ ここはまかせるのじゃ SaaSを作るためのSaaS

Slide 7

Slide 7 text

© 2024 Anti-Pattern Inc. All rights reserved. SaaSのアーキテクチャ SaaS管理画⾯ テナント管理 ユーザー管理 認証認可 ログ収集 利⽤量計測 分析 請求 料⾦プラン コントロールプレーン (SaaSの管理に必要な機能群) アプリケーションプレーン (SaaSのアプリケーションの機能群) Webフロントエンド テナント バックエンド DB テナント バックエンド DB テナント バックエンド DB テナント バックエンド DB これらが集まって1つのSaaSになる

Slide 8

Slide 8 text

© 2024 Anti-Pattern Inc. All rights reserved. 特に意識しなくてもSaaSはおのおのの役割は持っている SaaS管理画⾯ テナント管理 ユーザー管理 認証認可 ログ収集 利⽤量計測 分析 請求 料⾦プラン Webフロントエンド テナント バックエンド DB テナント バックエンド DB テナント バックエンド DB テナント バックエンド DB 作り⽅によっては分かれていないこともあるが その役割はどこかで持っている

Slide 9

Slide 9 text

© 2024 Anti-Pattern Inc. All rights reserved. Control Plane as a Service - SaaSus Platform https://saasus.io/

Slide 10

Slide 10 text

© 2024 Anti-Pattern Inc. All rights reserved. 普通の SaaS 開発例 お客様 SaaS VPC SaaS利⽤者 SaaS提供者 構築・運⽤ SaaSを利⽤ 認証・認可、テナント管理、 料⾦プラン、請求、 各種管理画⾯など SaaS で必要な要素も 合わせて実装する Amazon ECS Amazon RDS

Slide 11

Slide 11 text

© 2024 Anti-Pattern Inc. All rights reserved. SaaSus Platformを使った SaaS 開発例 お客様 SaaS VPC SaaS利⽤者 SaaS提供者 ログイン画⾯など 共通画⾯は SaaSus Platform の機能を利⽤ SaaS本来の部分の利⽤ 管理画⾯など 共通画⾯は SaaSus Platform の機能を利⽤ SaaS本来の部分を作る API Endpoint 認可、請求など 共通機能は API/SDK を利⽤ SDK イベントを通知し リアルタイムに 処理が可能 Amazon ECS Amazon RDS AWS Lambda Amazon EventBridge

Slide 12

Slide 12 text

© 2024 Anti-Pattern Inc. All rights reserved. Amazon EventBridge 連携 ここから使える感じに なってます

Slide 13

Slide 13 text

© 2024 Anti-Pattern Inc. All rights reserved. 導⼊イメージ SaaSの開発において、SaaSで共通的に必要な機能は SaaSus Platform側と連携 企業A 企業B 企業C ⾃社SaaS環境 SaaS基本 情報管理 役割管理 ユーザー管理 連携機能 料⾦プラン 管理 請求⾦額 管理 認証機能 ログイン画⾯管 理 SaaSus Platform SDK 運⽤担当者 機能1 機能2 機能3 機能4 事業責任者 エンジニア 1. コア機能は⾃社環境に開発 2. SDKやAPIで連携部分を実装 3. 画⾯から必要な情報は設定 1. 料⾦プランを設定 2. セキュリティレベルを定義 3. 必要な役割を定義 契約企業 管理 1. ユーザーの管理 2. 契約企業の管理 SaaS開発コンソール SaaS運⽤コンソール SaaSログイン画⾯ ● Amazon EventBridge連携 ● AWS Marketplace連携 ● Amazon App Stream2.0連携(予定) ● API ⽣成、運⽤ 機能(予定)

Slide 14

Slide 14 text

© 2024 Anti-Pattern Inc. All rights reserved. SaaSus Platform 使い⽅例 SDKを利⽤し、最⼩5⾏でマルチテナントに対応した認証・認可が実装可能に。 例︓PHP(Laravel) での Auth 機能利⽤ .env routes/web.php routes/api.php フロントのコード アプリケーション側の実装 SaaSus Platform の管理画⾯ SaaSus Platform 利⽤企業の SaaS ログイン画⾯

Slide 15

Slide 15 text

© 2024 Anti-Pattern Inc. All rights reserved. SaaS API Gateway Function (Coming soon!) It seems like magic! Single tenant SaaS vendors can use this feature to easily implement and provide external APIs. SaaSus Platform generate API definition automatically using GenAI and provides API endpoints and some API gateway functions.

Slide 16

Slide 16 text

© 2024 Anti-Pattern Inc. All rights reserved. SaaS API Gateway Function diagram Customer SaaS VPC SaaS User SaaS Vendor Upload source code that includes SaaSus API annotations SaaSus Auth Module Amazon ECS Amazon RDS AWS PrivateLink Authorizer External API Endpoint Invoker Amazon Bedrock Internal API Endpoint SaaSus Managed Resources API definitions AWS CloudFormation Provision required resources in customer SaaS account automatically by SaaSus Platform SaaS users can use SaaS API via SaaSus Platform SaaSus Consoles Throttling/ Dispatching SaaSus SDK

Slide 17

Slide 17 text

© 2024 Anti-Pattern Inc. All rights reserved. 全体のアーキテクチャの概要

Slide 18

Slide 18 text

© 2024 Anti-Pattern Inc. All rights reserved. アーキテクチャの全体イメージ SaaS 提供事業者は、 ⾃⾝の AWS アカウント にアプリケーションを構築 する。 SaaSus SDK / API を 活⽤して、 SaaS 化に 必要な部分だけ SaaSus Platform を活 ⽤する データストアやテナント固有 のサービスは、各テナント⽤ 専⽤に分離された AWS ア カウントに配置される 例︓テナントの固有の業務 データ、ログイン画⾯のア セット、SESのインスタンスな ど “SaaSus Core” はテナ ント共通の情報、テナン ト管理情報などを持って おり、またコンピューティ ングリソースとして APIを 提供する

Slide 19

Slide 19 text

© 2024 Anti-Pattern Inc. All rights reserved. Core API AWS Account API Endpoint API Containers (Auto Scale) Auth Module Billing Module Pricing Module Marketplace Module EventBridge Module Shared Storage Shared DB Tenant AWS Account for SaaSus Web Console Contents Management AWS Account Identity Provider AWS Control Tower Amazon EventBrdige Tenant DB Tenant Web Contents Tenant AWS Account for Tenant2 Identity Provider Tenant DB Tenant Web Contents Tenant AWS Account for Tenant1 Identity Provider Tenant DB Tenant Web Contents 各テナント⽤に AWS ア カウントを⽤意する Tenant vending には、 Control Tower / StackSets / CDK など を活⽤している Customer SaaS Applications Inside of SaaSus Platform

Slide 20

Slide 20 text

© 2024 Anti-Pattern Inc. All rights reserved. Core API AWS Account API Endpoint API Containers (Auto Scale) Auth Module Billing Module Pricing Module Marketplace Module EventBridge Module Shared Storage Shared DB Tenant AWS Account for SaaSus Web Console Contents Management AWS Account Identity Provider AWS Control Tower Amazon EventBrdige Tenant DB Tenant Web Contents Tenant AWS Account for Tenant2 Identity Provider Tenant DB Tenant Web Contents Tenant AWS Account for Tenant1 Identity Provider Tenant DB Tenant Web Contents 各テナント⽤に AWS ア カウントを⽤意する Tenant vending には、 Control Tower / StackSets / CDK など を活⽤している Customer SaaS Applications Inside of SaaSus Platform ここの量が多い︕

Slide 21

Slide 21 text

© 2024 Anti-Pattern Inc. All rights reserved. SaaSus Platform の AWS アカウント管理 それなりの量の AWS アカウントに CDK を適⽤する 必要があるので、 仕組みが必要

Slide 22

Slide 22 text

© 2024 Anti-Pattern Inc. All rights reserved. AWS CDK を活⽤している部分の説明

Slide 23

Slide 23 text

© 2024 Anti-Pattern Inc. All rights reserved. SaaSus Core Account Payer(Management) Account Tenant Account テナント情報の DynamoDB テナント固有の DynamoDB Tenant Vending の全体像 ここでCDKが活躍︕ ※BLEA v1ベースで作成 ※BLEA: https://github.com/aws-samples/baseline-environment-on-aws

Slide 24

Slide 24 text

© 2024 Anti-Pattern Inc. All rights reserved. Tenant Vending 処理の動き • 全般 • Pre-vending / Post-vending / CDK-exec の3段階で構成 • 各段階へは、 SNS 経由での SQS からの起動になっている • Post-vending 以降の処理は、べき等にできておりリトライ可能 • SQS からの実⾏は3回まではチャレンジ • 3回失敗したらDLQに⼊って、その後Slackに通知がくる

Slide 25

Slide 25 text

© 2024 Anti-Pattern Inc. All rights reserved. Tenant Vending 処理の動き Pre-vending • 画⾯経由などで SaaSus Platform のテナント作成のトリガーで SNS を発⾏して処理が始まる • Payer Account の IAM Role に Assume Role して、 ServiceCatalog 経由でアカウントを作成 • StackSets では、後続の処理に必要な IAM Role などを作成する • 処理が正常終了したら、後続の処理のために SNS を発⾏

Slide 26

Slide 26 text

© 2024 Anti-Pattern Inc. All rights reserved. Tenant Vending 処理の動き Post-vending • テナント⽤の AWS アカウントが作成された後に実⾏される • Pre-vending で作成した Tenant Account の IAM Role に Assume Role する • StackSets が異常終了する場合があるので、そのときは StackSets の再実⾏をする • Tenant Account の IAM Role に External ID をセット • Tenant Account の DynamoDB に初期マスターデータをセット • 処理が正常終了したら、後続の処理のために SNS を発⾏

Slide 27

Slide 27 text

© 2024 Anti-Pattern Inc. All rights reserved. Tenant Vending 処理の動き CDK-exec • Post-vending の後、もしくはテナント側のインフラを更新するタイミングで実⾏される • Core 側の DynamoDB の情報をもとに、テナント⽤の cdk.json を⽣成する • cdk.json を環境変数として CodeBuild 上で CDK を実⾏する • CodeBuild は Tenant Account の IAM Role に Assume Role して、 CDK を実⾏する

Slide 28

Slide 28 text

© 2024 Anti-Pattern Inc. All rights reserved. CodeBuild の実⾏イメージ こんな感じで⼀気 に同時に複数アカ ウントに CDK を適 ⽤していく

Slide 29

Slide 29 text

© 2024 Anti-Pattern Inc. All rights reserved. CodeBuild の実⾏イメージ 各 CodeBuild のビルドにはテナントに応じた cdk.json を配布し実⾏する

Slide 30

Slide 30 text

© 2024 Anti-Pattern Inc. All rights reserved. スタックのイメージ 各テナントの AWS アカウントには、こん な感じで BLEA v1 ベースのスタックができ る

Slide 31

Slide 31 text

© 2024 Anti-Pattern Inc. All rights reserved. インフラの CI/CD について • Dev / Stg / Prod 別々 AWS Organizations が存在 • 各 Organizations に、 Payer / Core / Tenants の AWS アカウントセットがある • Payer / Core の パイプラインと、 Tenants のパイプラインは別物 • インフラのリリースバージョンも、アプリケーションに合わせてセマンティックバージョニングをして、アプリケーションと同期 • ブランチ戦略は、 GitLab Flow(⾵︖) を採⽤ • GitHub Actions を活⽤して、 プルリクエスト作成時に CDK Diff の表⽰、マージ時に⾃動適⽤がされる

Slide 32

Slide 32 text

© 2024 Anti-Pattern Inc. All rights reserved. インフラの CI/CD について • 環境変数、パラメータストアは本当に必要な部分以外なるべく使わない • CI/CD & IaC がある現代、秘匿情報以外はむしろコードに⼊れちゃう⽅が安全 • cdk-nag を全⾯的に採⽤。厳しすぎるところは地道にサプレッションを⼊れて対応 • インフラのデプロイ時にも Feature Flag(LaunchDarkly)を活⽤ • ⼀部のテナントにだけ適⽤したいものなどがある場合、 ⼀部の機能⽤のインフラだけを除外する場合、の判断フラグを管理

Slide 33

Slide 33 text

© 2024 Anti-Pattern Inc. All rights reserved. 今後検討しているところ / つらいところ • AWS アカウントの払い出しを同時に 1 づつしか出来ない • AWS Control Tower では現在 5 つづつ払い出せるようになっているが、その前に作った仕組みな ので対応していない • CDK の適⽤が⼀番時間がかかる部分なので、前もって⼀定数 AWS アカウントを払い出しておい て初期パラメータで CDK 実⾏済みにしておく、という実装は終わっているが、まだリリースできていな い • CDK で破壊的変更がある部分適⽤がつらい • あたりまえだが、マイグレーションにかなりの⼿間がかかる。たとえば、 Cognito のオプション変更など • CodeBuild の同時実⾏数 20 が突破できない • 500 アカウントに CDK のアップデートなどを適⽤しようとすると、⼀晩かかる • 上限緩和したつもりだが、 20 しか動かない(サポートに聞きます) • AWS IAM Identity Center 登録アカウント数(サービス数) 上限 3,000 がどこまで緩和できるの か︖ • AWS Step Functions 使った⽅が良い節もある もっとこうした⽅が良いよ︕っていうことがあれば、ぜひ教えてください︕

Slide 34

Slide 34 text

© 2024 Anti-Pattern Inc. All rights reserved. まとめ

Slide 35

Slide 35 text

© 2024 Anti-Pattern Inc. All rights reserved. まとめ それなりの数のアカウントのインフラを管理する必要がありますが、 AWS CDK(IaC) のおかげで夜も眠れてます こちらからは以上です。

Slide 36

Slide 36 text

© 2024 Anti-Pattern Inc. All rights reserved. “⽇本のソフトウェアエンジニアを 憧れの職業へ”