Slide 1

Slide 1 text

PythonͱศརΨδΣοτɺαʔϏεɺπʔϧΛ ࢖ͬͯηϯγϯάʙݟ͑ΔԽͯ͠ΈΑ͏ 1Z$PO+1 ஌໺༤ೋʢ!DIJOPQQZʣ

Slide 2

Slide 2 text

͓લ୭Α ஌໺ ༤ೋ facebook : chinoppy twitter : @chinoppy0727 (ג)೔ຊγεςϜٕݚʢJSLʣ ॴଐ ௕໺ݝ௕໺ࢢʹ͋Γ·͢ ࠓ೥ͷPyCon JP 2019 ͰʮGold Sponsorʯ WebΤϯδχΞʢPython࢖ͬͯ·͢ʂʣ ۀ຿ͱϓϥΠϕʔτͰIoTͯ͠·͢ GEEKLAB.NAGANOͷ؅ཧਓ ౰͕ࣾӡӦ͢ΔίϛϡχςΟεϖʔε ௨শɿ͗ʔΒ΅ ฏ೔9:00ʙ18:00͜Ζ·Ͱ͸ແྉ։์͍ͯ͠·͢ ࡞ۀ৔ͱͯ͠΋ར༻Ͱ͖·͢ͷͰɺ͓ؾܰʹ͓ӽ͍ͩ͘͠͞

Slide 3

Slide 3 text

͓લ୭Α ͗ʔΒ΅ͪΌΜ ͗ʔΒ΅ʹՃΘͬͨ৽͍͠஥ؒ ه೦඼ʹεςοΧʔ͸͍ͬͯ·͢ ࡞ɿࣾ಺ͷPython࢖͍ͷֆࢣ͞Μ

Slide 4

Slide 4 text

εϥΠυɺίʔυ౳ʹ͍ͭͯ ͜ͷεϥΠυ͸ެ։͠·͢ʂ εϥΠυதͷίʔυ͸࠷খݶͷهࡌͱͳͬͯ·͢ GithubͰެ։தͰ͢ʢҰ෦ඇެ։ίʔυ͋Γʣ ηϯγϯάʢRaspberry PiΛલఏʣ https://github.com/peacemaker07/iot_making_for_raspberry_pi Ϋϥ΢υʢserverless frameworkʣ https://github.com/peacemaker07/iot_making_for_sls WebʢDjangoʣ https://github.com/peacemaker07/iot_making_for_django ※ࠓޙ΋ਵ࣌ɺߋ৽༧ఆͰ͢

Slide 5

Slide 5 text

͓ئ͍ ·ͩ·ͩվળ఺΍ศརͳαʔϏεɺπʔϧ͸͍Ζ͍Ζ͋Γ·͢ ΑΓΑ͍πʔϧɺαʔϏεɺϥΠϒϥϦ͋ΔΑʂ ͦ͜ɺ͜͏ͨ͠ํ͕Α͍ͷͰ͸ʁ ͦ͜͸஌Βͳ͔ͬͨʂ ͳͲڭ͑ͯ΋Β͑Δͱ͏Ε͍͠Ͱ͢

Slide 6

Slide 6 text

ηϯγϯάʙݟ͑ΔԽ ͦ΋ͦ΋ηϯγϯάͱ͸ ηϯαʔΛར༻ͯ͠෺ཧྔ΍ԻɾޫɾѹྗɾԹ౓ͳͲΛ ܭଌɾ൑ผ͢Δ͜ͱ ※ʮίτόϯΫ-ηϯγϯάͱ͸ʯ͔ΒҾ༻

Slide 7

Slide 7 text

ηϯαʔ౳ ηϯγϯάʙݟ͑ΔԽ ܭଌɿσʔλͷݟ͑ΔԽ

Slide 8

Slide 8 text

ηϯαʔ౳ ηϯγϯάʙݟ͑ΔԽ ؂ࢹɿผͷ৔ॴͷݟ͑ΔԽ

Slide 9

Slide 9 text

ηϯγϯάʙݟ͑ΔԽ ௨஌ɿঢ়گͷݟ͑ΔԽ ηϯαʔ౳

Slide 10

Slide 10 text

ηϯγϯάʙݟ͑ΔԽ ௨஌ɿঢ়گͷݟ͑ΔԽ ܭଌɿσʔλͷݟ͑ΔԽ ؂ࢹɿผͷ৔ॴͷݟ͑ΔԽ

Slide 11

Slide 11 text

ن໛ খن໛ ݸਓ·ͨ͸਺ਓͰ։ൃɺӡ༻͍͚ͯ͠ΔϨϕϧ ར༻ऀ΋਺ेਓ͘Β͍Λ૝ఆ

Slide 12

Slide 12 text

ηϯαʔ౳ ͍Ζ͍Ζͳٕज़ɾ஌͕ࣝඞཁ Ϋϥ΢υ Web ωοτϫʔΫ σόΠε

Slide 13

Slide 13 text

ຊ೔ͷΰʔϧʂ Python σόΠεɺΫϥ΢υɺWeb͢΂ͯ࢖͑Δʂ ࠓޙɺػցֶशͳͲಋೖ࣌΋Python࢖͑Δʂ ศརͰ৴པͰ͖ΔΨδΣοτɺαʔϏεɺϥΠϒϥϦΛ࢖͏ ʮͭ͘Βͳ͍ʯʮ΍Βͳ͍ʯͰ΋Α͍αʔϏε͕ߏஙͰ͖Δ ͦͷ෼ɺࣗ෼͕ͭ͘Γ͍ͨ΋ͷʹ஫ྗͰ͖Δ εϐʔσΟʹΑ͍αʔϏε͕ϦϦʔεͰ͖Δ

Slide 14

Slide 14 text

͖͔͚ͬ ೶Ոͷํ ʢݩϋʔυ԰͞Μʣ ϋ΢ε಺ͷ؀ڥσʔλऩूΛ͍ͨ͠ʂ Ͱ΋ɺΫϥ΢υʗWebΘ͔Βͳ͍ʢ>_<ʣ ௨஌ WebͰݟ͑ΔԽ ૣ͘࢖ͬͯ΋Β͏͜ͱ͕Ͱ͖ͨ ࠓ΋҆ఆՔಇதͰ͢

Slide 15

Slide 15 text

͖͔͚ͬ ΧʔυΛ͔ͯ͟͠ ϫϯλονͰग़ୀۈͰ͖Δʂ ग़ୀۈ੾Γସ͑

Slide 16

Slide 16 text

͖͔͚ͬ Πϕϯτ࣌ʹ։࠵෩ܠΛࣗಈTweet ௨஌

Slide 17

Slide 17 text

ݟ͑ΔԽɹָ͍͠ ࠓ·Ͱؾ͕෇͔ͳ͔ͬͨ͜ͱʹؾ͕͚ͭͨΓ σʔλΛ஝ੵ͓͚ͯ͠͹ɺ͋ͱͰ෼ੳ
 㱺͔ͦ͜Β·ͨ৽͍͜͠ͱ͕ݟ͑ͨΓ

Slide 18

Slide 18 text

ΞδΣϯμ σόΠε Ϋϥ΢υ Web ࠷ޙʹ ίετ

Slide 19

Slide 19 text

Ί͟͢΋ͷ

Slide 20

Slide 20 text

Ί͟͢΋ͷ σʔλͷݟ͑ΔԽ

Slide 21

Slide 21 text

Ί͟͢΋ͷ ผͷ৔ॴͷݟ͑ΔԽ

Slide 22

Slide 22 text

Ί͟͢΋ͷ ঢ়گͷݟ͑ΔԽ

Slide 23

Slide 23 text

ߏ੒

Slide 24

Slide 24 text

ߏ੒ɿσόΠε Raspberry Pi 3 Model B Grove System Թ࣪౓ܭ Իηϯα ϕʔεϢχοτɿGrove Pi ωοτϫʔΫ ໌Δ͞ ਫ෼ηϯα Χϝϥ AWS IoT Core

Slide 25

Slide 25 text

ߏ੒ɿΫϥ΢υ AWS IoT Core AWS Lambda Amazon DynamoDB AWS Lambda Amazon API Gateway Amazon Simple Storage Service

Slide 26

Slide 26 text

ߏ੒ɿWeb AWS IoT Core AWS Lambda Amazon DynamoDB AWS Lambda IoT action IoT rule Amazon API Gateway Amazon Simple Storage Service Ϋϥ΢υଆͰઆ໌ࡁΈ Auth0

Slide 27

Slide 27 text

લ൒ σόΠε ηϯγϯάσʔλͷऔಘ ωοτϫʔΫ Ϋϥ΢υ΁ૹ৴ MQTT Raspberry Pi㱺AWS IoT Core Raspberry Pi㱺SORACOM㱺AWS IoT Core Ϋϥ΢υ SORACOM㱺AWS IoT Core AWS IoT Core͔ΒAmazon DynamoDBʹσʔλอଘ

Slide 28

Slide 28 text

σόΠε

Slide 29

Slide 29 text

ߏ੒ Raspberry Pi 3 Model B Grove System Թ࣪౓ܭ Իηϯα ϕʔεϢχοτɿGrove Pi ωοτϫʔΫ ໌Δ͞ ਫ෼ηϯα Χϝϥ AWS IoT Core

Slide 30

Slide 30 text

લ൒ σόΠε ηϯγϯάσʔλͷऔಘ ωοτϫʔΫ Ϋϥ΢υ΁ૹ৴ MQTT Raspberry Pi㱺AWS IoT Core Raspberry Pi㱺SORACOM㱺AWS IoT Core Ϋϥ΢υ SORACOM㱺AWS IoT Core AWS IoT Core͔ΒAmazon DynamoDBʹσʔλอଘ

Slide 31

Slide 31 text

ηϯαɺRaspberry Pi Raspberry Pi 3 Model B Grove System Թ࣪౓ܭ Իηϯα ϕʔεϢχοτɿGrove Pi ωοτϫʔΫ ໌Δ͞ ਫ෼ηϯα Χϝϥ AWS IoT Core

Slide 32

Slide 32 text

ηϯαʔ Grove System seeed studio͕ࣾ։ൃ https://www.seeedstudio.com ϕʔεϢχοτͱඪ४Խ͞ΕͨίωΫλΛඋ͍͑ͯΔ ૠ͚ͩ͢Ͱѻ͑ΔηϯαʔͳͲͷϞδϡʔϧ͕ଟ਺ PythonϥΠϒϥϦ͕͋Δʂ https://github.com/DexterInd/GrovePi/tree/master/Software/Python ࢀߟ : http://wiki.seeedstudio.com/Grove_System/ ͸Μ͚ͩͮɺ഑ઢͷඞཁ͕ͳ͘PythonϥΠϒϥϦ΋͋Δ

Slide 33

Slide 33 text

ηϯαʔ ϕʔεϢχοτɿGrove Pi ඪ४Խ͞ΕͨίωΫλͱηϯα

Slide 34

Slide 34 text

ηϯαʔ ૠ͚ͩ͢ͰηοτΞοϓ׬ྃʂ Interface Digital Grove Analog Grove UART Grove I2C Sensor Թ࣪౓ ໌Δ͞ ਫ෼ Ի LED Ϙλϯ LCD 100छྨҎ্͋Δ

Slide 35

Slide 35 text

ϚΠίϯʗίϯϐϡʔλ Raspberry Pi γϯάϧϘʔυίϯϐϡʔλ ΋ͱ΋ͱڭҭΛ૝ఆ੍ͯ͠࡞ ࢖༻Ϟσϧɿ3 Model B 3͔ΒແઢLAN౥ࡌ 3͔ΒBluetoothඪ४౥ࡌ ͜Εʹͱ΋ͳ͍UART௨৴஫ҙ ࢀߟɿPi 3 serial Issues https://www.raspberrypi.org/forums/ viewtopic.php? f=63&t=151454#p993901 OS Raspbian https://www.raspberrypi.org/downloads/ raspbian/ Stretch Lite

Slide 36

Slide 36 text

