Slide 1

Slide 1 text

Advanced API Calling in Go @__timakin__ / Go 1.9 Release Party in Tokyo

Slide 2

Slide 2 text

ࣗݾ঺հ • Github: timakin / Twitter: @__timakin__ • ŧŔŕŪ Go Ŭ Contribute ŢŦ • Gunosy ৽نࣄۀ։ൃࣨ ॴଐ • Go / Swift • Recently Contributed / Created • giginet/xcprofiler • mercari/gaurun • timakin/gopli • timakin/ssm2env • timakin/md2mid • timakin/gonvert

Slide 3

Slide 3 text

Copyright© Gunosy Inc. All Rights Reserved 3 Go / Python ΤϯδχΞืूத ▶https://gunosy.co.jp/recruit/ Gunosy͸ɺ౦ژେֶʹ௨͏3ਓͷֶੜͷ
 ʮ৘ใΛੈքதͷਓʹ࠷దʹಧ͚͍ͨʯͱ͍͏૝͍͔Β࢝·Γ·ͨ͠ɻ ౦ূϚβʔζ্৔ɺ࿡ຊ໦ώϧζ΁ͷΦϑΟεҠసΛܦͯɺ
 େ͖͘੒௕͍ͯ͠ΔձࣾͰ׆༂͍ͨ͠ϝϯόʔΛืू͍ͯ͠·͢ɻ

Slide 4

Slide 4 text

ࠓ೔ͷςʔϚ

Slide 5

Slide 5 text

GoͰAPI Client࡞Δͱ͖ͷ ΧελϚΠζྫ

Slide 6

Slide 6 text

ࡢࠓͷAPI Client։ൃ • APIΛୟ͍ͯදࣔ͢ΔCLIπʔϧΛ࡞Δ

Slide 7

Slide 7 text

ࡢࠓͷAPI Client։ൃ • APIΛୟ͍ͯදࣔ͢ΔCLIπʔϧΛ࡞Δ • ։ൃͯ͠ΔAPI͔ΒͲ͔ͬͷAPIΛݺͼ͍ͨ

Slide 8

Slide 8 text

ࡢࠓͷAPI Client։ൃ • APIΛୟ͍ͯදࣔ͢ΔCLIπʔϧΛ࡞Δ • ։ൃͯ͠ΔAPI͔ΒͲ͔ͬͷAPIΛݺͼ͍ͨ • SDKܦ༝ͰσʔλΛऔ͖͍ͬͯͨ

Slide 9

Slide 9 text

ࡢࠓͷAPI Client։ൃ • APIΛୟ͍ͯදࣔ͢ΔCLIπʔϧΛ࡞Δ • ։ൃͯ͠ΔAPI͔ΒͲ͔ͬͷAPIΛݺͼ͍ͨ • SDKܦ༝ͰσʔλΛऔ͖͍ͬͯͨ • Proxy࡞Γ͍ͨ

Slide 10

Slide 10 text

ࡢࠓͷAPI Client։ൃ • APIΛୟ͍ͯදࣔ͢ΔCLIπʔϧΛ࡞Δ • ։ൃͯ͠ΔAPI͔ΒͲ͔ͬͷAPIΛݺͼ͍ͨ • SDKܦ༝ͰσʔλΛऔ͖͍ͬͯͨ • Proxy࡞Γ͍ͨ

Slide 11

Slide 11 text

௨ৗͷAPIϦΫΤετ

Slide 12

Slide 12 text

௨ৗͷϦΫΤετ

Slide 13

Slide 13 text

ಠࣗAPI Client

Slide 14

Slide 14 text

ಠࣗͷAPI ClientΛఆٛ͢Δ

Slide 15

Slide 15 text

ಠࣗͷAPI ClientΛఆٛ͢Δ API Clientͷߏ଄ମΛఆٛ͢Δ

Slide 16

Slide 16 text

ಠࣗͷAPI ClientΛఆٛ͢Δ ίϯετϥΫλΛॻ͘

