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

Webアプリエンジニアに贈る アプリケーション開発におけるサーバーレス流の考え方 / The concept of serverless in application development

Webアプリエンジニアに贈る アプリケーション開発におけるサーバーレス流の考え方 / The concept of serverless in application development

昨今、アプリケーションをつくるのに、様々な手段があります。「フルサーバーレス」はその一つで、マネージドサービスを駆使し効率的にアプリケーション開発を行うことができます。とはいえ、「アプリ開発」とひとことでいっても、必要な作業は多岐に渡ります。本セッションでは、Amazon EC2 に Play Framework + Scala で Webアプリ を構築する流れを比較対象の例にとり、サーバーレスで開発する場合の「考え方」を話します。言語や実装パターンの話よりも、典型的なWebアプリの開発手法がサーバーレスにおいても適用できるのか、またはまったく考え方を変えなければいけないのか、という議論が焦点です。

Yusuke Wada

March 27, 2019
Tweet

More Decks by Yusuke Wada

Other Decks in Programming

Transcript

  1. 8FCΞϓϦΤϯδχΞʹଃΔ
    ΞϓϦέʔγϣϯ։ൃʹ͓͚ΔαʔόʔϨεྲྀͷߟ͑ํ
    "844FSWFSMFTT5FDIηϛφʔ

    View Slide

  2. ࣗݾ঺հ

    ࿨ా༞հ
    Ϋϥεϝιουגࣜձࣾ
    αʔόʔϨε։ൃ෦ΤϯδχΞ
    XBEEZ@V

    View Slide

  3. खஈઌߦͷ෦ॺ͕Ͱ͖͔ͯΒ೥൒ʜ

    ͳͥαʔόʔϨεͰ΍Δͷ͔Λߟ͑ΔΑΓ͸ɺ

    αʔόʔϨεͰ΍ͬͯΈͯͲ͏͔ʹॏ఺Λஔ͍͍ͯΔ෦Ͱ͢

    ͳΜͱ͔ੜ͖࢒͍ͬͯ·͢
    ։ൃऀࢹ఺ͰɺαʔόʔϨε։ൃͷ
    ັྗΛ఻͑ʹདྷ·ͨ͠

    View Slide

  4. ͝஫ҙ

    • εϥΠυ͸ެ։͠·͢
    • ։ൃऀ޲͚Ͱ͢
    • ίϯςφͷ࿩͸͠·ͤΜ
    • EC2 vs αʔόʔϨε ͱ͍͏ߏਤ͕ग़͖ͯ·͢
    ͕ɺྑ͠ѱ͠ΛޠΔ΋ͷͰ͸ͳ͘ɺൺֱࡐྉͰ͢

    View Slide

  5. લఏɿαʔόʔϨεͷఆٛ

    Ծ૝Խ Ϋϥ΢υ FaaS
    Ϛωʔδυ
    αʔϏε
    ΞϓϦέʔγϣϯ
    ϥϯλΠϜ
    ϛυϧ΢ΣΞ
    OS
    Ծ૝Խج൫
    ϋʔυ΢ΣΞ
    Ϣʔβʔ
    Ϣʔβʔ
    Ϋϥ΢υϕϯμʔ
    Ϣʔβʔ
    Ϋϥ΢υϕϯμʔ
    Ϋϥ΢υϕϯμʔ
    αʔϏε੹೚Ϟσϧ

    View Slide

  6. લఏɿαʔόʔϨεͷఆٛ

    Ծ૝Խ Ϋϥ΢υ FaaS
    Ϛωʔδυ
    αʔϏε
    ΞϓϦέʔγϣϯ
    ϥϯλΠϜ
    ϛυϧ΢ΣΞ
    OS
    Ծ૝Խج൫
    ϋʔυ΢ΣΞ
    Ϣʔβʔ
    Ϣʔβʔ
    Ϋϥ΢υϕϯμʔ
    Ϣʔβʔ
    Ϋϥ΢υϕϯμʔ
    Ϋϥ΢υϕϯμʔ
    αʔϏε੹೚Ϟσϧ
    ͜ΕΒΛ૊Έ߹ΘͤΔ͜ͱ

    View Slide

  7. ຊൃදͰલఏͱ͍ͨ͠ίϯςΩετ

    αʔόʔϨε։ൃεΩϧ͸։ൃऀʹͱͬͯັྗత
    Ձ஋ʹ௚݁͢Δ࡞ۀʹूத͠΍͍͢
    8FC"1*։ൃʹͱͲ·ΒͣɺϑϩϯτΤϯυ·Ͱ։ൃҙཉ
    ্ཱ͕ͪΔ
    ։ൃऀͱͯ͠ϨϕϧΞοϓͰ͖Δ

    View Slide

  8. ࣗ෼ޠΓͰັྗΛ఻͑Δ

    2016/03 ΫϥϝιೖࣾɺαʔόʔαΠυAPI։ൃ
    2017/01 AWS Lambda ʹ;ΕΔ
    2017/10 αʔόʔϨε։ൃ෦ઃཱ
    2018/04 αʔόʔϨε։ൃ෦΁సଐ
    2018/09 Serverlessconf Tokyo Ͱొஃ

    View Slide

  9. ࣗ෼ޠΓͰັྗΛ఻͑Δ

    2016/03 ΫϥϝιೖࣾɺαʔόʔαΠυAPI։ൃ
    2017/01 AWS Lambda ʹ;ΕΔ
    2017/10 αʔόʔϨε։ൃ෦ઃཱ
    2018/04 αʔόʔϨε։ൃ෦΁సଐ
    2018/09 Serverlessconf Tokyo Ͱొஃ
    4DBMB
    1MBZ'SBNFXPSL
    &$

    View Slide

  10. ࣗ෼ޠΓͰັྗΛ఻͑Δ

    2016/03 ΫϥϝιೖࣾɺαʔόʔαΠυAPI։ൃ
    2017/01 AWS Lambda ʹ;ΕΔ
    2017/10 αʔόʔϨε։ൃ෦ઃཱ
    2018/04 αʔόʔϨε։ൃ෦΁సଐ
    2018/09 Serverlessconf Tokyo Ͱొஃ
    "84
    "OHVMBS
    J04

    View Slide



  11. αʔόʔϨε։ൃ͸ɺ
    ʮ͜͜·Ͱཪଆ࡞ͬͨͳΒը໘΋࡞Γ͍ͨΘʯ
    ͱͳΔຐྗ͕͋Δ
    ։ൃऀͱͯ͠ϨϕϧΞοϓͰ͖Δ

    View Slide

  12. ຊൃදͷഎܠ

    αʔόʔϨεʹ͍ͭͯͷٞ࿦
    લఏɿ"84-BNCEBͱϚωʔδυαʔϏεͰΞϓϦΛ࡞Δ
    ٞ࿦ɿͲͷΑ͏ʹ։ൃ͢Δ͔
    %ZOBNP%#ͷςʔϒϧઃܭΛ࢝Ίͱͨ͠ɺαʔϏε͝ͱͷ۩ମతͳ
    ࢖͍ํ͸͔ͳΓ৘ใ͕ॆ࣮͖ͯͨ͠
    ҰํɺΞϓϦέʔγϣϯΛϑϧαʔόʔϨεͰ։ൃ͢Δͱ͖ͷࢦ਑
    ΍ߟ͑ํɺૺ۰͕ͪ͠ͳ՝୊ʹର͢Δߟ࡯͕ੈʹग़͍ͯͳ͍ ݱ৔
    Ͱղܾ͍ͯ͠Δ
    ͱ͍͏ҹ৅

    View Slide

  13. ໨తͱΞϓϩʔν

    ຊൃදͷ໨తɿ
    αʔόʔϨεͷಛੑΛ஌Δ
    8FCΞϓϦΛϑϧαʔόʔϨεͰ։ൃ͢Δͱ͖ͷ՝୊Λग़͢
    ՝୊ͷղܾࡦΛߟ࡯͢Δ
    αʔόʔϨεྲྀͷlߟ͑ํzΛಋ͘
    ՝୊ղܾͷΞϓϩʔνɿ
    αʔόʔϨεͷಛੑΛߟྀͭͭ͠ɺ&$্ͰɺϑϨʔϜϫʔΫΛ࢖ͬͯ։
    ൃ͢Δ৔߹ͱൺֱ͢Δ

    View Slide

  14. ࿩͢಺༰
    w αʔόʔϨεͷಛੑΛ஌Δ
    w αʔόʔϨε։ൃ;Γ͔͑Γͱ՝୊
    w ՝୊ղܾ
    w αʔόʔϨεྲྀߟ͑ํͷ੔ཧ


    NJO
    NJO
    NJO
    NJO

    View Slide

  15. ࿩͢಺༰
    w αʔόʔϨεͷಛੑΛ஌Δ
    w αʔόʔϨε։ൃ;Γ͔͑Γͱ՝୊
    w ՝୊ղܾ
    w αʔόʔϨεྲྀߟ͑ํͷ੔ཧ


    NJO
    NJO
    NJO
    NJO

    View Slide

  16. αʔόʔϨεͷಛੑ

    ϏδωεՁ஋ͱ੒Ռ෺ΛҰகͤ͞΍͍͢
    ϒϨΠΫεϧʔ͕ԕ͍
    αʔϏε੍ݶͱ͏·͘෇͖߹͑͹ɺԸܙΛଘ෼ʹಘ
    ΒΕΔ

    View Slide

  17. ϏδωεՁ஋ͱ੒Ռ෺ΛҰகͤ͞΍͍͢

    -BNCEB'VODUJPOͱαʔϏεͷ૊Έ߹ΘͤͰ࣮૷͢
    ΔͨΊɺಈ͔͢·Ͱͷख͕ؒஈҧ͍ʹগͳ͍
    ͜Ε͸ɺಈ͔ͯ͠ΈΔ·ͰͲΜͳ੍໿ʹͿ͔ͭΔ͔Θ͔
    Βͳ͍ɺαʔϏεΛͲ͏࢖͏ͷ͔΍ͬͯΈͳ͍ͱΠϝʔ
    δ͕༙͔ͳ͍ͱ͍͏ଆ໘ͱදཪҰମ
    ΢ΥʔλʔϑΥʔϧతͳਐΊํͰ͸ͳ͘
    ࣗવͱػೳ͝ͱʹ։ൃ͢ΔྲྀΕʹͳΔ

    View Slide

  18. ϒϨΠΫεϧʔ͕ԕ͍

    ܦݧଇ͔ΒֶशۂઢͷԾઆΛͨͯͯΈͨ

    View Slide

  19. ֶशۂઢͷԾઆ˞8FCΞϓϦͷ৔߹

    ։ൃʹैࣄͨ࣌ؒ͠
    ֶश཰ ϑϨʔϜϫʔΫར༻
    EC2
    αʔόʔϨε

    View Slide

  20. ֶशۂઢͷԾઆ˞8FCΞϓϦͷ৔߹

    ։ൃʹैࣄͨ࣌ؒ͠
    ֶश཰
    ୈϑΣʔζɿ
    αʔόʔϨεͷҖྗΛ஌Δ

    View Slide

  21. ୈϑΣʔζɿ
    αʔόʔϨεͷ՝୊Λײ͡Δ
    ˞ࠓ೔࿩͢՝୊΋͜ͷ෦෼Ͱग़ͯ͘Δ΋ͷ͕΄
    ͱΜͲͰ͢
    ֶशۂઢͷԾઆ˞8FCΞϓϦͷ৔߹

    ։ൃʹैࣄͨ࣌ؒ͠
    ֶश཰

    View Slide

  22. ֶशۂઢͷԾઆ˞8FCΞϓϦͷ৔߹

    ։ൃʹैࣄͨ࣌ؒ͠
    ֶश཰
    ୈϑΣʔζɿ
    ϒϨΠΫεϧʔ͕དྷΔ͸ͣ

    View Slide

  23. ϒϨΠΫεϧʔ͕ԕ͍

    ൃදऀͷ৔߹ɿ
    αʔόʔϨε։ൃॳظɺͰ͖Δ͜ͱͷ๛෋͞ʹײಈ
    ൒೥ʙ೥ޙɺ੒ख़͍ͯ͠ͳ͍ΤίγεςϜͱ֨ಆɺ
    αʔϏε੍ݶͷߟྀͰເඳ͍ͨ΄ͲΞ΢τϓοτ͕ग़
    ͤͳ͍
    αʔόʔϨεͷͨΊʹҰਓͰຉ૸͢ΔͷͰ͸ͳ͘ɺप
    ΓΛר͖ࠐΉͱ΋͏Ұஈ֊ޮ཰͕͕͋Δ͜ͱʹؾͮ͘

    View Slide

  24. αʔϏε੍ݶͱ͏·͘෇͖߹͏

    ҰൠతͳαʔόʔϨεͷ࿩ͱͯ͠Α͘ฉ͘ɿ
    Ϧιʔεͷ্ݶ΍ػೳతͳ੍ݶΛड͚ೖΕΔ୅ΘΓʹɺεέʔ
    ϥϏϦςΟΛ͸͡Ίͱͨ͠αʔϏεͱͯ͠ͷϝϦοτΛڗडͰ
    ͖Δɻ
    ։ൃऀͱͯ͜͠ͷ࿩ΛͲ͏ࢥ͏͔ɿ
    ࣄ࣮ɻͨͩ͠ɺαʔϏεͱͯ͠ͷ੍ݶࣄ߲͕μΠϨΫτʹཁ݅
    ΍࢓༷ʹӨڹ͢ΔɻυϝΠϯΤΩεύʔτΛר͖ࠐΜͰɺͲΜ
    ͳϏδωεՁ஋ΛੜΈग़͍͔ͨ͠Λఆٛ͢Δ࡞ۀ͕ඞਢɻ

    View Slide

  25. αʔϏε੍ݶͱ͏·͘෇͖߹͏

    ҰൠతͳαʔόʔϨεͷ࿩ͱͯ͠Α͘ฉ͘ɿ
    Ϧιʔεͷ্ݶ΍ػೳతͳ੍ݶΛड͚ೖΕΔ୅ΘΓʹɺεέʔ
    ϥϏϦςΟΛ͸͡Ίͱͨ͠αʔϏεͱͯ͠ͷϝϦοτΛڗडͰ
    ͖Δɻ
    ։ൃऀͱͯ͜͠ͷ࿩ΛͲ͏ࢥ͏͔ɿ
    ࣄ࣮ɻͨͩ͠ɺαʔϏεͱͯ͠ͷ੍ݶࣄ߲͕μΠϨΫτʹཁ݅
    ΍࢓༷ʹӨڹ͢ΔɻυϝΠϯΤΩεύʔτΛר͖ࠐΜͰɺͲΜ
    ͳϏδωεՁ஋ΛੜΈग़͍͔ͨ͠Λఆٛ͢Δ࡞ۀ͕ඞਢɻ
    Կ͕͍͔ͨ͠ʁͱ͍͏࿩͕͋ͬͯ͸͡Ίͯɺ
    ͜ͷαʔϏε͕߹͏͔ʁ
    ੍ݶ͕ड͚ೖΕΒΕΔ͔ʁ
    ͷٞ࿦͕Ͱ͖Δ͔Β

    View Slide

  26. ࿩͢಺༰
    w αʔόʔϨεͷಛੑΛ஌Δ
    w αʔόʔϨε։ൃ;Γ͔͑Γͱ՝୊
    w ՝୊ղܾ
    w αʔόʔϨεྲྀߟ͑ํͷ੔ཧ


    NJO
    NJO
    NJO
    NJO

    View Slide

  27. αʔόʔϨεͷৼΓฦΓ

    $BTF AWS Lambda ʹ৮ΕΔ
    $BTF σʔλऩूج൫ͷPoC։ൃ
    $BTF iOSΞϓϦͷҐஔ৘ใΛ׆༻ͨ͠CMS
    $BTF εϚʔτ୐഑ϙετ ͷIoT αʔόʔ

    View Slide

  28. ɹɹɹɹ"84ͱαʔόʔϨεͱ๻

    2016/03 ΫϥϝιೖࣾɺαʔόʔαΠυAPI։ൃ
    2017/01 AWS Lambda ʹ;ΕΔ
    2017/10 αʔόʔϨε։ൃ෦ઃཱ
    2018/04 αʔόʔϨε։ൃ΁సଐ
    2018/09 Serverlessconf Tokyo Ͱొஃ
    ͜ͷ࿩
    $BTF

    View Slide

  29. ΋ͱ΋ͱ&$Ͱ8FC"1*։ൃΛ΍͍ͬͯͨ

    Ծ૝௨՟؅ཧγεςϜͷ
    όοΫΤϯυ

    View Slide



  30. ӡ༻։࢝ͯ͠ฏ࿨ͳ೔ʑʹಥવͷΞϥʔτ

    View Slide



  31. ϩάΠϯϑΥʔϜ͕DoS߈ܸΛड͚͍ͯΔ

    View Slide

  32. ϩάΠϯϑΥʔϜʹ%P4

    ϩάͳͲΛݟͯΈΔͱ࣮ମ͸ύεϫʔυϦετ߈ܸΆ͍
    ෛՙ͕Ұؾʹ্ঢɺ"VUP4DBMJOH(SPVQͷ࠷େ୆਺
    Λͱ͍ͯͨͨ͠ΊϦιʔεރׇɺҰൠར༻ऀʹӨڹ
    $MPVE'SPOU8"'Λઃஔ͠*1ΞυϨεͰϒϩοΫ

    ౰࣌͸"-#ʹ8"'ΛઃஔͰ͖ͳ͔ͬͨ

    ͱ͜Ζ͕߈ܸऀ͸͙͢͞·*1ΞυϨεΛมߋɺΠλνͬ͝
    ͜ʹ

    View Slide

  33. "848"'ͷ*1ΞυϨεϒϩοΫΛࣗಈઃఆ͢Δ

    ᶃ WAF Λؔ࿈෇͚
    ᶄ fluentd Ͱ nginx ͷ

    ɹϩάΛS3ʹू໿
    ※౰࣌͸WAFͷϨʔτϦϛοτͳ͠
    ᶅ ϧʔϧʹج͖ͮ

    ɹIPϒϩοΫ

    View Slide

  34. "848"'ͷ*1ΞυϨεϒϩοΫΛࣗಈઃఆ͢Δ

    ᶃ WAF Λؔ࿈෇͚
    ᶄ fluentd Ͱ nginx ͷ

    ɹϩάΛS3ʹू໿
    ※౰࣌͸WAFͷϨʔτϦϛοτͳ͠
    ᶅ ϧʔϧʹج͖ͮ

    ɹIPϒϩοΫ
    ਓ͕͔Γɺ೔Ͱߏங
    ࣍ͷ೔ʹຊ൪ద༻

    View Slide



  35. ͋Ε…αʔόʔϨε͘͢͝Ͷʁ

    View Slide

  36. ͜͜Ͱग़ͨ՝୊

    ͳ͠
    ଈޮੑͱεέʔϥϏϦςΟ Կ΋ͳ͍ͱ͖͸Կ΋͠ͳ
    ͍
    ͕ٻΊΒΕΔϝϯςφϯεෆཁͳγεςϜʹαʔόʔ
    Ϩε͸͏͚ͬͯͭ
    ͍·΋ݩؾʹಈ͍͍ͯ·͢

    View Slide

  37. ɹɹɹɹɹσʔλऩूج൫ͷ1P$։ൃ

    αʔόʔϨε։ൃ෦΁
    సଐͯ͠࠷ॳͷ։ൃ
    Ͳ͏ಈ͘ͷ͔ݟ͍ͨ
    ͱ͍͏͜ͱͰ41"΋
    ࡞ͬͨ
    αʔόʔଆ"1*

    ϑϩϯτଆ8FC

    ͱ͍͏ߏ੒
    $BTF

    View Slide

  38. ͜͜Ͱग़ͨ՝୊

    ͦ΋ͦ΋Ͳ͏΍ͬͯ-BNCEB'VODUJPOΛ։ൃ͢Ε͹
    ྑ͍ͷ͔ʁ
    w "84ίϯιʔϧͰ1ZUIPOΛॻ͍ͨ
    w "84ίϯιʔϧ͸͙͢ʹ࣮ߦͰ͖ɺ͙͢ʹमਖ਼Ͱ͖
    Δ఺Ͱ༏ल
    w ͨͩ͠ɺόʔδϣϯ؅ཧͳ͠ɺϑΝΠϧʹ͢΂ͯͷ
    ॲཧɺίʔυͷݟ௨͕͠ѱ͍ঢ়گʹͳͬͨ

    View Slide

  39. J04ΞϓϦͷҐஔ৘ใΛ׆༻ͨ͠$.4

    ෳ਺ͷೖྗιʔεɺ
    ෳ਺ͷग़ྗઌɺ
    4UFQ'VODUJPOTͷ
    ׆༻
    αʔόʔଆ"1*

    ϑϩϯτଆ8FC J04

    AWS Cloud
    Mobile App
    Amazon Kinesis Data
    Firehose
    Amazon Kinesis Data
    Streams
    Amazon Cognito
    device table
    report table
    Amazon Pinpoint
    AWS Identity and Access
    Management (IAM)
    content
    location log
    Amazon Rekognition
    report api
    user files
    update location
    register report
    Center UI
    Create and
    push
    mission
    Center UI
    View result
    analysis & store
    create / push api
    AWS Step Functions
    1. targeting location
    2. create segment
    3. order push
    list report
    get analysis result
    get reports of a mission
    login / signup
    stream gps
    report mission
    report image / movie
    push notification
    $BTF

    View Slide

  40. ͜͜Ͱग़ͨ՝୊

    ΞϓϦέʔγϣϯઃܭɻೖྗιʔεͱग़ྗઌΛͲ͏දݱ
    ͢Δ͔ʁ
    w ͜͏ͳΔͱ"84ίϯιʔϧͰͷ։ൃ͸ෆՄೳ
    w -BNCEB'VODUJPOTͷ෼ׂͱσϓϩΠΛߟ͑Δඞ
    ཁ͕͋Γͦ͏

    View Slide

  41. ͜͜·Ͱ

    ։ൃʹैࣄͨ࣌ؒ͠
    ֶश཰
    ୈϑΣʔζɿ
    αʔόʔϨεͷҖྗΛ஌Δ

    View Slide

  42. ୈϑΣʔζɿ
    αʔόʔϨεͷ՝୊Λײ͡Δ
    ˞ࠓ೔࿩͢՝୊΋͜ͷ෦෼Ͱग़ͯ͘Δ΋ͷ͕΄
    ͱΜͲͰ͢
    ͔͜͜Β

    ։ൃʹैࣄͨ࣌ؒ͠
    ֶश཰

    View Slide

  43. גࣜձࣾ-*9*-༷εϚʔτ୐഑ϙεταʔόʔ

    $BTF

    View Slide



  44. "84*P5ͷར༻
    ূ໌ॻͷδϟετΠ
    ϯλΠϜొ࿥
    *P55PQJDTܦ༝Ͱͷ
    "84-BNCEBىಈ
    νʔϜ։ൃ ਓ

    ֎෦ϕϯμʔͱͷ݁
    ߹ࢼݧ
    גࣜձࣾ-*9*-༷εϚʔτ୐഑ϙεταʔόʔ
    $BTF

    View Slide



  45. αʔόʔϨεͭΒ͍

    View Slide

  46. ͜͜Ͱग़ͨ՝୊

    w εςʔδ؀ڥͱຊ൪؀ڥͰσϓϩΠΛ෼͚͍ͨ৔߹Ͳ
    ͏͢Ε͹͍͍ΜͰ͔͢ʁ
    w Ͳ͜ΛͲ͏ςετ͢Ε͹ྑ͍ΜͰ͔͢ʁ
    w ಥવإΛग़͢"84αʔϏε੍ݶ
    w Α͠νʔϜ։ൃͩʂͰɺͲ͏΍ͬͯ෼୲͢Δͷʁ

    View Slide

  47. σϓϩΠͲ͏͢Ε͹͍͍ͷ

    ؀ڥΛ۠ผ͢Δέʔε͕ҟͳΔ
    ಉ͡"84ΞΧ΢ϯτʹ։ൃ༻Ϧιʔεɺຊ൪༻ϦιʔεΛ໊
    લͰ۠ผͯ͠σϓϩΠ͍ͨ͠έʔε
    ։ൃ༻"84ΞΧ΢ϯτɺຊ൪༻"84ΞΧ΢ϯτͱ෼͚ͯσ
    ϓϩΠ͍ͨ͠έʔε
    ؀ڥ͝ͱʹར༻͍ͨ͠ύϥϝʔλ͕͋Δ

    View Slide

  48. Ͳ͜ΛͲ͏ςετ͢Ε͹ྑ͍ͷ

    ͱΓ͋͑ͣϢχοτςετ΍Ζ͏
    "1*(BUFXBZͷೖྗΛϞοΫԽɺ%ZOBNP%#ͷ(FU*UFNΛ
    ϞοΫԽ
    +40/ͷม׵ॲཧΛςετ͍ͯ͠Δ͚ͩʜ
    ͍͟σϓϩΠ࣮ͯ͠ߦͯ͠ΈͨΒ*".ͷݖݶෆ଍Ͱ
    "DDFTT%FOJFEΤϥʔൃੜʗ ?P?
    ʘ

    View Slide

  49. ௚໘͢Δ"84αʔϏε੍ݶ

    ಈ࡞֬ೝதɺ%ZOBNP%#ͰṖͷΤϥʔൃੜ
    1SPWJTJPOFE3FBE$BQBDJUZ6OJUΛΦʔόʔ͍ͯͨͨ͠Ί
    *P55PQJDTͷΞΫγϣϯͰΫϥΠΞϯτূ໌ॻͷ
    $MJFOU*Eऔಘࣦഊ
    )5514ϓϩτίϧͩͱূ໌ॻͷ$MJFOU*E͕औಘͰ͖ͳ͍࢓

    ઃܭ΁ख໭Γ͢ΔཁҼͱͳͬͯ͠·ͬͨ

    View Slide

  50. νʔϜ։ൃͷ෼୲Ͳ͏͢Δͷʁ

    αʔόʔ୲౰ɺ41"୲౰ɺސ٬૭ޱʁ
    ػೳ͝ͱʹ૭ޱʹ΋ͳͬͯαʔόʔ͔Β41"·Ͱ΍Δͷ
    ͕ྑ͍ʁ

    View Slide



  51. ৼΓฦΓͰग़͖ͯͨ՝୊Λ੔ཧ

    View Slide

  52. ;Γ͔͑ΓͰग़͖ͯͨ՝୊Λ੔ཧ͢Δ

    Ͳ͏΍ͬͯίʔυΛॻ͔͘
    ͲͷΑ͏ʹίʔυઃܭ͢Δ͔
    Ͳ͏σϓϩΠ͢Δ͔
    ςετͷॏ఺ΛͲ͜ʹஔ͔͘
    ϓϩδΣΫτͷਐΊํͱνʔϜ։ൃํ๏

    View Slide



  53. ՝୊੔ཧฤɾ׬ʂ
    ղܾࡦΛߟ͍͑ͯ͘

    View Slide

  54. ࿩͢಺༰
    w αʔόʔϨεͷಛੑΛ஌Δ
    w αʔόʔϨε։ൃ;Γ͔͑Γͱ՝୊
    w ՝୊ղܾ
    w αʔόʔϨεྲྀߟ͑ํͷ੔ཧ


    NJO
    NJO
    NJO
    NJO

    View Slide

  55. ;Γ͔͑ΓͰग़͖ͯͨ՝୊Λ੔ཧ͢Δ

    Ͳ͏΍ͬͯίʔυΛॻ͔͘
    ͲͷΑ͏ʹίʔυઃܭ͢Δ͔
    Ͳ͏σϓϩΠ͢Δ͔
    ςετͷॏ఺ΛͲ͜ʹஔ͔͘
    ϓϩδΣΫτͷਐΊํͱνʔϜ։ൃํ๏
    Ͳ͔͜Ͱݟͨ͜ͱ͕͋ΔΑ͏ͳ಺༰
    ΘΕΘΕ͕&$ͰΞϓϦΛ։ൃ͢Δͱ͖ʹ௨ͬͨ
    &$Λ࢖͏৔߹͸Ͳ͏͢Δ͔͕ࢀߟʹͳΔͷͰ͸

    View Slide

  56. Ͳ͏΍ͬͯίʔυΛॻ͔͘

    ։ൃऀͷ࡞ۀޮ཰͕Ұ൪ྑ͍؀ڥΛ༻ҙ͢Δ
    ࢖͍׳Εͨ*OFMMJKΛ࢖͍ɺϩʔΧϧ؀ڥͰ։ൃ͢Δ
    ϩʔΧϧ࡞ۀ͕ऴΘͬͨΒ"84$PEF%FQMPZ΍DBQJTUSBOP
    ͰσϓϩΠ͢Δ
    (JU)VCͰόʔδϣϯ؅ཧ͢Δ
    &$

    View Slide

  57. Ͳ͏΍ͬͯίʔυΛॻ͔͘

    -BNCEB'VODUJPOΛ։ൃ͢Δ৔߹΋ಉ͡
    lίʔυΛॻ͘zͱ͍͏࡞ۀʹ͓͍ͯ͸ɺϩʔΧϧͰ࢖͍
    ׳Εͨ؀ڥͷ΋ͱߦ͏ͷ͕ޮ཰ྑ͍
    *OUFMMJKΛར༻ͯ͠5ZQF4DSJQU OPEFKT
    ΍1ZUIPOΛ
    ॻ͘
    "NB[PO$PEF$PNNJUΛ࢖ͬͯόʔδϣϯ؅ཧ
    "84$-*΍$MPVE'PSNBUJPOΛ࢖ͬͯσϓϩΠʢޙड़ʣ
    αόϨε

    View Slide

  58. ͲͷΑ͏ͳίʔυઃܭΛߦ͏͔

    ϑϨʔϜϫʔΫͷઃܭํ਑ʹै͏
    ΫϦʔϯΞʔΩςΫνϟͳͲͷಋೖʹΑΔυϝΠϯϩδο
    Ϋͷ෼཭
    &$

    View Slide

  59. ͲͷΑ͏ͳίʔυઃܭΛߦ͏͔

    -BNCEB'VODUJPOͷίʔυͰ΋ಉ͡ߟ͑ํ͕ద༻Ͱ͖Δ
    υϝΠϯϩδοΫΛ෼཭͢Δ͜ͱͰԿ͕͍ͨ͠ͷ͔Λදݱ
    Ͱ͖Δ
    ·ͨɺ୭͕-BNCEB'VODUJPOΛىಈͯ͠ɺ-BNCEB
    'VODUJPO͕ͲͷαʔϏεΛݺͼग़͢ͷ͔ΛΘ͔Γ΍͘͢
    ͓ͯ͘͠
    ϨΠϠԽΞʔΩςΫνϟ͕Ϛονͦ͠͏
    αόϨε

    View Slide

  60. ઃܭྫ

    αόϨε
    IBOEMFST
    EPNBJOT
    JOGSBTUSVDUVSFT
    BQJHXVTFS
    report.ts
    FWFOUDPOUFOU
    report-put.ts
    EZOBNPEC
    report.ts
    T
    content.ts

    View Slide

  61. ઃܭྫ

    αόϨε
    IBOEMFST
    EPNBJOT
    JOGSBTUSVDUVSFT
    BQJHXVTFS
    report.ts
    FWFOUDPOUFOU
    report-put.ts
    EZOBNPEC
    report.ts
    T
    content.ts
    VTFS޲͚ͷ"1*(BUFXBZ
    ͔Βىಈ͞ΕΔ
    SFQPSUϦιʔεʹؔ࿈͢Δॲ

    View Slide

  62. ઃܭྫ

    αόϨε
    IBOEMFST
    EPNBJOT
    JOGSBTUSVDUVSFT
    BQJHXVTFS
    report.ts
    FWFOUDPOUFOU
    report-put.ts
    EZOBNPEC
    report.ts
    T
    content.ts
    %ZOBNP%#ʹର͢Δॲཧ
    SFQPSUςʔϒϧΛૢ࡞͢Δ

    View Slide

  63. ͲͷΑ͏ͳίʔυઃܭΛߦ͏͔

    ͦ͏͸ݴͬͯ΋θϩ͔ΒϓϩδΣΫτϑΥϧμ࡞Δͷ͸ͪΐͬͱେ
    มɺςϯϓϨʔτ͕΄͍͠
    (JU)VCͰߏ੒ҊΛެ։͍ͯ͠·͢
    1ZUIPO
    QZUIPOMBNCEBUFNQMBUFIUUQTHJUIVCDPNDNXBEBZVTVLF
    QZUIPOMBNCEBUFNQMBUF
    5ZQF4DSJQU
    UTBTIUUQTHJUIVCDPNDNXBEBZVTVLFUTBT
    αόϨε

    View Slide

  64. Ͳ͏΍ͬͯσϓϩΠ͢Δ͔

    ΞϓϦέʔγϣϯʢ+"3ʣ"OTJCMF1BDLFSͰ(PMEFO
    ".*Λͭ͘Δ3BLFpMFΛ༻ҙ
    ؀ڥͷҧ͍͸SBLF࣮ߦ࣌ͷίϚϯυϥΠϯม਺Ͱ۠ผ
    ؀ڥύϥϝʔλͷҧ͍͸؀ڥ͝ͱͷ஋Λ4ͳͲʹ͓͍͓ͯ
    ͖ɺ"OTJCMF࣮ߦ࣌ʹ&$ͷ؀ڥม਺΁ల։͢Δ
    ઃఆϑΝΠϧεΫϦϓτͰσϓϩΠͰ͖ΔΑ͏ʹ͢Δ
    ؀ڥͷࠩ෼͸ผ్ύϥϝʔλ༻ϑΝΠϧʹ੾Γग़͢
    &$

    View Slide

  65. Ͳ͏΍ͬͯσϓϩΠ͢Δ͔

    &$ʹσϓϩΠ͢Δͱ͖ͱಉ͡ߟ͑ํ͕ద༻Ͱ͖Δ
    ઃఆϑΝΠϧ
    $MPVE'PSNBUJPOϕʔεͷ:".-ϑΝΠϧ
    εΫϦϓτ
    "84$-*ɺ4FSWFSMFTT'SBNFXPSLͳͲ
    ؀ڥࠩ෼
    ؀ڥ͝ͱʹύϥϝʔλΛ༻ҙ
    αόϨε

    View Slide

  66. ͦΕͰ΋ʜ

    $MPVE'PSNBUJPOςϯϓϨʔτΛ࢖ͬͯ؀ڥผʹσϓϩΠ͠Α
    ͏ͱࢥ͏ͱɺύϥϝʔλͷऔΓճ͠Ͱ޻෉͕ඞཁ
    σϓϩΠͨ͠ޙʹ&&ςετ͠Α͏ͱࢥ͏ͱɺ࣮ࡍʹར༻͍ͯ͠
    Δύϥϝʔλ͕ඞཁ
    ؀ڥ͝ͱͷύϥϝʔλΛ4ZTUFNT.BOBHFS1BSBNFUFS
    4UPSFʹ͋͛ͯ࢖͏ܰྔͳσϓϩΠπʔϧΛ࡞Γ·ͨ͠ʢએ఻ʣ
    αόϨε

    View Slide

  67. ͜͜·Ͱ੔ཧ

    Ͳ͏΍ͬͯίʔυΛॻ͔͘
    ࢖͍׳ΕͨΤίγεςϜΛ׆༻͢Δ
    ͲͷΑ͏ʹίʔυઃܭ͢Δ͔
    -BNCEB'VODUJPO͕Ͳ͔͜Βىಈ͞ΕɺͲͷαʔϏεΛݺͼग़͔͢Λ໌
    ࣔ͢Δ
    Ͳ͏σϓϩΠ͢Δ͔
    ઃఆϑΝΠϧεΫϦϓτ
    $MPVE'PSNBUJPOςϯϓϨʔτ"84$-*

    View Slide

  68. ςετͷॏ఺ΛͲ͜ʹஔ͔͘

    ॻ͍ͨίʔυ͕ΞϓϦέʔγϣϯͷ΄΅͢΂ͯ
    )551ϦΫΤετ΍σʔλϕʔεॲཧΛϞοΫԽɺॻ͍
    ͨίʔυΛ໢ཏ͢Δ
    ϩʔΧϧʹ.Z42-΍μϛʔαʔϏεΛىಈ͠ɺ֤छ֎
    ք΁ͷॲཧͷJNQMFNFOUBUJPO͕ҙਤͲ͓Γʹಈ࡞͠
    ͍ͯΔ͜ͱΛ֬ೝͰ͖Δͱͳ͓Α͍
    &$

    View Slide

  69. ςετͷॏ఺ΛͲ͜ʹஔ͔͘

    &$ΞϓϦέʔγϣϯͷςετͱ͸ߟ͑ํ͕ҟͳΔ
    αʔόʔϨεͷ৔߹ɺػೳ͝ͱͷ&&ςετʹॏ఺Λஔ͘
    ࣮ࡍʹ"84ʹσϓϩΠͯ͠ಈ͔ͯ͠Έͳ͍ͱΘ͔Βͳ͍͜ͱ͕
    ଟ͍ͨΊ *".ɺϦτϥΠॲཧͳͲʜ

    ҎԼͷྲྀΕ
    -BNCEB'VODUJPOͱ"84ϦιʔεΛ࣮ࡍʹσϓϩΠ͢Δ

    1BSBNFUFS4UPSF͔Βςετର৅ͱͳΔ؀ڥͷύϥϝʔλΛಡΈग़͢

    ϢʔεέʔεʹԊ࣮ͬͯࡍʹϦΫΤετΛߦ͍ςετ͢Δ
    αόϨε

    View Slide

  70. ςετͷྫ QZUFTU


    αόϨε
    @pytest.fixture(scope='session', autouse=False)
    def ssm_parameters(request) -> SsmParameters:
    env = request.config.getoption('--env')
    yield make_parameters(env)
    def make_parameters(env) -> SsmParameters:
    # from SSM
    function_args = {
    'Path': f'/{env}',
    'Recursive': True,
    'WithDecryption': True,
    'MaxResults': 10,
    }
    response = SSM.get_parameters_by_path(**function_args)
    current_batch, next_token = extract_result(response)
    result = current_batch
    while next_token is not None:
    #࠶औಘ
    parameters_from_ssm = \
    {extract_parameter_name(parameter): parameter['Value']
    for parameter in result}
    ssm_parameters = SsmParameters(parameters_from_ssm)
    return ssm_parameters
    1BSBNFUFS4UPSF͔Βσʔ
    λΛऔಘ͠ΦϒδΣΫτੜ੒
    ϑΟΫενϟͱͯ͠ఆٛ͢Δ
    ͜ͱͰ֤ςετͰύϥϝʔλ
    ͕ར༻Ͱ͖Δ

    View Slide

  71. νʔϜ։ൃ

    γεςϜͷڥքͱ։ൃϝϯόʔͷ୲౰ڥք͕Ұக͕ͪ͠
    ސ٬૭ޱ

    αʔόʔʢ"1*ɺόονʣ୲౰

    8FCը໘୲౰

    ϞόΠϧΞϓϦ୲౰
    ֤୲౰ɺಛʹαʔόʔαΠυ͸ߟ͑Δ͜ͱ͕ଟ͍
    &$

    View Slide

  72. αʔόʔαΠυ։ൃͰߟྀ͢Δ͜ͱ

    εέʔϧઃܭ
    σϓϩΠखॱͷ੔ཧ
    ΞʔΩςΫνϟઃܭɾϩδοΫ૊Έ্͛
    3VCZPO3BJMTͩͱ8FCը໘Λ࡞Δ͜ͱ΋
    ϩάઃܭʢूੵɾΞϥʔτઃఆʣ
    &$
    ଞʹख͕ճΒͳ͍

    View Slide

  73. νʔϜ։ൃ

    &$ΞϓϦέʔγϣϯͷνʔϜ։ൃͱ͸ߟ͕͑ҟͳΔ
    ػೳϏδωεՁ஋͝ͱʹཁ݅ௐ੔ɾαʔόʔɾϑϩϯ
    τΛҰਓͷ։ൃऀ͕୲౰͢Δͱޮ཰͕ྑ͍
    αʔόʔϨε։ൃͰࢧ഑తͳίϛϡχέʔγϣϯΦʔόʔ
    ϔουͷ࡟ݮʹͳΔʢޙड़ʣ
    αʔόʔαΠυʹશ౤ೖͤ͟ΔΛಘͳ͔ͬͨ։ൃऀͷϦ
    ιʔεΛɺϏδωε΍ผͷίϯϙʔωϯτʹׂ͚Δ
    αόϨε

    View Slide

  74. ϓϩδΣΫτͷਐΊํ

    &$ͱൺֱ͢Δ΋ͷͰ͸ͳ͍͕ɺ͜Ε·Ͱͱ͸ߟ͑ํΛม
    ͑Δඞཁ͕͋Δ͔΋͠Εͳ͍
    ఻౷తͳϓϩδΣΫτͷਐΊํ
    ཁ݅ௐ੔

    ࢓༷ௐ੔

    ։ൃ

    ςετ

    σϓϩΠ

    ϦϦʔεɺӡ༻
    αόϨε

    View Slide

  75. ͜ΕΛαʔόʔϨε։ൃͰ΍Δ৔߹

    ͢΂ͯͷ"84αʔϏεͷ੍ݶࣄ߲Λ೺Ѳ͓ͯ͘͠
    ͢΂ͯͷ"84αʔϏεͷػೳΛ೺Ѳ͓ͯ͘͠
    ཁ݅ͷ࣮ݱՄ൱Λ൑அ͢Δ
    ࢓༷ͷଥ౰ੑΛ൑அ͢Δ
    ͍͟։ൃ΁
    αόϨε

    View Slide



  76. ແཧ

    View Slide

  77. ϓϩδΣΫτͷਐΊํ

    ݱ࣮తͳαʔόʔϨε։ൃͷεςοϓ
    ཁ݅ௐ੔"84ར༻αʔϏεબఆݕূཁ݅֬ఆ
    ࢓༷ௐ੔ΞʔΩςΫνϟઃܭ1P$։ൃ࢓༷֬ఆ
    ։ൃ
    ςετ
    σϓϩΠ
    ϦϦʔεɺӡ༻
    αόϨε
    × ػೳ

    View Slide

  78. ϓϩδΣΫτͷਐΊํ

    ݱ࣮తͳαʔόʔϨε։ൃͷεςοϓ
    ཁ݅ௐ੔"84ར༻αʔϏεબఆݕূཁ݅֬ఆ
    ࢓༷ௐ੔ΞʔΩςΫνϟઃܭ1P$։ൃ࢓༷֬ఆ
    ։ൃ
    ςετ
    σϓϩΠ
    ϦϦʔεɺӡ༻
    αόϨε
    ͜͜ʹؔΘΔਓ਺͕ଟ͚Ε͹
    ଟ͍΄Ͳίετ͕രൃ͢Δ
    υϝΠϯΤΩεύʔτͱ։ൃऀ
    ͷਓମ੍͕ཧ૝

    View Slide

  79. αʔόʔϨε։ൃ੒ޭͷΧΪ

    ཁ݅ௐ੔"84ར༻αʔϏεબఆݕূཁ݅֬ఆ
    ࢓༷ௐ੔ΞʔΩςΫνϟઃܭ1P$։ൃ࢓༷֬ఆ
    ͜ͷεςοϓ͕ͦ΋ͦ΋ඞཁͰ͋Δ͜ͱΛεςʔΫϗϧ
    μʔʹཧղͯ͠΋Β͏
    ͜ͷεςοϓͷͨΊͷظؒΛઃ͚Δ
    ։ൃऀ͕ϏδωεΛ೺Ѳ͠ɺ͜ͷεςοϓΛޮ཰Խɾল
    ྗԽ͢Δ
    αόϨε

    View Slide

  80. ՝୊ղܾฤͷ੔ཧ

    ߟ͑ํ
    ίʔσΟϯά؀ڥ
    ࢖͍׳ΕͨΤσΟλ
    όʔδϣϯ؅ཧ
    ࢖͍׳ΕͨΤσΟλ
    όʔδϣϯ؅ཧ
    ಉ͡
    ίʔυઃܭ υϝΠϯϩδοΫ෼཭ ϨΠϠԽ ಉ͡
    σϓϩΠ
    "OTJCMF 1BDLFS
    3BLFλεΫ
    $MPVE'PSNBUJPO "84$-*
    4FSWFSMFTT'SBNFXPSL
    ಉ͡
    ςετͷॏ఺
    ΞϓϦέʔγϣϯ
    ίʔυ
    ࣮ݱ͍ͨ͠ػೳ ҟͳΔ
    νʔϜ։ൃํ๏ γεςϜڥքͰ෼୲ ࣮ݱ͍ͨ͠ػೳͰ෼୲ ҟͳΔ
    ϓϩδΣΫτͷਐΊํ
    ػೳ͝ͱʹσϓϩΠαΠΫϧ
    Λճ͢

    &$ αόϨε

    View Slide

  81. ࿩͢಺༰
    w αʔόʔϨεͷಛੑΛ஌Δ
    w αʔόʔϨε։ൃ;Γ͔͑Γͱ՝୊
    w ՝୊ղܾ
    w αʔόʔϨεྲྀߟ͑ํͷ੔ཧ


    NJO
    NJO
    NJO
    NJO

    View Slide

  82. αʔόʔϨεྲྀͷߟ͑ํ

    ม͑ͳͯ͘ྑ͍΋ͷɺม͑Δͱޮ཰্͕͕Δ΋ͷΛ஌Δ
    खஈઌߦͱϕϯμʔϩοΫΠϯΛڐ༰͢Δ
    ·ΘΓΛר͖ࠐΜͰҰॹʹ։ൃͯ͠΋Β͏

    View Slide

  83. ม͑ͳͯ͘ྑ͍΋ͷɺม͑Δͱޮ཰্͕͕Δ΋ͷΛ஌Δ

    αʔόʔϨε։ൃΛଓ͚͍ͯΔͱɺগͳ͔ΒͣนʹͿͪ͋
    ͨΔ͜ͱʹͳΔ
    ͜Ε·Ͱഓ͖ͬͯͨϝλ஌͕ࣝ໾ʹཱͭ
    ͳʹ͔՝୊͕ग़ͨΒɺ͜Ε·Ͱ͸Ͳ͏͍͔ͯͨ͠ɺͳͥ͜
    Ε·Ͱ͸՝୊Ͱ͸ͳ͔ͬͨͷ͔ͱ͍͏ࢥߟ࣮ݧ͕ޮՌత
    ୲౰ྖҬ͕ਫฏʹ޿͕ΔͷͰɺ
    ʢϏδωεՁ஋ͷߟ࡯ɺϑϩϯτΤϯυʣ
    ՝୊ʹ௚໘͢Δͷ͸౰ͨΓલ

    View Slide

  84. खஈઌߦͱϕϯμʔϩοΫΠϯΛڐ༰͢Δ

    αʔόʔϨε։ൃ͸͔ͨ͠ʹಘҙͳྖҬɺۤखͳྖҬ͸͋Δ
    ͕ɺϦεΫΛආ͚ͯ෦෼తͳద༻ʹͷΈऴ͍࢝ͯͯ͠͸εΩ
    ϧΞοϓ͸๬Ίͳ͍
    Α͘Θ͔ΒΜ͚ͲͱΓ͋͑ͣϑϧαʔόʔϨεͰɺ"84αʔ
    Ϗε͚ͩΛ࢖ͬͯ΍Δͧʂͱ͍͏૊৫୯ҐͰͷࢥ͍੾Γ΋࣌
    ʹ͸ඞཁ
    ৽͍͠ύϥμΠϜ΁ͷ౤ࢿ͕
    ։ൃऀͱͯ͠ͷεΩϧΞοϓʹͭͳ͕Δ

    View Slide

  85. ·ΘΓΛר͖ࠐΜͰҰॹʹ։ൃͯ͠΋Β͏

    ϓϩμΫτΦʔφʔ΍Ϛωʔδϟʔ͕ϝοηϯδϟʔʹͳͬͯཁ݅ɾ
    ࢓༷ɾ࣮ݱՄ൱Λ΍ΓͱΓ͍ͯ͠Δঢ়گͰ͸αʔόʔϨε։ൃ͸ෆՄೳ
    ։ൃऀ͕Ϗδωεͷ͜ͱΛ஌ΓɺϓϩμΫτΦʔφʔ΍υϝΠϯΤΩε
    ύʔτ͕"84αʔϏεͷ͜ͱΛ஌Δ
    Կ͕͍͔ͨ͠ɺϢʔβʔʹͲ͏ͳͬͯ΄͍͔͠Λৗʹ໰͍ଓ͚Δ
    ϏδωεϢʔεέʔεΛ"84ʹϑΟʔυόοΫ͢Δ
    ϢʔβʔʹՁ஋Λಧ͚Δͱ͍͏఺Ͱ
    αʔόʔϨε͸࠷଎

    View Slide

  86. ࢀߟॻ੶ɾར༻ͨ͠πʔϧ

    w DODGXHTFSWFSMFTT$/$'4FSWFSMFTT8(IUUQTHJUIVCDPNDODGXHTFSWFSMFTT
    w "844".IUUQTEPDTBXTBNB[PODPNKB@KQMBNCEBMBUFTUEHTFSWFSMFTT@BQQIUNM
    w .BLF(/61SPKFDUIUUQTXXXHOVPSHTPGUXBSFNBLF
    w QZUFTUEPDVNFOUBUJPOIUUQTEPDTQZUFTUPSHFOMBUFTU
    w DNXBEBZVTVLFUTBTUIUUQTHJUIVCDPNDNXBEBZVTVLFUTBT
    w "844FSWJDF-JNJUT"NB[PO8FC4FSWJDFTIUUQTEPDTBXTBNB[PODPNHFOFSBMMBUFTUHS

    View Slide