Slide 1

Slide 1 text

OSEKKAI × TECHNOLOGY Everything will be SERVERLESS 〜信じて運用した10年の経験値〜 ServerlessDays Tokyo 2026 2026-09-19 株式会社Fusic / 技術コミュニティ統括室長 / シニアエバンジェリスト 清家 史郎 (@seike460)

Slide 2

Slide 2 text

自己紹介 OSEKKAI × TECHNOLOG Y 清家 史郎 (@seike460) SHIRO SEIKE 技術コミュニティ統括室長 / シニアエバンジェリスト ・2026 Japan AWS Ambassador ・AWS Community Builder (Serverless) ・Japan AWS Top Engineers 2025・2026 — コミュニティ ・JAWS-UG Fukuoka Co-Organizer / JAWS DAYS 2026 実行委員長 ・ServerlessDays Fukuoka 2019 実行委員長 ・ServerlessDays Tokyo(2019 スタッフ / 2022–2026 運営) 2 ©Fusic Co., Ltd.

Slide 3

Slide 3 text

1 2016–2022:衝撃と言葉、そして結果 受け取る 3 ©Fusic Co., Ltd.

Slide 4

Slide 4 text

初めてのAWS案件で、上司の提案からLambdaを選んだ 上司の提案 AWS LambdaでServerlessで組めばいいじゃん インフラの管理 Fusicに入社 前々職・前職 2016年6月・初めてのAWS案件 Lambdaを採用 サーバー管理なしで コードを実行 学び:選択は、誰かの一言で始まる 4 ©Fusic Co., Ltd.

Slide 5

Slide 5 text

ワークショップ優勝の翌日、洗礼のような衝撃を受けた 浮かれた自分への洗礼 ServerlessConf Tokyo 2018 ワークショップで優勝し、浮かれた翌日 規模も視点も違う構成を見た 5 ©Fusic Co., Ltd.

Slide 6

Slide 6 text

2018年に相談し、翌年ServerlessDays Fukuokaを開催した ServerlessDays Fukuoka 2019 を開催した 2018年の懇親会で、福岡開催を相談した Tokyo 2019はスタッフとして参加した 日本初の地方開催の実行委員長 声をかけた翌年、私は実行委員長だった 6 ©Fusic Co., Ltd.

Slide 7

Slide 7 text

2019年、福岡でこの言葉を受け取った 「 Everything will be Serverless 」 — 西谷 圭介 ServerlessDays Fukuoka 2019 基調講演 7 ©Fusic Co., Ltd.

Slide 8

Slide 8 text

僕の最初のLambda APIは、リクエスト数約73倍でも保守者は1人だった 上司の提案で選んだ、あのAPIのその後 月間リクエスト数の増加 約 73 倍 21,172件(当初)→ 1,543,602件(2022年時点) 保守する人 1 人 増加後も、担当者は同じ 8 ©Fusic Co., Ltd.

Slide 9

Slide 9 text

2 2019:自作を捨て、コミュニティに頼る 頼る 9 ©Fusic Co., Ltd.

Slide 10

Slide 10 text

JAWS DAYS 2019で、複数案件を監視するFictionBaseを紹介した agent / monitor API Gateway CloudWatch SQS Lambda router DynamoDB S3 Slack 通知Lambda JAWS DAYS 2019 の登壇で発表した構成を再現 10 ©Fusic Co., Ltd.

Slide 11

Slide 11 text

JAWS DAYS 2019で、自作のYAMLをOSSの設定に置き換えた JAWS DAYS 2019のFictionBaseより。API GatewayとSQSの接続設定を、 自作のYAMLからコミュニティのプラグインへ置き換え の 設定例 # plugin README SQS custom: apiGatewayServiceProxies: - sqs: path: /sqs method: post queueName: {'Fn::GetAtt': ['SQSQueue', 'QueueName']} cors: true resources: Resources: SQSQueue: Type: 'AWS::SQS::Queue' 11 ©Fusic Co., Ltd.

Slide 12

Slide 12 text

3 2021:常時起動をやめる やめる 12 ©Fusic Co., Ltd.

Slide 13

Slide 13 text