Slide 17

Slide 17 text

ಠࣗͷAPI ClientΛఆٛ͢Δ ڞ௨ϝιουΛఆٛ͢Δ

Slide 18

Slide 18 text

ಠࣗͷAPI ClientΛఆٛ͢Δ Ϧιʔε͝ͱͷAPI ίʔϧΛఆٛ͢Δɻ ͜ͷล͸௨ৗͷrepository૚Ͱ΍ͬͯΔ͜ͱͱ
 ͦ͜·ͰมΘΒͳ͍ɻ

Slide 19

Slide 19 text

goroutine

Slide 20

Slide 20 text

goroutineͰͷฒߦcall • Goॻ͍ͯΔΜ͔ͩΒɺෳ਺ճAPIίʔϧ
 ͢Δ৔߹͸΋ͪΖΜgoroutine࢖͍͍ͨ

Slide 21

Slide 21 text

goroutineͰͷฒߦcall • Goॻ͍ͯΔΜ͔ͩΒɺෳ਺ճAPIίʔϧ
 ͢Δ৔߹͸΋ͪΖΜgoroutine࢖͍͍ͨ • ྫʣtimakin/ssm2env

Slide 22

Slide 22 text

goroutineͰͷฒߦcall • Goॻ͍ͯΔΜ͔ͩΒɺෳ਺ճAPIίʔϧ
 ͢Δ৔߹͸΋ͪΖΜgoroutine࢖͍͍ͨ • ྫʣtimakin/ssm2env • AWS (EC2 Parameter Store)ʹอଘ͞Ε͍ͯΔ
 ಛఆͷKeyʹͻ΋ͮ͘ValueΛऔ͖ͬͯͯɺ
 ݁ՌΛmapʹೖΕ͍ͨ

Slide 23

Slide 23 text

goroutineͰͷฒߦcall • Goॻ͍ͯΔΜ͔ͩΒɺෳ਺ճAPIίʔϧ
 ͢Δ৔߹͸΋ͪΖΜgoroutine࢖͍͍ͨ • ྫʣtimakin/ssm2env • AWS (EC2 Parameter Store)ʹอଘ͞Ε͍ͯΔ
 ಛఆͷKeyʹͻ΋ͮ͘ValueΛऔ͖ͬͯͯɺ
 ݁ՌΛmapʹೖΕ͍ͨ • Ͱ΋10ݸ͔ͣͭ͠औಘͰ͖ͳ͍


Slide 24

Slide 24 text

goroutineͰͷฒߦcall AWS ClientΛ࣋ͬͨߏ଄ମΛఆٛ͢Δ

Slide 25

Slide 25 text

goroutineͰͷฒߦcall AWS SSMʢύϥϝʔλετΞʣ͔Β
 औͬͯདྷͨValueΛmapʹͯ͠ฦ͢ϝιουΛఆٛɻ

Slide 26

Slide 26 text

goroutineͰͷฒߦcall x/sync/errgroupͰ
 ɾContextͷϋϯυϦϯά
 ɾϦΫΤετࣗମͷΤϥʔॲཧ
 ɾgoroutineʹΑΔฒߦϦΫΤετ
 Λ؅ཧ͢Δɻ

Slide 27

Slide 27 text

goroutineͰͷฒߦcall ɾ֤APIίʔϧͷ݁ՌΛ଴ͪड͚Δchannelʢࠓճ͸”c”ʣΛ༻ҙ͢Δ

Slide 28

Slide 28 text

goroutineͰͷฒߦcall ɾ֤APIίʔϧͷ݁ՌΛ଴ͪड͚Δchannelʢࠓճ͸”c”ʣΛ༻ҙ͢Δ ɾ10ݸͣͭʹ෼ׂͨ͠ϦΫΤετ༻ͷkeyҰཡΛ༻ҙ͢Δ
 ɹɾ͜͏͍͏෼ׂ΋channelܦ༝Ͱ݁ՌΛड͚औΔͱ
 ɹɹͦͷ··rangeʹ౉ͤͯศར

