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

ゼロベースから Laravel を用いた
 API 実装オートメーション

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for memory memory PRO
December 12, 2020
25k

ゼロベースから Laravel を用いた
 API 実装オートメーション

PHP Conference 2020 online
English Title:
How to implement automatically generation APIs with the Laravel based from full-scratch

Avatar for memory

memory PRO

December 12, 2020
Tweet

More Decks by memory

Transcript

  1. @2020 Torana, Inc. @2020 Torana, Inc. Ί΋Γʔ ϓϩμΫτ։ൃ෦ Ϛωʔδϟʔ Ί΋ΓʔͪΌΜͷϑΥʔΫݩͰ͢ɻ

    
 1)1Ͱ+7.Λ࣮૷ͨ͠ΓຊΛॻ͍ͯͨΓͯ͠ ·͢ɻೕ༮ࣇ޲͚͓΋ͪΌͷαϒεΫϦϓγϣ ϯαʔϏεΛఏڙ͢Δ5PSBOBͱ͍͏ձࣾʹ͍ ·͢ !NNS 3
  2. @2020 Torana, Inc. τϥʔφͷ՝୊ 4BB4ͰશͯΛ؅ཧ͍ͯͨ͠  ސ٬ͷ৘ใΛશͯ4BB4Ͱ؅ཧ͍ͯͨ͠  ͜ΕͰ΋'JMF.BLFS͔ΒҠ২ͨ͠ʢΒ͍͠ʣ 

    ଞػೳͱͷ࿈ܞ͸+BWB4DSJQUͰ֘౰ͷ4BB4͕ఏڙ͢Δ"1*Λ ࢖ͬͯߦ͍ͬͯͨ  "1*Λେྔʹୟͨ͘Ίސ٬ৄࡉϖʔδΛ։͘ͷʹඵఔ౓ 
 ͔͔͍ͬͯΔ 9
  3. @2020 Torana, Inc. τϥʔφͷ՝୊ ಥ೗ݱΕΔ(PPHMF"QQT&OHJOF  1)1ͷ4MJNͰ࣮૷͞Ε͍ͯͨ  ޾͍೉ಡԽ͸͞Ε͍ͯͳ͔ͬͨ 

    ͨ·ʹ"MMPXFENFNPSZTJ[FΤϥʔΛు͍ͯࢮ͵  ΠϯελϯεΛڧԽ͠ɺۚͰղܾΛ͍ͯ͠Δ 11
  4. @2020 Torana, Inc. τϥʔφͷ՝୊ ಥ೗ݱΕΔ(PPHMF"QQT&OHJOF  1)1ͷ4MJNͰ࣮૷͞Ε͍ͯͨ  ޾͍೉ಡԽ͸͞Ε͍ͯͳ͔ͬͨ 

    ͨ·ʹ"MMPXFENFNPSZTJ[FΤϥʔΛు͍ͯࢮ͵  ΠϯελϯεΛڧԽ͠ɺۚͰղܾΛ͍ͯ͠Δ 25
  5. @2020 Torana, Inc. ඞཁͳݕ౼ࣄ߲ ڞ௨Խ  $36% $SFBUF 3FBE 6QEBUF

    %FMFUF Λओ࣠ͱͯ͠ɺ"1*࡞੒ޙʹ 
 ΄΅ฤू͢Δඞཁͷͳ͍ͱ͜Ζ·Ͱڞ௨ԽΛ͢Δ  ΋ͪΖΜҰ෦ྫ֎ͳॲཧ΋͋ΔͷͰͦΕʹରԠͰ͖ΔΑ͏ʹ 
 ॊೈੑΛ࢒͢  ςʔϒϧͷεΩʔϚͱϨεϙϯεΛ߹ΘͤΔͷΛج४ʹ  Ұ෦ฦͨ͘͠ͳ͍஋΍໊લΛม͍͑ͨ৔߹ɺςʔϒϧͷεΩʔϚʹͳ͍ ΋ͷ΋ߟྀ͢Δ 49
  6. @2020 Torana, Inc. ඞཁͳݕ౼ࣄ߲ ςετ  ݎ࣮ͳΞϓϦέʔγϣϯΛ໨ࢦͨ͢Ίɺςετ΋ 
 ਖ਼ৗܥύλʔϯɺҟৗܥύλʔϯͷ྆ํΛࣗಈతʹੜ੒͢ΔΑ͏ʹ͢Δ 

    ༧Ίςετ༻ͷγʔυσʔλΛࣗಈతʹੜ੒͢ΔΑ͏ʹ  ༧Ί3%#ʹೖΕ͓ͯ͘΋ͷ  ΦϒδΣΫτΛม্͑ͨͰςετ͔Β3%#্ʹ౤ೖͰ͖ΔΑ͏ʹͯ͠ ͓͘΋ͷ 50
  7. @2020 Torana, Inc. ඞཁͳݕ౼ࣄ߲ υΩϡϝϯτ  υΩϡϝϯτॻ͍ͨΒউखʹίʔυ͕ੜ੒͞Εͯ΄͍͠ʂ  "1*ͷఆٛॻΛݩʹউखʹ"1*Λੜ੒͢ΔΑ͏ʹ 

    "1*ͷఆٛॻυΩϡϝϯτͱ͍͏ܗʹ͢Δ  ͭ·ΓΤϯδχΞ͸"1*ఆٛॻ͑͞ॻ͚͹ɺ΄΅࣮૷໘ͷίʔυΛ 
 ॻ͔ͳͯ͘ࡁΈɺΑΓݎ࣮ͳΞϓϦέʔγϣϯΛ໨ࢦ͢ํ޲ͷ 
 ίʔυΛॻ͘͜ͱʹϑΥʔΧεͰ͖Δ 51
  8. @2020 Torana, Inc. ඞཁͳݕ౼ࣄ߲ ύϑΥʔϚϯε  ݕࡧʹ֘౰͢Δͱ͜Ζ͸શจݕࡧΤϯδϯΛ࢖༻ͯ͠ύϑΥʔϚϯεΛ 
 ޲্͍ͤͨ͞ 

    શจݕࡧΤϯδϯͷϚοϐϯάఆٛΛ"1*ఆٛॻΛݩʹͯࣗ͠ಈੜ੒  ςʔϒϧͷεΩʔϚ͔ΒॏΈ෇͚ΛύλʔϯʹΑͬͯ෼͚ΔΑ͏ʹ  ྫ͑͹ސ٬ͷࢯ໊ͷ৔߹͸είΞΛΑΓॏࢹ͢ΔΑ͏ʹ  ి࿩൪߸ݕࡧͷ৔߹͸ి࿩൪߸ΛΑΓॏࢹ͢ΔΑ͏ͳ෭࡞༻Λ 52
  9. @2020 Torana, Inc. 0QFO"1*ͱ.PEFMͷ૒ํؒͰίϯόʔτͰ͖Δ࢓૊ΈΛ༻ҙ Model A 
 Attributes Normalizer 


    Recipe hasMany belongsTo belongsToMany Model B 
 Attributes Model C 
 Attributes Model D 
 Attributes Model A ͷ Attribute 
 ΛϨγϐʹ͔͚Δ ϦϨʔγϣϯؔ܎ͷϞσϧΛऔಘ͢Δ Model A ͱಉ༷ʹϨγϐʹ͔͚ͯɺಉ༷ͷॲཧΛ܁Γฦ͢ Scalar Value Model ͷ Attributes ΛͲ͏ม׵͢Δ͔Λ
 ॻ͍ͨϨγϐ Model Normalizer OpenAPI ϒϥ΢β ΞϓϦέʔγϣϯ 64
  10. @2020 Torana, Inc. 0QFO"1*ͱ.PEFMͷ૒ํؒͰίϯόʔτͰ͖Δ࢓૊ΈΛ༻ҙ OpenAPI Normalizer Model ΞϓϦέʔγϣϯ OpenAPI Model

    A 
 Attributes Normalizer 
 Recipe hasMany belongsTo belongsToMany OpenAPI Model B 
 Attributes OpenAPI Model C 
 Attributes OpenAPI Model D 
 Attributes OpenAPI Model A ͷ Attribute 
 ΛϨγϐʹ͔͚Δ ϦϨʔγϣϯؔ܎ͷϞσϧΛऔಘ͢Δ OpenAPI Model A ͱಉ༷ʹϨγϐʹ͔͚ͯɺಉ༷ͷॲཧΛ܁Γฦ͢ Scalar Value OpenAPI Model ͷ Attributes ΛͲ͏ม׵͢Δ͔Λ
 ॻ͍ͨϨγϐ ϒϥ΢β 65
  11. @2020 Torana, Inc. 0QFO"1*ͱ.PEFMͷ૒ํؒͰίϯόʔτͰ͖Δ࢓૊ΈΛ༻ҙ ࣗಈͰੜ੒͞Εͨ/PSNBMJ[FS͕େྔʹ͋Δ  ͭͷ"1*ʹ͖ͭͭ/PSNBMJ[FS͕ 
 ࣗಈͰੜ੒͞Ε·͢ 0QFO"1*

    .PEFM .PEFM0QFO"1*   ࣗಈͰੜ੒͞Εͨ΋ͷΛख௚͠Λ͢Δ ͚ͩͰඞཁͳϨεϙϯεΛ૊ΈཱͯΔ ͜ͱ͕Ͱ͖ɺผͷ։ൃʹ஫ྗͰ͖ΔΑ ͏ʹ 70
  12. @2020 Torana, Inc. Ͳ͏࡞͍͔ͬͯͬͨ .PEFMͷߋ৽࣌ʹ༷ʑͳॲཧΛ͢ΔΑ͏ʹ  σʔλ࡞੒࣌ɾߋ৽࣌ɾ࡟আ࣌ʹ͸ɺ%#ͷεΩʔϚΛϕʔεʹͨ͠ &MBTUJDTFBSDIͷΠϯσοΫεʹରͯ͠ߋ৽͕͔͔ΔΑ͏ʹ͠ɺ 
 શจݕࡧʹରͯ͠Կ΋ߟ͑ͳ͍ͰࡁΉΑ͏ʹ

     ϦϨʔγϣϯ͍ͯ͠ΔϞσϧ΋ࣗಈͰ࡞੒ɾߋ৽ɾ࡟আͳͲࣗಈతʹॲཧ ͞ΕΔΑ͏ʹͯ͠ɺϦϨʔγϣϯͷϞσϧʹରͯ͠Կ΋ߟ͑ͳ͍ͰࡁΉΑ ͏ʹ  Ωϟογϡ΋อଘɾ࡟আ͠ɺύϑΥʔϚϯεΛ༧Ί޲্͓ͤͯ͘͞ 71
  13. @2020 Torana, Inc. .PEFMͷߋ৽࣌ʹ༷ʑͳॲཧΛ͢ΔΑ͏ʹ Model A Model::saved Create or Update

    Delete Model B Model::deleted ※ AppModel ͸ Model Λܧঝͨ͠ΫϥεͰ͢ɻ͢΂ͯͷϞσϧ͸ AppModel Λܧঝ͢ΔΑ͏ʹͳ͍ͬͯ·͢ɻ Elasticsearch RDB Elasticsearch ʹ΋อଘɾ࡟আ อଘɾ࡟আ࣌ʹ݁ՌΛ༧ΊΩϟογϡ͓ͯ͘͠ Model A ʹඥ෇͚ΒΕͨ 
 Model B ΋อଘ Model A ͷΈ࡟আ 
 (Model B ͸࡟আ͠ͳ͍) Redis 72
  14. @2020 Torana, Inc. Ͳ͏࡞͍͔ͬͯͬͨ ݕࡧΫΤϦ͸͢΂ͯ&MBTUJDTFBSDI΁  %#εΩʔϚͱݕࡧΫΤϦΛϚοϐϯάͤ͞ɺΫΤϦจࣈྻ͔Β &MBTUJDTFBSDIͷݕࡧΫΤϦΛߏங͠ɺݕࡧͤ͞ΔΑ͏ʹ  ·ͨɺ͸͡Ί͔Β-BSBWFMͷSFTPVSDFͷJOEFY͸͢΂ͯ&MBTUJDTFBSDI

    Λࢀর͢ΔΑ͏ʹ͠ɺ&MBTUJDTFBSDIͷ͜ͱΛߟ͑ͳ͍Α͏ʹ  &MBTUJDTFBSDIͰݕࡧͰ͖Δ಺༰Λऔಘ͢ΔͨΊͷ"1*Λ༧Ίੜ΍͠ɺ 
 ϑϩϯτΤϯυͰݕࡧ৚݅Λ࠶ఆٛ͢ΔඞཁΛແ͘͠ɺ։ൃͷ࠷దԽ΁  ͳΔ΂͘3%#͸ࢀরͤ͞ͳ͍ 73
  15. @2020 Torana, Inc. ݕࡧΫΤϦ͸͢΂ͯ&MBTUJDTFBSDI΁ /api/v1/XXX?created_at[value][start]=2020-12-12 ... + { ... query:

    { must: [ { range: { created_at: { gte: "2020-12-12", } } } ] } ... } Elasticsearch Ϛοϐϯά͔ΒΫΤϦͷ
 ଥ౰ੑΛධՁ͠ม׵΁ Elasticsearch Ͱݕࡧ ΫΤϦจࣈྻ͔Β Elasticsearch ͷݕࡧΫΤϦʹม׵ Ϛοϐϯάʹͳ͍΋ͷ͸
 ݕࡧͤ͞ͳ͍ ϚοϐϯάͱΫΤϦจࣈྻ
 ͰͷܕͷධՁ΋͜͜Ͱߦ͏ 74
  16. @2020 Torana, Inc. ݕࡧΫΤϦ͸͢΂ͯ&MBTUJDTFBSDI΁ /api/v1/XXX + { ... query: {

    match_all: {} } ... } Elasticsearch ௨ৗͷ index ΋ Elasticsearch Λհ͢ Elasticsearch Ͱݕࡧ ݕࡧ৚͕݅ಛʹͳ͍৔߹͸ match_all Ͱ 75
  17. @2020 Torana, Inc. ݕࡧΫΤϦ͸͢΂ͯ&MBTUJDTFBSDI΁ ݕࡧ৚݅Λࣗಈੜ੒  &MBTUJDTFBSDIͰݕࡧͰ͖Δ΋ͷΛ 
 औಘ͠ɺϑϩϯτଆ͸ͨͩͦΕΛ 


    දࣔ͢Δ͚ͩ  ݕࡧ৚݅ʹ͋ͬͨϑΥʔϜΛશը໘ʹ खͰೖΕΔͷ͸ඇޮ཰ͩ͠ے೑Τϯδ χΞ͕଍Γͳ͍  ͦΕͱ७ਮʹॻ͘ͷ͕ਏ͍ 76
  18. @2020 Torana, Inc. ݕࡧΫΤϦ͸͢΂ͯ&MBTUJDTFBSDI΁ API ͷ݁Ռ͔ΒϑΥʔϜΛ࡞੒ input ͷ text ΍

    number ΛܾΊ·͢ ϦϨʔγϣϯΛϕʔεʹηϨΫτϘοΫεͷ ஋Λऔಘ͢ΔͨΊͷΤϯυϙΠϯτΛఆٛ͠ ͍ͯ·͢ type ͕ date ͷ৔߹ɺ։࢝೔ͱ 
 ऴྃ೔ΛࣗಈతʹೖΕΔΑ͏ʹ 78
  19. @2020 Torana, Inc. Ͳ͏࡞͍͔ͬͯͬͨ 0QFO"1*Λఆٛͯ͠ɺίϚϯυͰϑΝΠϧΛ࡞੒  AQIQBSJTBONBLFYYYAͰඞཁͳϑΝΠϧΛࣗಈͰ࡞੒Ͱ͖ΔΑ͏ʹ  όοΫΤϯυΤϯδχΞ͸όϦσʔγϣϯϧʔϧͷఆٛͱ 


    /PSNBMJ[FS ϧʔςΟϯάͷఆٛΛ͢Δ͚ͩ  ͜ͷؒͷ࡞ۀ࣌ؒ͸໿෼͔Β෼ఔ౓ͰऴΘΔ  ΑͬͯόοΫΤϯυΤϯδχΞ͸ύϑΥʔϚϯενϡʔχϯάʹ 
 ஫ྗ͢Δ͜ͱ͕Ͱ͖Δ 80
  20. @2020 Torana, Inc. 0QFO"1*Λఆٛͯ͠ɺίϚϯυͰϑΝΠϧΛ࡞੒ ςετͱϑΟΫενϟɺίϯτϩʔϥͳͲ 
 "1*ʹඞཁͳ΋ͷΛશͯࣗಈͰੜ੒  ࡞੒͞ΕΔϑΝΠϧ͸ܭϑΝΠϧ 

    4BB4࣌୅͔ΒͷϏδωεϩδοΫΛ੔ཧ͠ɺγϯϓϧͰΑΓந৅Խ͠΍ ͘͢ɺͨͩ"1*͝ͱʹඍົͳࠩҟ͕ੜ·ΕΔՄೳੑ΋͋ΔͨΊɺҰ෦ 
 ந৅Խ͸ͤͣɺόϥϯεΛ࣮࣋ͬͯ૷  ௨ৗͷϧʔςΟϯά͸࡞੒͞Εͨίϯτϩʔϥʔ΁ɺςετ࣌͸ϞοΫͱ ͯ͠࡞੒͞ΕͨίϯτϩʔϥʔΛࢀর͢ΔΑ͏ʹ 81
  21. @2020 Torana, Inc. 0QFO"1*Λఆٛͯ͠ɺίϚϯυͰϑΝΠϧΛ࡞੒ ςετͱϑΟΫενϟɺίϯτϩʔϥͳͲ 
 "1*ʹඞཁͳ΋ͷΛશͯࣗಈͰੜ੒  θϩϕʔε͔ͩΒͦ͜ςετ͸ઈରʹඞཁ 

    2"ΤϯδχΞ͕͍ͳ͍ɺগਓ਺ɺ࢓༷͕සൟʹมΘΔ͔Βͦ͜ςετ͸ ઈରʹඞཁ  ελʔτΞοϓ͔ͩΒͦ͜ɺ৽͍͠ΤϯδχΞΛසൟʹܴ͑ೖΕΔ͜ͱʹ ͳΔ͕ɺܴ͍ೖΕͨͱ͖ʹɺӨڹൣғ͕Θ͔Βͣ࢓༷มߋʹ௥ඌͯ͠ 
 όάΛग़ͯ͠ਏ͍ࢥ͍Λ͢Δɻͦͷ఺ɺςετ͕͋Ε͹҆ṉײ͸େ͖͍ɻ 83
  22. @2020 Torana, Inc. 0QFO"1*Λఆٛͯ͠ɺίϚϯυͰϑΝΠϧΛ࡞੒ ςετͱϑΟΫενϟɺίϯτϩʔϥͳͲ 
 "1*ʹඞཁͳ΋ͷΛશͯࣗಈͰੜ੒  ςετ͕͋Δ͜ͱʹΑΓ૬ରతʹ։ൃ଎౓͕޲্͢Δɻ 

    ςετ͕ӡ༻͞Ε͍ͯͳ͍ͱɺҎޙͷσϓϩΠ΍༷ʑͳػೳ։ൃʹ 
 ଟେͳӨڹΛٴ΅͢͸໨ʹݟ͍͑ͯΔ  ೲظ͕୹͍͔Βແཧͱ͍͏ཧ༝͕͋ΔͳΒೲظΛ৳͹͢͜ͱʹ 
 ਚྗ͢΂͖ʢͦ͏͍͏ίϛϡχέʔγϣϯΛऔΔʣ 
 84
  23. @2020 Torana, Inc. ඞཁͳ΋ͷΛશͯࣗಈͰੜ੒ OpenAPI ͷఆٛॻ ίϚϯυͷ࣮ߦ ίϯτϩʔϥʔͷ࡞੒ ςετͷ࡞੒ ϑΟΫενϟͷ

    
 ࡞੒ OpenAPI ͔ΒϞσϧ΁ͷ Normalizer ࡞੒ Ϟσϧ͔Β OpenAPI ΁ͷ Normalizer ࡞੒ ϞοΫ༻ͷ 
 ίϯτϩʔϥʔͷ࡞੒ ϞοΫ༻ͷ 
 Ϟσϧͷ࡞੒ ίϚϯυͰࣗಈతʹ࡞੒͞ΕΔ΋ͷ όοΫΤϯυΤϯδχΞ͕
 ॻ͘ඞཁͷ͋Δ΋ͷ 86
  24. @2020 Torana, Inc. ඞཁͳ΋ͷΛશͯࣗಈͰੜ੒ ௨ৗͷΞΫηε࣌ ςετ࣮ߦ࣌ ϞοΫ༻ 
 ίϯτϩʔϥʔ ίϯτϩʔϥʔ

    ίϯτϩʔϥʔΛܧঝ ֎෦෺ྲྀ API ܾࡁγεςϜ Google Developer API ϧʔςΟϯάͷ੾Γସ͑ 87
  25. @2020 Torana, Inc. ඞཁͳ΋ͷΛશͯࣗಈͰੜ੒ ௨ৗͷΞΫηε࣌ ςετ࣮ߦ࣌ ϞοΫ༻ 
 ίϯτϩʔϥʔ ίϯτϩʔϥʔ

    ίϯτϩʔϥʔΛܧঝ ֎෦෺ྲྀ API ܾࡁγεςϜ Google Developer API ֎෦ͷγεςϜͱ࿈ܞ͢ΔΑ͏ʹ ϧʔςΟϯάͷ੾Γସ͑ 88
  26. @2020 Torana, Inc. ඞཁͳ΋ͷΛશͯࣗಈͰੜ੒ ௨ৗͷΞΫηε࣌ ςετ࣮ߦ࣌ ϞοΫ༻ 
 ίϯτϩʔϥʔ ίϯτϩʔϥʔ

    ίϯτϩʔϥʔΛܧঝ ֎෦෺ྲྀ API ܾࡁγεςϜ Google Developer API ֎෦ͱͷ௨৴ΛϞοΫ͢Δ ϧʔςΟϯάͷ੾Γସ͑ 89
  27. @2020 Torana, Inc. 0QFO"1*Λఆٛͯ͠ɺίϚϯυͰϑΝΠϧΛ࡞੒ ςετͱϑΟΫενϟɺίϯτϩʔϥͳͲ 
 "1*ʹඞཁͳ΋ͷΛશͯࣗಈͰੜ੒  ը૾Ξοϓϩʔυ͸AJT6QMPBEBCMFAͷΑ͏ͳৗ࣌GBMTFΛ 


    ฦ͢Α͏ʹ͍ͯ͠ΔϝιουΛΦʔόʔϥΠυͯ͠USVFΛฦ͢Α͏ʹ͠ɺ ϞσϧͰΞοϓϩʔυ͕ඞཁͳϞσϧͱϚοϐϯά͢ΔΑ͏ʹ͢Δ  ͜ΕʹΑΓը૾ͷΞοϓϩʔυʹ͍ͭͯ΄΅ߟ͑ͳ͍ͰࡁΉΑ͏ʹ 92
  28. @2020 Torana, Inc. Ͳ͏࡞͍͔ͬͯͬͨ ίϯτϩʔϥʔʹ͸ϩδοΫΛॻ͔ͳ͍  ҰൠతʹݴΘΕ͍ͯΔ͜ͱ͕ͩʢجఈΫϥε΋ؚΊͯʣίϯτϩʔϥʔʹ͸ ϏδωεϩδοΫΛॻ͔ͳ͍ɻ  τϥʔφ͸ඞཁͳ৘ใΛϞσϧʹॻ͖ɺίϯτϩʔϥʔ͸ͦͷ৘ใ͕͋

    Δͱ͍͏લఏͰந৅Խͯ͠ॲཧΛ͍ͯ͠Δɻ  ͦΕͰ΋ओʹ૸Δͷ͸ϦΫΤετͷόϦσʔγϣϯͱอଘॲཧʢΞοϓ ϩʔυ΋ؚΊͯʣͷΈɻ  ίϯτϩʔϥʔϞσϧͷΑ͏ͳελΠϧͰॻ͍͍ͯΔ 95
  29. @2020 Torana, Inc. Ͳ͏࡞͍͔ͬͯͬͨ -BSBWFMʹґଘͭͭ͠ґଘ͠ͳ͍  -BSBWFMʹґଘ͗͢͠ΔͱָͰ͸͋Δ͕ɺϩοΫΠϯ͞Ε͗͢ΔͱϑϨʔϜ ϫʔΫ΁৐Γ׵͕͑Ͱ͖ͳ͍  ͱ͸͍͑ɺ౰࣌͸։ൃ෦ͷϝϯόʔ͸ۃগͩͬͨͨΊɺґଘ͢Δͱ͜Ζ͸ґ

    ଘ͢ΔΑ͏ʹ͠ͳ͍ͱ։ൃ͕࣌ؒ଍Γͳ͍  ґଘ͢Δͱ͜Ζ͸ґଘ͢Δɻґଘ͠ͳ͍ͱ͜Ζ͸ґଘ͠ͳ͍όϥϯε  -BSBWFMΛࣺͯΔ࿩ʹͳͬͯ΋ࣅͨΑ͏ͳΠϯλʔϑΣʔεͰ 
 ࡞ΕΔ͔ͳͲɺڥքઢΛܾΊΔ 98
  30. @2020 Torana, Inc. -BSBWFMʹґଘͭͭ͠ґଘ͠ͳ͍ Controller AppModel Domain Elasticsearch ෺ྲྀγεςϜ ܾࡁγεςϜ

    Cache DB Mail Laravel ʹґଘ͍ͯ͠ΔՕॴ Laravel ʹґଘ͍ͯ͠ͳ͍Օॴ (ϏδωεϩδοΫ) Normalizer جຊతʹϞσϧΛ௨͢Α͏ʹ͠ɺ ґଘؔ܎Λۃྗ΁Β͢ Model Laravel ΁ͷґଘ͸ย଍ಥͬࠐΜͰ͍Δ 100
  31. @2020 Torana, Inc. -BSBWFMʹґଘͭͭ͠ґଘ͠ͳ͍ Controller AppModel Domain Elasticsearch ෺ྲྀγεςϜ ܾࡁγεςϜ

    Cache DB Mail γεςϜͷण໋͕དྷͨͱ͖ͷϦϓϨΠε͸੺࿮Λࠩ͠ସ͑Δ͚ͩ Laravel ʹґଘ͍ͯ͠ͳ͍Օॴ (ϏδωεϩδοΫ) Normalizer جຊతʹϞσϧΛ௨͢Α͏ʹ͠ɺ ґଘؔ܎Λۃྗ΁Β͢ Model Laravel ΁ͷґଘ͸ย଍ಥͬࠐΜͰ͍Δ 101
  32. @2020 Torana, Inc. 4BB4͔ΒσʔλΛҠߦ͠΍͍͢Α͏ʹ SaaS CSV ΤΫεϙʔτ چγεςϜ ৽γεςϜ ίϯόʔλʔ

    RDB Amazon VPC (ຊ൪) RDB Amazon VPC (εςʔδϯά) ɾސ٬ΞϓϦ ɾ͓΋ͪΌΞϓϦ ɾ഑ૹΞϓϦ ɾetc... ɾސ٬ςʔϒϧ ɾetc... ɾސ٬ॅॴ ɾސ٬੥ٻઌॅॴ ɾސ٬ͷܖ໿৘ใ ɾސ٬ͷ͓ࢠ༷৘ใ ɾ഑ૹཤྺ ɾ഑ૹ͓΋ͪΌ ɾ… ɾސ٬ςʔϒϧ ɾetc... ɾސ٬ॅॴ ɾސ٬੥ٻઌॅॴ ɾސ٬ͷܖ໿৘ใ ɾސ٬ͷ͓ࢠ༷৘ใ ɾ഑ૹཤྺ ɾ഑ૹ͓΋ͪΌ ɾ… 103
  33. @2020 Torana, Inc. 4BB4͔ΒσʔλΛҠߦ͠΍͍͢Α͏ʹ SaaS CSV ΤΫεϙʔτ چγεςϜ ৽γεςϜ ίϯόʔλʔ

    RDB Amazon VPC (ຊ൪) RDB Amazon VPC (εςʔδϯά) ɾސ٬ΞϓϦ ɾ͓΋ͪΌΞϓϦ ɾ഑ૹΞϓϦ ɾetc... SaaS ্Ͱ͸ςʔϒϧͷ୅ΘΓʹ ΞϓϦͱݺΜͰ͍·͢ ɾސ٬ςʔϒϧ ɾetc... ɾސ٬ॅॴ ɾސ٬੥ٻઌॅॴ ɾސ٬ͷܖ໿৘ใ ɾސ٬ͷ͓ࢠ༷৘ใ ɾ഑ૹཤྺ ɾ഑ૹ͓΋ͪΌ ɾ… ɾސ٬ςʔϒϧ ɾetc... ɾސ٬ॅॴ ɾސ٬੥ٻઌॅॴ ɾސ٬ͷܖ໿৘ใ ɾސ٬ͷ͓ࢠ༷৘ใ ɾ഑ૹཤྺ ɾ഑ૹ͓΋ͪΌ ɾ… ςʔϒϧͰݴ͏ͱ 1 ͭͷϨίʔυͰ ෳ਺ͷ৘ใΛ؅ཧ͍ͯͨ͠΋ͷΛ 
 ਖ਼نԽ͠ɺϦϨʔγϣϯؔ܎Λ੔ཧ 104
  34. @2020 Torana, Inc. ࡞͍ͬͯΔͱ͖ʹى͖ͨ՝୊νʔϜ໘ ੒Ռ͕ଞͷϝϯόʔ͔Βݟ͑ͮΒ͍  όοΫΤϯυͱ͍͏ੑ࣭͔Β͔੒Ռ͕ΤϯδχΞҎ֎ͷ 
 ϝϯόʔ͔ΒݟΔͱ੒Ռ͕ݟ͑ͮΒ͍ 

    ཧղΛͯ͠΋Β͏Α͏ʹίϛϡχέʔγϣϯΛऔΔͷ͕େ੾  ͳͥɺ͜ΕΛ΍͍ͬͯΔͷ͔ɺͳͥඞཁͳͷ͔ΛͪΌΜͱ 
 ڞ༗͠આ໌͢Δ 107
  35. @2020 Torana, Inc. ࡞͍ͬͯΔͱ͖ʹى͖ͨ՝୊νʔϜ໘ ਓ͕଍Γͳ͗͢͞Δ  ελʔτΞοϓ͋Δ͋Δ͕ͩਓ͕଍Γͳ͗͢Δ  ࢲ͕όοΫΤϯυͱΠϯϑϥͱϑϩϯτΤϯυͱ࠾༻ͱ৘γεͳͲΛ݉ ೚͍ͯͨ͠

     ౰࣌͸໊ମ੍ͰҰਓ͸4BB4ͷରԠʹ௥ΘΕ͍ͯͨ  ࣮࣭ࢲҰਓͰ࣮૷͍ͯͨ͠  ୅දͱͷPO͸ຖճʮਓ͕଍Γͳ͍Ͳ͏͠Α͏ʯͱ͍͏࿩ͰऴΘΔ 110
  36. @2020 Torana, Inc. ࡞͍ͬͯΔͱ͖ʹى͖ͨ՝୊νʔϜ໘ ਓ͕଍Γͳ͗͢͞Δ  ࠷ॳ୅ද͸ϋʔυ΢ΣΞ։ൃؚΊͯਓ͘Β͍ͷ૊৫ʹͳΕ͹͍͍ͱࢥ͍ͬͯͨ  ΋ͪΖΜݎ࣮Ͱ͔ͭεέʔϥϒϧͳΞϓϦέʔγϣϯΛ໨ࢦ͢ʹ͸ 


    શવ଍Γͳ͍  ࢲ͕ٳΜͩΒӡ༻͸ճΔ͚Ͳ։ൃ͕ʢຊ౰ʹʣࢭ·Δ  ΋͸΍ɺ΍͍ͬͯΔ͜ͱ͕ϚωʔδϟʔͰ͸ͳ͘$50Ͱ͸  ϓϩμΫτ։ൃ෦ͷϝϯόʔʹ$50ͱ͢ΒࢥΘΕ͍ͯͨ 111
  37. @2020 Torana, Inc. ࡞͍ͬͯΔͱ͖ʹى͖ͨ՝୊ٕज़໘ -BSBWFMͷԸܙΛͲ͜·Ͱड͚Δ͔൑அʹ໎ͬͨ  ϩοΫΠϯ͗͢͠ΔͱϦϓϨΠεͷͱ͖ͷେ͖ͳฐ֐ʹͳΔͷ͸Θ͔Γ ͖͍ͬͯΔ  ͜Ε͸ࠓ·Ͱࢲ͕ܦݧͨ͠اۀྫ֎ͳ͘શͯͰฐ֐ʹͳ͍ͬͯͨ

    
 ܦݧ͕͋Δ͔Βͦ͜  ͱ͸͍͑গਓ਺Ͱ-BSBWFMͷԸܙΛ΄΅ड͚ͳ͍ঢ়ଶ͔ͭந৅ԽΛ͢Δͨ Ίͷ࣌ؒ͸͋Δͷ͔ɺͱ͍ͬͨόϥϯεΛऔΔ൑அ͕೉͔ͬͨ͠ 113
  38. @2020 Torana, Inc. ࡞͍ͬͯΔͱ͖ʹى͖ͨ՝୊ٕज़໘ ۀ຿ϑϩʔ͕७ਮʹ೉ղ  ෺ྲྀͱ͍͏ಛੑ΋͋ͬͯɺ͋·Γ࢖Θͳ͍Α͏ͳ୯ޠ͕େྔʹग़ͯ͘Δ  ೖݿɺग़ݿɺ࢓ೖΕɺ୨ɺ૔ݿɺݮՁঈ٫ 

    εςʔλεͱ͍͏֓೦͕େྔʹग़͖ͯͯɺࣅͯඇͳΔ΋ͷ͕͋Δ  ൃૹࡁΈɺൃૹதɺഇغɺෆඋɺച٫ɺӡ༻தʜͳͲͳͲ  ଞʹ΋৽͍֓͠೦͕ొ৔͢ΔՄೳੑ͕͋Δ  ݸମ؅ཧɺൃૹͷ௥੻ɺ഑ૹ୅ߦձࣾ 114
  39. @2020 Torana, Inc. ՝୊ΛͲ͏ղܾ͔ͨ͠νʔϜ໘ ਓ͕଍Γͳ͗͢͞Δ  ࠾༻νϟωϧ͕ݩʑ8BOUFEMZͱϦϑΝϥϧ͔͠ͳ͔͕ͬͨɺ 
 ΤʔδΣϯτΛؚΊ࠾༻νϟωϧΛ૿΍͢ಈ͖Λ͢ΔΑ͏ʹ 

    ͳͥਓ͕଍Γͳ͍ͷ͔ʁͲΕ͘Β͍ͷਓ͕ඞཁͳͷ͔ΛϓϩδΣΫτʹ Αͬͯ෼ੳ͠ɺݕ౼ΛॏͶΔ  ΤϯδχΞͷࢢ৔ͷ૬৔ͱٻΊΔਓ෺૾ΛυΩϡϝϯτʹચ͍ग़͠ɺ 
 ͦͷΤϯδχΞ͕ͲΕ΄ͲඞཁͰ͋Δ͔ɺͱ͍͏ͷΛߟ͑Δ 127
  40. @2020 Torana, Inc. ՝୊ΛͲ͏ղܾ͔ͨ͠νʔϜ໘ ਓ͕଍Γͳ͗͢͞Δ 0 1.75 3.5 5.25 7

    2020/04 2020/06 2020/08 2020/12 ΤϯδχΞͷ਺͕૿͖͑ͯ·ͨ͠ 7 5 4 2 129
  41. @2020 Torana, Inc. ՝୊ΛͲ͏ղܾ͔ٕͨ͠ज़໘ εέʔϧΛݟӽͨ͠ݕ౼ࣄ߲ΛͲ͜·Ͱࢥྀ͢Δ͔  ͨͩ͠ྫ͑͹lকདྷ͜͏͍͏৽ػೳ͕΄͍͠ΜͩΑͶz͸ରԠ͠ͳ͍  ৽ػೳʹରԠ͍ͯͨ͠ΒΩϦ͕ͳ͍ͨΊ 

    ༧ΊϏδωεαΠυ΍ଞͷϝϯόʔ͔Βཉ͍͠ػೳΛٵ͍ग़ͯ͠ 
 %#εΩʔϜ͕ͲͷΑ͏ʹมΘ͍ͬͯ͘ͷ͔Λ૝ఆ͓ͯ͘͜͠ͱ͸ඞཁ  ͦͷͨΊʹϑϩϯτΤϯυͰϓϩτλΠϓΛઌʹ࡞࣮ͬͯࡍʹ 
 ৮ͬͯ΋Βͬͨ 136
  42. @2020 Torana, Inc. swoole + laravel-swoole New Relic PagerDuty Terraform

    SendGrid Packer Raygun NewRelic ͔Βͷ௨஌Λ Slack ΍ి࿩ʹ ΤϥʔϩάऩूͷͨΊ ΞϓϦέʔγϣϯͷ 
 ύϑΥʔϚϯε؂ࢹ 141
  43. @2020 Torana, Inc. ՝୊ΛͲ͏ղܾ͔ٕͨ͠ज़໘ σʔλͷଟ͍"1*ͷύϑΥʔϚϯε͕஗͍  4XPPMFͱMBSBWFMTXPPMFΛ࢖༻ͯ͠಺෦ͷ1%0Λߴ଎Խ  4XPPMFʹΑͬͯ1%0͕ஔ͖׵͑ΒΕωοτϫʔΫ*0ͷ࠷దԽ͕ߦ ΘΕΔ

     ೖΕΔσϝϦοτ͸ϗοτϦϩʔυ͕Ͱ͖ͳ͘ͳΔͷͱQIQGQNΛ 
 ೖΕସ͑Δඞཁ͕͋Δ͘Β͍  ͜ΕͰඵ͔Βඵ͘Β͍ʹͳͬͨͷͰ໿ഒߴ଎ԽͰ͖ͨ 142
  44. @2020 Torana, Inc. ՝୊ΛͲ͏ղܾ͔ٕͨ͠ज़໘ σʔλͷଟ͍"1*ͷύϑΥʔϚϯε͕஗͍  औಘ͢ΔϑΟʔϧυɺ/PSNBMJ[FSͷ֊૚Λ੍ݶ͠ɺύϥϝʔλʔͰ 
 ໘౗ͯ͘͘͞΋ௐ੔͢ΔΑ͏ʹ 

    ͜ΕͰඵ͔Βdඵ͋ͨΓʹͳΓɺ໿ഒૣ͘ͳΓ·ͨ͠  ΋ͪΖΜऔಘ͢Δύϥϝʔλʔ͕૿͑Δͱͦͷ෼஗͘ͳΓ·͕͢ʜ  ݱࡏਐߦܥͰΫΤϦͷ࣮ߦΛݮΒͨ͢Ίʹɺෳ਺݅औಘ͢Δ৔߹͸ 
 ༧Ίඞཁͳ৘ใΛ͔͖ूΊ͓ͯ͘&BHFS-PBEJOHͷΑ͏ͳ΋ͷΛ 
 ࣮૷͠ύϑΥʔϚϯε޲্Λ໨ࢦ͍ͯ͠·͢ 143
  45. @2020 Torana, Inc. ՝୊ΛͲ͏ղܾ͔ٕͨ͠ज़໘ σʔλͷଟ͍"1*ͷύϑΥʔϚϯε͕஗͍  औಘ͢ΔϑΟʔϧυɺ/PSNBMJ[FSͷ֊૚Λ੍ݶ͠ɺύϥϝʔλʔͰ 
 ໘౗ͯ͘͘͞΋ௐ੔͢ΔΑ͏ʹ 

    ͜ΕͰඵ͔Βdඵ͋ͨΓʹͳΓɺ໿ഒૣ͘ͳΓ·ͨ͠  ΋ͪΖΜऔಘ͢Δύϥϝʔλʔ͕૿͑Δͱͦͷ෼஗͘ͳΓ·͕͢ʜ  ݱࡏਐߦܥͰΫΤϦͷ࣮ߦΛݮΒͨ͢Ίʹɺෳ਺݅औಘ͢Δ৔߹͸ 
 ༧Ίඞཁͳ৘ใΛ͔͖ूΊ͓ͯ͘&BHFS-PBEJOHͷΑ͏ͳ΋ͷΛ 
 ࣮૷͠ύϑΥʔϚϯε޲্Λ໨ࢦ͍ͯ͠·͢ 144
  46. @2020 Torana, Inc. σʔλͷଟ͍"1*ͷύϑΥʔϚϯε͕஗͍ /api/v1/shipments ਌ൃૹ৘ใ ൃૹํ๏ ഑ૹۀऀ໊ ൃૹ͓΋ͪΌ ͓΋ͪΌৄࡉ

    ϝʔΧʔ αϓϥΠϠʔ ݸମ৘ใ ୨৘ใ ൃૹ͓΋ͪΌ ͓΋ͪΌৄࡉ ϝʔΧʔ αϓϥΠϠʔ ૔ݿৄࡉ 145
  47. @2020 Torana, Inc. σʔλͷଟ͍"1*ͷύϑΥʔϚϯε͕஗͍ /api/v1/shipments ਌ൃૹ৘ใ ൃૹํ๏ ഑ૹۀऀ໊ ൃૹ͓΋ͪΌ ͓΋ͪΌৄࡉ

    ϝʔΧʔ αϓϥΠϠʔ ݸମ৘ใ ୨৘ใ ൃૹ͓΋ͪΌ ͓΋ͪΌৄࡉ ϝʔΧʔ αϓϥΠϠʔ ૔ݿৄࡉ ԣ͕࣠Ϩεϙϯεͷ֊૚ͷਂ͞ → ↓ॎ͕࣠ϑΟʔϧυ 146
  48. @2020 Torana, Inc. σʔλͷଟ͍"1*ͷύϑΥʔϚϯε͕஗͍ /api/v1/shipments ਌ൃૹ৘ใ ൃૹํ๏ ഑ૹۀऀ໊ ൃૹ͓΋ͪΌ ͓΋ͪΌৄࡉ

    ϝʔΧʔ αϓϥΠϠʔ ݸମ৘ใ ୨৘ใ ൃૹ͓΋ͪΌ ͓΋ͪΌৄࡉ ϝʔΧʔ αϓϥΠϠʔ ૔ݿৄࡉ ৔߹ʹΑͬͯ͸ϑΟʔϧυΛߜͬͯਂ͞Λ૿΍͢ͳͲͰରࡦ 147
  49. @2020 Torana, Inc. ·ͱΊ  "1*࣮૷ͷΦʔτϝʔγϣϯԽͷ࣮ݱͷͨΊʹ͸ɺٕज़తͳ 
 ՝୊͚ͩͰ͸ͳ͘ɺΦϖϨʔγϣϯ໘ͰͷΤϯδχΞϦϯά΋ඞཁ  ΦʔτϝʔγϣϯԽͷͨΊʹ͸͍͔ͭ͘ߟྀ͠ͳ͚Ε͹͍͚ͳ͍

    
 ఺͕͋Δ  ΦʔτϝʔγϣϯԽ͸੒Ռ͕ݟ͑ͮΒ͍ͷͰϝϯλϧΛอͭ౒ྗΛ ੯͠·ͳ͍Α͏ʹ͠Α͏  ϥΫ͞ͱύϑΥʔϚϯε͸τϨʔυΦϑ  ΦʔτϝʔγϣϯԽͯ͠΋ɺ͠ͳͯ͘΋ਓ͕଍Γͳ͍ͷ͸มΘΒͳ ͍ͷͰ࠾༻͸͍ͯ͜͠͏ 152