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

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

Avatar for memory memory
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

December 12, 2020
Tweet

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