AWS DevDay 2021で紹介した検索環境は、維持する対象が多かった ALB React + Amplify Fargate / Go API Amazon RDS 検索データ 解析実⾏ 中間データ 維持していた対象: ALB・Fargate・RDS + Goコード・コンテナの保守 Step Functions AWS Batch S3 / 13 ©Fusic Co., Ltd.

Slide 14

Slide 14 text

同僚の登壇を聞き、S3 Selectを検討し始めた 知っていた 登壇を聞いた S3 Selectの存在 JAWS DAYS 2020 同僚の内田さん 実データで検証 S3 Select=S3上のデータをSQLで絞り込む機能 登壇テーマ「サーバーレスの新しいデータストアの選択肢 S3 Selectの魅力」 学び:存在を知っていたことと、自分の設計で使えることは別 14 ©Fusic Co., Ltd.

Slide 15

Slide 15 text

1レコード1MBの制約を確認し、Fargate環境を廃止した 変更前 Fargate 変更後:AppSync + Lambda RDS 常時起動の費用 Go・コンテナ・ECRの管理 AppSync 廃止 DynamoDB Lambda (Go) S3 Select React・Amplifyの画面を継続 解析用のStep Functions・Batchも継続 1レコード1MB以内(S3 Select上限) 結果整合性で十分(多少の遅延は許容) データ件数の急増はない 2021年の事例。S3 Selectは現在、新規利用不可。AppSync=GraphQLのマネージドサービス 15 ©Fusic Co., Ltd.

Slide 16

Slide 16 text

型は移行の前後で引き継げる AWS DevDay 2021の移行より。API.graphqlの戻り値に型を指定し、従来の型 (OpenAPI Generator製)をそのまま使った async function fetchBlogRequest(id: string) { const getBlogVal: GetBlogQueryVariables = { id, } let res = (await API.graphql( graphqlOperation(getBlog, getBlogVal) )) as GraphQLResult setBlog(res.data?.getBlog as Blog) } 16 ©Fusic Co., Ltd.

Slide 17

Slide 17 text

保守対象を減らし、画面の型は引き継いだ AWS DevDay 2021 のまとめ 保守対象を減らす 画面の型は維持する 取得・登録処理の変更箇所は明確。 従来と同じ型に合わせて置き換えた 学び:サーバーレスはブロックで組む。 合わなくなったブロックは替えられる 17 ©Fusic Co., Ltd.

Slide 18

Slide 18 text

4 2022–2023:元アプリとの境界を引く 引く 18 ©Fusic Co., Ltd.

Slide 19

Slide 19 text

AWS DevDay 2022で、元アプリのRDSへ直接接続しないサブサイトを紹介した 元アプリのRDSへ直接接続する場合(見送った案) 元アプリ 安定運用中 サブサイト 新たな検索アクセス RDS 負荷試験・スケール計画済み 元アプリの運用者の再検証・調整を増やさない 19 ©Fusic Co., Ltd.

Slide 20

Slide 20 text

元アプリのRDSから、サブサイトの読み取りを切り離した 元アプリ アカウント レプリカ RDS サブサイトアカウント ブラウザ CloudFront S3 / 静的配信 S3 Select Fargate JSON ⽣成 API Gateway Lambda S3 (JSON) を配置 JSON 2022年の事例。S3 Selectは現在、新規利用不可 20 ©Fusic Co., Ltd.

Slide 21

Slide 21 text

PHPからS3 SelectにSQLを送り、検索した 2022年の事例。S3 Selectは現在、新規利用不可 $result = $this->s3Client->selectObjectContent([ 'Bucket' => $this->getBucket(), 'Key' => $this->getKey(), 'ExpressionType' => 'SQL', 'Expression' => "SELECT {$this->getField()} FROM …", 'InputSerialization' => [ 'JSON' => ['Type' => 'Document'], ], 'OutputSerialization' => [ 'JSON' => ['RecordDelimiter' => ','], ], ]); このLambdaはPHPで書き、Bref(PHPをLambdaで動かすOSS)で実行した 21 ©Fusic Co., Ltd.

Slide 22

Slide 22 text

必要な更新頻度を確認し、30分間隔で合意した 30 分ごとの更新で合意 JSONを更新 更新間隔 30分 次の更新 必要な更新頻度を顧客に確認し、定期的なデータ生成を採用した 22 ©Fusic Co., Ltd.

