Save 37% off PRO during our Black Friday Sale! »

とあるサービスにおける、とあるAPIの、 サーバーレス化を目指した検証のアレコレ

とあるサービスにおける、とあるAPIの、 サーバーレス化を目指した検証のアレコレ

JAWS-UG青森支部 [第5回] (https://jaws-tohoku.doorkeeper.jp/events/45162) でAPI Gateway, AWS Lambda(Apex), Elasticsearch Serviceについて話しました

107ba69ff7888cacdb4307a28adf5527?s=128

Retu Fukui

June 25, 2016
Tweet

Transcript

  1. ͱ͋ΔαʔϏεʹ͓͚Δɺ ͱ͋ΔAPIͷɺ αʔόʔϨεԽΛ໨ࢦͨ͠ ݕূͷΞϨίϨ JAWS-UG੨৿ࢧ෦ [ୈ5ճ] 2016/06/25

  2. ࣗݾ঺հ ෱Ҫ ྽ (Takeshi Fukui) Engineer @ Piece of Cake,

    inc. https://github.com/fukuiretu https://twitter.com/fukuiretu https://www.facebook.com/fukuiretu http://fukuiretu.com/ since 2015. 3 ~
  3. ࣗݾ঺հ https://cakes.mu/ https://note.mu/

  4. ࣗݾ঺հ ͜ͷํʑ΋noter

  5. ࣗݾ঺հ http://www.pref.aomori.lg.jp/sangyo/shoko/aomori_IT_life.html

  6. ࠓ೔࿩͢͜ͱ • αʔόʔϨεͱ͸ • ݕূͷ಺༰ • ΤίγεςϜ • ֤छαʔϏεͷઃఆͱͭͳ͗ࠐΈ •

    ϋϚͬͨͱ͜Ζ • ࠓޙͷ՝୊
  7. ಋೖࣄྫΛظ଴͍ͯͨ͠ํΰϝϯφαΠ ·ͩݕূஈ֊Ͱಋೖʹ͸͍͓ͨͬͯΓ·ͤΜ

  8. ࠷ۙΑࣖ͘ʹ͢Δ αʔόʔϨεͬͯ??

  9. GoogleτϨϯυ 2014೥தࠒ͔ΒҰൠతʹͳ͖ͬͯͨ܏޲

  10. Q. αʔόͳ͠Ͱ ӡ༻͔Βͳʹ͔Β શͯΛؙ౤͛Ͱ͖Δ ͦΜͳ͓͍͍͠࿩͕ ͋ΔΜͰ͔͢ʁ

  11. A. ࢒೦ͳ͕Β ͦΜͳ͓͍͍͠࿩Ͱ͸ͳ͍ શͯͰ͸ͳ͍͕ ͋Δఔ౓͸ ౤͛Δ͜ͱ͕Ͱ͖Δ

  12. ҰݴͰ͍͏ͱ…

  13. αʔόΛࣗલͰ༻ҙͤͣ ϚωʔδυαʔϏεʹཔΔ ΞʔΩςΫνϟ

  14. αʔόʔϨεΑΓ΋ αʔϏεϑϧ ͷ΄͏͕ͬ͘͠Γ͘Δ ※ड͚ചΓͰ͢ Track 2 GCP.AWSͱ͍ΘΏΔSeverlessɺ΄͔Habitatͷ࿩ https://soundcloud.com/cloudinfra_podcast_ja/track002

  15. ݩωλ http://www.slideshare.net/jedi4ever/from-serverless-to-service-full-how-the-role-of-devops-is-evolving

  16. ͱ͋ΔαʔϏε noteʹ͓͚Δɺ ͱ͋Δ ϋογϡλά, ϢʔβݕࡧAPIͷ αʔόʔϨεԽΛ໨ࢦͨ͠ ݕূͷΞϨίϨ

  17. αʔόʔϨε ಋೖͯ͠Έ͍ͨΜ͚ͩͲ ஔ͖׵͑ΒΕͦ͏ͳػೳ ͳ͍͔ͳ…

  18. ݟ͚ͭͨ!!

  19. ݕ౼ϙΠϯτ Ωʔϫʔυ͔ΒϋογϡλάͱϢʔβ໊ΛαδΣετ

  20. ݱࡏͷαʔόߏ੒ EC2(ΞϓϦέʔγϣϯ) ELB EC2(Elasticsearch) PC

  21. ݕ౼ϙΠϯτͱͨ͠ϫέ • ϚωʔδυαʔϏε΁ͷ੾Γସ͑ • ਓతϦιʔεͷίετμ΢ϯ • ΞϓϦέʔγϣϯαʔό͔Βͷಠཱ • ෛՙͷܰݮ •

    Մ༻ੑ • อकੑ (Մಡੑ, ϘτϧωοΫ΍ো֐ͷ੾Γ෼͚) • (͋ΘΑ͘͹) αʔόඅͷίετμ΢ϯ
  22. Lambda ͱ API Gateway ͱ Elasticsearch Service ͷػӡΛಘͨ!!

  23. AWS Lambda ͱ͸ • ԿΒ͔ͷΠϕϯτΛτϦΨʔʹॲཧΛ࣮ߦͰ͖Δ • S3ͷಛఆόέοτ΁ͷϑΝΠϧΞοϓϩʔυ • KinesisͷετϦʔϜ΁ͷσʔλૠೖ •

    DynamoDBͷςʔϒϧߋ৽ • εέδϡʔϥʔ • Πϯϑϥͷ؅ཧ͕ෆཁ • ΦʔτεέʔϦϯά • ࡉ͔͍ྉۚମܥ
  24. AWS Lambda ͱ͸ http://www.slideshare.net/youyo_/jawsdays2016-aws-lambda-59462755

  25. ͜ͷ͓ํ(ੴᖒ͞Μ)ʹฉ͚͹ Lambdaͷશ͕ͯΘ͔Δ͸ͣ!! …ͱ͓΋͍·͢

  26. Amazon API Gatewayͱ͸ • RESTFulͳAPIͷΤϯυϙΠϯτͷఏڙ͕Ͱ͖Δ • AWSͷ֤छαʔϏε • طଘͷΞϓϦέʔγϣϯ •

    ηΩϡϦςΟ(ೝূ) • IAM • Cognito • Custom Authorizer • Πϯϑϥͷ؅ཧ͕ෆཁ • ΦʔτεέʔϦϯά
  27. Amazon Elasticsearch Serviceͱ͸ • ElasticsearchͷϚωʔδυαʔϏε • Elasticsearchͱ͸Elastic͔ࣾΒఏڙ͞Ε͍ͯΔݕࡧΤϯδϯ • Luceneͱ͍͏શจݕࡧΤϯδϯΛόοΫΤϯυʹ࣋ͭ •

    RESTFulͳAPIͰσʔλͷૢ࡞͕Մೳ • σϓϩΠ͕؆୯ • Πϯετʔϧ࡞ۀͳͲ͕ෆཁ • ؅ཧ͕؆୯ • ো֐ݕग़ • ϊʔυͷަ׵ • σʔλόοΫΞοϓ
  28. αʔόʔϨεͳߏ੒ API Gateway PC Lambda Elasticsearch Service

  29. ͱ͸͍͑ɺ ͲΕ΋৮ͬͨ͜ͱͳ͔ͬͨͷͰ…

  30. श͏ΑΓ׳ΕΖͱ͍͏͜ͱͰ…

  31. Lambdaͱ API Gatewayͱ Elasticsearch Service ΛབྷΊͨ ؆୯ͳWebΞϓϦΛ࡞ͬͯ ཧղΛਂΊΔ͜ͱʹͨ͠

  32. ·ͣ͸ͬ͟ͱλεΫͷચ͍ग़͠

  33. None
  34. ઌਓͷ஌ܙ͸ ଘ෼ʹ࢖Θͳ͍ͱଛͰ͢ΑͶ??

  35. None
  36. Lambda, API GatewayपΓͷΤίγεςϜ • Serverless (http://serverless.com/) • Apex (http://apex.run/) •

    Zappa (https://zappa.gun.io/) • Fluct (https://github.com/fluct/fluct) • Lamvery (https://github.com/marcy-terui/lamvery)
  37. Lambda, API GatewayपΓͷΤίγεςϜ • Serverless (http://serverless.com/) • Apex (http://apex.run/) •

    Zappa (https://zappa.gun.io/) • Fluct (https://github.com/fluct/fluct) • Lamvery (https://github.com/marcy-terui/lamvery)
  38. Serverless • LambdaΛ؆୯ʹϓϩάϥϛϯά͢ΔͨΊͷ࿮૊Έ (ϑϨʔϜϫʔΫ)Λఏڙ • LambdaͱAPI GatewayΛσϓϩΠ͢ΔͨΊͷίϚϯυ Λఏڙ • ϩʔΧϧͰLambdaΛಈ͔͢࢓૊ΈΛఏڙ

    • αϙʔτ͍ͯ͠Δݴޠ͸ɺNode.js, Python, Java
  39. Apex • LambdaΛ؆୯ʹϓϩάϥϛϯά͢ΔͨΊͷ࿮૊Έ (ϑϨʔϜϫʔΫ)Λఏڙ • LambdaͱAPI GatewayΛσϓϩΠ͢ΔͨΊͷίϚϯυ Λఏڙ • αϙʔτ͍ͯ͠Δݴޠ͸ɺNode.js,

    Python, Java, Go
  40. Apex • LambdaΛ؆୯ʹϓϩάϥϛϯά͢ΔͨΊͷ࿮૊Έ (ϑϨʔϜϫʔΫ)Λఏڙ • LambdaͱAPI GatewayΛσϓϩΠ͢ΔͨΊͷίϚϯυ Λఏڙ • αϙʔτ͍ͯ͠Δݴޠ͸ɺNode.js,

    Python, Java, Go
  41. GoΛαϙʔτͯ͠Δ?????

  42. LambdaެࣜυΩϡϝϯτ ެࣜʹ͸Node.js, Java, PythonΛαϙʔτ

  43. GoͰॻ͍ͯΈ͔ͨͬͨͷͰ Apex࢖ͬͯਐΊΔ͜ͱʹͨ͠ ஫: ࢲͷGoྗ͸ɺA Tour of Goͱ͍͏νϡʔτϦΞϧΛૡ͍ఠΜͩϨϕϧͰ͢

  44. Goͱ͸ • ಛ௃ • ੩తܕ෇͚ • ฒߦॲཧ͕खܰʹॻ͚Δ • ΫϩείϯύΠϧ͕؆୯Ͱ1ͭͷόΠφϦϑΝΠ ϧͰಈ࡞͢Δ

    • ඪ४Ͱॆ࣮ͨ͠πʔϧ܈ • ϚείοτΩϟϥͷGopher͘Μ͕͖΋͔Θ͍͍ https://golang.org/ GoogleʹΑͬͯ։ൃ͞Εͨϓϩάϥϛϯάݴޠ
  45. LambdaͰ ެࣜαϙʔτ͍ͯ͠ͳͯ͘΋ GoΛಈ͔ͤΔͷ͸ ؀ڥʹԠͯ͡ όΠφϦϑΝΠϧ1ͭͰ ಈ࡞͢Δ͔Β

  46. ApexͷGoαϙʔτͷ࣮ଶ͸ Node.js͔Β Go(ίϚϯυ)Λ࣮ߦ͠ ඪ४ೖग़ྗͰ΍ΓͱΓ

  47. Go on ApexͰHello World

  48. ApexͰHello World 1. Πϯετʔϧ DVSMIUUQTSBXHJUIVCVTFSDPOUFOUDPNBQFYBQFYNBTUFSJOTUBMMTIcTI

  49. ApexͰHello World 2. ϓϩδΣΫτͷ࡞੒ NLEJSBQFYTBNQMF DEBQFYTBNQMF BQFYJOJU &OUFSUIFOBNFPGZPVSQSPKFDU*UTIPVMECFNBDIJOFGSJFOEMZ BTUIJT JTVTFEUPQSFpYZPVSGVODUJPOTJO-BNCEB

     1SPKFDUOBNFBQFYTBNQMF  &OUFSBOPQUJPOBMEFTDSJQUJPOPGZPVSQSPKFDU  1SPKFDUEFTDSJQUJPOBQFYTBNQMF ※ࣄલʹIAMͷ४උ͕ඞཁ
  50. ApexͰHello World σΟϨΫτϦߏ੒ USFF  ᵓᴷᴷGVODUJPOT ᴹᵓᴷᴷIFMMP ᴹᴹᵓᴷᴷGVODUJPOKTPO ᴹᴹᵋᴷᴷJOEFYKT ᵋᴷᴷQSPKFDUKTPO

  51. ApexͰHello World { "description": “hello world function", "runtime": "golang" }

    3. function.jsonΛमਖ਼
  52. ApexͰHello World package main import ( "encoding/json" "github.com/apex/go-apex" ) type

    message struct { Hello string `json:"hello"` } func main() { apex.HandleFunc(func(event json.RawMessage, ctx *apex.Context) (interface{}, error) { var m message if err := json.Unmarshal(event, &m); err != nil { return nil, err } return m, nil }) } 4. main.goΛ༻ҙ
  53. ApexͰHello World { "hello": "world" } 5. event.jsonΛ༻ҙ

  54. ApexͰHello World σΟϨΫτϦߏ੒ USFF  ᵓᴷᴷGVODUJPOT ᴹᵓᴷᴷIFMMP ᴹᴹᵓᴷᴷFWFOUKTPO ᴹᴹᵓᴷᴷGVODUJPOKTPO ᴹᴹᵋᴷᴷNBJOHP

    ᵋᴷᴷQSPKFDUKTPO
  55. ApexͰHello World 6. Lambda΁σϓϩΠ BQFYEFQMPZIFMMP

  56. ApexͰHello World 7. ϑΝϯΫγϣϯΛ࣮ߦ͢Δ BQFYJOWPLFIFMMPFWFOUKTPO \IFMMPXPSME^

  57. ࡞ͬͨWebΞϓϦͷ঺հ

  58. WebΞϓϦ (࢓༷) • Ωʔϫʔυؚ͕·ΕΔσʔλΛAPI Gateway → Lambda → Elasticseach ServiceΛհͯ͠औ͖ͬͯͨ΋ͷΛදࣔ

    • αϯϓϧσʔλ͸໿20ສ݅ • είΞͷܭࢉ͸͍ͯ͠ͳ͍
  59. WebΞϓϦ (APIͷϨεϙϯε) { "result": [ { "access_count": "1064", "address": "ळాࢢେொ5-4-16ΞδϚοΫεϏϧ1ʙ2F",

    "category": "110", "closed": "0", "description": "", "location": "", "menu_count": "0", "name": "ळాॳେτϩ1؏130ԁͷళ͋ͬͺΕण࢘", "name_alphabet": "", "name_kana": "͖͋ͨ͸͓͓ͭͱΖ͍͔ͬΜͻΌ͘͞Μ͡Ύ͏͑ΜͷΈͤ͋ͬͺΕͣ͠", "photo_count": "0", "purpose": "", "restaurant_id": "371693" }, ɾ ɹɹɾ ɾ } ] }
  60. WebΞϓϦ (αϯϓϧσʔλ) https://github.com/livedoor/datasets

  61. WebΞϓϦ (αϯϓϧσʔλ౤ೖ) func main() { fp, err := os.Open("fixtures/restaurants.csv") if

    err != nil { panic(err) } defer fp.Close() reader := csv.NewReader(fp) reader.Comma = ',' reader.LazyQuotes = true client, err := elastic.NewClient( elastic.SetSniff(false), elastic.SetURL(os.Getenv("ES_HOST")), ) if err != nil { // Handle error panic(err) } bulkRequest := client.Bulk() i := 0 for { record, err := reader.Read() if err == io.EOF { break } else if err != nil { panic(err) } restaurant := newRestaurant(record) mapingData := toMapingData(restaurant) indexReq := elastic.NewBulkIndexRequest().Index("ldgourmet").Type("restaurant").Doc(mapingData) bulkRequest = bulkRequest.Add(indexReq) if i%1000 == 0 { bulkResponse, err := bulkRequest.Do() if err != nil { panic(err) } if bulkResponse == nil { panic("expected bulkResponse to be != nil; got nil") } } i++ } if bulkRequest.NumberOfActions() > 0 { bulkRequest.Do() } } ࢖༻ϥΠϒϥϦ: https://github.com/olivere/elastic CSVͷߦΛಡΈࠐΈ ߏ଄ମʹม׵͠ɺ ESʹ1000݅୯ҐͰ όϧΫΠϯαʔτ
  62. WebΞϓϦ (LambdaͰಈ͍͍ͯΔϓϩάϥϜ) func main() { apex.HandleFunc(func(event json.RawMessage, ctx *apex.Context) (interface{},

    error) { client, err := elastic.NewClient( elastic.SetSniff(false), elastic.SetURL(os.Getenv("ES_HOST")), ) if err != nil { panic(err) } var in input if err := json.Unmarshal(event, &in); err != nil { panic(err) } q := elastic.NewQueryStringQuery(in.SearchWord) q = q.DefaultField("name") searchResult, err := client.Search(). Index("ldgourmet"). Query(q). Sort("name", true). From(0).Size(30). Pretty(true). Do() if err != nil { panic(err) } var out output var ttyp restaurant for _, item := range searchResult.Each(reflect.TypeOf(ttyp)) { if t, ok := item.(restaurant); ok { out.Restaurants = append(out.Restaurants, t) } } return out, nil }) } ࢖༻ϥΠϒϥϦ: https://github.com/olivere/elastic ESͷσʔλݕࡧ ES͔ΒͷऔಘσʔλΛ ߏ଄ମʹม׵
  63. WebΞϓϦΛ࡞ֶͬͯΜͩ͜ͱ • ֤αʔϏεͷઃఆʹ͍ͭͯ • ApexΛར༻ͨ͠GoͰͷ࣮૷ํ๏ͱσϓϩΠ· Ͱͷաఔ • API Gateway <->

    Lambdaͷͭͳ͗ࠐΈ • Lambda <-> Elasticsearch Serviceͷͭͳ͗ࠐΈ
  64. ݕূதʹϋϚͬͨ͜ͱ

  65. API GatewayͱLambdaؒͷϚοϐϯάઃఆ • API GatewayͰड͚ͨϦΫΤετ৘ใΛLambda ͔Βࢀর͢ΔͨΊʹඞཁ • ϚοϐϯάͷςϯϓϨʔτ͸Apache Velocityͱ ͍͏ςϯϓϨʔτΤϯδϯ͕࢖ΘΕ͍ͯΔ

  66. API GatewayͱLambdaؒͷϚοϐϯάઃఆ

  67. API Gatewayʹ͓͚ΔCORSͷઃఆ • CORS(Cross-origin resource sharing)Λ༗ޮʹ ͯ͠ɺAccess-Control-Allow-OriginΛઃఆͯ͠ ͋͛ͳ͍ͱ 'Access-Control-Allow-Origin' header

    is present on the requested resource. ͱ͍͏Τϥʔ͕ൃੜ (͍ΘΏΔΫϩευϝΠϯ ໰୊)
  68. API Gatewayʹ͓͚ΔCORSͷઃఆ

  69. API Gatewayͷઃఆมߋ͕൓ө͞Εͳ͍ • Ϛοϐϯάͷઃఆ͸൓ө͞Ε͕ͨɺCORSͷઃఆ ͸API Actions -> deploy APIΛ࣮ߦ͠ͳ͍ͱ൓ө ͞Εͳ͔ͬͨ

    • deploy͕ඞཁͳ΋ͷͱෆཁͳ΋ͷ͕͋Δͷ͔ ΋ɻ൓ө͞Εͳ͔ͬͨΒ͜͜Λٙ͏΂͠ɻ
  70. API Gatewayͷઃఆมߋ͕൓ө͞Εͳ͍

  71. Lambdaͷσόοά͕໘౗ • ͍͍ͪͪσϓϩΠ͢Δඞཁ͕͋Δ(ServerlessͰ͋ Ε͹ϩʔΧϧͰಈ͘ͷͰෆཁ) • ApexͰϥϯλΠϜΛGoʹͨ͠৔߹ɺprint debug Λ͢Δํ๏͕Θ͔Βͳ͔ͬͨ • Tips

    • apex logs ίϚϯυ͕ศར BQFYMPHTTFBSDI BXTMBNCEBBQFYTBNQMF@TFBSDI45"353FRVFTU*EEBFBGDCGB 7FSTJPO BXTMBNCEBBQFYTBNQMF@TFBSDI&/%3FRVFTU*EEBFBGDCGB BXTMBNCEBBQFYTBNQMF@TFBSDI3&10353FRVFTU*EEBFBGDCGB %VSBUJPONT #JMMFE%VSBUJPONT .FNPSZ4J[F.# .BY.FNPSZ6TFE.#
  72. ࠓޙͷ՝୊

  73. Lambdaͷݴޠબఆ • બఆͷͨΊͷࡐྉΛूΊΔ • ֤ݴޠͷϝϦοτɾσϝϦοτ • νʔϜͷεΩϧηοτ • Ϟνϕʔγϣϯ

  74. Lambdaʹ͓͚ΔϩάͷՄࢹԽ | ෼ੳ | Τϥʔ௨஌ • CloudWatch LogsͰݟΕΔʹ͸ݟΕΔ͕ࡉ͔͍෼ ੳ͕ඞཁͳͱ͖ͳͲ͸গʑΊΜͲ͏ •

    CloudWatch Logs͸͋͘·ͰࢀߟϨϕϧͱׂΓ͖ ΓɺS3΁όονΤΫεϙʔτ͠ɺdatadog΍ bugsnagͳͲ޷͖ͳαʔϏεʹσʔλϩʔυ͢Δ
  75. Lambdaʹ͓͚Δࢿݯͷڞ༗ • ΞϓϦέʔγϣϯͱ࢖༻ݴޠ͕ҟͳΔ৔߹ (Lambda͸GoɺΞϓϦέʔγϣϯ͕Rails(Ruby)ͳ Ͳʣɺݴޠؒͷࢿݯ(ιʔείʔυ)ͷڞ༗͕೉͍͠ • ORM༻ͷModelΫϥεΛੜ੒͢Δπʔϧ(Railsͷ ActiveRecord͔ΒGoͷgorm etc…)͘Β͍͸༻ҙ ͓͖͍ͯͨ͠

    • ΞϓϦέʔγϣϯͱ࢖༻ݴޠΛ౷ҰͰ͖ΔͳΒͦ Εʹӽͨ͜͠ͱ͸ͳ͍
  76. API Gatewayͷೝূ • API KeyͰڐ༰ग़དྷͳ͍৔߹ͷߟྀ͕ඞཁ • IAM or Cognito or

    Custom Authorizer • Custom AuthorizerΛར༻ͯ͠JWT or OAuthͰ
  77. Elasticsearch Serviceͷαϙʔτঢ়گ • VPCະରԠ • ηΩϡϦςΟͷ୲อ͸IAMͱಛఆIPڐՄ • ϨΠςϯγ͕ؾʹͳΔ৔߹͸VPCରԠ·Ͱ͸ࣗલͰؤுΔ ͔͠ແ͍ •

    ଴ͬͯΕ͹͍ͣΕରԠ͸͞ΕΔ͸ͣ • Elasticsearchͷόʔδϣϯ͕બ΂ͳ͍ + ௥ै͕஗͍ • 2016/06/25ݱࡏ 1.5.2ɻຊՈ͸2.3.3ɻ • ࠷৽ͷόʔδϣϯΛར༻͍ͨ͠৔߹͸ࣗલͰؤுΔ͔͠ແ ͍ • Ҡߦ࣌ʹݹ͍όʔδϣϯ΁ͷϦετΞ͕ग़དྷͳ͍ͷͰ஫ҙ
  78. ύϑΥʔϚϯεͱεέʔϥϏϦςΟ • ୲อͯ͘͠ΕΔͱ͸͍͑ɺͲͷఔ౓ͷ΋ͷ͔೺Ѳ͓ͯ͠ ͖͍ͨ • πʔϧ • ఆ൪ͷApache Bench (http://httpd.apache.org/docs/

    2.4/programs/ab.html) • LambdaʹߜΔͳΒgoad (https://github.com/ goadapp/goad)
  79. CIͱσϓϩΠઓུ • લड़ͷ௨ΓLambda͸σόοά͕େมͳͷͰɺϩδοΫ͸ͳ Δ΂͘෼཭͠ɺCIͰςετΛճͤΔΑ͏ʹ͍ͨ͠ • σϓϩΠͷϑϩʔ͸ΞϓϦέʔγϣϯಉ༷ɺCI͕௨ͬͨΒࣗ ಈͰσϓϩΠ͢ΔΑ͏ͳ͘͠Έʹ͍ͨ͠ (CircleCI + Apex)

    • LambdaͱAPI GatewayͷϦιʔε؅ཧ͸Apex(࣮ଶ͸ Terraform)ʹ೚͍ͤͨ • ςετ͸awspec(https://github.com/k1LoW/awspec)Ͱ
  80. ·ͱΊ

  81. খ׳Εͯ͘Ε͹ αʔόηοτΞοϓ͕ ෆཁͳ෼ εϐʔσΟʔʹ ϦϦʔεͰ͖Δ(ϋζ)

  82. εέʔϦϯά΍ όοΫΞοϓΛ ೚ͤΔ͜ͱ͕Ͱ͖Δ෼ ӡ༻ίετ΋ ݮΔ(ϋζ)

  83. ۜͷ஄ؙ Ͱ͸ͳ͍ͷͰɺ τϨʔυΦϑ Λ͔ͬ͠Γͱ཈͑ ద੾ʹར༻͢Δ

  84. ΈΜͳͰ৭ʑࢼͯ͠ ஌ݟΛڞ༗͠·͠ΐ͏!!

  85. Let's Enjoy AWS

  86. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