Slide 29

Slide 29 text

goroutineͰͷฒߦcall ɾ֤APIίʔϧͷ݁ՌΛ଴ͪड͚Δchannelʢࠓճ͸”c”ʣΛ༻ҙ͢Δ ɾ10ݸͣͭʹ෼ׂͨ͠ϦΫΤετ༻ͷkeyҰཡΛ༻ҙ͢Δ
 ɹɾ͜͏͍͏෼ׂ΋channelܦ༝Ͱ݁ՌΛड͚औΔͱ
 ɹɹͦͷ··rangeʹ౉ͤͯศར ɾeg.Go಺෦ͰฒߦॲཧΛߦ͏

Slide 30

Slide 30 text

goroutineͰͷฒߦcall ɾ੒ޭϨεϙϯεͳΒ݁ՌΛchannelʹҾ͖౉͢

Slide 31

Slide 31 text

goroutineͰͷฒߦcall ɾ੒ޭϨεϙϯεͳΒ݁ՌΛchannelʹҾ͖౉͢ ɾcontextͷλΠϜΞ΢τ௨஌Λड͚औͬͨΒͦͷ࣌఺Ͱऴྃ

Slide 32

Slide 32 text

goroutineͰͷฒߦcall ɾeg.Go͔ΒΤϥʔ͕ฦͬͯདྷͨΒclose͢Δ

Slide 33

Slide 33 text

goroutineͰͷฒߦcall ɾeg.Go͔ΒΤϥʔ͕ฦͬͯདྷͨΒclose͢Δ ɾchannelܦ༝Ͱؼͬͯདྷͨ݁ՌΛॱ࣍mapʹ٧ΊΔ

Slide 34

Slide 34 text

goroutineͰͷฒߦcall x/sync/errgroupͰ
 ɾContextͷϋϯυϦϯά
 ɾϦΫΤετࣗମͷΤϥʔॲཧ
 ɾgoroutineʹΑΔฒߦϦΫΤετ
 Λ؅ཧ͢Δɻ

Slide 35

Slide 35 text

Configuration

Slide 36

Slide 36 text

ϦΫΤετ༻ͷৄࡉͳConfig • http.ClientʹΧελϜͳઃఆΛ΋͍ͨͤͨ

Slide 37

Slide 37 text

ϦΫΤετ༻ͷৄࡉͳConfig • http.ClientʹΧελϜͳઃఆΛ΋͍ͨͤͨ • MaxIdleConnɺTimeoutͳͲ

Slide 38

Slide 38 text

ϦΫΤετ༻ͷৄࡉͳConfig • http.ClientʹΧελϜͳઃఆΛ΋͍ͨͤͨ • MaxIdleConnɺTimeoutͳͲ • ྫʣmercari/gaurun

Slide 39

Slide 39 text

ϦΫΤετ༻ͷৄࡉͳConfig ɾhttp.Transport(௨৴ॲཧΛ࣮ࡍʹߦ͏࣮૷Λ࣋ͬͨߏ଄ମ)ʹɺ ɹTimeout΍ConnͷઃఆΛ౉͢

Slide 40

Slide 40 text

ϦΫΤετ༻ͷৄࡉͳConfig ɾhttp.Transport(௨৴ॲཧΛ࣮ࡍʹߦ͏࣮૷Λ࣋ͬͨߏ଄ମ)ʹɺ ɹTimeout΍ConnͷઃఆΛ౉͢ ɾhttp.ClientͷϑΟʔϧυʹTransportΛ౉ͯ͠ΫϥΠΞϯτੜ੒

Slide 41

Slide 41 text

Proxy

Slide 42

Slide 42 text

Proxy • API ϦΫΤετͷࡍʹυϝΠϯॻ͖׵͍͑ͨ

Slide 43