Slide 23

Slide 23 text

サブサイト側で、処理できるリクエスト数を測った 2022年の負荷試験:GET・100クライアント・20万リクエスト GET 約 600 POSTの測定結果(別条件) RPS 次に、同じGETの試験で キャッシュ追加の効果を確認 約1,100 RPS データ量はGETの1/10 GETとは条件の異なる測定値 RPS=毎秒のリクエスト数。別条件でも計測(500クライアント・2,000リクエスト、 1,000クライアント・20万リクエスト) 23 ©Fusic Co., Ltd.

Slide 24

Slide 24 text

効果が得られないキャッシュは、採用しなかった API Gatewayのキャッシュを比較(同じGETの試験) キャッシュなし 約600 RPS キャッシュあり 約200 RPS 0 採用を見送った この試験では処理量が低下。時間単位の課金と管理項目も増える 学び:効果のない管理対象を、運用の中に増やさない CloudFrontのキャッシュは利用していた 24 ©Fusic Co., Ltd.

Slide 25

Slide 25 text

キャパシティ管理がほぼ不要になり、運用負担が減った キャパシティ管理が ほぼ不要になった アクセスの急増に備えて、毎回サーバーの台数や スペックを調整する必要がほぼなかった 構築から約1年、私の記憶にある限り保守作業はなかった

Slide 26

Slide 26 text

5 2022–2025:チームの技術に合わせる 合わせる 26 ©Fusic Co., Ltd.

Slide 27

Slide 27 text

1章のAPIは、言語を変えても保守者が増えなかった Python 最初の実装言語 保守者 1 人 Go 保守を考えて変更 = 型・後方互換性を評価 保守者 1 人 言語は変わったが、保守する担当者は増えなかった 学び:1人で回せてしまうことが、次の課題になった 27 ©Fusic Co., Ltd.

Slide 28

Slide 28 text

勉強会を開いても、すぐには使われなかった 勉強会 直後 数年後 社内で紹介 利用は広がらず 自然に利用 Amplify・AppSync PHP・Brefの構成 当時の社内はPHP・Ruby・AWSが中心。Amplify・AppSyncは、馴染みのない技術だった 28 ©Fusic Co., Ltd.

Slide 29

Slide 29 text

使い慣れたPHP・Rubyを前提にLambdaを使う Ruby 公式ランタイム PHP Bref Lambda Lambda ServerlessDays Tokyo 2024・AWS Community Day Hong Kong 2025で紹介した構成。 PHPには公式ランタイムがないため、Bref(コミュニティ製のPHPランタイム)を使う 29 ©Fusic Co., Ltd.

Slide 30

Slide 30 text

ServerlessDays Tokyo 2023でも、BrefでPHPをLambdaに載せた Serverless Frameworkの設定(serverless.yml)より。BrefでPHPをLambdaに載せる service: app-php-serverless provider: name: aws plugins: - ./vendor/bref/bref functions: api: handler: index.php runtime: php-82-fpm events: - httpApi: '*' 30 ©Fusic Co., Ltd.

Slide 31

Slide 31 text

Laravelの性能を測り、採用を続けた PHPは素の実装、Laravelはフレームワーク込み。EC2から同時接続10・2万リクエスト。 処理量は3回目の値 処理量(RPS) デプロイ時間(秒) PHP PHP Laravel 351.93 262.52 0 Laravel 30 52 0 パッケージ:PHP 260kB / Laravel 32MB Laravelの採用を継続 性能差を確認し、使い慣れた開発方法を評価した 31 ©Fusic Co., Ltd.

Slide 32

Slide 32 text

若手のPHP開発者が、同じ構成を採用できた 若手のPHP開発者 Laravel 普段の開発知識 共通の構成 + Laravel + Bref Lambda 別案件の本番環境を構築 32 ©Fusic Co., Ltd.

Slide 33

Slide 33 text

構築と運用を含め、チームに適した構成を選んだ 「 AWS Lambdaとしてはベストではない。 でも構築、運用まで含めた アプリケーションとしては、 チームとしてベストだった 」 ServerlessDays Tokyo 2023 33 ©Fusic Co., Ltd.

Slide 34

Slide 34 text