σδλϧɿԹ࣪౓ܭ I2Cɿ໌Δ͞ ΞφϩάɿԻͷେ͖͞ ΧϝϥɿࡱӨ ϥΠϒϥϦΛ࢖ͬͯσʔλΛऔಘ

Slide 37

Slide 37 text

σδλϧ >>> import grovepi >>> >>> sensor = 4 # The Sensor goes on digital port 4. >>> blue = 0 # The Blue colored sensor. >>> white = 1 # The White colored sensor. >>> >>> grovepi.dht(sensor, white) [32.4, 44.0] # Թ౓, ࣪౓ >>> Թ࣪౓Λऔಘ http://wiki.seeedstudio.com/Grove-TemperatureAndHumidity_Sensor/ ʲblue : Temperature&Humidity Sensorʳ ϚΠφεͷԹ౓͕ଌΕͳ͍ ͍͚҆Ͳਫ਼౓͸ѱ͍ 820ԁ ʲwhite : Temperature&Humidity Sensor proʳ ϚΠφεͷԹ౓͕ଌΕΔ blueΑΓߴ͍͕ਫ਼౓͕Α͍ 2,095ԁ

Slide 38

Slide 38 text

I2C $ $ cd [yourpath]/GrovePi/Software/Python/grove_i2c_digital_light_sensor $ pwd [yourpath]/GrovePi/Software/Python/grove_i2c_digital_light_sensor # αϯϓϧιʔε΋ॆ࣮ $ python grove_i2c_digital_light_sensor.py Lux: 72 [Vis+IR=570, IR=276 @ Gain=1x, Timing=402.0ms] Lux: 72 [Vis+IR=570, IR=276 @ Gain=1x, Timing=402.0ms] ɾɾɾ ໌Δ͞Λऔಘ http://wiki.seeedstudio.com/Grove-Digital_Light_Sensor/ Digital Light Sensor

Slide 39

Slide 39 text

Ξφϩά >>> import grovepi >>> >>> loudness_sensor = 0 >>> grovepi.analogRead(loudness_sensor) 124 >>> Իηϯα http://wiki.seeedstudio.com/Grove-Loudness_Sensor/ Loudness Sensor

Slide 40

Slide 40 text

Χϝϥ >>> from picamera import PiCamera >>> >>> camera = PiCamera() >>> >>> camera.start_preview() >>> >>> # ࡱӨ >>> camera.capture('./sample.jpg') >>> >>> camera.stop_preview() >>> camera.close() ࡱӨ 3BTQCFSSZ1J$BNFSB.PEVMF7ΧϝϥϞδϡʔϧ

Slide 41

Slide 41 text

ηϯα౳ͷσʔλऔಘ׬ྃʂ Raspberry Pi 3 Model B Grove System Թ࣪౓ܭ Իηϯα ϕʔεϢχοτɿGrove Pi ωοτϫʔΫ ໌Δ͞ ਫ෼ηϯα Χϝϥ AWS IoT Core આ໌ࡁΈ

Slide 42

Slide 42 text

લ൒ σόΠε ηϯγϯάσʔλͷऔಘ ωοτϫʔΫ Ϋϥ΢υ΁ૹ৴ MQTT Raspberry Pi㱺AWS IoT Core Raspberry Pi㱺SORACOM㱺AWS IoT Core Ϋϥ΢υ SORACOM㱺AWS IoT Core AWS IoT Core͔ΒAmazon DynamoDBʹσʔλอଘ

Slide 43

Slide 43 text

ωοτϫʔΫɺΫϥ΢υ΁ૹ৴ Raspberry Pi 3 Model B Grove System Թ࣪౓ܭ Իηϯα ϕʔεϢχοτɿGrove Pi ωοτϫʔΫ ໌Δ͞ ਫ෼ηϯα Χϝϥ AWS IoT Core આ໌ࡁΈ

Slide 44

Slide 44 text

SORACOM IoT ϓϥοτϑΥʔϜ MVNO ͱͯ͠σʔλ௨৴ SIM Λఏڙ ϞόΠϧ௨৴ͱΫϥ΢υΛҰ؏ͯ͠ఏڙ ࢀߟɿ https://soracom.jp/overview/ ωοτϫʔΫ ωοτϫʔΫɺηΩϡϦςΟΛ͓·͔ͤʂ

Slide 45

Slide 45 text

Ϋϥ΢υ΁ૹ৴ Raspberry Pi 㱺 AWS IoT Core Raspberry Pi 㱺 SORACOM 㱺 AWS IoT Core AWS IoT Core AWS IoT Core

Slide 46

Slide 46 text

MQTT Message Queuing Telemetry Transportͷུ Pub/Subܕσʔλ഑৴Ϟσϧ ඇྗͳσόΠε΍ωοτϫʔΫ͕ෆ҆ఆͳ৔ॴͰ΋ಈ࡞͠΍͢ ͍Α͏ʹϝοηʔδిจ͕ܰྔʹઃܭ͞Ε͍ͯΔ ࢀߟɿ΢ΟΩϖσΟΞʮMQ Telemetry Transportʯ ɹɹɿhttps://tech-blog.optim.co.jp/entry/2019/08/20/163000

Slide 47

Slide 47 text

MQTT HTTP ΫϥΠΞϯτA ϦΫΤετ αʔό Ϩεϙϯε ΫϥΠΞϯτ͕αʔόʹϦΫΤετ αʔό͕ͦΕʹ͋ͬͨϨεϙϯεΛฦ٫͢Δ

Slide 48

Slide 48 text

MQTT ϒϩʔΧʔ ʢதܧऀʣ MQTT ΫϥΠΞϯτA ΫϥΠΞϯτB ΞΫλʔ ύϒϦογϟʔʢൃߦऀʣ αϒεΫϥΠόʔʢߪಡऀʣ ϒϩʔΧʔʢதܧऀʣ ϝοηʔδͷ఻ૹ ϝοηʔδΛൃߦʢૹ৴ʣ͢ΔɿPublish ϝοηʔδͷߪಡʢड৴ʣΛొ࿥͢ΔɿSubscribe ϝοηʔδͷΩʔɿtopic

Slide 49

Slide 49 text

MQTT ϒϩʔΧʔ ʢதܧऀʣ σʔλΛड͚औΓɺ ֘౰͢Δߪಡऀ΁ σʔλΛ఻ૹ MQTT ΫϥΠΞϯτA ΫϥΠΞϯτB ΫϥΠΞϯτ͸ʮϒϩʔΧʔʯΛ௨ͯ͠ɺϝοηʔδͷ΍ΓͱΓΛ͢Δ ϒϩʔΧʔ͸ɺΫϥΠΞϯτ͔Βૹ৴͞ΕͨσʔλΛ
 ͦͷtopicΛαϒεΫϥΠϒ͍ͯ͠ΔΫϥΠΞϯτ΁ૹΔ ʲPublishʳ topicɿenvironment/ ʲSubscribeʳ topicɿenvironment/ ΫϥΠΞϯτC ʲSubscribeʳ topicɿenvironment/ ΫϥΠΞϯτD

Slide 50

Slide 50 text

MQTT ϒϩʔΧʔ ʢதܧऀʣ σʔλΛड͚औΓɺ ֘౰͢Δߪಡऀ΁ σʔλΛ఻ૹ MQTT ΫϥΠΞϯτA ΫϥΠΞϯτB ʲPublishʳ topicɿenvironment/ ʲSubscribeʳ topicɿenvironment/ ΫϥΠΞϯτC ʲSubscribeʳ topicɿenvironment/ ϒϩʔΧʔ͸͋Δఔ౓ɺPublish͞ΕͨϝοηʔδΛอ࣋Ͱ͖Δ ΫϥΠΞϯτD ʲSubscribeʳ topicɿenvironment/

Slide 51

Slide 51 text

MQTT ࠓޙɺهࡌͷʮMQTTʯ͸ํࣜͷҙຯͰ͸ͳ͘ ϓϩτίϧΛද͠·͢ MQTTʹϙʔτ 1883ʢΠϝʔδͱͯ͠͸HTTP:80ʣ MQTTSʹϙʔτ 8883ʢΠϝʔδͱͯ͠͸HTTPS:443ʣ AWS IoT Core͕ϒϩʔΧʔͷ໾ׂΛͯ͘͠Ε·͢ʂ AWS IoT Core

Slide 52

Slide 52 text

Ϋϥ΢υ΁ૹ৴ Raspberry Pi 㱺 AWS IoT Core Raspberry Pi 㱺 SORACOM 㱺 AWS IoT Core AWS IoT Core AWS IoT Core MQTTS MQTT

Slide 53

Slide 53 text

Ϋϥ΢υ΁ૹ৴ Raspberry Pi 㱺 AWS IoT Core ४උ AWS IoT ͷSDKͷΠϯετʔϧ https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-sdks.html#iot-python-sdk σόΠεূ໌ॻΛσόΠεଆʹ഑ஔ SDK σόΠεূ໌ॻ AWS IoT Core MQTTS

Slide 54

Slide 54 text

Ϋϥ΢υ΁ૹ৴ Raspberry Pi 㱺 AWS IoT Core αϯϓϧίʔυ͔Βൈਮ https://github.com/aws/aws-iot-device-sdk-python/blob/master/samples/basicPubSub/basicPubSub.py ɾɾɾʢলུʣ from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient ɾɾɾʢলུʣ # Read in command-line parameters parser = argparse.ArgumentParser() parser.add_argument("-e", "--endpoint", action="store", required=True, dest="host", help="Your AWS IoT custom endpoint") ɾɾɾʢলུʣ # Init AWSIoTMQTTClient myAWSIoTMQTTClient = AWSIoTMQTTClient(clientId) myAWSIoTMQTTClient.configureEndpoint(host, port) myAWSIoTMQTTClient.configureCredentials(rootCAPath, privateKeyPath, certificatePath) ɾɾɾʢলུʣ # AWSIoTMQTTClient connection configuration myAWSIoTMQTTClient.configureAutoReconnectBackoffTime(1, 32, 20) myAWSIoTMQTTClient.configureOfflinePublishQueueing(-1) # Infinite offline Publish queueing ɾɾɾʢ࣍ͷϖʔδ΁ʣ ᶃ ূ໌ॻ౳ͷಡΈࠐΈ ᶄΫϥΠΞϯτͷॳظԽ ᶅ઀ଓͷઃఆ౳

Slide 55

Slide 55 text

Ϋϥ΢υ΁ૹ৴ Raspberry Pi 㱺 AWS IoT Core αϯϓϧίʔυ͔Βൈਮ https://github.com/aws/aws-iot-device-sdk-python/blob/master/samples/basicPubSub/basicPubSub.py ɾɾɾʢଓ͖ʣ # Connect and subscribe to AWS IoT myAWSIoTMQTTClient.connect() ɾɾɾʢলུʣ # Publish to the same topic in a loop forever message = {} message['message'] = args.message messageJson = json.dumps(message) # Connect and subscribe to AWS IoT myAWSIoTMQTTClient.publish(topic, messageJson, 1) ɾɾɾʢলུʣ ᶆAWS IoT Core΁઀ଓ ᶇૹ৴σʔλ४උ ᶈpublishʂʂʂ

Slide 56

Slide 56 text

Ϋϥ΢υ΁ૹ৴ Raspberry Pi 㱺 AWS IoT Core Raspberry Pi㱺 SORACOM 㱺 AWS IoT Core AWS IoT Core AWS IoT Core MQTTS MQTT આ໌ࡁΈ

Slide 57

Slide 57 text

Ϋϥ΢υ΁ૹ৴ Raspberry Pi 㱺 SORACOM 㱺 AWS IoT Core σόΠεଆͰઆ໌ Ϋϥ΢υଆͰઆ໌ MQTT AWS IoT Core

Slide 58

Slide 58 text

Ϋϥ΢υ΁ૹ৴ Raspberry Pi 㱺 SORACOM ४උ PythonͷMQTTϥΠϒϥϦͷΠϯετʔϧ Paho-mqttΛ࢖༻ https://pypi.org/project/paho-mqtt/ SORACOM Air SIM ࠓճ͸ηϧϥʔΛ࢖༻ USBυϯάϧ ͜ͷதʹSIMΛ͍ΕͯRaspberry Piʹૠ͢ʂ ※υϯάϧͷઃఆʹؔͯ͠͸Githubࢀর MQTT