Slide 43 text

Proxy • API ϦΫΤετͷࡍʹυϝΠϯॻ͖׵͍͑ͨ • ௨৴ΛΩϟογϡ͓͖͍ͯͨ͠

Slide 44

Slide 44 text

Proxy • API ϦΫΤετͷࡍʹυϝΠϯॻ͖׵͍͑ͨ • ௨৴ΛΩϟογϡ͓͖͍ͯͨ͠ • SSLɺHTTP2ͳͲΛΑ͠ͳʹ੾Γସ͍͑ͨ

Slide 45

Slide 45 text

Proxy • API ϦΫΤετͷࡍʹυϝΠϯॻ͖׵͍͑ͨ • ௨৴ΛΩϟογϡ͓͖͍ͯͨ͠ • SSLɺHTTP2ͳͲΛΑ͠ͳʹ੾Γସ͍͑ͨ • ྫʣkazeburo/chocon

Slide 46

Slide 46 text

Proxy

Slide 47

Slide 47 text

Proxy • GoͷHTTPϦΫΤετͷߏ੒ཁૉ • http.RoundTripper • HTTPͷτϥϯβΫγϣϯΛ࣮ߦ͠ɺreq/resΛॲཧ͢Δ ͨΊͷΠϯλʔϑΣʔε

Slide 48

Slide 48 text

Proxy • GoͷHTTPϦΫΤετͷߏ੒ཁૉ • http.RoundTripper • HTTPͷτϥϯβΫγϣϯΛ࣮ߦ͠ɺreq/resΛॲཧ͢Δ ͨΊͷΠϯλʔϑΣʔε • http.Transport • http.RoundTripper Λ࣮૷ͨ͠ߏ଄ମͰɺ௨৴ʹඞཁͳ ઃఆͱɺRoundTripϝιουͷ࣮૷Λ࣋ͭ

Slide 49

Slide 49 text

Proxy • GoͷHTTPϦΫΤετͷߏ੒ཁૉ • http.RoundTripper • HTTPͷτϥϯβΫγϣϯΛ࣮ߦ͠ɺreq/resΛॲཧ͢Δ ͨΊͷΠϯλʔϑΣʔε • http.Transport • http.RoundTripper Λ࣮૷ͨ͠ߏ଄ମͰɺ௨৴ʹඞཁͳ ઃఆͱɺRoundTripϝιουͷ࣮૷Λ࣋ͭ • http.Client • http.Transport Λ಺෦ʹ࣋ͬͨɺHTTPϓϩτίϧͰͷ௨ ৴Λ͓͜ͳ͏ͨΊͷૉͷΫϥΠΞϯτ࣮૷ • func (c *Client) Do(…) ͸தͰRoundTripΛݺΜͰ͍Δ

Slide 50

Slide 50 text

Proxy • kazeburo/chocon಺Ͱ͸…

Slide 51

Slide 51 text

Proxy ϦΫΤετ಺༰ͷॻ͖׵͑ɺRoundTripperΛ࣋ͬͨߏ଄ମ

Slide 52

Slide 52 text

Proxy ϦΫΤετ಺༰ͷॻ͖׵͑ʢHostͷஔ׵ɺBodyͷcopyʣ

Slide 53

Slide 53 text

Proxy ɾServeHTTPΛ࣮૷ ɾProxy͕ड͚औͬͨresponseΛɺAPIClient޲͚ʹcopyͯ͠
 ɹฦ٫ͯ͋͛͠Δ

Slide 54

Slide 54 text

Retry

Slide 55

Slide 55 text

Retry • ϦΫΤετʹࣦഊͯ͠΋ɺࢦఆճ਺·Ͱ͸
 ϦτϥΠ͍ͨ͠

Slide 56

Slide 56 text

Retry • ϦΫΤετʹࣦഊͯ͠΋ɺࢦఆճ਺·Ͱ͸
 ϦτϥΠ͍ͨ͠ • ྫʣaws-sdk-go

