Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Everything will be SERVERLESS — 信じて運用した10年の経験値 ...

Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience

Avatar for shiro seike

shiro seike PRO

September 19, 2026

More Decks by shiro seike

Other Decks in Programming

Transcript

  1. OSEKKAI × TECHNOLOGY Everything will be SERVERLESS 〜信じて運用した10年の経験値〜 ServerlessDays Tokyo

    2026 2026-09-19 株式会社Fusic / 技術コミュニティ統括室長 / シニアエバンジェリスト 清家 史郎 (@seike460)
  2. 自己紹介 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.
  3. JAWS DAYS 2019で、複数案件を監視するFictionBaseを紹介した agent / monitor API Gateway CloudWatch SQS

    Lambda router DynamoDB S3 Slack 通知Lambda JAWS DAYS 2019 の登壇で発表した構成を再現 10 ©Fusic Co., Ltd.
  4. 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.
  5. AWS DevDay 2021で紹介した検索環境は、維持する対象が多かった ALB React + Amplify Fargate / Go

    API Amazon RDS 検索データ 解析実⾏ 中間データ 維持していた対象: ALB・Fargate・RDS + Goコード・コンテナの保守 Step Functions AWS Batch S3 / 13 ©Fusic Co., Ltd.
  6. 同僚の登壇を聞き、S3 Selectを検討し始めた 知っていた 登壇を聞いた S3 Selectの存在 JAWS DAYS 2020 同僚の内田さん

    実データで検証 S3 Select=S3上のデータをSQLで絞り込む機能 登壇テーマ「サーバーレスの新しいデータストアの選択肢 S3 Selectの魅力」 学び:存在を知っていたことと、自分の設計で使えることは別 14 ©Fusic Co., Ltd.
  7. 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.
  8. 型は移行の前後で引き継げる 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<GetBlogQuery> setBlog(res.data?.getBlog as Blog) } 16 ©Fusic Co., Ltd.
  9. 元アプリのRDSから、サブサイトの読み取りを切り離した 元アプリ アカウント レプリカ RDS サブサイトアカウント ブラウザ CloudFront S3 /

    静的配信 S3 Select Fargate JSON ⽣成 API Gateway Lambda S3 (JSON) を配置 JSON 2022年の事例。S3 Selectは現在、新規利用不可 20 ©Fusic Co., Ltd.
  10. 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.
  11. サブサイト側で、処理できるリクエスト数を測った 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.
  12. 効果が得られないキャッシュは、採用しなかった API Gatewayのキャッシュを比較(同じGETの試験) キャッシュなし 約600 RPS キャッシュあり 約200 RPS 0

    採用を見送った この試験では処理量が低下。時間単位の課金と管理項目も増える 学び:効果のない管理対象を、運用の中に増やさない CloudFrontのキャッシュは利用していた 24 ©Fusic Co., Ltd.
  13. 1章のAPIは、言語を変えても保守者が増えなかった Python 最初の実装言語 保守者 1 人 Go 保守を考えて変更 = 型・後方互換性を評価

    保守者 1 人 言語は変わったが、保守する担当者は増えなかった 学び:1人で回せてしまうことが、次の課題になった 27 ©Fusic Co., Ltd.
  14. 使い慣れたPHP・Rubyを前提にLambdaを使う Ruby 公式ランタイム PHP Bref Lambda Lambda ServerlessDays Tokyo 2024・AWS

    Community Day Hong Kong 2025で紹介した構成。 PHPには公式ランタイムがないため、Bref(コミュニティ製のPHPランタイム)を使う 29 ©Fusic Co., Ltd.
  15. 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.
  16. 本番と開発で、同じLaravelのコードを使う 本番 TiDB Serverless 互換 MySQL AWS Lambda Bref /

    Laravel 同じLaravelのコードで開発する ⼿元の開発環境 / Docker Compose Laravel MySQL LocalStack TiDB Serverlessは現在、TiDB Cloud Starterという名称です 34 ©Fusic Co., Ltd.
  17. 担当者の交代を前提に、導入・定着・拡大を設計する 定着 導入 拡大 Normalize Adopt テスト・デプロイ・監視を テンプレートで試す 自動化 Scale

    複数の製品へ広げる 各段階で、設計判断を3点に整理して記録する 前提 見送った案 見直す条件 個人の構成をチームの基盤として整える取り組みは、Platform Engineeringと呼ばれる 38 ©Fusic Co., Ltd.
  18. 現在の構成で、設計判断を確認する ドメインごとにAWSアカウントを分離 共通テンプレートから、同型のサービスを展開 レガシー 基幹 S3 CSV SQS Lambda Aurora

    取り込み ドメインDB DLQ ⼿動で復旧 ドメイン=業務の領域。既存側はCSVを置くだけ。SQSが受け付けと処理を分離し、失敗したメッセージはDLQ(隔離用キュー)へ退避させ、手動復旧 基幹にサーバーレスを選んだ理由:管理する実行基盤を最小化し、人が入れ替わっても運用し続けられるようにするため 39 ©Fusic Co., Ltd.
  19. 時刻の条件で更新の順序を守る。削除は守れない 差分処理は実装済み・未使用。同時実行数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.
  20. 受信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.
  21. 冪等キーが守るのは、応答のキャッシュだけ 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.
  22. 原因を修正し、対象と処理順序を確認して復旧する 担当者が確認 DLQ アラームで検知 復旧は手動 失敗原因の修正 対象ファイル 並行する取り込み 固定のS3キー Lambda

    最新の内容を再読込 全件洗い替え 全件洗い替えは手動で復旧。 差分の運用は、キーの使い方と処理順序を導入前に定める 44 ©Fusic Co., Ltd.
  23. 前提と見直す条件があれば、次の担当者も判断できる 初版 前提 約2か月後に改訂 大量なのは初回だけ 日次は少量 見送った案 日次処理へのCOPY導入 見直す条件 日次の性能不足が

    実測で判明 前提が 崩れた 日次も 1,000万件規模 ECS Run Task + COPY による一括MERGEへ ADR=設計判断を記録する文書 COPY=PostgreSQLの一括取り込み命令 46 ©Fusic Co., Ltd.
  24. 判断するAIの登場で、サーバーレスの価値は上がる 引き継ぐのは「判断」— その判断を、AIも行う時代になった 判断専用AIが必要とするもの サーバーレスが持っているもの イベントを契機に行う判断 S3 PUT → SQS

    → Lambda のイベント駆動 断続的に呼ばれる判断 従量課金と自動スケール 自動実行と人の境界(閾値) コードに残した規則と記録 (CI・ADR) 人のために整えた基盤は、そのままAIのプラットフォームになる 「Jev」(TypeSafe AI・2026年9月発表)は、確信度つきの判断を返す判断専用AI。 CNCFもAIエージェントがプラットフォームの利用者になると述べている。 「価値が上がる」は実際に動かして確かめた結果 48 ©Fusic Co., Ltd.
  25. このJevのデモは、実際にサーバーレスで動いている 構成 静的画面+判断APIのPOST 1本 S3+CloudFront → API Gateway → Lambda

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