Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

AWS Lambdaと歩んだ“サーバーレス”と今後 #lambda_10years

吉田真吾
November 13, 2024

AWS Lambdaと歩んだ“サーバーレス”と今後 #lambda_10years

AWS Lambda 10周年記念生誕祭
https://serverless-newworld.connpass.com/event/320224/

吉田真吾

November 13, 2024
Tweet

More Decks by 吉田真吾

Other Decks in Technology

Transcript

  1. 吉田真吾 n バックグラウンド 証券システム基盤開発 p基盤システム開発、Oracleチューニング エバンジェリスト‧ソリューションアーキテクト pAWS設計‧構築‧移⾏ pエバンジェリスト‧SA スタートアップCTO p技術経営‧組織開発

    pタレントマネジメントSaaS 開発‧運⽤ n 現在のしごと (株) セクションナイン 代表取締役CEO (株) ジェネラティブエージェンツ 取締役COO n 実績等 pAWSウルトラクイズ 初代チャンピオン pAWS Samurai 2014 / 2016 pAWS Serverless Hero p講演、執筆多数
  2. ·ΔͰΫϥ΢υͰ૸ΔϚΫϩݴޠʮ"84-BNCEBʯൃද • ೥຤ SF*OWFOU ʹͯൃද • /PEFKT • Πϕϯτιʔεɿ •

    4όέοτ • %ZOBNP%#ςʔϒϧ • ,JOFTJTετϦʔϜ • ϗετɿඇެ։ -JOVYϕʔε • ϝϞϦɿ.#ʙ (# • λΠϜΞ΢τɿʙඵ • Ұ࣌ετϨʔδɿ.# • ϝϞϦʹൺྫͯ͠$16ωοτ ϫʔΫͷׂ౰ͯ΋ଟ͘ͳΔ https://www.publickey1.jp/blog/14/aws_lambdaaws_reinvent_2014.html
  3. 'VODUJPOTBTB4FSWJDFͷ୆಄ • ಛ௃ • ࣮ߦ؀ڥ͸ӅṭˍϓϥοτϑΥʔϜ؅ཧͰɺඞཁͳͷ͸ίʔυͷΈ • ίϯςφϕʔεͰௐୡϦʔυλΠϜΛ୹ॖ • ෼ࢄ࣮ߦ؀ڥʹΑΔՄ༻ੑͷ֬อ •

    ࣮ߦ࣌ؒͷΈ՝ۚʹΑΔίετ௿ݮ • ΞʔΩςΫνϟʹ͓͚Δ੹຿ • 4UBUFGVM 4UBUFMFTT΁ • Ӭଓσʔλ شൃੑ • ϞϊϦγοΫ .JDSPTFSWJDFT • όονॲཧ ΠϕϯτυϦϒϯ https://aws.amazon.com/jp/about-aws/events/reinvent-report-2014-pt2/
  4. "84-BNCEB αʔόʔϨεɾϚχϑΣετ  ϑΝϯΫγϣϯ͸σϓϩΠ୯Ґ֦ுՄೳ୯ҐͰ؅ཧ͢Δ  ػث΍Ծ૝αʔόʔ΍ίϯςφ͕ϓϩάϥϛϯάϞσϧ͔Βݟ͑ ͯ͸͍͚ͳ͍  σʔλΛӬଓԽ͢ΔετϨʔδ͸ଞͷ৔ॴʹ֬อ͢Δ 

    ϦΫΤετ୯Ґʹεέʔϧ͕؅ཧ͞ΕΔɻϢʔβʔ͸Ωϟύγ ςΟͷௐୡෆ଍΋௒ա΋͠ͳ͍  ΞΠυϧ࣌ؒʹ՝ۚ͞Εͯ͸͍͚ͳ͍ʢ଴ػαʔόʔίϯςφ΍ ՝ۚʣ  ϑΝϯΫγϣϯ͸Ͳ͜Ͱ΋࣮ߦͰ͖ΔͷͰɺ҉໧తʹ଱ো֐ੑΛ ࣋ͭ  #SJOHZPVSPXODPEFίʔυ͚ͩ࣋ͪࠐΊ͹͍͍  ϝτϦΫεऩू΍ϩάऔಘ͸ઈରతਖ਼ٛͰ͋Δ
  5. "84-BNCEB :&4 • ಠཱͨ͠ϑΝϯΫγϣϯ • 3&45GVM"1*͔ ΠϕϯτυϦϒϯ • #:0$ ίʔυΛ࣋ͪࠐΉ͚ͩ

    • ෳࡶͳΞϧΰϦζϜͰ؅ཧ • ਫฏεέʔϧ • ಉظඇಉظεέδϡʔϦϯά /0 • αʔόʔ্ͰՔಇ • ϞϊϦγοΫͳUBSϘʔϧʹͳͬ ͍ͯΔ • ϞϊϦγοΫͳσϓϩΠํ๏ • ॏྔڃϑϨʔϜϫʔΫ • ෼ࢄ഑෍͞ΕͨγεςϜίʔυ • ୯ௐ࡞ۀʢϩάऔಘͳͲʣ͕ඞ ཁ αʔόʔϨεΞϓϦέʔγϣϯ͔Ͳ͏͔
  6. 8FC 6*υϦϒϯ ΞϓϦέʔγϣϯ #BDLFOE'PS'SPOUFOEͰαʔόʔϨ ε׆༻  ೝূϩδοΫΛ#BB4Ͱஔ׵͑  %ZOBNP%#ʹΫϥΠΞϯτ͔Β௚ ઀ΞΫηε͢ΔΑ͏ʹ

     େ൒ͷϩδοΫΛΫϥΠΞϯτͷ γϯάϧϖʔδΞϓϦέʔγϣϯ ʹ 69ʹؾΛ͚ͭΔ ͯ͠αʔόʔ ଆ͸"1*(BUFXBZͰଋͶΔ  ݕࡧػೳΛ'BB4্ʹ  ηΩϡϦςΟͷߟྀͰ՝ۚ͸ผ%# ʹผ'BB4ͰΞΫηε͢ΔΑ͏ʹ http://martinfowler.com/articles/serverless.html
  7. www.example.com Amazon Route 53 Amazon S3 (Static Website) Google+ profile

    Cognito Identity Pools Lambda DynamoDB SPA 41"ʴαʔόʔϨεߏ੒
  8. αʔόʔαΠυॲཧෆཁ [index.html] イベント ループ Javascript [app.js] [app_spec.js] イベントを トリガする リクエスト

    コールバック 関数の起動 入力の取得 マークアップの変更 マークアップのテスト public ├── index.html ├── app.js ├── tests │ ├── SpecHelper.js │ ├── app_spec.js │ ├── index.html │ └── lib │ ├── jasmine-2.3.4 │ │ ├── boot.js │ │ ├── console.js │ │ ├── jasmine-html.js │ │ ├── jasmine.css │ │ ├── jasmine.js │ │ └── jasmine_favicon.png │ └── jquery-2.1.4.js └── vendor.js
  9. 'use strict'; var learnjs = {}; learnjs.problemView = function() {

    return $('<div class="problem-view">').text('Coming soon!'); } learnjs.showView = function(hash) { var routes = { '#problem-1': learnjs.problemView }; var viewFn = routes[hash]; if (viewFn) { $('.view-container').empty().append(viewFn()); } } ςετۦಈ [tests/app_spec.js] describe('LearnJS', function() { it('can show a problem view', function() { learnjs.showView('#problem-1'); expect($('.view-container .problem-view').length).toEqual(1); }); it('shows the landing page view when there is no hash', function() { learnjs.showView(''); expect($('.view-container .landing-view').length).toEqual(1); }); }); テスト ϧʔτͷଘࡏνΣοΫˠςετɿΤϥʔ ˠϧʔτͷ࣮૷ˠςετɿਖ਼ৗ [app.js] 実装
  10. $PHOJUP "84-BNCEB  (PPHMF"QQ &OHJOF 1SFWJFX 8IZ5IF'VUVSF0G4PGUXBSF "OE"QQT*T4FSWFSMFTT ϑϩϯτΤϯυͷओઓ৔Խʹ ൐͏όοΫΤϯυͷύʔπԽ

     "NB[PO4   "1*(BUFXBZ ,JOFTJT'JSFIPTF   $MPVE8BUDI&WFOUT &WFOU#SJEHF 4UFQ'VODUJPOT "UIFOB (MVF  "VSPSB4FSWFSMFTT7 "QQ'MPX 1SPUPO  "QQMJDBUJPO $PNQPTFS 0QFO4FBSDI 4FSWFSMFTT  #FESPDL "QQ'BCSJD ##%BUB*OUFSDIBOHF &MBTUJ$BDIF 4FSWFSMFTT  "QQ4ZOD "84'BSHBUF 4FSWFSMFTT"QQMJDBUJPO3FQPTJUPSZ lͪΐͬͱzαʔόʔϨε΋ αʔόʔϨε ΠϕϯτϧʔςΟϯάɺϑΣσϨʔ γϣϯɺεςʔτϚγϯͳͲͷਐԽ $%/ΤοδͷαʔόʔϨε 7 8BTN CZ4IJOHP٢ాਅޗ !"844FSWFSMFTT)FSP <ࢀߟࢿྉ> 'JHIUJOHPGGGBVYTFSWFSMFTTCBOEJUTXJUIUIFUSVFEFGJOJUJPOPGTFSWFSMFTT IUUQTXXXHPNPNFOUPDPNCMPHGJHIUJOHPGGGBLFTFSWFSMFTTCBOEJUTXJUIUIFUSVFEFGJOJUJPOPGTFSWFSMFTT Ί΋͓͖͹5FDI3FQPSU ʮαʔόʔϨεͷ࣍͸ͳΜͳΜͩʯ IUUQTOFLPSVSJCPPUIQNJUFNT
  11. 4FSWFSMFTT$PNNVOJUZ +1 ΧϯϑΝϨϯε • 4FSWFSMFTTDPOG 5PLZP • 4FSWFSMFTTDPOG 5PLZP •

    4FSWFSMFTT%BZT 5PLZP • 4FSWFSMFTT%BZT 5PLZP • 4FSWFSMFTT%BZT 'VLVPLB • 4FSWFSMFTT5PLZP  7JSUVBM • 4FSWFSMFTT5PLZP • 4FSWFSMFTT5PLZP .FFUVQ • 4FSWFSMFTT.FFUVQ5PLZP • 4FSWFSMFTT.FFUVQ0TBLB • 4FSWFSMFTT.FFUVQ4BQQPSP • 4FSWFSMFTT.FFUVQ'VLVPLB • 4FSWFSMFTT.FFUVQ/BHPZB • 4FSWFSMFTT.FFUVQ+BQBO 7JSUVBM
  12. ιϑτ΢ΣΞΞʔΩςΫνϟͱͯ͠ͷಛ௃ n マイクロサービス指向 • ⼩規模で⾃律的なシステム • 1つの⽬的にフィットしている n リアクティブなアーキテクチャ •

    リクエストルーティング機能(バインド/トリガ/ファンアウト)∕ランタイム∕状態管理∕ 永続ストレージを「分離」することでコードをメンテナンスしやすい状態に維持し、⽣産性 を向上する n 認証‧認可にもとづくリソースアクセス • サービス間のアクセスは認証サービスから取得した委任トークンを⽤いて認可される (SAML / OpenID Connect) n DRY • 競争⼒を得られない汎⽤機能のアウトソース
  13. Usecases of Serverless Architecture  8FCΞϓϦέʔγϣϯ • 41" • 3&45"1*

     ӡ༻ۀ຿  Ϗοάσʔλܥ • ετϦʔϜσʔλॲཧ • &5-ॲཧɺେن໛ΫΤϦॲཧ  ϞόΠϧɾ*P5ͷόοΫΤϯυ  ΞϓϦέʔγϣϯ࿈ܞͷόοΫΤϯυ • 76* • $IBUCPU
  14. upload.example.com Amazon Route 53 Amazon S3 (Static Website) Cognito User

    Pools Lambda RDS アップロード画⾯ Amazon S3 イベント発⽕
  15. 3&45"1* カスタマー S3 CloudFront DynamoDB Lambda function API Gateway Amazon

    Cognito 認証‧認可 SPA REST API CodePipeline CodeBuild CodeDeploy 開発者 CloudFormation テンプレート Swagger.yml • API BlueprintによるAPI Docの⾃動最新化 • newmanでAPIの⾃動テスト Functionコード
  16. όονॲཧ upload.example.com Amazon Route 53 Amazon S3 (Static Website) Cognito

    User Pools Lambda RDS アップロード 画⾯ Amazon S3 イベント発⽕ • ⼀覧画⾯や詳細画⾯とCSVアップロード∕ダウンロードが 同⼀アプリに載っている • php-fpmやunicornのワーカーの設定チューニングが⼤変 (重たい処理に合わせないといけない)
  17. 10X Product Development • 最優先 = Product Market Fit •

    10X ソフトウェア開発者は存在しない • 10X 製品開発はできる • ビジネスコード開発に時間を使う • 顧客とのイテレーションを最⼤化する • 依存性の最⼩化:仕様確定待ち、DBA 待ちなどを避ける IUUQXXXTMJEFTIBSFOFU4FSWFSMFTT$POGKPFFNJTPOYQSPEVDUEFWFMPQNFOU
  18. 10X Product Development • Commercial Search • 2⼈の開発者 x 4ヶ⽉

    • TypeScript 13,307⾏ • 開発者の稼働 95%以上 • Microservices的だが⾃分たちはコアだけ • 構成 • Auth: Firebase • Static Site Hosting: Netlify • 画像管理: Cloudinary • 検索: Algolia • ペインポイント • 製品ごとのラーニングカーブ IUUQXXXTMJEFTIBSFOFU4FSWFSMFTT$POGKPFFNJTPOYQSPEVDUEFWFMPQNFOU
  19. 4FSWFSMFTT "QQMJDBUJPO-FOT 8FMM"SDIJUFDUFE'SBNFXPSL • "84ͰαʔόʔϨεΞϓϦέʔγϣϯΛ͍͔ʹʮઃ ܭʯʮσϓϩΠʯʮΞʔΩςΫτʯ͢Δ͔ʹϑΥʔΧ εͨ͠ 8FMM"SDIJUFDUFE'SBNFXPSLผࢴ • ίϯϐϡʔςΟϯά૚σʔλ૚ετϦʔϜ૚Ϣʔ

    βʔ؅ཧ૚ϞχλϦϯά૚γεςϜ؅ཧ૚Τοδ૚ • ઃܭݪଇ • 'VODUJPO͸୯Ұ໨తͰγϯϓϧʹ࡞Δ • ෼ࢄɾฒྻͰॲཧ͕ՄೳͳΑ͏ʹ࡞Δ • γΣΞʔυφογϯά εςʔτϨε • ϋʔυ΢ΣΞͷ࢓૊ΈΛҙࣝ͠ͳ͍࡞Γ $16ϑϥάͳͲ • 'VODUJPOͰ͸ͳ͘εςʔτϚγϯΛ࢖ͬͯΞϓϦΛΦʔέετ Ϩʔτ͢Δ • ඇಉظͳΠϕϯττϦΨʔΛ׆༻͢Δ ϙʔϦϯάͱ͔͠ͳ͍ • ϦτϥΠલఏͰ΋΂͖౳ͳಈ࡞͕อূ͞ΕΔ࡞Γ • αʔόʔϨεͷϢʔεέʔε Serverless Application Lens https://d1.awsstatic.com/whitepapers/architecture/AWS-Serverless-Applications-Lens.pdf Serverless Applications Lens AWS Well-Architected Framework November 2017
  20. すべてがサーバーレスかつNoOpsになるか? トレードオフへの対応 IUUQXXXTMJEFTIBSFOFU4FSWFSMFTT$POGDIBSJUZIPVOETFSWFSMFTTOPPQTUIFUPPUIGBJSZ n トレードオフ • 可視性が下がる → 適切な運⽤監視の計画 •

    ⾃分⾃⾝で問題を修復できない → リスクの把握、追加対策の実施 • 制約が明⽂化されていない可能性 → ⼗分な利⽤可否調査 • 共同利⽤‧アイソレーションの問題 → ⼗分な利⽤可否調査、ヒアリング、第三者認証、 監査レポートなど • ツールの未成熟さ → エコシステムの学習、⽀援、適切なツールチェー ンの構築
  21. 1990年代 2013 2018 2020 統計的⾔語モデル ニューラル⾔語モデル 事前学習済み⾔語モデル ⼤規模⾔語モデル(LLM) 特定タスク⽀援 n-gram⾔語モデル

    統計的⼿法 確率推定 特定のタスク⽤途 タスクに依存しない 機能学習 Word2Vec (NPLM), NLPS 静的な単語の関連性 ニューラル⾔語モデル 特定のNLPタスク⽤途 タスク 解決 能⼒ 転移学習をもちいた NLPによるタスク解決 ELMO, BERT, GPT-1/2 コンテキスト表現 事前学習+ファイン チューニング さまざまなNLPタスク ⽤途 汎⽤的なタスク解決 GPT-3/4, ChatGPT, Claude ⾔語モデルの規模拡⼤ プロンプトによる⽳埋め さまざまな実世界のタスク ⽤途 A Survey of Large Language Models https://arxiv.org/abs/2303.18223
  22. 3F"DU4ZOFSHJ[JOH3FBTPOJOHBOE"DUJOHJO-BOHVBHF .PEFMT  • ݕূύλʔϯ B 3FBTPOͳ͠ɺ"DUͳ͠ C 3FBTPOͷΈ D

    "DUͷΈ E 3FBTPO͋Γɺ"DU͋Γ 3F"DU • "QQMF3FNPUFͷ΄͔ʹɺ"QQMF 3FNPUF͕΋ͱ΋ͱ૬ޓ࡞༻͢ΔΑ ͏ʹઃܭ͞ΕͨϓϩάϥϜΛ੍ޚͰ ͖ΔσόΠε͸͋Γ·͔͢ʁ ˠ3F"DUͷΈਖ਼ղ https://arxiv.org/abs/221
  23. あなたは部屋の中央にいます。すばやく周囲を⾒てみるとキャビネット#6、キャビネット#1、コーヒーマシン#1、カウンター#3、ガスコン ロ#1、トースター#1があります。 あなたのタスクは: 胡椒⼊れを引き出しに⼊れてください。 (2) AlfWorld ⾏動 1: 引き出し#1に⾏きます。 観察

    1: 引き出し#1は閉まっています。 ⾏動 2: 引き出し#1を開きます。 観察 2: 引き出し#1を開きました。引き出し#1は開いています。中に⾷ 器洗いスポンジ#2とスプーン#1が⼊っています。 ⾏動 3: キッチンシンク#1に⾏きます。 観察 3: キッチンシンク#1の上に⾷器洗いスポンジ#3と、ヘラ#1と、ス プーン#2があります。 ⾏動 4: キッチンシンク#1から胡椒⼊れ#1を⼿に取ります。 観察 4: なにも起きません。 ⾏動 5: キッチンシンク#1から胡椒⼊れ#1を⼿に取ります。 観察 5: なにも起きません。 (2a) Act のみ ⾏動 1: 思考[まず胡椒⼊れを⾒つける必要があります...キャビネット (#1-6)やカウンター(#1-3)や...にあるかもしれません。] ⾏動 2: キャビネット#1に⾏きます。 観察 2: キャビネット#1の上に花瓶#2があります。 (ここでエージェントはキャビネット#1に⾏き、キャビネット#2,#3、そ してカウンター#1,#2に⾏きます。) ⾏動 6: カウンター#3に⾏きます。 観察 6: カウンター#3の上にりんご#1、パン#1,...胡椒⼊れ#1,花瓶#3が あります。 思考 7: カウンター#3から胡椒⼊れ#1を⼿に取ります。 観察 7: カウンター#3から胡椒⼊れ#1が⼿に⼊りました。 ⾏動 8: 思考[胡椒⼊れ#1が⾒つかりました。次に、これを引き出し#1に ⼊れる必要があります。] ⾏動 9: 引き出し#1に⾏きます。 観察 9: 引き出し#1は閉まっています。 ⾏動 10: 引き出し#1を開けます。 観察 10: 引き出し#1を開いています... ⾏動 11: 胡椒⼊れ#1を引き出し#1に⼊れます。 観察 11: 胡椒⼊れ#1を引き出し#1に⼊れました。✔ (2b) ReAct (Reason + Act)
  24. "*ΤʔδΣϯτͷ࣮૷Ξϓϩʔν ׬શͳ3F"DUΤʔδΣϯτ • ෳࡶͳ໨ඪʹ޲͔ͬͯҎԼͷ ͢΂ͯΛ--.Ͱ੍ޚ ɾ؍࡯ 0CTFSWF ˠࢥߟ 5IJOL<3FBTPOJOH> ˠߦಈ

    "DU ΦʔέετϨʔλʔʴ--. • ͭҎ্ͷΞΫγϣϯΛܾఆతͳ ΦʔέετϨʔλʔͰ੍ޚ • --.ʹΑΔΞΫγϣϯ • ೝ஌ɾ؍࡯ • λεΫͷܭը΍'VODUJPOͷબ୒ • λεΫͷ࣮ߦ • ଟ͘ͷϚϧνΤʔ δΣϯτϑϨʔϜ ϫʔΫ • -BOH(SBQI • "HFOUTGPS #FESPDL • 4UFQ'VODUJPOT #FESPDL
  25. メモリ 実⾏エージェント (GPT-4) (1) タスクと実⾏結果のペアを保存 (2) コンテキスト情報をメモリから読み出す 3. タスクの実⾏結果を送信する タスク作成エージェント

    (GPT-4) タスクキュー ユーザー 1. ⽬標やタスクを与える 2. タスクを実⾏させる コンテキスト情報 4 新しいタスクを追加 優先度づけエージェント (GPT-4) コンテキスト情報を メモリから読み出す コンテキスト情報 5. タスク優先度をつける 6. タスクを消す Task-driven Autonomous Agent https://yoheinakajima.com/task-driven-autonomous-agent-utilizing-gpt-4-pinecone-and-langchain-for-diverse-applications/ Baby AGI
  26. A1. 数学の問題を解く 学⽣ アシスタント 専⾨家 アシスタント 専 ⾨ 家 に

    聞 く 検索拡張 プロキシ 検索拡張 アシスタント A2. 検索拡張チャット ALFWorld 実⾏マシン A3. 意思決定 アシスタント グラウンディング エージェント 指揮官 A4. マルチエージェントコーディング ライター 護衛 マネージャー A5. 動的グループチャット ⼀⻫配信 会話 チェス盤 A6. 対話型チェス プレイヤー A プレイヤー B AutoGen
  27. Conditional Edge 実⾏待ち ノード Eメールの 新着チェック Eメール取得 ノード ノード Eメール

    クルー Eメール解析 フィルタリング 全スレッド取得 調査実施 下書き作成 crewAI + LangGraph https://github.com/crewAIInc/crewAI-examples/tree/main/CrewAI-LangGraph
  28. 1. LLMアプリケーション開発の基礎 2. OpenAI APIの基礎 3. プロンプトエンジニアリング 4. LangChainの基礎 5.

    LCEL徹底解説 6. RAGアプリ開発実践 7. LangSmith 8. AIエージェントとは? 9. LangGraphでつくるAIエージェント実践入門 10.LangGraphでつくる要件定義生成AIエージェント 11.エージェントデザインパターン 12.LangChain/LangGraphで実装するエージェント デザインパターン 【好評発売中!】