Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
大規模サーバーレスプロジェクトのリアルな零れ話
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
maimyyym
May 10, 2025
Technology
460
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
大規模サーバーレスプロジェクトのリアルな零れ話
2025/05/10
Serverless Meetup Fukuoka #5
https://serverless.connpass.com/event/348712/
maimyyym
May 10, 2025
More Decks by maimyyym
See All by maimyyym
組織内の開発ポリシーを 整えるはじめの一歩
maimyyym
1
74
未来の自分と明日の誰かへ繋ぐ、非連続的なキャリアと再現性の分析
maimyyym
0
170
AWSを使う上で最低限知っておきたいセキュリティ研修を社内で実施した話 ~みんなでやるセキュリティ~
maimyyym
3
2.4k
大規模サーバーレスAPIの堅牢性・信頼性設計 〜AWSのベストプラクティスから始まる現実的制約との向き合い方〜
maimyyym
11
6.4k
Amazon Inspector コードセキュリティで手軽に実現するシフトレフト
maimyyym
0
850
組織とセキュリティ文化と、自分の一歩
maimyyym
3
1.7k
ABWG2024採択者が語るエンジニアとしての自分自身の見つけ方〜発信して、つながって、世界を広げていく〜
maimyyym
1
610
re:Invent2024で広がった AWS Verified Accessの可能性を探る
maimyyym
1
380
“自分”を大切に、フラットに。キャリアチェンジしてからの一年 三ヶ月で見えたもの。
maimyyym
0
550
Other Decks in Technology
See All in Technology
自律型AIエージェントは何を破壊するのか
kojira
0
130
「嘘をつくテスト」の失敗例から学ぶ 良いテストコード #frontend_phpcon_do
asumikam
0
600
日本 Fintech 未来予測レポート 2027〜2028年(オリジナル版)
8maki
0
190
Sync と Async ─ useSyncExternalStore を使う者の岐路
kakehashi
PRO
1
100
サイバーセキュリティ概論 / Introduction to Cybersecurity
ks91
PRO
0
170
非エンジニアがClaudeと挑んだ「1ヶ月間プロダクト30本ノック」
askokc
0
160
MCP Appsを作ってみよう
iwamot
PRO
4
350
noUncheckedIndexedAccess、3時間、1万円。 / noUncheckedIndexedAccess, 3 Hours, 10,000 JPY.
kaonavi
1
340
NAB Show 2026 動画技術関連レポート / NAB Show 2026 Report
cyberagentdevelopers
PRO
0
140
「速く作る」から「正しく作る」へ ─ 生成AI時代の開発フロー改革の ロードマップと実行 ─
starfish719
0
9.5k
Reliability in the Age of AI: Engineering for AI Velocity
rrreeeyyy
0
120
2026TECHFRESH畢業分享會 - AI 時代的人生存檔點
line_developers_tw
PRO
0
150
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
230
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
280
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
Un-Boring Meetings
codingconduct
0
310
The Limits of Empathy - UXLibs8
cassininazir
1
350
How to make the Groovebox
asonas
2
2.2k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
290
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.7k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
Transcript
2025.05.10 @maimyyym Mai Miyazaki 大規模サーバーレスプロジェクトの リアルな零れ話 Serverless Meetup Fukuoka #5
2 Introduction 宮 崎 真 衣 HN: mai (@maimyyym )
株式会社Fusic (2023.10〜) 事業本部 技術創造部門 / エンジニア MAI MIYAZAKI ◉ I am ◉ Skill ◉ Commenh m IDDM(1型糖尿病) 3歳発 元百貨店スタッフ(Beauty Counselor AWS Community Builder(Security) 2025- m AWS / Python / PHP(Laravel) 最近野球観戦にハマりました⚾️ Click!!
3 今日のおはなし 大規模サーバーレスプロジェクトを経験して ちょっとした気づきと学び
4 最近のお仕事 サーバーレスプロジェクトの PM兼デベロッパーといったロールで動いています こんな感じの構成(イメージ) 比較的簡単な、よくあるサーバーレス構成
5 最近のお仕事 サーバーレスプロジェクトの PM兼デベロッパーといったロールで動いています こんな感じの構成(イメージ) 比較的簡単な、よくあるサーバーレス構成 ・・・と思っていた
6 最近のお仕事 サーバーレスプロジェクトの PM兼デベロッパーといったロールで動いています こんな感じの構成(イメージ) 比較的簡単な、よくあるサーバーレス構成 いっぱいある しかもクロスアカウント! あらゆるイベントタイプを網羅
7 大変だったこと 多くのイベントタイ7 B API Gatewa% B Kinesis Data Stream
B DynamoDB Stream B S3→SNS→SQ B S3→EventBridge→SNS→SQS Lambdaの数が30以上 複数アカウント・リージョンに展開
8 大変だったこと 多くのイベントタイ7 B API Gatewa% B Kinesis Data Stream
B DynamoDB Stream B S3→SNS→SQ B S3→EventBridge→SNS→SQS Lambdaの数が30以上 複数アカウント・リージョンに展開 規模が大きい
9 大変だったこと 大変だったこと
10 大変だったこと 変数上書きで実行コンテナの使い回しを実感 デプロイしないと分からない「実際のイベント構造」 メンタルモデルの共有の難しさ
11 大変だったこと 変数上書きで実行コンテナの使い回しを実感 デプロイしないと分からない「実際のイベント構造」 メンタルモデルの共有の難しさ
12 実行コンテナの使い回しを実感 AWS Lambdaでは、関数を実行するコンテナは 「使い捨て」ではなく「使い回し」 def main(event, context): def main(event,
context): def main(event, context): def main(event, context): def main(event, context): def main(event, context): ×
13 実行コンテナの使い回しを実感 こんなコードを書いていました (Python) 一回目の実行結果 二回連続でリクエストを送ると・・・? (一回目と同じ結果のはず!) response = {“result”:
[]} def main(event, context): result = { “hoge”: “fuga” } response.append(result) return response response = { “result”: [{“hoge”: “fuga”}] }
14 実行コンテナの使い回しを実感 こんなコードを書いていました (Python) 一回目の実行結果 二回目の実行結果 response = {“result”: []}
def main(event, context): result = { “hoge”: “fuga” } response.append(result) return response response = { “result”: [{“hoge”: “fuga”}] } response = { “result”: [ {“hoge”: “fuga”}, {“hoge”: “fuga”}, ] }
15 実行コンテナの使い回しを実感 こんなコードを書いていました (Python) 一回目の実行結果 二回目の実行結果 response = {“result”: []}
def main(event, context): result = { “hoge”: “fuga” } response.append(result) return response response = { “result”: [{“hoge”: “fuga”}] } response = { “result”: [ {“hoge”: “fuga”}, ] } {“hoge”: “fuga”}, 増えた!
16 実行コンテナの使い回しを実感 こんなコードを書いていました (Python) 一回目の実行結果 最初の一回だけ 二回目の実行結果 response = {“result”:
[]} def main(event, context): result = { “hoge”: “fuga” } response.append(result) return response response = { “result”: [{“hoge”: “fuga”}] } response = { “result”: [ {“hoge”: “fuga”}, ] } {“hoge”: “fuga”}, 増えた! 実行コンテナが使い回され、 関数 = main()だけが実行される。 main()の外での初期化は行われない…!
17 実行コンテナの使い回しを実感 Lambdaの「実行コンテナ」の概念とPythonの言語仕様を APIの振る舞いを通して実感した(知ってはいたけど…!)
18 大変だったこと 変数上書きで実行コンテナの使い回しを実感 デプロイするまで分からない「実際のイベント構造」 メンタルモデルの共有の難しさ
19 大変だったこと 変数上書きで実行コンテナの使い回しを実感 デプロイするまで分からない「実際のイベント構造」 メンタルモデルの共有の難しさ
20 デプロイするまで分からない「実際のイベント構造」 イベントとなる、さまざまなAWSサービス Amazon API Gateway Amazon Kinesis Data Streams
Amazon DynamoDB Streams Amazon SQS Amazon S3 Amazon EventBridge Amazon SNS
21 デプロイするまで分からない「実際のイベント構造」 Lambda関数が受け取るイベントのJSON構造 Amazon API Gateway { "headers": { "X-Forwarded-Host":
"example.com", "X-Forwarded-Proto": "https" }, "resource": "/v1/users/{user_id}.json", "requestContext": { "resourcePath": "/v1/users/{user_id}.json", "path": "/v1/users/12345.json", "protocol": "HTTP/1.1", "requestTimeEpoch": 1728054000000 }, "pathParameters": { "user_id": "12345.json" } }
22 デプロイするまで分からない「実際のイベント構造」 Lambda関数が受け取るイベントのJSON構造 { "kinesis": { "partitionKey": "partitionKey-03", "kinesisSchemaVersion": "1.0",
"data": base64.b64encode( "sequenceNumber": "xxxxxxxxxxxxxxx "approximateArrivalTimestamp": 1428537600, }, "eventSource": "aws:kinesis", "eventID": "shardId-000000000000:xxxxxxxx", "invokeIdentityArn": "arn:aws:iam::EXAMPLE", "eventVersion": "1.0", "eventName": "aws:kinesis:record", "eventSourceARN": "arn:aws:kinesis:EXAMPLE", "awsRegion": "us-east-1", } Amazon Kinesis Data Streams
23 デプロイするまで分からない「実際のイベント構造」 Lambda関数が受け取るイベントのJSON構造 { "Message": "{ "Records": [ { "eventName":
"ObjectCreated:Put", "s3": { "bucket": { "name": "hoge-xxxxxxxx-bucket" }, "object": { "key": "hoge/example.html" } } } ] }" } Amazon SQS Amazon SNS Amazon S3
24 デプロイするまで分からない「実際のイベント構造」 Lambda関数が受け取るイベントのJSON構造 { "Message": "{ "detail-type": "Object Created", "detail":
{ "bucket": { "name": "hoge-xxxxxxxx-bucket" }, "object": { "key": "hoge/example.html" } }, "is_initial_data_import": true }" } Amazon SQS Amazon SNS Amazon EventBridge Amazon S3
25 デプロイするまで分からない「実際のイベント構造」 単体テストでイベントを定義しても、それが合っているかは 実際にデプロイ・起動させて初めて分かる。 実際のイベント構造に合わせて単体テストを書いていた。
26 デプロイするまで分からない「実際のイベント構造」 単体テストでイベントを定義しても、それが合っているかは 実際にデプロイ・起動させて初めて分かる。 実際のイベント構造に合わせて単体テストを書いていた。 【実際にあった、ハマりポイント】 SQSのrawメッセージ配信が有効・無効の設定によって 微妙に構造が違った。気付きづらい…!
27 デプロイするまで分からない「実際のイベント構造」 ドキュメント見るしかない
28 デプロイするまで分からない「実際のイベント構造」 ドキュメント見るしかない 各AWSサービスの仕様を知る + ドキュメントを読み慣れる いい機会でした。
29 大変だったこと 変数上書きで実行コンテナの使い回しを実感 デプロイするまで分からない「実際のイベント構造」 メンタルモデルの共有の難しさ
30 大変だったこと 変数上書きで実行コンテナの使い回しを実感 デプロイするまで分からない「実際のイベント構造」 メンタルモデルの共有の難しさ
31 メンタルモデルの共有の難しさ 「メンタルモデル」とは? > 頭の中にある「ああなったらこうなる」といった「行動のイメージ」を 表現したものである。 (Wikipediaより) 【メンタルモデルが形成できている状況とは?】 プロジェクト内でタスクを受け取ったり、仕様を共有されたり、 デバッグしたりする時に、前提知識・全体像が脳内にしっかり構築
されており、スムーズに理解できる状況のこと
32 メンタルモデルの共有の難しさ 「メンタルモデル」とは? > 頭の中にある「ああなったらこうなる」といった「行動のイメージ」を 表現したものである。 (Wikipediaより) 【メンタルモデルが形成できている状況とは?】 プロジェクト内でタスクを受け取ったり、仕様を共有されたり、 デバッグしたりする時に、前提知識・全体像が脳内にしっかり構築
されており、スムーズに理解できる状況のこと PMの立場として、新規メンバーにメンタルモデルを形成してもらい 共通認識をつくることを目指した
33 メンタルモデルの共有の難しさ Webフレームワークにおける「メンタルモデル」の共有 サーバーレスPJの話をする前に・・・ プロジェクトA プロジェクトB 同じ設計思想 ・・・ FusicではLaravelやRuby on
Railsが主に使用されるフレームワーク プロジェクトが異なっても、たいてい似たような設計思想で構築する プロジェクト固有の知識・仕様こそあるが、設計思想の点では 共通の「メンタルモデル」をみんな持っている laravel-app/ ├── app/ ├── bootstrap/ ├── config/ ├── database/ ├── public/ ├── resources/ ├── routes/ ├── storage/ ├── tests/ laravel-app/ ├── app/ ├── bootstrap/ ├── config/ ├── database/ ├── public/ ├── resources/ ├── routes/ ├── storage/ ├── tests/
34 メンタルモデルの共有の難しさ 大規模サーバーレスPJにおける「メンタルモデル」の共有 イベント駆動で があるからこそ、 プロジェクト固有の「メンタルモデル」0から形成する必要がある 自由度・柔軟性 フレームワークを使用しない プロジェクト独自の構成 複雑で多様なイベント
(どこから何を受け取ってどう処理する?)
35 メンタルモデルの共有の難しさ 大規模サーバーレスPJにおける「メンタルモデル」の共有 イベント駆動で があるからこそ、 プロジェクト固有の「メンタルモデル」0から形成する必要がある むずかしい! 自由度・柔軟性 フレームワークを使用しない プロジェクト独自の構成
複雑で多様なイベント (どこから何を受け取ってどう処理する?)
36 メンタルモデルの共有の難しさ 大規模サーバーレスPJにおける「メンタルモデル」の共有 イベント駆動で があるからこそ、 プロジェクト固有の「メンタルモデル」0から形成する必要がある むずかしい! 自由度・柔軟性 フレームワークを使用しない プロジェクト独自の構成
複雑で多様なイベント (どこから何を受け取ってどう処理する?) 正解はないからこそ手探り
37 メンタルモデルの共有の難しさ 大規模サーバーレスPJにおける「メンタルモデル」の共有 イベント駆動で があるからこそ、 プロジェクト固有の「メンタルモデル」0から形成する必要がある むずかしい! 自由度・柔軟性 フレームワークを使用しない プロジェクト独自の構成
複雑で多様なイベント (どこから何を受け取ってどう処理する?) 正解はないからこそ手探り 【やったこと】 仕様や構成を可視化する PRのレビューを通して理解してもらう 「分かりやすく言い換え」をあえてしない
38 大規模サーバーレスプロジェクトのリアルな零れ話 まとめ Lambdaの実行コンテナの概念を「実感」した Point 01 さまざまなイベントを扱ってAWSサービスへの理解が深まった Point 02 自由度・柔軟性が高いからこそ「メンタルモデル」の形成が0からになる
Point 03 AWSサービス、Web基礎、PMとして・・・学べることが多くて、お得! Point 04
39 Thank You ご清聴いただきありがとうございました We are Hiring! https://recruit.fusic.co.jp/ カジュアル面談もお気軽に! Let's
Talk!