Slide 59

Slide 59 text

Ϋϥ΢υ΁ૹ৴ Raspberry Pi 㱺 SORACOM σόΠεূ໌ॻ SDK ௚઀ɺAWS΁ૹ৴͢Δͱ͖ͱͷҧ͍ σόΠεূ໌ॻΛஔ͘ඞཁ͕ͳ͍ SDKෆཁ Ϋϥ΢υʹґଘ͠ͳ͍ίʔυ͕ॻ͚Δ MQTT

Slide 60

Slide 60 text

Ϋϥ΢υ΁ૹ৴ import json import time import paho.mqtt.client as mqtt host = 'beam.soracom.io' port = 1883 topic = 'environment' # ॳظԽ client = mqtt.Client(protocol=mqtt.MQTTv311) client.connect(host, port=port, keepalive=60) time.sleep(5) # ૹ৴σʔλ json_dict = { 'temp': 34, 'humi': 45, } # ηϯγϯά৘ใΛૹ৴ result = client.publish(topic, json.dumps(json_dict), qos=1) client.disconnect() Raspberry Pi 㱺 SORACOM ᶃ ΫϥΠΞϯτॳظԽ ᶄSORACOM΁઀ଓ ᶅૹ৴σʔλ४උ ᶆpublishʂʂʂ

Slide 61

Slide 61 text

Ϋϥ΢υ΁ૹ৴׬ྃʂ Raspberry Pi 㱺 AWS IoT Core Raspberry Pi 㱺 SORACOM 㱺 AWS IoT Core AWS IoT Core AWS IoT Core MQTTS MQTT આ໌ࡁΈ

Slide 62

Slide 62 text

ηϯα͔ΒͷσʔλऔಘɺωοτϫʔΫ
 Ϋϥ΢υ΁ͷૹ৴׬ྃʂ Raspberry Pi 3 Model B Grove System Թ࣪౓ܭ Իηϯα ϕʔεϢχοτɿGrove Pi ωοτϫʔΫ ໌Δ͞ ਫ෼ηϯα Χϝϥ AWS IoT Core આ໌ࡁΈ

Slide 63

Slide 63 text

σόΠε·ͱΊ ϋʔυۤखɾϓϩτλΠϐϯά Grove System, Sense HAT Wifi؀ڥ͕ͳ͍ SORACOM࢖ͬͯΈ͍ͯͩ͘͞ ※SORACOMͷγεςϜ͸AWS಺Ͱ͕͢ศ্ٓɺ෼͚ͯॻ͍ͯ͋Γ·͢ Sense HAT

Slide 64

Slide 64 text

Ϋϥ΢υ

Slide 65

Slide 65 text

ߏ੒ AWS IoT Core AWS Lambda Amazon DynamoDB AWS Lambda Amazon API Gateway Amazon Simple Storage Service

Slide 66

Slide 66 text

લ൒ σόΠε ηϯγϯάσʔλͷऔಘ ωοτϫʔΫ Ϋϥ΢υ΁ૹ৴ MQTT Raspberry Pi㱺AWS IoT Core Raspberry Pi㱺SORACOM㱺AWS IoT Core Ϋϥ΢υ SORACOM㱺AWS IoT Core AWS IoT Core͔ΒAmazon DynamoDBʹσʔλอଘ

Slide 67

Slide 67 text

SORACOM 㱺 AWS IoT Core΁ AWS IoT Core AWS Lambda Amazon DynamoDB AWS Lambda Amazon API Gateway Amazon Simple Storage Service

Slide 68

Slide 68 text

SORACOMͷαʔϏεͰసૹ SORACOM 㱺 AWS IoT Core Beam ҉߸Խͯ͠ σʔλΛసૹͯ͘͠ΕΔ ূ໌ॻ͸SORACOM΁ ొ࿥ͯ͠ઃఆ࣌ʹࢦఆ͢Δ AWS IoT Core Funnel σʔλΛಛఆͷΫϥ΢υαʔϏε΁௚઀సૹ͢ΔαʔϏε MQTT MQTTS

Slide 69

Slide 69 text

SORACOMͷαʔϏεͰసૹ SORACOM 㱺 AWS IoT Core SORACOMͷίϯιʔϧ͔Β సૹઌ͸ม͑ΒΕΔʂ

Slide 70

Slide 70 text

SORACOMͷαʔϏεͰసૹ SORACOM 㱺 AWS IoT Core SORACOMͷίϯιʔϧ͔Β సૹઌ͸ม͑ΒΕΔʂ

Slide 71

Slide 71 text

SORACOM㱺AWS IoT Core΁ૹ৴׬ྃʂ AWS IoT Core AWS Lambda Amazon DynamoDB AWS Lambda Amazon API Gateway Amazon Simple Storage Service આ໌ࡁΈ

Slide 72

Slide 72 text

AWS IoT Core ͔ΒAmazon DynamoDBʹσʔλอଘ AWS IoT Core AWS Lambda Amazon DynamoDB AWS Lambda Amazon API Gateway Amazon Simple Storage Service આ໌ࡁΈ

Slide 73

Slide 73 text

AWS IoT Core͔ΒAmazon DynamoDBʹσʔλอଘ AWS IoT Core AWS Lambda Amazon DynamoDB AWS Lambda IoT rule ಛఆͷtopicΛड৴ͨ͠Βޙड़ ͷactionΛ࣮ߦ IoT action DynamoDBͷςʔϒϧ΁σʔλ Λొ࿥ LambdaΛ࣮ߦ ͳͲෳ਺ͷΞΫγϣϯΛα ϙʔτ͍ͯ͠Δ ࢀߟɿAWS IoT ϧʔϧΞΫγϣϯ https://docs.aws.amazon.com/ ja_jp/iot/latest/developerguide/ iot-rule-actions.html IoT action IoT rule Amazon API Gateway Amazon Simple Storage Service

Slide 74

Slide 74 text

AWS IoT Core͔ΒAmazon DynamoDBʹσʔλอଘ σόΠε͔ΒૹΒΕ͖ͯͨσʔλ { “imsi": XXXX, “timestamp": 1565276403000, “air_quality”: 83, “humi": 41.8, “loudness": 88, “lux": 35, “temp": 25.3, } IoT action IoT rule

Slide 75

Slide 75 text

AWS IoT Core͔ΒAmazon DynamoDBʹσʔλอଘ΋׬ྃ AWS IoT Core AWS Lambda Amazon DynamoDB AWS Lambda Amazon API Gateway Amazon Simple Storage Service IoT action IoT rule આ໌ࡁΈ આ໌ࡁΈ

Slide 76

Slide 76 text

σʔλΛΫϥ΢υ·ͰอଘͰ͖·ͨ͠ ٳܜɾɾɾ

Slide 77

Slide 77 text

௥Ճ৘ใɿSigfoxʢγάϑΥοΫεʣ ෹ࠃSigfox͕ࣾఏڙ͢ΔLPWAωοτϫʔΫ LPWAʹLow Power Wide Area ௿Ձ֨ɾ௿ফඅిྗɾ௕ڑ཭఻ૹ͕ಛ௃ ηϯαʔ౳ ੍ݶ 1ճͷ࠷େૹ৴ྔ͸12όΠτ 1೔Ͱૹ৴Ͱ͖Δճ਺ʢ্Γ140ճ/೔˞ɺԼΓ4ճ/೔ʣ ※໿10෼ʹ1ճϖʔε

Slide 78

Slide 78 text

௥Ճ৘ใɿSigfoxʢγάϑΥοΫεʣ Sens’it https://soracom.jp/products/sigfox/sensit/ Sigfoxʹ઀ଓՄೳͳηϯα಺ଂσόΠε Թ࣪౓ɺর౓ηϯαʔɺৼಈݕ஌ͳͲ಺ଂ όοςϦʔ಺ଂ ௨৴ྉ͕ʮ1,440ԁʗ೥ʯ ߪೖͯ͠ɺಈ࡞ϞʔυΛબ୒͢Ε͹উखʹσʔλૹ৴͕࢝·Δ ϦΞϧλΠϜੑ͕ͳ͍ɺిݯ͕ͳ͍৔ॴͰܭଌ͍ͨ͠ ϋ΢ε಺Ͱ࢖༻தɿόοςϦʔ͸͍͍ͩͨ2िؒ͘Β͍΋͍ͬͯΔ

Slide 79

Slide 79 text

ޙ൒ Ϋϥ΢υͷଓ͖ Web ίετ

Slide 80

Slide 80 text

ޙ൒ Ϋϥ΢υ ߏ੒؅ཧπʔϧ ઃఆ৘ใͷอ࣋ Թ౓Λຖਖ਼࣌ɺΫϥ΢υ΁ૹΔ ঢ়ଶͷมߋ ҉͘ͳͬͨΒՄࢹޫΧϝϥͷࡱӨΛ΍ΊΔ ؂ࢹ ࣸਅΛࡱͬͯTwitter΁౤ߘ͢Δ ௨஌ Թ౓͕ᮢ஋Ҏ্ʹͳͬͨΒ௨஌͢Δ

Slide 81

Slide 81 text

ޙ൒ Ϋϥ΢υ ߏ੒؅ཧπʔϧ ઃఆ৘ใͷอ࣋ Թ౓Λຖਖ਼࣌ɺΫϥ΢υ΁ૹΔ ঢ়ଶͷมߋ ҉͘ͳͬͨΒՄࢹޫΧϝϥͷࡱӨΛ΍ΊΔ ؂ࢹ ࣸਅΛࡱͬͯTwitter΁౤ߘ͢Δ ௨஌ Թ౓͕ᮢ஋Ҏ্ʹͳͬͨΒ௨஌͢Δ

Slide 82

Slide 82 text

͍Ζ͍ΖͳαʔϏεΛ࢖͍·͢ AWS IoT Core AWS Lambda Amazon DynamoDB AWS Lambda AWS Identity and Access Management Permisions Role Amazon API Gateway Amazon Simple Storage Service

Slide 83

Slide 83 text

serverless framework https://serverless.com/framework/ Node.jsΛར༻ͨ͠serverlessΛߏஙɺ؅ཧɺσϓϩΠ౳ΛͰ͖Δπʔ ϧ yamlʹߏங಺༰Λهࡌ͢Ε͹ίϚϯυҰൃͰσϓϩΠ AWSɺGCPɺAzureͳͲʹ΋ରԠ AWS Lambda PythonͷϥΠϒϥϦ΋ҰॹʹzipԽͯ͠σϓϩΠ docker-lambdaΠϝʔδΛ࢖ͬͯ
 ίϯύΠϧޙʹσϓϩΠ΋ͯ͘͠ΕΔ ߏ੒؅ཧπʔϧ ྨࣅαʔϏε AWS SAM https://aws.amazon.com/jp/serverless/sam/ serverless ༻ʹCloudFormationΛ֦ுͨ͠AWSαʔϏε AWSͷΈ࢖༻Ͱ͋Ε͹ɺͪ͜Β΋ݕ౼ͯ͠Έ͍ͯͩ͘͞

Slide 84

Slide 84 text

ޙ൒ Ϋϥ΢υ ߏ੒؅ཧπʔϧ ઃఆ৘ใͷอ࣋ Թ౓Λຖਖ਼࣌ɺΫϥ΢υ΁ૹΔ ঢ়ଶͷมߋ ҉͘ͳͬͨΒՄࢹޫΧϝϥͷࡱӨΛ΍ΊΔ ؂ࢹ ࣸਅΛࡱͬͯTwitter΁౤ߘ͢Δ ௨஌ Թ౓͕ᮢ஋Ҏ্ʹͳͬͨΒ௨஌͢Δ

Slide 85

Slide 85 text

ઃఆ৘ใͷอ࣋ AWS IoT Core AWS Lambda Amazon DynamoDB AWS Lambda Amazon API Gateway Amazon Simple Storage Service આ໌ࡁΈ આ໌ࡁΈ

Slide 86

Slide 86 text

