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

DESAMIS Go Training Season 1 Day 8

DESAMIS Go Training Season 1 Day 8

デザミス社内 Go 研修 (第1期) の8日目の資料です。
今回は AWS Lambda を Go で開発するためのハンズオンを行います。定期実行されるシンプルな構成のパート 1 と、API Gateway を組み合わせて REST API の土台を作るパート 2 に分けて習得していきます。

Yutaka Kato

June 08, 2021
Tweet

More Decks by Yutaka Kato

Other Decks in Technology

Transcript

  1. ݚमܭը ճ ೔࣍ ༧ఆ λΠτϧ ୈճ  Ր  (Pͷجຊ

    ୈճ  Ր  ؀ڥߏஙͱ(JU (JU)VCͷجຊ ୈճ  Ր  جຊߏจ ୈճ  Ր  ߏ଄ମɺεϥΠεɺϚοϓ ୈճ  Ր  ඪ४ϥΠϒϥϦ͸΍Ί͙Γ ୈճ  Ր  ϞδϡʔϧγεςϜͱ֎෦ϥΠϒϥϦ ୈճ  Ր  )FSPLV(Pೖ໳ ୈճ  Ր  "84-BNCEB(Pೖ໳ ୈճ  Ր  ฒߦॲཧϓϩάϥϛϯά ୈճ  Ր  ୯ମςετٕ๏ ୈճ  Ր  σʔλϕʔεΞΫηε ୈճ  Ր  'ZOFʹΑΔ(6*ΞϓϦέʔγϣϯ։ൃ ୈճ  Ր  ࣾ಺(PϓϩδΣΫτͷίʔυղઆ 
  2. "84-BNCEBͱ͸ w ೥ʹΠϕϯτۦಈͷؔ਺ ϓϩάϥϜ ࣮ߦج൫ͱͯ͠ొ৔ w /PEFKT 1ZUIPO +BWB (P

    3VCZ /&5 $ 1PXFS4IFMM ʹରԠɺ ΧελϜϥϯλΠϜͰͦΕҎ֎ͷ࣮ߦ؀ڥ΋ߏஙՄೳ w ϓϥοτϑΥʔϜͱͷ੹೚෼ք఺͕࠷΋ߴ͍ 
 ։ൃɾӡ༻ऀଆ͕੹೚Λ࣋ͨͳ͍ͱ͍͚ͳ͍ൣғ͕࠷খ  ϋʔυ΢ΣΞ ϋΠύʔόΠβʔ 04 ϥϯλΠϜϛυϧ΢ΣΞ ϑϨʔϜϫʔΫ ΞϓϦέʔγϣϯ ϋʔυ΢ΣΞ ϋΠύʔόΠβʔ 04 ϥϯλΠϜϛυϧ΢ΣΞ ϑϨʔϜϫʔΫ ΞϓϦέʔγϣϯ *BB4 $BB4 ϋʔυ΢ΣΞ ϋΠύʔόΠβʔ 04 ϥϯλΠϜϛυϧ΢ΣΞ ϑϨʔϜϫʔΫ ΞϓϦέʔγϣϯ 1BB4 ϋʔυ΢ΣΞ ϋΠύʔόΠβʔ 04 ϥϯλΠϜϛυϧ΢ΣΞ ϑϨʔϜϫʔΫ ΞϓϦέʔγϣϯ 'BB4 ϋʔυ΢ΣΞ ϋΠύʔόΠβʔ 04 ϥϯλΠϜϛυϧ΢ΣΞ ϑϨʔϜϫʔΫ ΞϓϦέʔγϣϯ 4BB4
  3. "84-BNCEBͱ͸ w ೥ʹΠϕϯτۦಈͷؔ਺ ϓϩάϥϜ ࣮ߦج൫ͱͯ͠ొ৔ w /PEFKT 1ZUIPO +BWB (P

    3VCZ /&5 $ 1PXFS4IFMM ʹରԠɺ ΧελϜϥϯλΠϜͰͦΕҎ֎ͷ࣮ߦ؀ڥ΋ߏஙՄೳ w ϓϥοτϑΥʔϜͱͷ੹೚෼ք఺͕࠷΋ߴ͍ 
 ։ൃɾӡ༻ऀଆ͕੹೚Λ࣋ͨͳ͍ͱ͍͚ͳ͍ൣғ͕࠷খ  ϋʔυ΢ΣΞ ϋΠύʔόΠβʔ 04 ϥϯλΠϜϛυϧ΢ΣΞ ϑϨʔϜϫʔΫ ΞϓϦέʔγϣϯ ϋʔυ΢ΣΞ ϋΠύʔόΠβʔ 04 ϥϯλΠϜϛυϧ΢ΣΞ ϑϨʔϜϫʔΫ ΞϓϦέʔγϣϯ *BB4 $BB4 ϋʔυ΢ΣΞ ϋΠύʔόΠβʔ 04 ϥϯλΠϜϛυϧ΢ΣΞ ϑϨʔϜϫʔΫ ΞϓϦέʔγϣϯ 1BB4 ϋʔυ΢ΣΞ ϋΠύʔόΠβʔ 04 ϥϯλΠϜϛυϧ΢ΣΞ ϑϨʔϜϫʔΫ ΞϓϦέʔγϣϯ 'BB4 ϋʔυ΢ΣΞ ϋΠύʔόΠβʔ 04 ϥϯλΠϜϛυϧ΢ΣΞ ϑϨʔϜϫʔΫ ΞϓϦέʔγϣϯ 4BB4
  4. -BNCEBʹ͓͚Δ(P w "84͕ఏڙ͢ΔϥΠϒϥϦΛ༻͍ͯ։ൃ͢Δ w ༷ʑͳϋϯυϥؔ਺ͷܗࣜΛબ୒Մೳ w Y-JOVY޲͚ʹΫϩείϯύΠϧ࣮ͨ͠ߦόΠφϦΛϏϧυ͠ɺͦ ΕΛΠϝʔδԽͯ͠഑උ͢Δඞཁ͕͋Δ  package

    mai n import "github.com/aws/aws-lambda-go/lambda " func handler() (string, error) { return "͜Μʹͪ͸ʂ", ni l } func main() { lambda.Start(handler ) }
  5. ϋϯυϥؔ਺γάχνϟ • func ( ) • func () erro r

    • func (TIn), erro r • func () (TOut, error ) • func (context.Context) erro r • func (context.Context, TIn) erro r • func (context.Context) (TOut, error ) • func (context.Context, TIn) (TOut, error) TIn , TOut は 標準 ラ イ ブ ラ リ で J S O N 
 エ ン コ ー ド ・デ コ ー ド 可能 な 任意 の 型 を 選択可能 ͖ͬ͞ͷίʔυྫ͸͜Ε ΤϥʔΛฦ͢ͱσϑΥϧτͰճ·ͰϦτϥΠͯ͘͠ΕΔ
  6. -BNCEBͷ࢓૊Έ  ιʔείʔυ 
 εΫϦϓτ 'JSFDSBDLFS.JDSP7. $POUSPM1MBOF "1*(BUFXBZ [JQ ࣮ߦόΠφϦ

    
 ίϯύΠϧࡁ 03 λ 'VODUJPO &# $8& 4/4 424 4 
 *P5$PSF 
 %ZOBNP%# ʜ FUD σϓϩΠ σϓϩΠ τϦΨʔ %BUB1MBOF ׂΓ౰ͯ 
 ࣮ߦ -BZFST
  7. ؔ਺ͷݺ͹Εํ w ৽͍͠.JDSP7.ʹؔ਺ׂ͕Γ౰ͯΒΕΔͱɺmain()΍init() ͋Ε͹  ͕ݺ͹Ε͔ͯΒϋϯυϥؔ਺͕ݺ͹ΕΔ ίʔϧυελʔτ  w Ұఆ࣌ؒ಺ͷ܁Γฦ͠ͷݺͼग़͠Ͱ͸Πϯελϯε͕࠶ར༻͞ΕΔ

    w ͭͷΠϯελϯε্ͷϋϯυϥؔ਺͕ಉ࣌ʹฒߦͯ͠ݺ͹ΕΔ͜ͱ͸ͳ͍  package mai n import "github.com/aws/aws-lambda-go/lambda " func handler() (string, error) { return "͜Μʹͪ͸ʂ", ni l } func main() { lambda.Start(handler ) } Πϕϯτൃੜͷ౓ʹݺ͹ΕΔ ίʔϧυελʔτ࣌ͷΈݺ͹ΕΔ
  8. ྉۚମܥ  ৄࡉ͸IUUQTBXTBNB[PODPNKQMBNCEBQSJDJOH ϦΫΤετ՝ۚ ࣮ߦ࣌ؒ՝ۚ ถࠃɾ౦ژϦʔδϣϯ 
   ճ

    େࡕϦʔδϣϯ 
   ճ ถࠃɾ౦ژϦʔδϣϯ 
 (#ඵ େࡕϦʔδϣϯ 
 (#ඵ ׂΓ౰ͯ.#࣮ߦඵͷؔ਺Λສճ࣮ߦͨ͠Βʜ ถࠃɾ౦ژϦʔδϣϯେࡕϦʔδϣϯ "84ΞΧ΢ϯτ಺ͷແྉ࿮ຖ݄  ϦΫΤετɺ  (#ඵ
  9. ։ൃπʔϧ w -BNCEBͷ։ൃɺςετɺσϓϩΠʹ͸ "84ίϯιʔ ϧΛૢ࡞͢ΔͷͰ͸ͳ͘ πʔϧΛ࢖ͬͯߦ͏ͷ͕ޮ཰తɺ ༷ʑͳબ୒ࢶ͕͋Δ  πʔϧ ։ൃݩ

    ֓ཁ 4FSWFSMFTT"QQMJDBUJPO.PEFM "84 "84ެࣜͷ-BNCEB։ൃπʔϧ 4FSWFSMFTT'SBNFXPSL 4FSWFSMFTT *OD ࠷΋ਓؾͷαʔόʔϨε։ൃπʔϧ $MPVE%FWFMPQNFOU,JU "84 ༷ʑͳݴޠͰهड़Մೳͳ*B$πʔϧ ϚϧνΫϥ΢υ*B$πʔϧ ֤ࣾ 5FSSBGPSN 1VMVNJͳͲ $IBMJDF "84 1ZUIPO-BNCEBઐ༻
  10. ։ൃπʔϧ w -BNCEBͷ։ൃɺςετɺσϓϩΠʹ͸ "84ίϯιʔ ϧΛૢ࡞͢ΔͷͰ͸ͳ͘ πʔϧΛ࢖ͬͯߦ͏ͷ͕ޮ཰తɺ ༷ʑͳબ୒ࢶ͕͋Δ  πʔϧ ։ൃݩ

    ֓ཁ 4FSWFSMFTT"QQMJDBUJPO.PEFM "84 "84ެࣜͷ-BNCEB։ൃπʔϧ 4FSWFSMFTT'SBNFXPSL 4FSWFSMFTT *OD ࠷΋ਓؾͷαʔόʔϨε։ൃπʔϧ $MPVE%FWFMPQNFOU,JU "84 ༷ʑͳݴޠͰهड़Մೳͳ*B$πʔϧ ϚϧνΫϥ΢υ*B$πʔϧ ֤ࣾ 5FSSBGPSN 1VMVNJͳͲ $IBMJDF "84 1ZUIPO-BNCEBઐ༻ 今回 は こ れ で
  11. 45&1ؔ਺ͷ࣮૷   74$PEFΛىಈ͠ݚमϦϙδτϦΛ։͖·͢  Ϣʔβʔ໊ϑΥϧμҎԼʹʮEBZMBNCEBʯϑΥϧμΛ࡞੒͠ɺ ͦͷதʹҎԼͷ಺༰ͰʮIBOEMFSHPʯΛ࡞੒͠·͢ package mai n

    import "github.com/aws/aws-lambda-go/lambda " func handler() (string, error) { return "͜Μʹͪ͸ʂ", ni l } func main() { lambda.Start(handler ) } ೖྗΛऴ͑ͨΒIBOEMFSHPΛӈΫϦοΫͯ͠౷߹λʔϛφϧΛ։͖ɺ 
 ʮgo mod tidyʯʻ&OUFSʼΛೖྗ͠·͢
  12. 45&14".ςϯϓϨʔτ  IBOEMFSHPͱಉ͡σΟϨΫΠτϦʹҎԼͷ಺༰ͰʮUFNQMBUFZNMʯ Λ࡞੒͍ͯͩ͘͠͞ Ϣʔβʔ໊ͷͱ͜Ζ͸ม͍͑ͯͩ͘͞ AWSTemplateFormatVersion: '2010-09-09 ' Transform: AWS::Serverless-2016-10-3

    1 Resources : GoTraining<Ϣʔβʔ໊>1 : Type: AWS::Serverless::Functio n Properties : FunctionName: go-training-<Ϣʔβʔ໊>- 1 CodeUri: . Handler: handle r Runtime: go1. x MemorySize: 128 # M B Timeout: 5 # Se c Events : Timer : Type: Schedul e Properties : Schedule: rate(1 minute)
  13. 45&1ΞΫηεΩʔͷઃఆ   "84ϚωδϝϯτίϯιʔϧʹϩάΠϯ͠ɺΞΫηεΩʔΛൃߦ͠·͢  ը໘ӈ্ͷ<Ϣʔβʔ໊!ΞΧ΢ϯτ໊˝>ͷϝχϡʔ͔Β<ϚΠηΩϡϦ ςΟࢿ֨৘ใ>Λબ୒  <ΞΫηεΩʔͷ࡞੒>ϘλϯΛΫϦοΫɺʮΞΫηεΩʔ*%ʯͱʮγʔΫϨοτΞ ΫηεΩʔʯͷ಺༰Λه࿥

    w 5*14MBDLͷࣗ෼Ѽͷ%.ʹॻ͖ࠐΜͰ͓͘ͳͲ͓ͯ͘͠ͱศར  ౷߹λʔϛφϧͰʮaws configureʯʻ&OUFSʼΛ࣮ߦ͠ɺҎԼͷ಺༰Λೖྗ͠·͢ "84"DDFTTLFZ*% ઌఔൃߦ͞ΕͨΞΫηεΩʔ*% "844FDSFU"DDFTT,FZ ઌఔൃߦ͞ΕͨγʔΫϨοτΞΫηεΩʔ %FGBVMUSFHJPOOBNF BQOPSUIFBTU %FGBVMUPVUQVUGPSNBU Կ΋ೖྗͤͣ&OUFS ۀ຿Ͱ࣮ࢪࡁͷํ͸εΩοϓՄ
  14. 45&1σϓϩΠ  @echo of f set GOOS=linu x set GOARCH=amd6

    4 go build -o handler handler.g o if %errorlevel% neq 0 exit / b sam deploy --stack-name go-training-<Ϣʔβʔ໊>-1 ^ --s3-bucket go-training-1 --capabilities CAPABILITY_IAM  IBOEMFSHPͱಉ͡σΟϨΫτϦʹʮHJUJHOPSFʯΛ࡞੒͠ɺதʹ ʮIBOEMFSʯͱॻ͍ͯอଘ͠·͢  IBOEMFSHPͱಉ͡σΟϨΫΠτϦʹҎԼͷ಺༰ͰʮEFQMPZCBUʯΛ࡞ ੒͠·͢ Ϣʔβʔ໊ͷͱ͜Ζ͸ม͍͑ͯͩ͘͞   ౷߹λʔϛφϧͰʮ.\deploy.batʯʻ&OUFSʼΛ࣮ߦ͠·͢
  15. 45&1֬ೝ   "84ϚωδϝϯτίϯιʔϧͰ-BNCEBΛ։͖ɺࣗ෼ͷؔ਺ 
 HPUSBJOJOHϢʔβʔ໊ Λ୳͠·͢ w ؔ਺ҰཡΛҰ൪ӈͷ<࠷ऴߋ৽>Ͱฒͼସ͑Δͱݟ͚ͭ΍͍͢Ͱ͢ 

    <ςετ>λϒΛ։͖ɺ<ςετ>ϘλϯΛԡͯ݁͠ՌΛ֬ೝ͠·͢ ಺༰͸ద౰   <ϞχλϦϯά>λϒΛ։͖ɺ<$MPVE8BUDIͷϩάΛදࣔ>Ϙλϯ͔ΒϩάΛ֬ೝ ͠·͢
  16. 45&1ؔ਺ͷ࣮૷   Ϣʔβʔ໊ϑΥϧμҎԼʹʮEBZMBNCEBʯϑΥϧμΛ࡞ ੒͠ɺͦͷதʹҎԼͷ಺༰ͰʮIBOEMFSHPʯΛ࡞੒͠·͢ package mai n // import

    ͸লུ func handler(r events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { return events.APIGatewayProxyResponse { StatusCode: http.StatusOK , Body: "͜Μʹͪ͸ʂ\nϦΫΤετͨ͠Ϧιʔε: " + r.Resource , }, ni l } func main() { lambda.Start(handler ) }
  17. 45&14".ςϯϓϨʔτ  IBOEMFSHPͱಉ͡σΟϨΫΠτϦʹҎԼͷ಺༰ͰʮUFNQMBUFZNMʯ Λ࡞੒͠·͢ Ϣʔβʔ໊ͷͱ͜Ζ͸ม͍͑ͯͩ͘͞ AWSTemplateFormatVersion: '2010-09-09 ' Transform: AWS::Serverless-2016-10-3

    1 Resources : GoTraining<Ϣʔβʔ໊>2 : Type: AWS::Serverless::Functio n Properties : FunctionName: go-training-<Ϣʔβʔ໊>- 2 CodeUri: . Handler: handle r Runtime: go1. x MemorySize: 12 8 Timeout: 5 Events : Root : Type: Ap i Properties : Path: / Method: GET 1 が2 に な って いる 点 に 注意 1 が2 に な って いる 点 に 注意
  18. 45&1σϓϩΠ  @echo of f set GOOS=linu x set GOARCH=amd6

    4 go build -o handler handler.g o if %errorlevel% neq 0 exit / b sam deploy --stack-name go-training-<Ϣʔβʔ໊>-2 ^ --s3-bucket go-training-1 --capabilities CAPABILITY_IAM  IBOEMFSHPͱಉ͡σΟϨΫτϦʹʮHJUJHOPSFʯΛ࡞੒͠ɺதʹ ʮIBOEMFSʯͱॻ͍ͯอଘ͠·͢  IBOEMFSHPͱಉ͡σΟϨΫΠτϦʹҎԼͷ಺༰ͰʮEFQMPZCBUʯΛ࡞ ੒͠·͢ Ϣʔβʔ໊ͷͱ͜Ζ͸ม͍͑ͯͩ͘͞   EBZMBNCEBͷσΟϨΫτϦͷ౷߹λʔϛφϧΛ։͖ ʮ.\deploy.batʯʻ&OUFSʼΛ࣮ߦ͠·͢ 1 が2 に な って いる 点 に 注意
  19. 4".XJUI%PDLFS w %PDLFSΛೖΕ͓ͯ͘ͱɺ࣍ͷͭͷ͜ͱ͕Ͱ͖ΔΑ͏ʹͳΔ • sam local invok e w ϩʔΧϧͰ-BNCEB؀ڥΛ࠶ݱ࣮ͨ͠ߦ͕Մೳʹ

    w ֤छτϦΨʔͷΠϕϯτΛ+40/Ͱڙڅ͠ςετ΋Մೳ • sam build --use-container w -JOVYωΠςΟϒͳґଘؔ܎͕͋Δ৔߹΍ɺϏϧυ؀ڥ Λ%PDLFSʹִ཭͍ͨ͠৔߹ʹศར 
  20. ֎෦͔Βͷ؀ڥม਺ͷ஫ೖ w 1BSBNFUFS0WFSSJEFT w ςϯϓϨʔτͷ1BSBNFUFSTϒϩοΫͰఆٛ͠ʮ&/7@7"33FG 1BSBNʯͷΑ͏ʹࢀর͢Δͱɺlocal invoke΍deploy࣌ʹ ʮ--parameter-overrides ‘Param=foo'ʯͰ஋ΛڙڅͰ͖Δ w

    +40/ϑΝΠϧ w local invoke࣌ʹ؀ڥม਺Λྻڍͨ͠+40/ϑΝΠϧ ྫ {“GoTrainingMikan1":{"ENV_VAR":"foo"}} Λʮ--env- varsʯͰ౉͢͜ͱͰఆٛࡁͷ؀ڥม਺Λ্ॻ͖Ͱ͖Δ 
  21. $MFBOVQ w ຊݚमͰ࡞੒ͨ͠"84Ϧιʔε͸$MPVE'PSNBUJPOελοΫʹͳ͍ͬͯΔͷͰɺ"84Ϛ ωδϝϯτίϯιʔϧͰ$MPVE'PSNBUJPOΛ։͖ελοΫΛ࡟আ͢Ε͹-BNCEB΍"1* (BUFXBZͳͲ͸ҰׅͰ࡟আՄೳ w "84$-* 
 aws cloudformation

    delete-stack --stack-nameɹgo-training-Ϣʔβʔ ໊-਺ࣈ w ͨͩ͠-BNCEBͷ࣮ߦϩά͸$MPVE8BUDI-PHT্ʹ࢒ΔͷͰɺ͜Ε΋ফ͍ͨ͠৔߹͸ಉ ͘͡खಈͰ࡟আ͕ඞཁ w "84$-* 
 aws logs delete-log-group --log-group-name /aws/lambda/go- training-Ϣʔβʔ໊-਺ࣈ 
  22. ࿅श՝୊ w ࿅श՝୊<ϑΥϧμ໊EBZMBNCEB> w ৽͍͠"1*ϦιʔεΛ௥Ճ͍ͯͩ͘͠͞ ໊લɾ಺༰͸ࣗ༝  w ࿅श՝୊<ϑΥϧμ໊EBZMBNCEB> w

    ԼਤΛࢀߟʹ"1*ʹ"1*ΩʔೝূΛ௥Ճɾςετ͍ͯͩ͘͠͞  > curl https://...
 {"message":"Forbidden"}
 > curl -H “x-api-key: ...” https://.. . ͜Μʹͪ͸ʂ ϦΫΤετͨ͠Ϧιʔε: / .. . Method: GE T RestApiId : Ref: GoTrainingMikanAp i GoTraining<Ϣʔβʔ໊>Api : Type: AWS::Serverless::Ap i Properties : StageName: Pro d Auth : ApiKeyRequired: tru e UsagePlan : CreateUsagePlan: PER_API
  23. ίʔυΛॻ͖ऴ͑ͨΒ w ʮϢʔβʔ໊QSBDUJDFʯϒϥϯνͰ࡞ۀ͍ͯ͠Δ͜ͱΛ֬ೝ͍ͯͩ͘͠͞ w 74$PEFͷҰ൪ࠨԼʹදࣔ͞Ε͍ͯ·͢ w มߋΛεςʔδ͠ɺίϛοτ͍ͯͩ͘͠͞ w 74$PEFͷࠨϝχϡʔͷʮιʔε؅ཧʯ͔Βૢ࡞ w

    ίʔυΛ(JU)VCʹϓογϡ͍ͯͩ͘͠͞ w 74$PEFͷҰ൪ࠨԼͷϒϥϯν໊ͷ͙͢ӈʹ͋ΔΞΠίϯ͔Βૢ࡞ ্ਤ  w ϓϧϦΫΤετΛ࡞੒͍ͯͩ͘͠͞ w ʮιʔε؅ཧʯͷ্෦ʹΞΠίϯ͕͋Γ·͢