Slide 1

Slide 1 text

AWS Lambda + Go 2017/06/16 γφδʔϚʔέςΟϯά(ג) Տ໺݈ଠ࿕

Slide 2

Slide 2 text

ࣗݾ঺հ • Տ໺ ݈ଠ࿕ • γφδʔϚʔέςΟϯά(ג) ϓϩμΫτ։ൃ෦ ॴଐ • Synergy! ͷϚϧννϟωϧରԠ͕ओۀ຿ • ΞϓϦϓογϡج൫ߏங • GoͰߏங → ܰྔԽ͍ͨ͠ • LINE ϝοηʔδϯάج൫ߏங • callback෦෼ΛGoͰ

Slide 3

Slide 3 text

AWS Lambda ͓͞Β͍

Slide 4

Slide 4 text

AWS Lambda ͱ͸ • Function as a Service • AWSͷαʔϏε্ͷΠϕϯτʹରԠ • ྫ) S3ʹը૾͕Ξοϓϩʔυ͞Εͨͱ͖ɺϦαΠ ζ͢Δ • Node.jsɺJavaɺC#ɺPython͕αϙʔτ͞Ε͍ͯΔ • Lambda Function ͱ͍͏୯ҐͰ؅ཧ

Slide 5

Slide 5 text

Lambda FunctionͷྫʢNode.jsʣ exports.handler = (event, context, callback) => { // Do Something callback(null, 'Hello from Lambda'); }; // event: Πϕϯτ৘ใ
 // context: ϥϯλΠϜ৘ใ
 // callback: ݺͼग़͠ݩʹ৘ใΛฦͨ͢Ίͷؔ਺

Slide 6

Slide 6 text

αϙʔτ͞Ε͍ͯͳ͍ͷʹ
 ͳΜͰGoͰ΍Δͷʁ

Slide 7

Slide 7 text

ͳΜͰGo? • ඪ४ͷݴޠͱൺֱͯ͠ɺḮ৭ͳ͍ύϑΥʔϚϯε • ࣾ಺ͷϥΠϒϥϦ͕࢖༻Ͱ͖Δ • ׳Ε • ίετ

Slide 8

Slide 8 text

GoͰͰ͖Δ͜ͱ͸GoͰ΍Γ͍ͨʂʂʂ

Slide 9

Slide 9 text

Ͳ͏΍ͬͯGoΛ࢖͏͔

Slide 10

Slide 10 text

ApexΛ࢖༻͢Δ

Slide 11

Slide 11 text

Apex ͱ͸ • Lambda FunctionΛ؅ཧ͢Δπʔϧ • ެࣜҎ֎ͷݴޠ΋αϙʔτ • Functionͷ࣮૷ʹ࢖͑ΔϥΠϒϥϦ΋ఏڙ • ࣮૷ɺϏϧυɺσϓϩΠΛҰ؏ͯ͠ߦ͑Δ • Node.jsͷhandler + GoͷόΠφϦΛಉࠝͯ͠σϓϩ Π

Slide 12

Slide 12 text

AWS Lambda ࣮ߦͷ࢓૊ΈʢApex+Goʣ 1. Πϕϯτൃੜ 2. Lambda FunctionΛίϯςφ্Ͱىಈ 3. نఆͷhandlerΛݺͼग़͢(Node.js) 4. Node.js͔ΒspawnͰmainΛ࣮ߦ • apexͷhandlerΛ࣮ߦ

Slide 13

Slide 13 text

Apex جຊίϚϯυ # ϓϩδΣΫτॳظԽ(IAM role, policyͷ࡞੒) $ apex init # ϏϧυͷΈ $ apex build > hello.zip # ϏϧυɺσϓϩΠΛ࣮ߦ $ apex deploy # functionͷϦετʢAWS্ͷ৘ใ΋֬ೝͰ͖Δʣ $ apex list

Slide 14

Slide 14 text

Apex ϑΝΠϧߏ੒ . ├ ─ ─ functions │ ├ ─ ─ bot # σΟϨΫτϦ୯ҐͰ؅ཧ │ ├ ─ ─ function.json # function͝ͱͷઃఆ │ └ ─ ─ main.go ├ ─ ─ .apexignore # ແࢹ͢ΔϑΝΠϧͷઃఆ └ ─ ─ project.json # ϓϩδΣΫτશମͷઃఆ

Slide 15

Slide 15 text

project.json { "name": "line-kensho", "description": "lineͷݕূ༻", "memory": 128, "timeout": 5, "role": "arn:aws:iam::...", "environment": {}, "runtime": "golang" }

Slide 16

Slide 16 text

function.json { "environment": { "CHANNEL_SECRET": ”...", "CHANNEL_TOKEN": ”..." } } function.jsonͷํ͕༏ઌ͞ΕΔ

Slide 17

Slide 17 text

.apexignore • gitignoreͱಉ͡ॻࣜ • Ϗϧυͷࡍʹzipͷର৅ʹ͠ͳ͍ • *.go ͰιʔείʔυΛআ֎

Slide 18

Slide 18 text

Lambda Function ͷྫʢApex+Goʣ import "github.com/apex/go-apex" func main() { apex.HandleFunc( func(e json.RawMessage, c *apex.Context) (interface{}, error) { return "Hello from Lambda", nil }) } // json.RawMessage: Πϕϯτ৘ใ // apex.Context: ϥϯλΠϜ৘ใ // return஋: ݺͼग़͠ݩʹฦ͢৘ใ

Slide 19

Slide 19 text

஫ҙ఺

Slide 20

Slide 20 text

஫ҙ఺ • ඪ४ग़ྗͷ಺༰͸Functionͷ݁Ռͱͯ͠ѻ͏ • ϩά͸ඪ४Τϥʔग़ྗʹ • ࢒ΓͷՔಇՄೳ͕࣌ؒऔಘͰ͖ͳ͍ • environment ͸ϚωδϝϯτίϯιʔϧͰؙݟ͑ • ೝূ৘ใ͸͖ͪΜͱ؅ཧ͠ͳ͍ͱ…ʢݕ౼தʣ

Slide 21

Slide 21 text

AWS API Gatewayͱͷ࿈ܞ

Slide 22

Slide 22 text

API Gatewayͱͷ࿈ܞ • API GatewayͰAPIΛ࡞੒ • ϦιʔεɺϝιουΛఆٛ • integrationʹLambda FunctionΛࢦఆ • ProxyϦιʔεͱͯ͠࿈ܞ͢Δ • ϦΫΤετͷ৘ใ͕JSONͰ౉ͬͯ͘Δ

Slide 23

Slide 23 text

API Gatewayͱ࿈ܞޙͷ࣮૷ type Request struct { Body string `json:"body"` Headers map[string]string `json:"headers"` HTTPMethod string `json:"httpMethod"` Path string `json:"path"` PathParameters map[string]string `json:"pathParameters"` QueryStringParameters map[string]string `json:"queryStringParameters”` // ...ଞ͍Ζ͍Ζ... } func main() { apex.HandleFunc( func(e json.RawMessage, c *apex.Context) (interface{}, error) { // ͜͜ͰϦΫΤετͷ৘ใΛ json.UnmarshalͳͲ͢Δඞཁ͕͋Δ => πϥΠ }) }

Slide 24

Slide 24 text

github.com/fujiwara/ridge

Slide 25

Slide 25 text

ridge ͱ͸ • ApexΛϥοϓ • net/http.Request, net/http.ResponsWriter͕࢖͑ Δ • logύοέʔδ͕࢖͑Δ

Slide 26

Slide 26 text

ridgeͰͷ࣮૷ import "github.com/fujiwara/ridge" func main() { var mux = http.NewServeMux() mux.HandleFunc("/", handleRoot) ridge.Run(":8080", "/api", mux) } func handleHello(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/plain") fmt.Fprintf(w, "Hello %s\n", r.FormValue("name")) } // ͍ͭ΋Ͳ͓Γͷ࣮૷ͰΒͪ͘Μ

Slide 27

Slide 27 text

ridgeͰͷ஫ҙ఺ • ridge.Run ͷprefix͸AWS্Ͱ͸ແޮ • handlerΛ౉͢ͱ͖ʹStrip͢Δ // ridge.Run(":8080", ”/callback", handler) stripped := http.StripPrefix("/callback", handler) ridge.Run(":8080", "", stripped)

Slide 28

Slide 28 text

·ͱΊ

Slide 29

Slide 29 text

·ͱΊ • AWS LambdaͰ΋Go͸࢖͑Δ • ApexΛ࢖͏ • API Gatewayͱ࿈ܞ͢ΔͳΒridgeΛ࢖͏