ઃఆ৘ใͷอ࣋ Device ShadowαʔϏε https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-device-shadows.html AWS IoT CoreͱσόΠεؒΛJSONͰ΍ΓͱΓʢGET/UPDATEʣ͕Ͱ͖Δ ͜ͷJSONʹσόΠεͷʮઃఆ৘ใʯ΍ʮঢ়ଶʯΛ΋͓ͬͯ͘ Device ShadowαʔϏε { # Ϋϥ΢υ͔Βͷཁٻ "desired": { "sensor": { "interval": 10 } }, # σόΠεͷঢ়ଶ "reported": { "sensor": { "interval": 5 } }, # Ϋϥ΢υͱσόΠεͷࠩ෼ "delta": { "sensor": { "interval": 10 } } }

Slide 87

Slide 87 text

ઃఆ৘ใͷอ࣋ Device ShadowαʔϏε ηΫγϣϯ desiredɿΫϥ΢υ͔Βͷཁٻ reportedɿσόΠεͷঢ়ଶ deltaɿΫϥ΢υͱσόΠεͷࠩ෼ Device ShadowαʔϏε { # Ϋϥ΢υ͔Βͷཁٻ "desired": { "sensor": { "interval": 10 } }, # σόΠεͷঢ়ଶ "reported": { "sensor": { "interval": 5 } }, # Ϋϥ΢υͱσόΠεͷࠩ෼ "delta": { "sensor": { "interval": 10 } } }

Slide 88

Slide 88 text

σόΠεଆ cronͰຖਖ਼࣌ɺ5෼͝ͱىಈ ىಈ͝ͱDevice ShadowΛࢀর Device Shadow ૹ৴ִؒʢintervalʣ 5෼㱺10෼ִؒʹมߋ Device ShadowαʔϏε { # Ϋϥ΢υ͔Βͷཁٻ "desired": { "sensor": { "interval": 10 # 10෼ִؒ } }, # σόΠεͷঢ়ଶ "reported": { "sensor": { "interval": 5 } }, # Ϋϥ΢υͱσόΠεͷࠩ෼ "delta": { "sensor": { "interval": 10 } } } Թ౓Λຖਖ਼࣌ɺΫϥ΢υ΁ૹΔ

Slide 89

Slide 89 text

Թ౓Λຖਖ਼࣌ɺΫϥ΢υ΁ૹΔ

Slide 90

Slide 90 text

AWS IoT Core Թ౓Λຖਖ਼࣌ɺΫϥ΢υ΁ૹΔ Device Shadowͷऔಘ Ϋϥ΢υ σόΠε GETཁٻ Device ShadowαʔϏε { # Ϋϥ΢υ͔Βͷཁٻ "desired": { "sensor": { "interval": 10 } }, # σόΠεͷঢ়ଶ "reported": { "sensor": { "interval": 5 } }, # Ϋϥ΢υͱσόΠεͷࠩ෼ "delta": { "sensor": { "interval": 10 } } }

Slide 91

Slide 91 text

AWS IoT Core Ϋϥ΢υ σόΠε JSONΛड͚औΔ GETཁٻ Device ShadowαʔϏε { # Ϋϥ΢υ͔Βͷཁٻ "desired": { "sensor": { "interval": 10 } }, # σόΠεͷঢ়ଶ "reported": { "sensor": { "interval": 5 } }, # Ϋϥ΢υͱσόΠεͷࠩ෼ "delta": { "sensor": { "interval": 10 } } } Device ShadowαʔϏε { # Ϋϥ΢υ͔Βͷཁٻ "desired": { "sensor": { "interval": 10 } }, # σόΠεͷঢ়ଶ "reported": { "sensor": { "interval": 5 } }, # Ϋϥ΢υͱσόΠεͷࠩ෼ "delta": { "sensor": { "interval": 10 } } } Թ౓Λຖਖ਼࣌ɺΫϥ΢υ΁ૹΔ Device Shadowͷऔಘ

Slide 92

Slide 92 text

AWS IoT Core Թ౓Λૹ৴ Ϋϥ΢υ σόΠε JSONΛड͚औΔ GETཁٻ Device ShadowαʔϏε { # Ϋϥ΢υ͔Βͷཁٻ "desired": { "sensor": { "interval": 10 } }, # σόΠεͷঢ়ଶ "reported": { "sensor": { "interval": 5 } }, # Ϋϥ΢υͱσόΠεͷࠩ෼ "delta": { "sensor": { "interval": 10 } } } Device ShadowαʔϏε { # Ϋϥ΢υ͔Βͷཁٻ "desired": { "sensor": { "interval": 10 } }, # σόΠεͷঢ়ଶ "reported": { "sensor": { "interval": 5 } }, # Ϋϥ΢υͱσόΠεͷࠩ෼ "delta": { "sensor": { "interval": 10 } } } ݱࡏ࣌ࠁ 11 : 40 㱺Թ౓Λૹ৴ Թ౓Λຖਖ਼࣌ɺΫϥ΢υ΁ૹΔ

Slide 93

Slide 93 text

AWS IoT Core Device Shadow ߋ৽ Ϋϥ΢υ σόΠε JSONΛड͚औΔ GETཁٻ Device ShadowαʔϏε { # Ϋϥ΢υ͔Βͷཁٻ "desired": { "sensor": { "interval": 10 } }, # σόΠεͷঢ়ଶ "reported": { "sensor": { "interval": 5 } }, # Ϋϥ΢υͱσόΠεͷࠩ෼ "delta": { "sensor": { "interval": 10 } } } Device ShadowαʔϏε { # Ϋϥ΢υ͔Βͷཁٻ "desired": { "sensor": { "interval": 10 } }, # σόΠεͷঢ়ଶ "reported": { "sensor": { "interval": 5 } }, # Ϋϥ΢υͱσόΠεͷࠩ෼ "delta": { "sensor": { "interval": 10 } } } ݱࡏ࣌ࠁ 11 : 40 㱺Թ౓Λૹ৴ UPDATEཁٻ ૹ৴σʔλ { "reported": { "sensor": { "interval": 10 } }, } Թ౓Λຖਖ਼࣌ɺΫϥ΢υ΁ૹΔ

Slide 94

Slide 94 text

AWS IoT Core Ϋϥ΢υ σόΠε JSONΛड͚औΔ GETཁٻ Device ShadowαʔϏε { # Ϋϥ΢υ͔Βͷཁٻ "desired": { "sensor": { "interval": 10 } }, # σόΠεͷঢ়ଶ "reported": { "sensor": { "interval": 10 } }, # Ϋϥ΢υͱσόΠεͷࠩ෼ # ͕ͳ͘ͳΔʂ } Device ShadowαʔϏε { # Ϋϥ΢υ͔Βͷཁٻ "desired": { "sensor": { "interval": 10 } }, # σόΠεͷঢ়ଶ "reported": { "sensor": { "interval": 5 } }, # Ϋϥ΢υͱσόΠεͷࠩ෼ "delta": { "sensor": { "interval": 10 } } } ݱࡏ࣌ࠁ 11 : 40 㱺Թ౓Λૹ৴ UPDATEཁٻ ૹ৴σʔλ { "reported": { "sensor": { "interval": 10 } }, } Թ౓Λຖਖ਼࣌ɺΫϥ΢υ΁ૹΔ Device Shadow ߋ৽

Slide 95

Slide 95 text

AWS IoT Core Ϋϥ΢υ σόΠε GETཁٻ Device ShadowαʔϏε { # Ϋϥ΢υ͔Βͷཁٻ "desired": { "sensor": { "interval": 10 } }, # σόΠεͷঢ়ଶ "reported": { "sensor": { "interval": 5 } }, # Ϋϥ΢υͱσόΠεͷࠩ෼ # ͕ͳ͘ͳΔʂ } Թ౓Λຖਖ਼࣌ɺΫϥ΢υ΁ૹΔ Device Shadow औಘ MQTT Ͱ΍ΓͱΓ͍ͯ͠Δ

Slide 96

Slide 96 text

AWS IoT Core Ϋϥ΢υ σόΠε JSONΛड͚औΔ Device ShadowαʔϏε { # Ϋϥ΢υ͔Βͷཁٻ "desired": { "sensor": { "interval": 10 } }, # σόΠεͷঢ়ଶ "reported": { "sensor": { "interval": 5 } }, # Ϋϥ΢υͱσόΠεͷࠩ෼ # ͕ͳ͘ͳΔʂ } Թ౓Λຖਖ਼࣌ɺΫϥ΢υ΁ૹΔ Device Shadow औಘ Subscribe GETཁٻʢPublishʣ MQTT Ͱ΍ΓͱΓ͍ͯ͠Δ

Slide 97

Slide 97 text

ઃఆ৘ใͷอ࣋ subscribe import paho.mqtt.client as mqtt ɾɾɾ def on_connect(client, userdata, flags, respons_code): # ϒϩʔΧʔʹ઀ଓͰ͖ͨΒαϒεΫϥΠϒ client.subscribe(topic) def on_message(client, userdata, msg): # ϝοηʔδड৴ʢDevice Shadow͔Βͷσʔλड৴ʣ࣌ json_str = msg.payload.decode(encoding='utf-8') client.disconnect() client = mqtt.Client(protocol=mqtt.MQTTv311) # callbackΛొ࿥ client.on_connect = on_connect client.on_message = on_message # ઀ଓ client.connect(host, port=port, keepalive=60) # ଴ͪड͚ঢ়ଶʹ͢Δ client.loop_forever() Device Shadow ͔Βड৴ͨ͠σʔλ 㱺͜ΕΛ࢖͍͍ͨʂ on_messageΛcallback ొ࿥͢Δ ※ຊίʔυ͸paho-mqtt࢖༻࣌ͷྫ ※AWS IoT SDK࢖༻࣌͸SDKͷϝιουΛ࢖༻ͯ͠Device Shadowͱ΍ΓͱΓ͠·͢

Slide 98

Slide 98 text

ઃఆ৘ใͷอ࣋ subscribe import paho.mqtt.client as mqtt ɾɾɾ @app.task def run_subscribe(host, port, topic): redis_client = RedisClient() def on_connect(client, userdata, flags, respons_code): client.subscribe(topic) def on_message(client, userdata, msg): json_str = msg.payload.decode(encoding='utf-8') redis_client.set('token', json_str) client.disconnect() redis_client.delete('token') client = mqtt.Client(protocol=mqtt.MQTTv311) client.on_connect = on_connect client.on_message = on_message client.connect(host, port=port, keepalive=60) # ଴ͪड͚ঢ়ଶʹ͢Δ client.loop_forever() Device Shadow ͔Βड৴ͨ͠σʔλ 㱺Redisʹset PythonͷඇಉظϥΠϒϥϦ CeleryΛ࢖༻ͯ͠λεΫԽ ※ຊίʔυ͸paho-mqtt࢖༻࣌ͷྫ ※AWS IoT SDK࢖༻࣌͸SDKͷϝιουΛ࢖༻ͯ͠Device Shadowͱ΍ΓͱΓ͠·͢

Slide 99

Slide 99 text

ઃఆ৘ใͷอ࣋ subscribe + publishʢGETཁٻʣ import paho.mqtt.client as mqtt ɾɾɾ redis_client = RedisClient() # αϒεΫϥΠϒͷඇಉظλεΫ࣮ߦ result_sub = tasks_mqtt.run_subscribe.delay(ɾɾɾ) # publishʢGETཁٻʣ client = mqtt.Client(protocol=mqtt.MQTTv311) client.connect(host, port=port, keepalive=60) result = client.publish(topic, json.dumps(json_dict), qos=1) # αϒεΫϥΠϒͷඇಉظλεΫऴྃ଴ͪ while not result_sub.ready(): time.sleep(1) # Device ShadowΛऔಘ value = redis_client.get('token') payload_str = value.decode(encoding='utf-8') # Թ౓Λpublish # Device ShadowΛߋ৽ʢupdateͷτϐοΫʹpublishʣ Redis͔ΒDevice Shadow ͷσʔλΛऔಘ subscribeͷλεΫΛ࣮ߦ publishʂʂʂ ※ຊίʔυ͸paho-mqtt࢖༻࣌ͷྫ ※AWS IoT SDK࢖༻࣌͸SDKͷϝιουΛ࢖༻ͯ͠Device Shadowͱ΍ΓͱΓ͠·͢ αϒεΫϥΠϒͷ λεΫऴྃ଴ͪ

Slide 100

Slide 100 text

ઃఆ৘ใͷอ࣋·ͱΊ σόΠεଆʹઃఆ஋Λอ࣋͠ͳ͍ ·ͨ͸ɺΫϥ΢υ͔Βड͚औͬͨ΋ͷΛอ࣋͢Δ͚ͩ Ϋϥ΢υଆΛࢀর͢Ε͹σόΠεͷઃఆ͕Θ͔Δ Webϖʔδ͔ΒΫϥ΢υܦ༝Ͱઃఆ஋ͷมߋ͕Ͱ͖Δ

Slide 101

Slide 101 text

ޙ൒ Ϋϥ΢υ ߏ੒؅ཧπʔϧ ઃఆ৘ใͷอ࣋ Թ౓Λຖਖ਼࣌ɺΫϥ΢υ΁ૹΔ ঢ়ଶͷมߋ ҉͘ͳͬͨΒՄࢹޫΧϝϥͷࡱӨΛ΍ΊΔ ؂ࢹ ࣸਅΛࡱͬͯTwitter΁౤ߘ͢Δ ௨஌ Թ౓͕ᮢ஋Ҏ্ʹͳͬͨΒ௨஌͢Δ

Slide 102

Slide 102 text

ঢ়ଶͷมߋ AWS IoT Core AWS Lambda Amazon DynamoDB AWS Lambda Amazon API Gateway Amazon Simple Storage Service આ໌ࡁΈ આ໌ࡁΈ ৄࡉ͸
 Appendixࢀর

Slide 103

Slide 103 text

ঢ়ଶͷมߋ ঢ়ଶͷมߋͷ൑ఆ΋Ϋϥ΢υଆͰߦ͍ࢦࣔ σόΠεଆ͸ͦͷࢦࣔͰಈ͚ͩ͘ σόΠεଆ͸ηϯγϯάσʔλΛૹΔ͚ͩ σόΠεଆͷίʔυ͕୯७ʹͳΔ

Slide 104

Slide 104 text

ޙ൒ Ϋϥ΢υ ߏ੒؅ཧπʔϧ ઃఆ৘ใͷอ࣋ Թ౓Λຖਖ਼࣌ɺΫϥ΢υ΁ૹΔ ঢ়ଶͷมߋ ҉͘ͳͬͨΒՄࢹޫΧϝϥͷࡱӨΛ΍ΊΔ ؂ࢹ ࣸਅΛࡱͬͯTwitter΁౤ߘ͢Δ ௨஌ Թ౓͕ᮢ஋Ҏ্ʹͳͬͨΒ௨஌͢Δ

Slide 105

Slide 105 text

؂ࢹ AWS IoT Core AWS Lambda Amazon DynamoDB Amazon Simple Storage Service AWS Lambda Amazon API Gateway આ໌ࡁΈ આ໌ࡁΈ

Slide 106

Slide 106 text

AWS IoT Core ؂ࢹ ࣸਅΛࡱͬͯTwitter΁౤ߘ͢Δ Ϋϥ΢υ σόΠε ը૾Λૹ৴ Amazon Simple Storage Service TriggerͰ LambdaΛىಈ ࡱӨ

Slide 107

Slide 107 text

AWS IoT Core ؂ࢹ ࣸਅΛࡱͬͯTwitter΁౤ߘ͢Δ Ϋϥ΢υ σόΠε ը૾Λૹ৴ Amazon Simple Storage Service TriggerͰ LambdaΛىಈ ࡱӨ ͲͷΑ͏ʹ Tweet͍ͯ͠Δ͔

Slide 108

Slide 108 text

؂ࢹ ࣸਅΛࡱͬͯTwitter΁౤ߘ͢Δ url_media = "https://upload.twitter.com/1.1/media/upload.json" url_text = "https://api.twitter.com/1.1/statuses/update.json" CK = os.getenv('TWITTER_CONSUMER_KEY') ɾɾɾʢলུʣ twitter = OAuth1Session(CK, CS, AT, ATS) # S3΁อଘ͞Εͨը૾Λऔಘ bucket_name = event['Records'][0]['s3']['bucket']['name'] object_key = event['Records'][0]['s3']['object']['key'] response = s3.get_object(Bucket=bucket_name, Key=object_key) body = response['Body'].read() # ը૾Λpost files = {"media": body} req_media = twitter.post(url_media, files=files) media_id = json.loads(req_media.text)['media_id'] # tweet jst = timezone(timedelta(hours=+9), 'JST') now = datetime.now(jst) params = {"status": "{} XXXXXX ษڧձ։࠵த ษڧத #glnagano" .format(now.strftime(“%Y/%m/%d %H:%M")), "media_ids": [media_id]} req_text = twitter.post(url_text, params=params) ը૾Λऔಘ Twitter΁ը૾Λpost Twitter΁Tweet

Slide 109

Slide 109 text

؂ࢹ·ͱΊ ࣸਅΛࡱͬͯTwitter΁౤ߘ͢Δ Twitter΁ͷૹ৴͸ɺʮγʔΫϨοτΩʔʯʮτʔΫϯʯͳͲ͕ඞཁ Ϋϥ΢υଆͰTweet͢ΔͷͰΫϥ΢υଆͰΩʔ͕؅ཧͰ͖Δ ஫ҙ AWS IoT CoreͰ΍ΓͱΓͰ͖Δσʔλྔ͸128KB·Ͱ https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws_service_limits.html#iot-protocol-limits ࡱӨ࣌ʹը૾ղ૾౓Λམͱ͢ Ұ࣌తͳτʔΫϯΛAWS IoTܦ༝Ͱऔಘ͠ɺ
 σόΠε͔Β௚઀S3΁ΞοϓϩʔυͳͲ ϥʔδσʔλΞοϓϩʔυύλʔϯ https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2017-iot#37

Slide 110

Slide 110 text

ޙ൒ Ϋϥ΢υ ߏ੒؅ཧπʔϧ ઃఆ৘ใͷอ࣋ Թ౓Λຖਖ਼࣌ɺΫϥ΢υ΁ૹΔ ঢ়ଶͷมߋ ҉͘ͳͬͨΒՄࢹޫΧϝϥͷࡱӨΛ΍ΊΔ ؂ࢹ ࣸਅΛࡱͬͯTwitter΁౤ߘ͢Δ ௨஌ Թ౓͕ᮢ஋Ҏ্ʹͳͬͨΒ௨஌͢Δ

Slide 111

Slide 111 text

௨஌ AWS IoT Core AWS Lambda Amazon DynamoDB Amazon Simple Storage Service AWS Lambda Amazon API Gateway આ໌ࡁΈ આ໌ࡁΈ આ໌ࡁΈ આ໌ࡁΈ LINE Notifyͷઆ໌͸
 Appendixࢀর

Slide 112

Slide 112 text

AWS IoT Core ௨஌ Թ౓͕ᮢ஋Ҏ্ʹͳͬͨΒ௨஌͢Δ Ϋϥ΢υ σόΠε Թ౓Λૹ৴ LambdaΛ࣮ߦ ᮢ஋ΛνΣοΫͯ͠ ֤αʔϏε΁௨஌

Slide 113

Slide 113 text

AWS IoT Core ௨஌ Թ౓͕ᮢ஋Ҏ্ʹͳͬͨΒ௨஌͢Δ Ϋϥ΢υ σόΠε Թ౓Λૹ৴ LambdaΛ࣮ߦ ᮢ஋ΛνΣοΫͯ͠ ֤αʔϏε΁௨஌ ͲͷΑ͏ʹ ૹ৴͍ͯ͠Δ͔

Slide 114

Slide 114 text

import ssl import slackweb class Slack: slack_webhook_url = '[slackͰऔಘͨ͠webhookͷURL]' @staticmethod def notify(slack_url, message): ssl._create_default_https_context = ssl._create_unverified_context slack = slackweb.Slack(url=slack_url) slack.notify(text=message, username="notify", icon_emoji=":bell:") # slack΁௨஌ Slack.notify(Slack.slack_webhook_url, 'Թ౓͕30౓Ҏ্Ͱ͢ʂ') ௨஌ Թ౓͕ᮢ஋Ҏ্ʹͳͬͨΒ௨஌͢Δ Slack΁௨஌ʂ

Slide 115

Slide 115 text

import requests class LineNotify: @classmethod def notify(cls, message): payload = {'message': message} res = cls._requests(payload) return res @classmethod def _requests(cls, payload): url = 'https://notify-api.line.me/api/notify' access_token = '[ΞΫηετʔΫϯ]' headers = {'authorization': 'Bearer {}'.format(access_token)} res = requests.post(url, headers=headers, params=payload) return res # LINE Notifyʹ௨஌ LineNotify.notify('Թ౓͕30౓Ҏ্Ͱ͢ʂ') ௨஌ Թ౓͕ᮢ஋Ҏ্ʹͳͬͨΒ௨஌͢Δ LINE Notifyʹ௨஌ʂ

Slide 116

Slide 116 text

௨஌·ͱΊ ؆୯ʹଞαʔϏε΁௨஌Ͱ͖ΔϥΠϒϥϦɺαʔϏε͕͋Δʂ LINE NotifyΛ͔͖͔͚ͭͬͨͬ ೶Ոͷํ͔Βɺϋ΢εͷԹ౓͕ҰఆҎ্orҎԼʹͳͬͨΒ௨஌ͯ͠΄͍͠ slack஌Βͳ͍ LINE͸࢖༻͍ͯ͠Δͻͱ͕ଟ͍ʂ

Slide 117

Slide 117 text

σʔλอଘɺ؂ࢹɺ௨஌͕Ͱ͖·ͨ͠ʂ AWS IoT Core AWS Lambda Amazon DynamoDB AWS Lambda Amazon API Gateway Amazon Simple Storage Service આ໌ࡁΈ

Slide 118

Slide 118 text

Ϋϥ΢υ·ͱΊ ߏ੒؅ཧπʔϧΛ࢖༻͢Δ͜ͱʹΑΓ Ϋϥ΢υͷߏ੒ΛϑΝΠϧͰ؅ཧʹόʔδϣϯ؅ཧ΋Ͱ͖Δ ίϚϯυҰൃͰߏங

Slide 119

Slide 119 text

Ϋϥ΢υ·ͱΊ ઃఆ৘ใͷอ࣋ɺঢ়ଶͷมߋɺ؂ࢹɺ௨஌ ͳΔ΂͘Ϋϥ΢υଆͰߦ͏ σόΠε͸ͦͷࢦࣔʹै͏͚ͩʗσʔλΛૹΔ͚ͩ Ϋϥ΢υ͔Β࿈ܞͰ͖ΔαʔϏεɺΨδΣοτ͕૿͑ͨʂʂʂ Ϋϥ΢υଆͰ৘ใΛอ͓࣋ͯ͘͜͠ͱʹΑΓ࿈ܞָ͕ twilioɺkintoneɺεϚʔτϗʔϜΩοτɺεϚʔτϐʔΧʔͳͲ Ϋϥ΢υଆͰʮ΍Δʯ͜ͱΛҙࣝ͢Δͱ͍Ζ͍Ζͱ޾ͤʹͳΔʂ

Slide 120

Slide 120 text

Web

Slide 121

Slide 121 text

ޙ൒ Web Amazon API GatewayͰσʔλΛެ։ ΞΫηε੍ݶ WebϖʔδͰάϥϑɺදΛදࣔ

Slide 122

Slide 122 text

ߏ੒ AWS IoT Core AWS Lambda Amazon DynamoDB AWS Lambda IoT action IoT rule Amazon API Gateway Amazon Simple Storage Service Ϋϥ΢υଆͰઆ໌ࡁΈ Auth0

Slide 123

Slide 123 text

ޙ൒ Web Amazon API GatewayͰσʔλΛެ։ ΞΫηε੍ݶ WebϖʔδͰάϥϑɺදΛදࣔ

Slide 124

Slide 124 text

APIͰηϯαͷσʔλΛެ։ AWS IoT Core AWS Lambda Amazon DynamoDB AWS Lambda IoT action IoT rule Amazon API Gateway Amazon Simple Storage Service Ϋϥ΢υଆͰઆ໌ࡁΈ Auth0 ΦʔιϥΠβʔɾ Auth0ͷৄࡉ͸
 Appendixࢀর

Slide 125

Slide 125 text

ΞΫηε੍ݶ ࠓճ͸Amazon API Gateway + AWS LambdaͰσʔλΛެ։ Amazon API GatewayͷΞΫηε੍ݶ https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway- control-access-to-api.html ࠓճ͸ʮAPI Gateway Lambda ΦʔιϥΠβʔʯΛ࢖༻ https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/ apigateway-use-lambda-authorizer.html τʔΫϯͷੜ੒ɺೝূ౳͸Auth0Λ࢖༻

Slide 126

Slide 126 text

ࣗલͰϓϥοτϑΥʔϜΛߏங͢Δඞཁ͕ͳ͍ ΞΫηε੍ݶ Auth0 https://auth0.com/jp/ WebɺϞόΠϧɺ͓ΑͼϨΨγʔΞϓϦέʔγϣϯ޲͚ͷ
 ϢχόʔαϧೝূɾೝՄϓϥοτϑΥʔϜΛఏڙ

Slide 127

Slide 127 text

ΞΫηε੍ݶ Auth0Λར༻ Amazon API Gateway Auth0 ϦΫΤετલʹ τʔΫϯऔಘ ϦΫΤετ࣌ͷϔομʹ τʔΫϯΛ΋ͨͤΔʂ ϦΫΤετͷ τʔΫϯΛೝূ ೝূɺೝՄΛߦ͏Lambda Lambda ΦʔιϥΠβʔ

Slide 128

Slide 128 text

APIͰηϯαͷσʔλΛެ։·Ͱ׬ྃʂ AWS IoT Core AWS Lambda Amazon DynamoDB AWS Lambda IoT action IoT rule Amazon API Gateway Amazon Simple Storage Service Ϋϥ΢υଆͰઆ໌ࡁΈ Auth0 આ໌ࡁΈ

Slide 129

Slide 129 text

ޙ൒ Web Amazon API GatewayͰσʔλΛެ։ ΞΫηε੍ݶ WebϖʔδͰάϥϑɺදΛදࣔ

Slide 130

Slide 130 text

Webϖʔδ AWS IoT Core AWS Lambda Amazon DynamoDB AWS Lambda IoT action IoT rule Amazon API Gateway Amazon Simple Storage Service Ϋϥ΢υଆͰઆ໌ࡁΈ Auth0 આ໌ࡁΈ

Slide 131

Slide 131 text

Django https://docs.djangoproject.com/ja/2.2/ ͓ͳ͡ΈͷPythonͷWebϑϨʔϜϫʔΫ ࠓճ͸ϩάΠϯػೳͱWebϖʔδͷදࣔʹ࢖༻ django rest framework΋࢖༻ Ϋϥ΢υ͔Βͷσʔλऔಘ WebϑϨʔϜϫʔΫ

Slide 132

Slide 132 text

Char.js https://www.chartjs.org/ JavascriptͷϥΠϒϥϦ ؆୯ʹάϥϑ͕͔͚Δʂ άϥϑͷछྨ΋͍Ζ͍ΖͱରԠ͍ͯ͠Δʂ άϥϑදࣔ

Slide 133

Slide 133 text

Char.js άϥϑදࣔ const chartDht = new Chart(ctxDht, { type: 'line', data: { labels: labels, datasets: [ { label: 'Թ౓', data: dataTemp, backgroundColor: 'rgba(0, 0, 0, 0)', borderColor: 'rgba(255, 99, 132, 1)', borderWidth: 1 }, { label: '࣪౓', data: dataHumi, ɾɾɾ }, { label: 'ۭؾͷ඼࣭', data: dataAirQuality, ɾɾɾ },] }, options: { ɾɾɾ } });

Slide 134

Slide 134 text

Char.js άϥϑදࣔ

Slide 135

Slide 135 text

Char.js άϥϑදࣔ ΫϦοΫ͢Δͱɺ දࣔ͢Δର৅Λ͔͑ΒΕΔʂ

Slide 136

Slide 136 text

DataTables https://datatables.net/ jQueryͷϓϥάΠϯ ؆୯ʹද͕͔͚Δʂ ϖʔδωʔγϣϯɺݕࡧʹ΋ରԠʂ ςʔϒϧදࣔ

Slide 137

Slide 137 text

ɾɾɾ columnDefs: [ // ૹ৴೔࣌ { "targets": 0, data: "send_time"}, // Թ౓ { "targets": 1, data: "temp", "render": function (data, type, full, meta) { return (webCommons.dispRange(data)) ? data : "-"; } }, // ࣪౓ { "targets": 2, data: "humi", ɾɾɾ { className: "center", "targets": [ 0, 1, 2, 3, 4, 5, ] } ], ɾɾɾ ςʔϒϧදࣔ DataTables

Slide 138

Slide 138 text

ςʔϒϧදࣔ DataTables 1ϖʔδͷදࣔߦ σʔλͷݕࡧػೳ ϖʔδωʔγϣϯ

Slide 139

Slide 139 text

HEROKU https://jp.heroku.com/ Paas PythonϥΠϒϥϦͷdjango-herokuΛ࢖ͬͯ؆୯ʹઃఆͰ͖Δʂ $ git push heroku master Ͱ؆୯σϓϩΠ αΠτ͸σϑΥϧτͰHTTPS αʔό

Slide 140

Slide 140 text

WebϖʔδͰݟ͑ΔԽ·Ͱ׬ྃʂ AWS IoT Core AWS Lambda Amazon DynamoDB AWS Lambda IoT action IoT rule Amazon API Gateway Amazon Simple Storage Service Ϋϥ΢υଆͰઆ໌ࡁΈ Auth0 આ໌ࡁΈ આ໌ࡁΈ

Slide 141

Slide 141 text

Web·ͱΊ ηΩϡϦςΟɺೝূ Djangoɺdjango rest frameworkɺAuth0ʹ͓೚ͤ ؆୯ʹϏδϡΞϧΛΧοίΑ͘Ͱ͖Δʂ Chart.jsɺDataTablesͰΠέͯΔϖʔδ࡞੒ αʔόߏஙɺ؅ཧ͔Βͷղ์ HEROKUΛ࢖ͬͯ؆୯ެ։ʂ

Slide 142

Slide 142 text

ίετ

Slide 143

Slide 143 text

ίετ ॳظίετ ϥϯχϯάίετ ※2019/09/02ݱࡏͰ͢

Slide 144

Slide 144 text

ॳظίετ ඼໊ ݸ਺ ߹ܭ ࢀߟݩ౳ 3BTQCFSSZ1J .PEFM# ԁ ੫ࠐ ,4: (SPWF1J ԁ ੫ࠐ "NB[PO Թ࣪౓ܭQSP ԁ ੫ࠐ "NB[PO (64#υϯάϧ ", ԁ ੫ൈ 403"$0. 403"$0.4*. ԁ ੫ൈ ˞QMBO%ɺσʔλ௨৴ͷΈ ߹ܭ — ໿ ԁ ॳظඅ༻ʢૹྉผʣ ※ηϯα͸͢΂ͯܝࡌ͍ͯ͠·ͤΜ

Slide 145

Slide 145 text

ϥϯχϯάίετ ࢖༻ස౓౳ σʔλͷݟ͑ΔԽʗ௨஌ ؂ࢹ ྉۚ SORACOM AWS Auth0 HEROKU

Slide 146

Slide 146 text

ϥϯχϯάίετ ࢖༻ස౓౳ σʔλͷݟ͑ΔԽʗ௨஌ ؂ࢹ ྉۚ SORACOM AWS Auth0 HEROKU

Slide 147

Slide 147 text

ϥϯχϯάίετ ༻్ ೔͝ͱ ݄͝ͱ උߟ ηϯγϯάσʔλͷૹ৴ ճʢ෼͝ͱʣ࣌✕✕୆ ܭɿճ ճ೔✕೔ ܭɿճ σόΠε㱺 "84*P5$PSF㱺 ֤αʔϏε σʔλόοΫΞοϓ ճ ճ %ZOBNP%#ͷ೔෼ͷσʔ λΛ4ʹόοΫΞοϓ ௨஌ ఆظ͕ճ ෆఆظ͕ճ͘Β͍ ܭɿճ ճ೔✕೔ ܭɿճ TMBDLɺ-*/&/PUJGZ΁ ௨஌ 8FCϖʔδͷࢀর ໿ճ ճ೔✕೔ ճ ※ෆఆظͰಈ͍͍ͯΔͱ͜Ζ΋͋ΔͨΊɺྉ࣮ۚ੷ͷ࢖༻ྔͱҰக͸͠·ͤΜ ࢖༻ස౓౳ ʲσʔλͷݟ͑ΔԽʗ௨஌ʳ

Slide 148

Slide 148 text

ϥϯχϯάίετ ༻్ ೔͝ͱ ݄͝ͱ උߟ ࣸਅࡱӨͨ͠5XFFU ճ ෼͝ͱ ࣌✕ ܭɿճ ճ೔✕೔ ܭɿճ σόΠε㱺 "84*P5$PSF㱺 ֤αʔϏε ,ຕ✕ճ ෼͝ͱ ࣌✕ ܭɿ.# .#೔✕೔ ܭɿ.# ʏ %FWJDF4IBEPX ʢ(&561%"5&ʣ ճ ෼͝ͱ ࣌✕ ܭɿճ ճ೔✕೔ ܭɿ ճ σόΠε㱻"84*P5$PSF ※ෆఆظͰಈ͍͍ͯΔͱ͜Ζ΋͋ΔͨΊɺྉ࣮ۚ੷ͷ࢖༻ྔͱҰக͸͠·ͤΜ ※೔தͷΈՔಇʢ҉͘ͳΔͱࡱӨ͠ͳ͍ʣ ࢖༻ස౓౳ ʲ؂ࢹʳ

Slide 149

Slide 149 text

ϥϯχϯάίετ ࢖༻ස౓౳ σʔλͷݟ͑ΔԽʗ௨஌ ؂ࢹ ྉۚ SORACOM AWS Auth0 HEROKU

Slide 150

Slide 150 text

ϥϯχϯάίετ αʔϏε ྉۚʢ੫ผʣ උߟ "JS4*. جຊྉۚ ຕɿԁ೔ ˞ ௨৴ྉ ԁ.# ˞ #FBN جຊྉۚ ແྉ ϦΫΤετྉ ԁϦΫΤετ ˞ ແྉར༻࿮͋Γ SORACOM ※ಛఆ஍Ҭ޲͚ IoT SIMɺplan-Dɺ࢖༻։࢝ޙɺσʔλ௨৴ͷΈɺs1.standard ɹhttps://soracom.jp/services/air/cellular/price_specific_area_sim/#plan-d 1SIM ໿300ԁ/݄ ✕ ࢖༻ຕ਺ ʲσʔλͷݟ͑ΔԽʗ௨஌ɺ؂ࢹʳ

Slide 151

Slide 151 text

ϥϯχϯάίετ αʔϏε ࢖༻ྉ ࢖༻ྔ ྉۚମܥ౳ උߟ "84*P5$PSF .FTTBHFT ϝοηʔδԯ݅·Ͱ 64% ϝοηʔδສ݅͋ͨΓ ˞ ଞͷྉۚ͸ԁͷͨΊׂѪ %ZOBNP%# 3FBE 8SJUF (#.P DBQBDJUZVOJUɿͳͷͰແྉ࿮಺ (#Ҏ಺ͳͷͰແྉ࿮ ˞ -BNCEB TFDPOET 3FRVFTUT ྆ํͱ΋ແྉ࿮಺ ˞ "NB[PO"1* (BUFXBZ 3FRVFTU ʲ"1*ίʔϧʳ ࠷ॳͷԯ ສ·Ͱ ສ͋ͨΓ64% ˞ "NB[PO4JNQMF 4UPSBHF4FSWJDF 3FRVFTUT 3FRVFTUT (#.P 165ଞ·Ͱɿ (&5ଞ·Ͱɿ ࠷ॳͷ5#݄·Ͱɿ(# ˞ ߹ܭ AWS ※౦ژϦʔδϣϯͷྉۚͰ͢ ※ྉۚମܥ͸লུͯ͠Δͱ͜Ζ΋͋Γ·͢ͷͰɺৄࡉ͸AWSͷϖʔδΛࢀর ʲσʔλͷݟ͑ΔԽʗ௨஌ʳ˞2019೥7݄࣮੷

Slide 152

Slide 152 text

ϥϯχϯάίετ αʔϏε ྉۚ ࢖༻ྔ ྉۚମܥ౳ උߟ "84*P5$PSF ໿0QFSBUJPOT %FWJDF4IBEPXBOE%FWJDF3FHJTUSZ 0QFSBUJPOTɿສ͝ͱ ˞ ଞͷྉۚ͸ԁͷͨΊׂѪ -BNCEB ˞ "NB[PO4JNQMF 4UPSBHF4FSWJDF 165ଞ·Ͱɿ (&5ଞ·Ͱɿ ࠷ॳͷ5#݄·Ͱɿ(# ˞ ߹ܭ AWS ※౦ژϦʔδϣϯͷྉۚͰ͢ ※ྉۚମܥ͸লུͯ͠Δͱ͜Ζ΋͋Γ·͢ͷͰɺৄࡉ͸AWSͷϖʔδΛࢀর ※LambdaɺS3ʹ͍ͭͯ͸ɺଞαʔϏεͰ΋࢖༻͍ͯ͠ΔͨΊਪఆ஋ʢσʔλͷݟ͑ΔԽʗ௨஌ΑΓ࢖༻ྉ͸গͳ͍ʣ ʲ؂ࢹʳ˞2019೥7݄࣮੷

Slide 153

Slide 153 text

ϥϯχϯάίετ ϓϥϯ ྉۚ උߟ '3&&ϥΠηϯε ແྉ Ұ෦ɺػೳ੍ݶ͋Γ %&7&-01&3 ݄ʙ &YUFSOBM"DUJWF6TFSTʹΑΓมಈ %&7&-01&3130 ˈ݄ʙ &YUFSOBM"DUJWF6TFSTଞʹΑΓมಈ Auth0 ※DEVELOPER PROͷ্ʹʮENTERPRISEʯϥΠηϯε͕͋Γ·ׂ͕͢Ѫ FREEϥΠηϯεͳͷͰɺ0ԁ ʲσʔλͷݟ͑ΔԽʳ

Slide 154

Slide 154 text

ϥϯχϯάίετ HEROKU FreeͳͷͰ0ԁ ࢖༻ऀ͸਺ेਓͰͦΕ΄ͲසൟʹΞΫηε͞ΕΔ༁Ͱ͸ͳ͍ͷͰFreeͰे෼ ʲdyno https://jp.heroku.com/pricing#dynosʳ ϓϥϯ ྉۚ උߟ 'SFF ແྉ Ұ෦ɺػೳ੍ݶ͋Γ )PCCZ ࠷େ݄EZOP ඵ୯Ґͷ՝ۚ 4UBOEBSE ࠷େ݄EZOP ඵ୯Ґͷ՝ۚ 1FSGPSNBODF ʲσʔλͷݟ͑ΔԽʳ

Slide 155

Slide 155 text

ϥϯχϯάίετ HEROKU Hobby-FreeͳͷͰ0ԁ ηϯγϯάσʔλ͸AWSʹ͋ΔͷͰHobby - FreeͰे෼ ʲHeroku Postgres https://jp.heroku.com/pricing#databasesʳ ϓϥϯ ྉۚ උߟ )PCCZ'SFF ແྉ ߦ·Ͱ )PCCZ#BTJD ࠷େ݄ ສߦ·Ͱ ඵ୯Ґͷ՝ۚ 4UBOEBSE ࠷େ ݄ ඵ୯Ґͷ՝ۚ 1SFNJVN ࠷େ ݄ ඵ୯Ґͷ՝ۚ ʲσʔλͷݟ͑ΔԽʳ

Slide 156

Slide 156 text

ίετ·ͱΊ ॳظඅ༻͕ͪΐͬͱߴΊɾɾɾ ϥϯχϯάίετ͸΄΅ɺSIMྉ͘Β͍ʂ খن໛Ͱ͋Ε͹ɺݸਓͰ΋ӡ༻Ͱ͖ΔϨϕϧ

Slide 157

Slide 157 text

·ͱΊ Python͸σόΠεʗΫϥ΢υʗWebͰ࢖͑Δ ࠓޙɺ౷ܭ΍ػցֶशͳͲͰ΋Python࢖͑Δʂ ·ͣ͸ϦϦʔεͯ͠࢖ͬͯ΋Β͏͜ͱ͕େࣄ ݟ͑ΔԽ͢Δ͚ͩͰ΋͘͢͝ت͹ΕΔ ೶Ոͷํɺ੡଄ۀͷํ ঢ়گ͚ͩΘ͔Ε͹͍͍ʗ஌Βͤͯ͘ΕΕ͹Α͍ ౎౓౎౓ɺݱ஍ʹ͍ͬͯ֬ೝ͍ͯͨ͜͠ͱ͔Βղ์͞ΕΔʂ Ϟϊ͕Πϯλʔωοτʹܨ͕͍ͬͯΔ͜ͱ͕౰ͨΓલ ݸਓͰ΋͓खܰʹγεςϜ͕ߏஙͰ͖ΔΑ͏ʹͳͬͨʂ ࠓޙ΋Α͍αʔϏ౳͸ͲΜͲΜͰͯ͘Δ औࣺબ୒͸͋Δ͚ͲɺΑ͍΋ͷ͸ͲΜͲΜऔΓೖΕΔ

Slide 158

Slide 158 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ Enjoy IoT Life

Slide 159

Slide 159 text

Appendix

Slide 160

Slide 160 text

σόΠεؔ࿈Ͱࠓޙ΍Γ͍ͨ͜ͱ σόΠε΁ͷσϓϩΠ balenaCloud https://www.balena.io/ ίϯςφΠϝʔδΛσόΠεʹ഑෍ͨ͠ΓͰ͖Δʂ

Slide 161

Slide 161 text

௨஌ LINE Notify https://notify-bot.line.me/ja/ WebαʔϏε͔Βͷ௨஌ΛLINEͰड৴Ͱ͖Δ άϧʔϓͰ΋௨஌Λड৴͢Δ͜ͱ͕Մೳ ΞΫηετʔΫϯΛऔಘͯ͠
 ࢦఆͷURL΁POST͢Δ͚ͩʂ ར༻ྉۚ͸ແྉ 1࣌ؒʹ௨஌1000ճ·ͰՄ

Slide 162

Slide 162 text

Appendixɿঢ়ଶͷมߋ

Slide 163

Slide 163 text

ঢ়ଶͷมߋ AWS IoT Core AWS Lambda Amazon DynamoDB AWS Lambda Amazon API Gateway Amazon Simple Storage Service આ໌ࡁΈ આ໌ࡁΈ

Slide 164

Slide 164 text

σόΠεଆ cronͰຖਖ਼࣌ɺ5෼͝ͱىಈ ىಈ͝ͱDevice ShadowΛࢀর Device Shadow ΧϝϥͷࡱӨ༗ແʢis_shootingʣ trueɿࡱӨ͢Δ falseɿࡱӨ͠ͳ͍ Device ShadowαʔϏε { # Ϋϥ΢υ͔Βͷཁٻ "desired": { "sensor": { "interval": 10 } "camera": { "is_shooting": true } }, # σόΠεͷঢ়ଶ "reported": { "sensor": { "interval": 10 } "camera": { "is_shooting": true } }, # Ϋϥ΢υͱσόΠεͷࠩ෼ } ঢ়ଶͷมߋ

Slide 165

Slide 165 text

AWS IoT Core ঢ়ଶͷมߋ ҉͘ͳͬͨΒՄࢹޫΧϝϥͷࡱӨΛ΍ΊΔ Ϋϥ΢υ σόΠε Device ShadowαʔϏε { # Ϋϥ΢υ͔Βͷཁٻ "desired": { "sensor": { "interval": 10 }, “camera": { “is_shooting": true } }, # σόΠεͷঢ়ଶ "reported": { "sensor": { "interval": 10 }, “camera": { “is_shooting": true } }, } ໌Δ͞Λૹ৴ ໌Δ͞ʹ0ʢਅͬ҉ʣ LambdaΛ࣮ߦ ਅͬ҉ʹͳͬͨͷͰShadowΛߋ৽
 is_shootingΛʮfalseʯ

Slide 166

Slide 166 text

AWS IoT Core ঢ়ଶͷมߋ ҉͘ͳͬͨΒՄࢹޫΧϝϥͷࡱӨΛ΍ΊΔ Ϋϥ΢υ σόΠε Device ShadowαʔϏε { # Ϋϥ΢υ͔Βͷཁٻ "desired": { "sensor": { "interval": 10 }, “camera": { “is_shooting": false } }, # σόΠεͷঢ়ଶ "reported": { "sensor": { "interval": 10 }, “camera": { “is_shooting": true } }, # Ϋϥ΢υͱσόΠεͷࠩ෼ “delta": { “camera": { “is_shooting": false } } } ໌Δ͞Λૹ৴ ໌Δ͞ʹ0ʢਅͬ҉ʣ LambdaΛ࣮ߦ ਅͬ҉ʹͳͬͨͷͰShadowΛߋ৽
 is_shootingΛʮfalseʯ

Slide 167

Slide 167 text

AWS IoT Core ঢ়ଶͷมߋ ҉͘ͳͬͨΒՄࢹޫΧϝϥͷࡱӨΛ΍ΊΔ Ϋϥ΢υ σόΠε Device ShadowαʔϏε 
 Device ShadowαʔϏε { # Ϋϥ΢υ͔Βͷཁٻ "desired": { "sensor": { "interval": 10 }, "camera": { "is_shooting": false } }, # σόΠεͷঢ়ଶ "reported": { "sensor": { "interval": 10 }, "camera": { "is_shooting": true } }, # Ϋϥ΢υͱσόΠεͷࠩ෼ "delta": { "camera": { "is_shooting": false } } } ࠩ෼Λreportedͱͯ͠ JSONͰૹΔʢUPDATEʣ JSONΛड͚औΔ GETཁٻ is_shooting͕false ͳͷͰࡱӨ͠ͳ͍ ໌Δ͞Λૹ৴ ໌Δ͞ʹ0ʢਅͬ҉ʣ LambdaΛ࣮ߦ ਅͬ҉ʹͳͬͨͷͰShadowΛߋ৽
 is_shootingΛʮfalseʯ

Slide 168

Slide 168 text

AWS IoT Core ঢ়ଶͷมߋ ҉͘ͳͬͨΒՄࢹޫΧϝϥͷࡱӨΛ΍ΊΔ Ϋϥ΢υ σόΠε Device ShadowαʔϏε 
 Device ShadowαʔϏε { # Ϋϥ΢υ͔Βͷཁٻ "desired": { "sensor": { "interval": 10 }, "camera": { "is_shooting": false } }, # σόΠεͷঢ়ଶ "reported": { "sensor": { "interval": 10 }, "camera": { "is_shooting": false } } # Ϋϥ΢υͱσόΠεͷࠩ෼ } ࠩ෼Λreportedͱͯ͠ JSONͰૹΔʢUPDATEʣ JSONΛड͚औΔ GETཁٻ is_shooting͕false ͳͷͰࡱӨ͠ͳ͍ ໌Δ͞Λૹ৴ ໌Δ͞ʹ0ʢਅͬ҉ʣ LambdaΛ࣮ߦ ਅͬ҉ʹͳͬͨͷͰShadowΛߋ৽
 is_shootingΛʮfalseʯ

Slide 169

Slide 169 text

AWS IoT Core ঢ়ଶͷมߋ ҉͘ͳͬͨΒՄࢹޫΧϝϥͷࡱӨΛ΍ΊΔ Ϋϥ΢υ σόΠε Device ShadowαʔϏε 
 Device ShadowαʔϏε { # Ϋϥ΢υ͔Βͷཁٻ "desired": { "sensor": { "interval": 10 }, "camera": { "is_shooting": false } }, # σόΠεͷঢ়ଶ "reported": { "sensor": { "interval": 10 }, "camera": { "is_shooting": false } } # Ϋϥ΢υͱσόΠεͷࠩ෼ } ࠩ෼Λreportedͱͯ͠ JSONͰૹΔʢUPDATEʣ JSONΛड͚औΔ GETཁٻ is_shooting͕false ͳͷͰࡱӨ͠ͳ͍ ໌Δ͞Λૹ৴ ໌Δ͞ʹ0ʢਅͬ҉ʣ LambdaΛ࣮ߦ ਅͬ҉ʹͳͬͨͷͰShadowΛߋ৽
 is_shootingΛʮfalseʯ ͲͷΑ͏ʹ Device Shadow Λมߋ͍ͯ͠Δ͔

Slide 170

Slide 170 text

ঢ়ଶͷมߋ ҉͘ͳͬͨΒՄࢹޫΧϝϥͷࡱӨΛ΍ΊΔ import boto3 # IoTDataPlaneΫϥΠΞϯτ iot_data = boto3.client('iot-data') # ࡱӨ͠ͳ͍ʹ͢Δ update_payload = b'{"state": {"desired": {"camera": {"is_shooting": false}}}}' # ShadowΛUPDATE͢Δ iot_data.update_thing_shadow( thingName=thing_name, payload=update_payload )

Slide 171

Slide 171 text

ঢ়ଶͷมߋ ͪͳΈʹDevice Shadowͷऔಘ΋؆୯ import boto3 # IoTDataPlaneΫϥΠΞϯτ iot_data = boto3.client('iot-data') # shadow ͷऔಘ response = iot_data.get_thing_shadow( thingName=thing_name ) payload = response['payload'] payload_dict = json.loads(payload.read())

Slide 172

Slide 172 text

AppendixɿΞΫηε੍ݶ

Slide 173

Slide 173 text

ΞΫηε੍ݶ API Gateway Lambda ΦʔιϥΠβʔͱ͸ https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/ apigateway-use-lambda-authorizer.html AWS Lambda Amazon API Gateway Amazon DynamoDB ΞΫηε੍ݶͳ͠ͷ৔߹

Slide 174

Slide 174 text

ΞΫηε੍ݶ API Gateway Lambda ΦʔιϥΠβʔͱ͸ AWS Lambda Amazon API Gateway Amazon DynamoDB ʲϨεϙϯεʳDynamoDB΁ొ࿥ͨ͠σʔλ [ { “imsi": XXXX, “timestamp": 1565276403000, “air_quality”: 83, “humi": 41.8, “loudness": 88, “lux": 35, “temp": 25.3, }, ɾɾɾ ] ΞΫηε੍ݶͳ͠ͷ৔߹

Slide 175

Slide 175 text

ΞΫηε੍ݶ API Gateway Lambda ΦʔιϥΠβʔͱ͸ AWS Lambda Amazon API Gateway Amazon DynamoDB ʲϨεϙϯεʳDynamoDB΁ొ࿥ͨ͠σʔλ [ { “imsi": XXXX, “timestamp": 1565276403000, “air_quality”: 83, “humi": 41.8, “loudness": 88, “lux": 35, “temp": 25.3, }, ɾɾɾ ] ΞΫηε੍ݶͳ͠ͷ৔߹ URLΛ஌͍ͬͯΔͱ୭Ͱ΋ΞΫηεͰ͖ ͯ͠·͏

Slide 176

Slide 176 text

ΞΫηε੍ݶ API Gateway Lambda ΦʔιϥΠβʔͱ͸ AWS Lambda Amazon API Gateway Amazon DynamoDB ϦΫΤετ࣌ͷϔομʹ τʔΫϯΛ΋ͨͤΔʂ ΞΫηε੍ݶ͋Γͷ৔߹

Slide 177

Slide 177 text

ΞΫηε੍ݶ API Gateway Lambda ΦʔιϥΠβʔͱ͸ AWS Lambda Amazon API Gateway Amazon DynamoDB ΞΫηε੍ݶ͋Γͷ৔߹ ϦΫΤετ࣌ͷϔομʹ τʔΫϯΛ΋ͨͤΔʂ ೝূɺೝՄΛߦ͏Lambda Lambda ΦʔιϥΠβʔ

Slide 178

Slide 178 text

ΞΫηε੍ݶ API Gateway Lambda ΦʔιϥΠβʔͱ͸ AWS Lambda Amazon API Gateway Amazon DynamoDB ΞΫηε੍ݶ͋Γͷ৔߹ ϦΫΤετ࣌ͷϔομʹ τʔΫϯΛ΋ͨͤΔʂ ೝূɺೝՄΛߦ͏Lambda Lambda ΦʔιϥΠβʔ ೝূOK

Slide 179

Slide 179 text

ΞΫηε੍ݶ API Gateway Lambda ΦʔιϥΠβʔͱ͸ AWS Lambda Amazon API Gateway Amazon DynamoDB ΞΫηε੍ݶ͋Γͷ৔߹ ϦΫΤετ࣌ͷϔομʹ τʔΫϯΛ΋ͨͤΔʂ ೝূɺೝՄΛߦ͏Lambda Lambda ΦʔιϥΠβʔ ʲϨεϙϯεʳDynamoDB΁ొ࿥ͨ͠σʔλ [ { “imsi": XXXX, “timestamp": 1565276403000, “air_quality”: 83, “humi": 41.8, “loudness": 88, “lux": 35, “temp": 25.3, }, ɾɾɾ ] ೝূOK

Slide 180

Slide 180 text

ΞΫηε੍ݶ API Gateway Lambda ΦʔιϥΠβʔͱ͸ AWS Lambda Amazon API Gateway Amazon DynamoDB ΞΫηε੍ݶ͋Γͷ৔߹ ϦΫΤετ࣌ͷϔομʹ τʔΫϯΛ΋ͨͤΔʂ ೝূɺೝՄΛߦ͏Lambda Lambda ΦʔιϥΠβʔ ʲϨεϙϯεʳDynamoDB΁ొ࿥ͨ͠σʔλ [ { “imsi": XXXX, “timestamp": 1565276403000, “air_quality”: 83, “humi": 41.8, “loudness": 88, “lux": 35, “temp": 25.3, }, ɾɾɾ ] ೝূOK

Slide 181

Slide 181 text

ΞΫηε੍ݶ API Gateway Lambda ΦʔιϥΠβʔͱ͸ AWS Lambda Amazon API Gateway Amazon DynamoDB ΞΫηε੍ݶ͋Γͷ৔߹ ϦΫΤετ࣌ͷϔομʹ τʔΫϯΛ΋ͨͤΔʂ ೝূɺೝՄΛߦ͏Lambda Lambda ΦʔιϥΠβʔ ೝূNG

Slide 182

Slide 182 text

ΞΫηε੍ݶ API Gateway Lambda ΦʔιϥΠβʔͱ͸ AWS Lambda Amazon API Gateway Amazon DynamoDB ΞΫηε੍ݶ͋Γͷ৔߹ ϦΫΤετ࣌ͷϔομʹ τʔΫϯΛ΋ͨͤΔʂ ೝূɺೝՄΛߦ͏Lambda Lambda ΦʔιϥΠβʔ ೝূNG ޙଓͷLambda͸࣮ߦ͞Εͣ ݖݶͳ͕͠ฦ٫͞ΕΔ

Slide 183

Slide 183 text

ΞΫηε੍ݶ API Gateway Lambda ΦʔιϥΠβʔͱ͸ AWS Lambda Amazon API Gateway Amazon DynamoDB ΞΫηε੍ݶ͋Γͷ৔߹ ϦΫΤετ࣌ͷϔομʹ τʔΫϯΛ΋ͨͤΔʂ ೝূɺೝՄΛߦ͏Lambda Lambda ΦʔιϥΠβʔ ޙଓͷLambda͸࣮ߦ͞Εͣ ݖݶͳ͕͠ฦ٫͞ΕΔ τʔΫϯͷൃߦ͸ʁ

Slide 184

Slide 184 text

ࣗલͰϓϥοτϑΥʔϜΛߏங͢Δඞཁ͕ͳ͍ ΞΫηε੍ݶ Auth0 WebɺϞόΠϧɺ͓ΑͼϨΨγʔΞϓϦέʔγϣϯ޲͚ͷ
 ϢχόʔαϧೝূɾೝՄϓϥοτϑΥʔϜΛఏڙ

Slide 185

Slide 185 text

ΞΫηε੍ݶ Auth0Λར༻ Amazon API Gateway ೝূɺೝՄΛߦ͏Lambda Lambda ΦʔιϥΠβʔ Auth0 ϦΫΤετલʹ τʔΫϯऔಘ

Slide 186

Slide 186 text

ΞΫηε੍ݶ Auth0Λར༻ Amazon API Gateway ೝূɺೝՄΛߦ͏Lambda Lambda ΦʔιϥΠβʔ Auth0 ϦΫΤετલʹ τʔΫϯऔಘ ϦΫΤετ࣌ͷϔομʹ τʔΫϯΛ΋ͨͤΔʂ

Slide 187

Slide 187 text

ΞΫηε੍ݶ Auth0Λར༻ Amazon API Gateway ೝূɺೝՄΛߦ͏Lambda Lambda ΦʔιϥΠβʔ Auth0 ϦΫΤετલʹ τʔΫϯऔಘ ϦΫΤετ࣌ͷϔομʹ τʔΫϯΛ΋ͨͤΔʂ ϦΫΤετͷ τʔΫϯΛೝূ

Slide 188

Slide 188 text

ΞΫηε੍ݶ Auth0Λར༻ Amazon API Gateway ೝূɺೝՄΛߦ͏Lambda Lambda ΦʔιϥΠβʔ Auth0 ϦΫΤετલʹ τʔΫϯऔಘ ϦΫΤετ࣌ͷϔομʹ τʔΫϯΛ΋ͨͤΔʂ ϦΫΤετͷ τʔΫϯΛೝূ

Slide 189

Slide 189 text

from auth0.v3.authentication import GetToken ɾɾɾ # τʔΫϯऔಘʹඞཁͳ৘ใʢAuth0ͷϖʔδ͔Βऔಘʣ domain = settings.AUTH0_DOMAIN client_id = settings.AUTH0_CLIENT_ID client_secret = settings.AUTH0_CLIENT_SECRET api_audience = settings.API_AUDIENCE # τʔΫϯΛऔಘ get_token = GetToken(domain) token = get_token.client_credentials(client_id, client_secret, api_audience) ΞΫηε੍ݶ Auth0Λར༻

Slide 190

Slide 190 text

ΞΫηε੍ݶ Auth0Λར༻ Amazon API Gateway ೝূɺೝՄΛߦ͏Lambda Lambda ΦʔιϥΠβʔ Auth0 ϦΫΤετલʹ τʔΫϯऔಘ ϦΫΤετ࣌ͷϔομʹ τʔΫϯΛ΋ͨͤΔʂ ϦΫΤετͷ τʔΫϯΛೝূ

Slide 191

Slide 191 text

from jose import jwt ɾɾɾ try: payload = jwt.decode( token, rsa_key, algorithms=ALGORITHMS, audience=API_AUDIENCE, issuer="https://" + AUTH0_DOMAIN + "/" ) except jwt.ExpiredSignatureError: raise AuthError({"code": "token_expired", "description": "token is expired"}, 401) except jwt.JWTClaimsError: raise AuthError({"code": "invalid_claims", "description": "incorrect claims, please check the audience and issuer"}, 401) except Exception: raise AuthError({"code": "invalid_header", "description": "Unable to parse authentication token."}, 401) ΞΫηε੍ݶ Auth0Λར༻