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

大規模サーバーレスプロジェクトのリアルな零れ話

 大規模サーバーレスプロジェクトのリアルな零れ話

2025/05/10
Serverless Meetup Fukuoka #5
https://serverless.connpass.com/event/348712/

Avatar for mai miya

mai miya

May 10, 2025
Tweet

More Decks by mai miya

Other Decks in Technology

Transcript

  1. 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!!
  2. 7 大変だったこと 多くのイベントタイ7 B API Gatewa% B Kinesis Data Stream

    B DynamoDB Stream B S3→SNS→SQ B S3→EventBridge→SNS→SQS Lambdaの数が30以上 複数アカウント・リージョンに展開
  3. 8 大変だったこと 多くのイベントタイ7 B API Gatewa% B Kinesis Data Stream

    B DynamoDB Stream B S3→SNS→SQ B S3→EventBridge→SNS→SQS Lambdaの数が30以上 複数アカウント・リージョンに展開 規模が大きい
  4. 13 実行コンテナの使い回しを実感 こんなコードを書いていました (Python) 一回目の実行結果 二回連続でリクエストを送ると・・・? (一回目と同じ結果のはず!) response = {“result”:

    []} def main(event, context): result = { “hoge”: “fuga” } response.append(result) return response response = { “result”: [{“hoge”: “fuga”}] }
  5. 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”}, ] }
  6. 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”}, 増えた!
  7. 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()の外での初期化は行われない…!
  8. 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" } }
  9. 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
  10. 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
  11. 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
  12. 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/
  13. 37 メンタルモデルの共有の難しさ 大規模サーバーレスPJにおける「メンタルモデル」の共有 イベント駆動で があるからこそ、 プロジェクト固有の「メンタルモデル」0から形成する必要がある むずかしい! 自由度・柔軟性 フレームワークを使用しない プロジェクト独自の構成

    複雑で多様なイベント (どこから何を受け取ってどう処理する?) 正解はないからこそ手探り 【やったこと】 仕様や構成を可視化する PRのレビューを通して理解してもらう 「分かりやすく言い換え」をあえてしない