Slide 57

Slide 57 text

Retry • ϦΫΤετʹࣦഊͯ͠΋ɺࢦఆճ਺·Ͱ͸
 ϦτϥΠ͍ͨ͠ • ྫʣaws-sdk-go

Slide 58

Slide 58 text

AWS-SDK-Go • NinjaΈ͍ͨͳίʔυ͍ͬͺ͍͋Δ

Slide 59

Slide 59 text

AWS-SDK-Go ಠࣗRetryerΛఆٛ͢Δ

Slide 60

Slide 60 text

AWS-SDK-Go WithRetryerͰɺΧελϜϦτϥΠϠʔΛઃఆͯ͋͛͠Δɻ ʢcontextύοέʔδͷWithValueతͳʣ

Slide 61

Slide 61 text

AWS-SDK-Go Requestੜ੒࣌ʹ΋RetryerΛҾ͖౉͢

Slide 62

Slide 62 text

AWS-SDK-Go ϦτϥΠՄೳ͔Ͳ͏͔ΛνΣοΫͯ͠ɺtrueͳΒΧ΢ϯτ૿Ճ

Slide 63

Slide 63 text

AWS-SDK-Go νΣοΫޙɺϦτϥΠՄೳͳΒϦΫΤετ಺༰Λίϐʔ

Slide 64

Slide 64 text

୅ସखஈ • ಠࣗRetryerΛఆٛͤͣʹɺcenkalti/backoffͳͲͷ exponential backoff࣮૷Λ࢖͏ํ๏΋͋Γ

Slide 65

Slide 65 text

ྫʣgo-datadog-api

Slide 66

Slide 66 text

Paging

Slide 67

Slide 67 text

Paging • ϖʔδϯά༻ͷAPIΛ࡞ΔͷͰ͸ͳ͘ɺ
 ϖʔδϯάରԠͷAPIʹɺ೚ҙͷϖʔδ·Ͱ͸
 ϦΫΤετΛ౤͛ଓ͚͍ͨ • ྫʣEC2ύϥϝʔλʔετΞʹอଘ͞Εͨ
 ΩʔͷҰཡΛऔಘ͍ͨ͠ɻ͕ɺ
 10ݸ͔ͣͭ͠ฦͬͯ͜ͳ͍…

Slide 68

Slide 68 text

AWS-SDK-Go • ࠶Ninja

Slide 69

Slide 69 text

Paging request.Paginationʂʂʂʂ ϦΫΤετͷstructʹ߹Θͤͯɺϖʔδϯάॲཧͷ࣮૷Λ࣋ͭ

Slide 70

Slide 70 text

Paging ϖʔδϯάՄೳͳΒɺ࣍ͷϦΫΤετΛੜ੒͢Δ

Slide 71

Slide 71 text

Paging ϖʔδϯάՄೳͳΒɺ࣍ͷϦΫΤετΛੜ੒͢Δ Ҿ਺͕௕͗͢ΔͷͰݟ͑ͳ͍͕ɺ
 ίʔϧόοΫ͕ઃఆͯ͋ͬͯ͠ɺ
 ݁Ռͱʮ࠷ޙͷϖʔδ͔ʯ
 ͷϑϥάΛฦ͢

Slide 72

Slide 72 text

·ͱΊ

Slide 73

Slide 73 text

·ͱΊ • ੈͷதʹ͸৭ʑͳAPI Client͕͍Δ
 ΈΜͳҧͬͯΈΜͳ͍͍ • ඞཁͳΒΧελϜClientɺͳ͍͠ϦΫΤετ
 ؅ཧ༻ͷstructΛ࣮૷͢Δ • aws-sdk-go͸͕͢͞ʹ΍Γ͗͢ͳͷͰɺ
 ͪΐ͏Ͳ͍͍ϋϯυϥΛ࣮૷͠·͠ΐ͏

Slide 74

Slide 74 text

Thank you!