【スナックミー】 Real Food(リアルフード)のみからできたおやつのパーソナライズ型サブスクリプションBOX https://snaq.me
Amazon PinpointΛ༻͍ͯEmailLINE௨ΛࣗಈԽͨ͠ج൫2019.10.03AWS DevDay Tokyo 2019 C-4גࣜձࣾεφοΫϛʔ CTO & co-founder ࡾ ൏ਓ
View Slide
• גࣜձࣾεφοΫϛʔ• ࡾ ൏ਓ co-founder & CTO• ౦ژੜ·Ε౦ژҭͪ• ݐஙग़ΤϯδχΞ• τϥΠΞεϩϯϚϥιϯΛᅂΉ@miyoshihayato
1. snaq.me(εφοΫϛʔ) ʹ͍ͭͯ1,980ԁ (੫ࠐ)100छҎ্͔Β8छͷ͓ͭΛҰਓͻͱΓʹηϨΫτ͓ͯ͠ಧ͚Real Food͔Β࡞ͬͨɺඒຯͯ͘͠Χϥμʹ༏͍͓ͭ͠Λ͓ҰਓͻͱΓʹΧελϚΠζ͓ͯ͠ಧ͚͢ΔαϒεΫϦϓγϣϯαʔϏε
MissionVison৽͍͓ͭ͠ମݧΛ͠ɺ ͓ͭͷ࣌ؒΛՁͷ͋Δͷʹ͢Δɻඦԯԁنͷ Real FoodεφοΫࢢΛΓɺ ͦͷࢢͷφϯόʔ1ϒϥϯυͱͳΔɻӫཆՁ͕ߴ͘ɺͦΕͰ͍ͯඒຯ͠͞ʹଥڠ͠ͳ͍εφοΫʹΑͬͯɺ͓ͭͦͷͷ࣭Λ্͛Δɻ·ͨɺϞϊ͚ͩͰͳ͘ɺ৽͍͓ͭ͠ମݧΛσβΠϯ͠ɺ͓ͭͷ࣌ؒͷՁΛ্ͤ͞ΔɻͦΕʹΑͬͯɺ͓ͭͷ͕࣌ؒ࠼ΓͱͳΓɺ๛͔ͳੜ׆Λ࣮ݱ͢ΔɻReal FoodεφοΫͱɺܗ͋ΔReal FoodͷΈ͔Β࡞ΒΕͨεφοΫɻૉࡐຊདྷ͕࣋ͭӫཆͱඒຯ͠͞Λ࠷େݶʹ׆͔͠ɺਓతͳݪྉԽֶ࣭Θͳ͍ɻӫཆՁ͕ߴ݈͘߁తͰɺͦΕͰ͍ͯඒຯ͠͞ʹଥڠ͠ͳ͍ɻ
εφοΫϛʔͷ։ൃج४Made From Real FoodԽֶ࣭ʹཔΒͣɺࣗવͳૉࡐ͔Βඒຯ͠͞ͱӫཆΛҾ͖ग़͢Create a New Culture৽͍͠৯จԽ৯श׳Λ࡞Γग़͠͏ΔWithout Compromiseඒຯ͠͞ʹଥڠ͠ͳ͍
υϥΠϑϧʔπɾφοπτϨΠϧϛοΫεম͖՛ࢠνϣίνοϓεถ՛ͦͷଞϑϧʔπ՛ࢠقઅʹ߹Θͤͨ100SKUҎ্Λৗ࣌ࡏݿɻຖ݄10ʙ20%ΛೖΕସ͑ɻ1. snaq.me(εφοΫϛʔ) ʹ͍ͭͯ
1. snaq.me(εφοΫϛʔ) ʹ͍ͭͯࢦࣔॻ࡞ ࡏݿొ ΞαΠϯ ϐοΩϯά ൃૹ͔Βൃૹ४උ·ͰҰ؏
1. snaq.me(εφοΫϛʔ) ʹ͍ͭͯੳTOBDLCPY͓ͭͷධՁ/ϦΫΤετ৽։ൃ͓ͭͷA/Bςετ͓ಧ͚͢Δ͓ͭΛܾఆ
։ൃͷओͳπʔϧ- αʔόʔαΠυ : Ruby on Rails (PHP)- ϑϩϯτΤϯυݴޠ : BabelɺҰ෦TypeScript- ϑϩϯτΤϯυ : React, Redux, webpack- UIίϯϙʔωϯτΧλϩά : Storybook- σʔλੳ : python- σʔλϕʔε : Aurora, DynamoDB- Πϯϑϥ : AWS- ։ൃڥ : Vagrant, Docker- ϦϙδτϦཧ : GitHub / codecommit- CI / CDͳͲ : CodePipeLine / jest / RSpec- ίϛϡχέʔγϣϯ : Qiita:Team, Slack
Amazon PinpointΛ༻͍ͯEmailLINE௨ΛࣗಈԽͨ͠ج൫ͷ͔͜͜Βຊ
ͦͦɺͳͥLINE(νϟοτUI)Λ༻͍ͨͷ͔ʁ
2015ͷۀલ͔ΒҎԼͷΑ͏ʹߟ͍͑ͯ·ͨ͠• UX͕໌֬• νϟοτUIएஉঁ͑Δ• ͜Ε͔ΒνϟοτUI͕ϕʔεʹͳΔՄೳੑ͕͋Δ• LINE͔ΒpushͰ͖Δ• LINE্ͩͱϑϨΩγϒϧʹUIΛૢΕͳ͍ͷͰwebʹҊ͢ΔΑ͏ʹͨ͠
εφοΫϛʔॳʁ
ॳ
ΓͱΓશͯνϟοτܗࣜධՁϦΫΤετ
νϟοτUI͍͍ͱ͜Ζ͚ͩ͡Όͳ͍త͕͔ͬ͠Γ͍ͯ͠Δ߹ճΓ͘Ͳ͍ॳճɺॳݟϢʔβʔʹνϟοτͰҊ͢Δͱ͍উख্⭕❌2प(ֶशࡁΈͷUIUX)❌
CSͱͯ͠ͷίϛϡχέʔγϣϯ1ຊʹͦͷͨΊ
LINE Messaging API༻͍͍ͯΔͷ͕
• اۀͱϢʔβʔͷํίϛϡχέʔγϣϯ͕Մೳ• ϓογϡϝοηʔδͱԠϝοηʔδ• 1ର1ɺάϧʔϓͰτʔΫՄೳ• ͞·͟·ͳঢ়گʹ߹ΘͤͨϝοηʔδλΠϓ• ςΩετ• ελϯϓ• Ի• ը૾ͳͲLINE Messaging APIͰͰ͖Δ͜ͱ
ߏਤϢʔβʔૹ৴ελοϑૹ৴ελοϑ௨AmazonRoute 53ElasticLoadBalancingElasticLoadBalancingEC2EC2AmazonAurora
ૹड৴Λ͚͍ͯΔཧ༝Ϣʔβʔ͔Βͷϝοηʔδड৴ઈରʂམͱͤͳ͍
• αʔϏε͕άϩʔε͢ΕɺCS૿͢ඞཁ͕͋Δ• Ͳ͜·ͰΞτόϯυ(ελοϑൃ৴)Λߦ͏͔• ͕ͩɺϢʔβʔͱͷଟ͍࣋ͪͨ͘• ৽͍͠ࢪࡦΛࢼ͍ͨ͠ͳͲ՝
1ର1ͷରԠ͠ɺ1ରଟΛͰ͖ΔΈͷߏஙϢʔβʔͱ͢Δʹ1า(௨)͕େࣄͳͷͰ
ηάϝϯτରͷ1௨awsΛ༻͍ͨγεςϜͦͷޙ1ର1ͰϝοηʔδͷΓऔΓ͜͏͍͏͜ͱ
ηάϝϯτͨ͠Ϣʔβʔ৴ΛࣗಈԽͰ͖Δج൫͕ཉ͍͠
Amazon Pinpoint
Amazon Pinpoint ͱΤϯήʔδϝϯτνϟωϧϝοηʔδΛͻͱͭͷνϟωϧ͔ɺଟ͘ͷνϟωϧܦ༝ͰૹΔ͔ʹ͔͔ΘΒͣɺੈքதͷԿඦສͷސ٬ʹ؆୯Ͱ৴པੑߴ͘ϝοηʔδΛಧ͚Δ͜ͱ͕Ͱ͖·͢ɻΤϯήʔδϝϯτཧదͳސ٬ʹɺదͳϝοηʔδΛɺదͳλΠϛϯάͰɺదͳνϟωϧΛ௨ͯ͠ૹ͍ͬͯͩ͘͞ɻੳސ٬ͱوࣾͷΤϯήʔδϝϯτʹؔ࿈ͨ͠σʔλΛूɺՄࢹԽɺΧελϚΠζɻࢀর : https://aws.amazon.com/jp/pinpoint/
Amazon Pinpoint ͱΤϯήʔδϝϯτνϟωϧEϝʔϧɺԻɺSMSɺϓογϡ௨ɺ֦ுػೳ(LINEͳͲ)ΤϯήʔδϝϯτཧΩϟϯϖʔϯͷΑ͏ʹಛఆͷରऀηάϝϯτʹૹ৴͢ΔͷͰͳ͘ɺಛఆͷड৴ऀʹૹ৴͢ΔΦϯσϚϯυϝοηʔδΛૹΔ͜ͱՄೳੳސ٬σʔλͷऩूͱཧղɺ͓Αͼσʔλʹج͍ͮͨߦಈɺΤϯήʔδϝϯτͷऔΓΈͷύϑΥʔϚϯεʹରͯ͠ɺ͞·͟·ͳੳ͕Մೳࢀর : https://aws.amazon.com/jp/pinpoint/
Amazon Pinpoint ͱࢀর : https://docs.aws.amazon.com/ja_jp/aws-mobile/latest/developerguide/mobile-hub-add-aws-mobile-analytics.html
Amazon Pinpoint Ͱemail/push௨ ͷϢʔεέʔεAWS BatchAmazon SimpleStorage Service(S3)AmazonPinpointલॲཧηάϝϯτͷϢʔβʔΛS3ʹΞοϓϩʔυ࣌ؒࢦఆ or ଈ࣌৴
• jsoncsvϑΝΠϧ͕͋ΕGUI͔Βૢ࡞͢Δ͜ͱՄೳ• ࣌ؒࢦఆ or ଈ࣌৴͕Մೳ• 1ඵؒʹ0 ~ 25,000௨·Ͱ৴Λม͑Β͑Δ• ։෧ClickҎ֎ͷੳΛҎͰੳͯ͘͠ΕΔ• ϑΝωϧੳͰ͖Δ & Amazon PersonalizeAmazon Pinpointͷخ͍͠ϙΠϯτײͰ৮ΕΔ༧৴(batchॲཧ)ۓٸੑͷߴ͍৴(ใχϡʔεͳͲ)ΞΫηεΛίϯτϩʔϩͰ͖ΔͨͩૹΔ͚ͩ͡Όͳ͘ɺͦͷޙͷΞΫγϣϯʹͭͳ͛ΒΕΔ͞·͟·ͳCVRௐ͕ࠪՄೳϑΝωϧੳ
Ͳ͏͍͏ߏਤʹ͠Α͏͔ʁʁ
Email or LINE Ͱ௨͍ͨ͠
LINE௨Λ͢ΔʹAWS LambdaΛ༻ͨ͠ΧελϜνϟωϧͰͰ͖ΔΒ͍͠※ ࠓ(201910݄ݱࡏ)ύϒϦοΫϕʔλ൛ͳͷͰ༷มߋͷՄೳੑ͋Γ
Amazon Pinpoint౦ژϦʔδϣϯͰར༻Ͱ͖ͳ͍※ ࠓ(201910݄ݱࡏ)
Amazon PinpointΛىಈͤ͞ΔʹͲ͏͠Α͏σʔλ౦ژϦʔδϣϯʹ͋Δ
AWS Step FunctionsͰཧͰ͖ΔʁAWS Lambdaʁ
AWS Step FunctionsAWS LambdaϦʔδϣϯؒΛͭͳ͛ΒΕͳ͍
ҟͳΔϦʔδϣϯͷAWS LambdaΛར༻͢Δํ๏͕͋Δࢀর : https://dev.classmethod.jp/cloud/trigger-lambda-on-other-regions/
• ϢʔβʔΞϓϦέʔγϣϯͷݺͼग़͠ɺPC/αʔόʔ্ͷAWS SDK·ͨεϚʔτ্ͷAWS Mobile SDKͰՄೳ• AWSͷ௨αʔϏεͰ͋ΔSNSͷ௨ઌͱͯ͠AWS LambdaΛࢦఆ͢Δ• S3 Cross-Region ReplicationͰAWS Lambdaؔͱಉ͡ϦʔδϣϯʹόέοτΛෳ͠ɺෳόέοτʹAWS LambdaͷΠϕϯτ௨Λઃఆ͢ΔҟͳΔϦʔδϣϯͷAWS LambdaΛར༻͢Δํ๏ࢀর : https://dev.classmethod.jp/cloud/trigger-lambda-on-other-regions/
• ϢʔβʔΞϓϦέʔγϣϯͷݺͼग़͠ɺPC/αʔόʔ্ͷAWS SDK·ͨεϚʔτ্ͷAWS Mobile SDKͰՄೳ• AWSͷ௨αʔϏεͰ͋ΔSNSͷ௨ઌͱͯ͠AWS LambdaΛࢦఆ͢Δ• S3 Cross-Region ReplicationͰAWS Lambdaؔͱಉ͡ϦʔδϣϯʹόέοτΛෳ͠ɺෳόέοτʹAWS LambdaͷΠϕϯτ௨Λઃఆ͢ΔҟͳΔϦʔδϣϯͷAWS LambdaΛར༻͢Δํ๏͕͋Δࢀর : https://dev.classmethod.jp/cloud/trigger-lambda-on-other-regions/
ηάϝϯτใ͔Β৴·ͰͷϑϩʔAWS Step FunctionsͰ͍ͨ͠
Amazon Pinpoint ηάϝϯτΛΠϯϙʔτ͢Δʹ࣌ؒΛཁ͢Δ(࣌ؒͰͳ͍)
ΧελϜνϟωϧͰىಈ͞ΕͨAWS Lambda50໊Ͱ1Lambdaىಈ͢Δ
• σʔλϕʔε͕౦ژϦʔδϣϯͷͨΊLambdaܦ༝ͰPinpointΛىಈͰ͖ͳ͍• ৴ͷϫʔΫϑϩʔΛStep FunctionsΛ༻͍Δ༧ఆ͕ϦʔδϣϯؒsetͰ͖ͳ͍• ηάϝϯτͨ͠δϣϒΛΠϯϙʔτྃʹ͕͔͔࣌ؒΔ• ࠷ޙͷLINE৴࣌Ͱ৴ਓ / 50໊ͷLambda্ཱ͕͕ͪΔ• ଐੑͷίϯτϩʔϧAWS LambdaͱࣗಈԽʹ͏՝ΦϨΰϯͳͲಉϦʔδϣϯͰ͋ΕىಈՄೳPinpointͷϑϩʔ͚ͩStep FunctionsΛ༻͍ΔͳͲΠϯϙʔτྃΛϙʔϦϯά͢Δඞཁ͕͋Δ্ݶ؇·ͨಉ࣌ʹ50,000ਓʹૹΒͳ͚Εجຊͳ͍ଐੑ40ݸ·ͰͳͷͰɺܭըతͳઃܭ͕ඞཁ
AWS Step FunctionsAmazon S3AWS Lambda AWS Lambda AmazonDynamoDBAWS LambdaAWS LambdaAWS LambdaDONE import?৴ ϑϩʔAmazon SimpleNotification ServiceTokyo Region (ap-northeast-1) Oregon Region (us-west-2)AWS Batch
AWS Step FunctionsAmazon S3AWS Lambda AWS Lambda AmazonDynamoDBAWS LambdaAWS LambdaAWS LambdaDONE import?৴ ϑϩʔAmazon SimpleNotification ServiceTokyo Region (ap-northeast-1) Oregon Region (us-west-2)AWS Batch౦ژϦʔδϣϯ
AWS Step FunctionsAmazon S3AWS Lambda AWS Lambda AmazonDynamoDBAWS LambdaAWS LambdaAWS LambdaDONE import?৴ ϑϩʔAmazon SimpleNotification ServiceTokyo Region (ap-northeast-1) Oregon Region (us-west-2)AWS BatchΦϨΰϯϦʔδϣϯ
AWS Step FunctionsAmazon S3AWS Lambda AWS Lambda AmazonDynamoDBAWS LambdaAWS LambdaAWS LambdaDONE import?৴ ϑϩʔAmazon SimpleNotification ServiceTokyo Region (ap-northeast-1) Oregon Region (us-west-2)AWS BatchϢʔβʔηάϝϯτͨ͠σʔλΛS3ʹputͰSNSΛணՐSNSϦʔδϣϯؒؔͳ͍ͷͰɺStep Functions Λىಈͤ͞ΔAmazon PinpointΛ༻͍ͯ৴
AWS Step FunctionsAmazonDynamoDBAWS LambdaAWS LambdaAWS LambdaDONE import?৴ AWS Step FunctionsStep FunctionsͷελʔτDynamoDB͔Β৴͢ΔpinpointͷΞϓϦέʔγϣϯΛऔಘ͢Δimport͞ΕͨJSONσʔλΛݩʹηάϝϯτΛ࡞৴͢ΔνϟωϧλΠϓ͔ΒΧελϜνϟωϧඪ४Λऔಘ͢Δimportޙ͕݅ଟ͘ͳΔͱimportʹ͕͔͔࣌ؒΔ(࣌ؒͰͳ͍ͳ͍)ͦͷͨΊɺimport͕͔ྃͨ͠ఆظνΣοΫ͢Δඞཁ͋ΓྃޙΩϟϯϖʔϯͷੜΧελϜͷ߹ΧελϜνϟωϧͰ৴͢ΔLambdaΛىಈͤ͞Δ
AWS Lambda৴ AWS Step FunctionsྃޙΩϟϯϖʔϯͷੜΧελϜͷ߹ΧελϜνϟωϧͰ৴͢ΔLambdaΛىಈͤ͞Δimport osimport jsonimport boto3def lambda_handler(event, context):s3 = boto3.client(‘s3')# ϝοηʔδ༰msg = event["Message"]["smsmessage"]["body"]arr = json.loads(msg)# ΤϯυϙΠϯτҰཡendpoints = event["Endpoints"]for item in endpoints:# ΤϯυϙΠϯτline_id = endpoints[item][‘Address']# ৴
S3ͷߏߏjson : ৴σʔλҰཡemail_format : ৴༰৴͢Δ্Ͱཧ͍͢͠Α͏ʹઃఆͳͷͰɺձࣾํͰ͓ͤemail: ϝʔϧ৴line: LINE৴email_line: ϝʔϧ & LINE৴xxxxʹline: LINE৴ͷϑΥʔϚοτhtml: ϝʔϧͷHTMLܕtxt: ϝʔϧςΩετܕtitle: ϝʔϧλΠτϧAmazon S3s3:// BUCKET_NAME / format / ΧςΰϦ / ϒϥϯυ໊ / ৴λΠϓ / ࢠΧςΰϦ_xxxx.txts3:// BUCKET_NAME / json / ΧςΰϦ / ϒϥϯυ໊ /৴λΠϓ / ࢠΧςΰϦ / yyyy-mm-dd.jsonjson / format ɾࢠΧςΰϦϒϥϯυ໊৴λΠϓ ࢠΧςΰϦʔ_xxxx.txtηάϝϯτϑΝΠϧ໊৴ϑΝΠϧ໊
AWS LambdaLINE ৴ AWS Lambda{"text": {"text": "xxxxxx"}}ςΩετ ver. ը૾ ver. ΠϝʔδϚοϓ ver.{"image": {"original_content_url": "xxx","preview_image_url": "yyy"}}{"imagemap":{"alt_text": "ccccccccccccccccccccc",“base_url": "https://snaq.me","h": xxx,"w": yyyy,"actions": [{"uri_text": "https://snaq.me","type": "uri","x": 0,"y": 0,"w": aaaaa,"h": bbbbb}……..]}}
AWS Step FunctionsAWS LambdaAWS LambdaΞϓϦέʔγϣϯ࡞ AWS Step FunctionspinpointͷΞϓϦʔγϣϯ࡞ ࡞ΒΕͨΞϓϦέʔγϣϯΛDynamoDBʹೖΕࠐΉ&ঢ়گnotificationͤ͞Δ༗ޮޙͷঢ়گΛDynamoʹput&ঢ়گΛnotificationͤ͞ΔAmazonDynamoDBAWS LambdaAWS LambdaAmazonDynamoDBΞϓϦέγϣʔϯͰEMAILΛ༗ޮʹͤ͞Δ
௨AWS Step FunctionsAWS LambdaAWS LambdaΞϓϦέʔγϣϯ࡞ AWS Step FunctionsAmazonDynamoDBAWS LambdaAWS LambdaAmazonDynamoDB{“app_email": "[email protected]","app_name": "xxxxxxxxxxx"}
͜ΕͰ࠷ॳͷϢʔβʔηάϝϯτͷ෦ΛೖΕସ͑Δ͚ͩͰࣗಈ৴͕Մೳʹ
Amazon PinpointͰቕͬͯ͠·ͬͨ͜ͱ
• ଐੑͷ্ݶΛ͑ͯΤϥʔ͕ฦΒͳ͍• ߏจϛεΤϥʔ͕ͩɺର߲ͷ্ݶจࣈΛ͑ͯΤϥʔฦΒͳ͍• ଐੑ͕ରϢʔβʔʹΑۭͬͯͷ߹ɺCSVͩͱ[]ͱͯ͠Δ͕jsonฏؾAmazon PinpointΛቕͬͯ͠·ͬͨ͜ͱ্ه2ͭΤϯυϙΠϯτʹରऀ͕͍Δ͔֬ೝ͕ඞཁɻ1ͭͰoutͩͱશͯૹΕͳ͍CSVཧޙʑϚʔέ͕ѻ͍͍͕͢ɺjsonΈࠐΈ͍͢
Amazon Pinpointͷ੍ݶ (ओʹҙ͕ඞཁͳpoint)Ϧιʔε σϑΥϧτͷ੍ݶ ૿ՃͷରAttributesɺMetricsɺUserAttributes ύϥϝʔλʹ·ͱΊׂͯΓͯΒΕͨଐੑΞϓϦ͝ͱʹ 40 ͍͍͑ଐੑͷ͞ 100 จࣈ ͍͍͑ಉ͡Ϣʔβʔ ID Λ࣋ͭΤϯυϙΠϯτϢʔβʔ ID ͝ͱʹ 10 ݸͷҰҙͷΤϯυϙΠϯτ͍͍͑ηάϝϯτͷ࡞ʹ༻Ͱ͖ΔσΟϝϯγϣϯͷ࠷େηάϝϯτ͝ͱʹ 100 ͍͍͑ηάϝϯτʹಉҰͷΤϯυϙΠϯτ ॏෳআ͞ΕΔ ͍͍͑
·ͱΊ• Amazon PinpointͰ͞·͟·ͳνϟωϧ௨͕Մೳ• ΧελϜνϟωϧΛ༻͍ΕLINE৴Մೳ(β൛ͳͷͰมΘΔ͜ͱ)• ଐੑͷ্ݶ͔ΒΞϓϦέʔγϣϯͷཧํ๏Λߟ͑Δඞཁ͕͋Δ• Τϥʔ͡Όͳ͍͕ૹΕͯͳ͍͜ͱ͕͋ΔͷͰɺ֬ೝͷϑϩʔඞਢ• AWS Step Functionsʹ·ͱΊΔ͜ͱͰҰݩཧ• ϦʔδϣϯؒSNSαϒεΫϥΠϒΛ༻͍Δ͜ͱͰεϜʔζʹ
ࠓޙ͍ͨ͜͠ͱ• Amazon PersonalizeΛ༻͍ͯΑΓ֬ͷߴ͍௨Λ• ͓՛ࢠͷબఆͷڧԽ• OEMઌͷγεςϜ• ύςΟγΤ͚ͷ৽։ൃγεςϜ• ࣗಈൃૹ• ධՁΛ͠ͳͯࣗ͘ಈͰ͖ݏ͍ΛஅͰ͖ΔΈͳͲ
৽͍͓ͭ͠ମݧΛ͠ɺ ͓ͭͷ࣌ؒΛՁͷ͋Δͷʹ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠͝ڵຯ͋Δํ snaq.me (εφοΫϛʔ)