本番と開発で、同じLaravelのコードを使う 本番 TiDB Serverless 互換 MySQL AWS Lambda Bref / Laravel 同じLaravelのコードで開発する ⼿元の開発環境 / Docker Compose Laravel MySQL LocalStack TiDB Serverlessは現在、TiDB Cloud Starterという名称です 34 ©Fusic Co., Ltd.

Slide 35

Slide 35 text

私が開発に加わらなくても、案件が進むようになった 「 今までServerlessの開発を 牽引していた自分自身が 開発には一切加わらず進捗 」 ServerlessDays Tokyo 2024 / AWS Community Day Hong Kong 2025 35 ©Fusic Co., Ltd.

Slide 36

Slide 36 text

6 現在:判断を記録し、次の担当者へ 引き継ぐ 36 ©Fusic Co., Ltd.

Slide 37

Slide 37 text

開発が進んでも、基盤の運営は個人に集中していた アプリケーション開発 開発チーム 基盤の運営 清家 共同作業・導入支援 私が開発に加わらなくても進行 個人に集中したまま 利用する案件が増えるときは、支援する側の作業も確認する 37 ©Fusic Co., Ltd.

Slide 38

Slide 38 text

担当者の交代を前提に、導入・定着・拡大を設計する 定着 導入 拡大 Normalize Adopt テスト・デプロイ・監視を テンプレートで試す 自動化 Scale 複数の製品へ広げる 各段階で、設計判断を3点に整理して記録する 前提 見送った案 見直す条件 個人の構成をチームの基盤として整える取り組みは、Platform Engineeringと呼ばれる 38 ©Fusic Co., Ltd.

Slide 39

Slide 39 text

現在の構成で、設計判断を確認する ドメインごとにAWSアカウントを分離 共通テンプレートから、同型のサービスを展開 レガシー 基幹 S3 CSV SQS Lambda Aurora 取り込み ドメインDB DLQ ⼿動で復旧 ドメイン=業務の領域。既存側はCSVを置くだけ。SQSが受け付けと処理を分離し、失敗したメッセージはDLQ(隔離用キュー)へ退避させ、手動復旧 基幹にサーバーレスを選んだ理由:管理する実行基盤を最小化し、人が入れ替わっても運用し続けられるようにするため 39 ©Fusic Co., Ltd.

Slide 40

Slide 40 text

時刻の条件で更新の順序を守る。削除は守れない 差分処理は実装済み・未使用。同時実行数1の制限に加え、 SQSの順序非保証に備え発生時刻で新旧を判定する で 、 発生時刻 で上書き条件を付ける // keyColumns ON CONFLICT // orderColumn ( ) await tx.execute(sql` INSERT INTO ${table} (${cols}) VALUES (${values}) ON CONFLICT (${keyCols}) DO UPDATE SET ${setClause} WHERE excluded.${order} >= ${table}.${order} `) // delete ( DELETE) 側 物理 には同じ条件がない 40 ©Fusic Co., Ltd.

Slide 41

Slide 41 text

受信3回を上限とし、復旧は手動で行う 設定の要点を抜粋。コメントは説明用 推奨 以上 推奨 倍 const MAX_RECEIVE_COUNT = 3 // AWS : 5 const VT_MULTIPLIER = 3 // AWS : 6 + window const visibilityTimeout = cdk.Duration.seconds( lambdaTimeout.toSeconds() * VT_MULTIPLIER ) new sqs.Queue(this, 'MainQueue', { visibilityTimeout, deadLetterQueue: { queue: this.deadLetterQueue, maxReceiveCount: MAX_RECEIVE_COUNT, }, }) visibilityTimeout=処理中に隠す時間。maxReceiveCount=DLQへ移す受信上限 以上 41 ©Fusic Co., Ltd.

Slide 42

Slide 42 text

冪等キーが守るのは、応答のキャッシュだけ SQSの取り込みとは別の、API応答キャッシュの処理。冪等キー=重複処理を防ぐ識別子。 TTL=保存期限 はミリ秒。秒に変換して 加算 // put(): createdAt 24h const ttl = Math.floor(record.createdAt / 1000) + TTL_SECONDS await this.client.send(new PutCommand({ TableName: this.tableName, Item: this.toItem(record, ttl), ConditionExpression: 'attribute_not_exists(pk)', })) 削除は遅延しうるため論理的にも判定 // get(): TTL if (parsed.data.ttl <= nowSeconds) return null 42 ©Fusic Co., Ltd.

Slide 43

Slide 43 text

1,500万件超の初回投入は、Lambdaの外で行った 1,500万件超 初回投入 別の実行環境 Lambda 実行時間の上限は15分 ではなく Lambdaの外で投入した 次の担当者が確認: 選定理由とLambda分割の検討 43 ©Fusic Co., Ltd.

Slide 44

Slide 44 text

原因を修正し、対象と処理順序を確認して復旧する 担当者が確認 DLQ アラームで検知 復旧は手動 失敗原因の修正 対象ファイル 並行する取り込み 固定のS3キー Lambda 最新の内容を再読込 全件洗い替え 全件洗い替えは手動で復旧。 差分の運用は、キーの使い方と処理順序を導入前に定める 44 ©Fusic Co., Ltd.

Slide 45

Slide 45 text

coreからほかのパッケージへの依存を、CI(自動チェック)で検出する 共通テンプレートの依存ルール設定より。 業務ルールを置くcoreの、ほかのパッケージへの依存を禁止 { name: 'core-no-workspace-import', severity: 'error', from: { path: '^packages/core/src' }, to: { path: '^packages/(?!core/)' }, } 設計の規則は、文書とCIの両方に残す。レビューする人の記憶に頼らない 45 ©Fusic Co., Ltd.

Slide 46

Slide 46 text

前提と見直す条件があれば、次の担当者も判断できる 初版 前提 約2か月後に改訂 大量なのは初回だけ 日次は少量 見送った案 日次処理へのCOPY導入 見直す条件 日次の性能不足が 実測で判明 前提が 崩れた 日次も 1,000万件規模 ECS Run Task + COPY による一括MERGEへ ADR=設計判断を記録する文書 COPY=PostgreSQLの一括取り込み命令 46 ©Fusic Co., Ltd.

Slide 47

Slide 47 text

7 次の10年へ 信じる 47 ©Fusic Co., Ltd.

Slide 48

Slide 48 text

判断するAIの登場で、サーバーレスの価値は上がる 引き継ぐのは「判断」— その判断を、AIも行う時代になった 判断専用AIが必要とするもの サーバーレスが持っているもの イベントを契機に行う判断 S3 PUT → SQS → Lambda のイベント駆動 断続的に呼ばれる判断 従量課金と自動スケール 自動実行と人の境界(閾値) コードに残した規則と記録 (CI・ADR) 人のために整えた基盤は、そのままAIのプラットフォームになる 「Jev」(TypeSafe AI・2026年9月発表)は、確信度つきの判断を返す判断専用AI。 CNCFもAIエージェントがプラットフォームの利用者になると述べている。 「価値が上がる」は実際に動かして確かめた結果 48 ©Fusic Co., Ltd.

Slide 49

Slide 49 text

このJevのデモは、実際にサーバーレスで動いている 構成 静的画面+判断APIのPOST 1本 S3+CloudFront → API Gateway → Lambda 境界 確信度の分岐をコードに明記 0.9以上=自動実行 / 0.5以上=人に確認 未満=拒否 鍵 APIキーはサーバー側に閉じ込め 外に出るのは静的画面だけ 実際のCloudFrontで動作しています 判断が走るのは押された時だけ — 待機コストなし 大量の判断が起きても自動スケール 49 ©Fusic Co., Ltd.

Slide 50

Slide 50 text

10年の行動が「信じる」の中身 信じるとは、盲信ではなく 確かめ続けること 頼り、確かめ、やめ、引き、合わせ、 選び直し、記録して渡してきた "Everything will be Serverless" その言葉を盲信せず、10年確かめ続けました

Slide 51

Slide 51 text

僕は信じて、10年進み続けてきた Serverlessは必ず意味がある AI、Jevもその路の軌跡にすぎない "Believe in Your Serverless" あなたの話を聞かせて欲しい 51 ©Fusic Co., Ltd.

Slide 52

Slide 52 text

Thank You ご清聴いただきありがとうございました ©Fusic Co., Ltd.