Share
Embed
Ruby on Lambdaで変わる大規模サービスの裏側 / Ruby on Lambda makes a change to Eight's backend
AWS Serverless Tech/事例セミナー
- サーバーレスで Ruby 他、いろんな言語が使えるよ
https://pages.awscloud.com/ServerlessSeminar20190327-jp.html
■登壇概要
タイトル:Ruby on Lambdaで変わる大規模サービスの裏側
登壇者:Eight事業部 エンジニアリングマネージャー 藤井洋太郎
▼Sansan Builders Box
https://buildersbox.corp-sansan.com/
Sansan
March 27, 2019
Transcript
56 slides
-
- ౻Ҫ༸ଠ(Fujii Yotaro) - 1989ੜ·Ε(30ࡀ) - ɹɹɹɹɹ (ݸਓ໊͚ΞϓϦ) - 20144݄ʹ৽ଔͱͯ͠ೖࣾ
- Platform Unit / ج൫νʔϜ - Unit Leader ݉ Engineering Manager ࣗݾհ -
Eight Ͱར༻͍ͯ͠Δ AWSαʔϏε AWS100αʔϏεͷ͏ͪͷҎ্Λར༻ D I D KPI D D
N B P P A B/ I N W D W Recommendation Feed XPSLFS -
- ໊ը૾ - χϡʔεϑΟʔυ্ͷը૾ - ϓϩϑΟʔϧը૾ - ը૾ϝϞ - etc…
EightͰ༷ʑͳը૾Λѻ͏ -
- αϜωΠϧը૾ - ෳαΠζͷαϜωΠϧը૾Λ༻ҙ͠ɺ֤දࣔॴͰඞཁ࠷ݶͳα Πζͷը૾Λ͏͜ͱͰɺΞϓϦͷߴԽΛਤ͍ͬͯΔ - ΅͔͠ը૾ - Ӿཡݖݶ͕ແ͍Ϣʔβؒͷ߹ɺ΅͔͠ը૾Λදࣔ͢ΔΑ͏ʹ -
webpϑΥʔϚοτରԠ - JPEGͱൺֱ͠30%ϑΝΠϧαΠζ͕খ͘͢͞Δ͜ͱ͕Ͱ͖Δ ମݧ্ϓϥΠόγʔ؍ʹ͓͚Δ༷ʑͳը૾ॲཧΛߦ͏ -
1ຕͷ໊͔Β࡞ΒΕΔαϜωΠϧɺ΅͔͠ը૾ 1ຕͷ໊औΓࠐΈ αΠζ - ද×ཪ - jpeg × webp Λߟ͑Δͱ20छఔඞཁʹ
ΦϦδφϧ(ද) ΦϦδφϧ(ཪ) αϜωΠϧ(ද) ΅͔͠αϜωΠϧ(ද) … … … … αϜωΠϧ(ཪ) ΅͔͠αϜωΠϧ(ཪ) jpeg webp -
- σΠϦʔͰेʙඦສͷը૾ॲཧδϣϒ ͕ൃੜ - தʹϐʔΫ͕๚ΕΔ͕ɺ όονॲཧػߏͷؔͰ༰қʹεέʔϧ͕Ͱ͖ͳ͍ - ॲཧ͕ཹ͠ɺαϜωΠϧը૾͕४උͰ͖͍ͯͳ͍ͱɺ ը૾औಘAPIͰ on-the-fly
ʹը૾ੜΛߦΘͳ͚ΕͳΒͣɺ ϨεϙϯεྼԽʹͭͳ͕ͬͯ͠·͏… αʔϏε֦େʹͭΕɺεέʔϥϏϦςΟͷ͕ൃੜ -
ը૾ॲཧΩϡʔͷ enqueue / dequeue ঢ়گͰݟͯΈΔ னա͗ͷϐʔΫ࣌ʹεέʔϧͰ͖͍ͯͳ͍ɻ εέʔϧΞτ͢ΔʹόοναʔόʔΛ૿ ͠RailsϓϩηεΛ্ཱͪ͛ͳ͚Ε͍͚ͳ͍ ݱঢ়։ൃऀ͕खಈͰରԠ" ͔͠͠ɺ࣍ୈʹগঢ়ଶʹ…
ྲྀೖ͕མͪண͍ͯɺॲཧྔߴ͍ঢ়ଶͰுΓ ͍͍ͯΔɻ࣌ؒཹ/Ԇͯ͠͠·͍ͬͯΔɻ → ը૾औಘAPIͷύϑΥʔϚϯεྼԽʹͭͳ͕Δ enqueue dequeue -
- ͕ɺEight ʹͱͬͯ RubyͰॻ͚ͳ͍͜ͱ͕େ͖ͳ Lambda ʹߦ͚Εͤͩͱ͍͏͜ͱΘ͔͍ͬͯΔ - ໊ը૾पΓͷॲཧຊମαʔϏεʹີʹඥ͍͍ͯΔ - ಉظతʹ໊ը૾Λ৮Βͳ͍ͱ͍͚ͳ͍έʔε͕͋ΓɺϩδοΫͷଟॏཧʹ
- Ϣʔβؒͷؔੑެ։εςʔλεʹΑ໊ͬͯը૾औಘՄ൱݁Ռ͕ҟͳΔɻ - ը૾αʔϏε(?)ͷΑ͏ʹαʔϏεΛΓग़͢ͷɺݱঢ়͔ͳΓՙ͕ॏ͍ - ͦΜͳதɺଞͷݴޠΛͬͯͷ Lambda ࣮ϝϯςφϯεੑʹ͋Γ… -
[ཧΠϝʔδ] ڞ௨ॲཧΛࣗલͷgemͱͯ͠Γग़͍͍ͤײ͡ʹʁ eight_card_image_processor gem ɾը૾ͷอଘɾߋ৽ɾআ ɾαϜωΠϧը૾ੜ ɾ΅͔͠ը૾ੜ ɾjpegมαϙʔτ ɾwebpมαϙʔτ ໊ը૾ʹؔ͢Δ
ڞ௨ॲཧΛࣗ࡞Gemͱͯ͠Γग़͢ bundle install bundle install -
- ᶃ gemΛͬͨ Lambda Λ࡞Δ - ᶄ native extensionsʹґଘ͢ΔgemΛͬͨ Lambda
Λ࡞Δ - ᶅ ࣮ߦόΠφϦΛؚΊͨ Lambda Λ࡞Δ - ᶆ Lambda LayersΛར༻࣮ͯ͠ߦόΠφϦΛFunction͔ΒΓ͢ - ᶇ FrameworkΛར༻ͨ͠ϩʔΧϧ࣮ߦڥͱσϓϩΠڥ - ᶈ CI / CDڥͷߏங εςοϓ -
- bundle install ࣌ʹ࡞ۀσΟϨΫτϦԼͷ vendor/bundle ʹΠϯετʔϧ͞ ΕΔΑ͏ʹ͠ɺlambda function(rubyίʔυ)ͱҰॹʹΞοϓϩʔυ͢Ε' - σΟϨΫτϦߏྫ
1. Ruby on Lambda Ͱ Gem Λར༻͢Δ bundle install --path vendor/bundle -
- workσΟϨΫτϦԼͷ vendor/bundle Ͱಈ͘ཧ༝ Lambda࣮ߦڥͷڥม(GEM_PATH)ʹσϑΥϧτͰՃ͞Ε͍ͯΔͨΊ 1. Ruby on Lambda Ͱ
Gem Λར༻͢Δ https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/current-supported-versions.html -
- Lambda ͷ࣮ߦڥͱಉͷڥͰbundle(Ϗϧυ)͢Δඞཁ͕͋Δ 2. native extension ʹґଘͨ͠ gem ͷ߹ lambci/lambda:build-ruby2.5
lambci dockerΠϝʔδΛΘͤͯΒ͏ https://github.com/lambci/docker-lambda lambci # rmagickͳͲnative extensionsΛඞཁͱ͢ΔgemΛGemfileʹهड़ $ vi Gemfile # docker container্Ͱbundle install. volumeϚϯτ͠ϗετ্ͷ vendor/bundle ʹΠϯετʔϧ $ docker run -v `pwd`:/var/task -it lambci/lambda:build-ruby2.5 bundle install --path vendor/bundle # lambda_handler.rb, vendor/bundleΛzipԽͯ͠Ξοϓϩʔυ $ zip -r zip_function ./* -
- Eightͷը૾ॲཧͰߴԽͷͨΊʹ webp ϑΥʔϚοτมΛߦ͍ͬͯΔ - ͕ɺ௨ৗͷLambda࣮ߦڥͷImageMagick webp ରԠ͍ͯ͠ͳ͍…orz 3. ࣮ߦόΠφϦΛؚΊͨ
Lambda ͷ࡞ ## ImageMagickͷversion֬ೝ $ convert -version Version: ImageMagick 6.7.8-9 2016-06-22 Q16 http://www.imagemagick.org Copyright: Copyright (C) 1999-2012 ImageMagick Studio LLC Features: OpenMP ## ରԠը૾ϑΥʔϚοτͷ֬ೝɻ $ convert -list format … VST* TGA rw- Truevision Targa image WBMP* WBMP rw- Wireless Bitmap (level 0) image WMF* WMF r-- Windows Meta File … dockerίϯςφ্ͰImageMagickΛ֬ೝ webp͕ରԠϦετʹແ͍ -
- ࣮ߦόΠφϦΛؚΊͯLambdaؔΛύοέʔδϯάԽ͢Δͷ͕ਖ਼߈๏✅ - native extensionsΛ͏ࡍͱಉ༷ɺLambdaͷDockerڥͰ࣮ߦόΠφϦΛϏϧυ - Ϗϧυ͢ΔࡍͷΠϯετʔϧσΟϨΫτϦҙ͕ඞཁɻϥΠϒϥϦݕࡧύεΛ֬ೝ͢Δ͜ͱ - Lambda࣮ߦڥͷσϑΥϧτͷϥΠϒϥϦݕࡧύεͷڥมҎԼ -
ඞཁʹԠͯ͡ɺLambdaʹڥมΛ༩͑Δ(্ॻ͘͜ͱ)Մೳ 3. ࣮ߦόΠφϦΛؚΊͨ Lambda ͷ࡞ https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/current-supported-versions.html -
- WebP compatibleͳImageMagickΛϏϧυ͢Δࡍͷ࣮ߦྫ 3. ࣮ߦόΠφϦΛؚΊͨ Lambda ͷ࡞ ## Lambda͕ؔల։͞ΕΔσΟϨΫτϦͰ࡞ۀ cd
/var/task ## libwebpͷinstall curl -sLO https://storage.googleapis.com/downloads.webmproject.org/releases/webp/ libwebp-1.0.0.tar.gz \ && tar zxvf libwebp-1.0.0.tar.gz \ && cd libwebp-1.0.0 && ./configure --prefix=/var/task && make && make install \ && rm -rf ../libwebp-1.0.0.tar.gz ../libwebp-1.0.0 ## webp compatibleͳImageMagickͷϏϧυ curl -sLO https://www.imagemagick.org/download/releases/ImageMagick-6.9.10-34.tar.gz \ && tar zxvf ImageMagick-6.9.10-34.tar.gz \ && cd ImageMagick-6.9.10-34 && ./configure --prefix=/var/task --with-webp=yes \ && make && make install \ && rm -rf ../ImageMagick-6.9.10-34.tar.gz ../ImageMagick-6.9.10-34 - /var/task ҎԼͷϑΝΠϧ(*.rb, vendor/bundle, bin/, lib/, etc…)Λશͯύοέʔδϯά(zipԽ)͢ΕOK lambci dockerίϯςφ্ͰϏϧυ࡞ۀ -
- ͔͠͠ɺ࣮ߦόΠφϦ(ImageMagick)ΛؚΊͨΞοϓϩʔυຯʹਏ͍ ࣮ߦόΠφϦΛʮؚ·ͳ͍ʯ߹ (*.rb, vendor/bundle ͷΈ) ࣮ߦόΠφϦΛʮؚΉʯ߹ (*.rb, vendor/bundle, bin/,
lib/, …) 5MB 50MB! - ࣮ߦόΠφϦࣗମΛߋ৽͢Δසଟ͘ͳ͍͕ͣͩɺ ؔΛमਖ਼͢Δͨͼʹຖճύοέʔδϯά & σϓϩΠ͠ͳ͚ΕͳΒͳ͍ - ཧ͢ΔLambda͕ҰͭͰ͋Ε·ͩɺͳΜͱ͔ͳΔ͔͠Εͳ͍͕…? ਏ͍͜ͱʹมΘΒͳ͍ 3. ࣮ߦόΠφϦΛؚΊͨ Lambda ͷ࡞ -
- re:Invent 2018 Ͱ Ruby Support ͱҰॹʹϦϦʔε͞ΕͨʮLambda Layersʯ 4. Lambda
LayersΛͬͯσϓϩΠίετΛݮ͢Δ -
- Lambda Layers : ෳͷLambdaؔͰϥΠϒϥϦΛڞ༗Ͱ͖ΔΈ ৄࡉ https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html 4. Lambda LayersΛͬͯσϓϩΠίετΛݮ͢Δ
- Point - Layerͷίʔυ /opt ҎԼʹల։͞ΕΔ - /opt ҎԼͷύεϥΠϒϥϦݕࡧύεʹ σϑΥϧτͰؚ·Ε͍ͯΔ ref: https://qiita.com/t_okkan/items/394a15577bd1aad46ec3 -
- Dockerίϯςφ্ͰWebP Compatible ImageMagick LayerΛ࡞Δ 4. Lambda LayersΛͬͯσϓϩΠίετΛݮ͢Δ # Lambda
Layer͕ల։͞ΕΔ /opt ҎԼͰ࡞ۀ cd /opt ## libwebpͷinstall curl -sLO https://storage.googleapis.com/downloads.webmproject.org/releases/webp/ libwebp-1.0.0.tar.gz \ && tar zxvf libwebp-1.0.0.tar.gz \ && cd libwebp-1.0.0 && ./configure --prefix=/opt && make && make install \ && rm -rf ../libwebp-1.0.0.tar.gz ../libwebp-1.0.0 ## webp compatibleͳImageMagickͷϏϧυ curl -sLO https://www.imagemagick.org/download/releases/ImageMagick-6.9.10-34.tar.gz \ && tar zxvf ImageMagick-6.9.10-34.tar.gz \ && cd ImageMagick-6.9.10-34 && ./configure --prefix=/opt --with-webp=yes \ && make && make install \ && rm -rf ../ImageMagick-6.9.10-34.tar.gz ../ImageMagick-6.9.10-34 - /opt ҎԼͷϑΝΠϧ(bin/, lib/, etc…)Λύοέʔδϯά͠LayersʹΞοϓϩʔυ͢ΕOK ΠϯετʔϧσΟϨΫτϦͷࢦఆΛ /var/task ͔ΒLayer͕ల։͞ΕΔ /opt ҎԼʹมߋ -
- , ֎෦ϥΠϒϥϦΛLayersʹҠߦ͢Δ͜ͱͰɺϏδωεϩδοΫͷ։ൃʹूத͠ ͘͢ͳΔ - , LambdaؔͷσϓϩΠ࣌ʹɺ֎෦ϥΠϒϥϦΛؚΉύοέʔδϯά͕ෆཁʹ ͳΓσϓϩΠίετ͕ݮ - -
ҰํͰɺLayersࣗମͷόʔδϣϯཧɺLambdaͱͷґଘؔɾඥ͚Λखಈ Ͱߦ͍ͬͯ͘ͷΑΓෳࡶʹ… - ϑϨʔϜϫʔΫಋೖͷػӡ 4. Lambda LayersΛͬͯσϓϩΠίετΛݮ͢Δ -
- LambdaΛؚΉServerlessΞʔΩςΫνϟͷߏཧɺϩʔΧϧ࣮ߦɺσϓϩΠ͕ՄೳͳϑϨʔϜϫʔΫ - AWS SAM(Serverless Application Model) - Serverless Framework
ͷ2͔ 5. ϑϨʔϜϫʔΫΛར༻͠࠶ݱੑ/ܧଓੑΛߴΊΔ AWS SAM - AWSެࣜͷαʔόʔϨεΞʔΩςΫνϟʹ ಛԽͨ͠ϑϨʔϜϫʔΫ - CloudFormationͰཧ - ϩʔΧϧ࣮ߦڥΛඋ - σϓϩΠखॱ͕एׯෳࡶͳҹ - AWSҎ֎ͷΫϥυʹରԠ - SAMಉ༷ɺCloudFormationͰཧ - ։ൃ͕Μ(ͳҹ) - pluginͳͲ๛Ͱ͔Ώ͍ͱ͜Ζʹख͕ಧ͘ - ࠓճ͢ͰʹEightͰར༻࣮ͷ͋Δ Serverless Framework Λ࠾༻ -
- Serverlss Framework ͱDockerΛར༻͠ɺLambdaͱLayersΛཧ͢Δ 5. ϑϨʔϜϫʔΫΛར༻͠࠶ݱੑ/ܧଓੑΛߴΊΔ ΦεεϝͷσΟϨΫτϦߏҊ - ᶃ Layers
ͷཧ Dockefileʹهड़͠ɺDocker Imageʹด͡ࠐΊͯ͠·͏ɻ Layers ʹߋ৽͕͋ͬͨ߹Docker ImageΛ࠶Ϗϧυ͢Δɻ - ᶄ Serverless Framework serverlessDockerͰ࣮ߦͰ͖ΔΑ͏ʹ - ᶅ Lambdaؔ, serverless.yml, vendor/bundleͷཧ ্ड़ͷDockerίϯςφͷ্ཱͪ͛࣌ʹ /var/task ʹ࡞ۀσΟϨΫτϦΛϚϯ τ͠ɺίϚϯυ࣮ߦDockerίϯςφ্Ͱߦ͏ɻ - gemͷՃ/ߋ৽͋͠͠ΔͨΊvendor/bundle docker imageʹؚΊͳ͍ & όʔδϣϯཧ͠ͳ͍(.gitignore) -
- Layers Dockerfile Ͱཧͯ͠͠·͏ͷ͕٢ 5. ϑϨʔϜϫʔΫΛར༻͠࠶ݱੑ/ܧଓੑΛߴΊΔ LambdaͷDocker ImageΛϕʔεͱͨ͠ ࣗલͷDocker Image༻ҙ
FROM lambci/lambda:build-ruby2.5 # ࡞ۀڥͷߏஙʹඞཁͳڥมͷఆٛ ENV PKG_CONFIG_PATH /opt/lib/pkgconfig # Lambda layer૬ͷڥΛ࡞ WORKDIR /opt ## libwebpͷinstall ... (લड़ͱಉ༷ͷॲཧ) ## webp compatibleͳImageMagickͷϏϧυ ... (લड़ͱಉ༷ͷॲཧ) # serverless frameworkͷΠϯετʔϧ RUN curl -sL https://rpm.nodesource.com/setup_6.x | bash - \ && yum -y install nodejs && yum -y clean all \ && npm install -g serverless WORKDIR /var/task/ CMD ["/bin/bash"] ᶃlambci/lambda:build-ruby2.5 Λ ɹϕʔεʹͨ͠Πϝʔδ ᶄ/opt ԼʹAWS Layersʹ૬͢Δ ɹϥΠϒϥϦΛϏϧυ͠ஔ ᶅnodeΛΠϯετʔϧ͠ɺ ɹserverless frameworkΛΠϯετʔϧ͢Δ Dockerfileྫ -
- serverless.yml Ͱͷ layers, functionsͷઃఆྫ 5. ϑϨʔϜϫʔΫΛར༻͠࠶ݱੑ/ܧଓੑΛߴΊΔ … layers: webpimagemagick:
path: copy_layers # /opt ͷγϯϘϦοΫϦϯάΛష্ͬͨͰdeploy͢Δ description: WebP compatible ImageMagick functions: func1: handler: func1.execute layers: - {Ref: WebpimagemagickLambdaLayer} events: - s3: card-images func2: handler: func2.execute LambdaؔͰ͏LayerΛ ඥ͚ͯཧ͢Δ͜ͱ͕Մೳ ࢦఆͨ͠bucketʹߋ৽͕͋ͬͨࡍʹ lambda࣮ߦͤ͞Δઃఆ -
- Ϗϧυͨ͠Docker Imageͷίϯςφ্Ͱ։ൃ࡞ۀ - bundle install —path vendor/bundle - gemͷΠϯετʔϧ
- bundle exec rspec - rubyίʔυͷࣗಈςετ࣮ߦ - serverless deploy - functionͱlayersͷσϓϩΠ - serverless invoke (local) -f function໊ - Lambda functionͷ(ϩʔΧϧ)࣮ߦ 5. ϑϨʔϜϫʔΫΛར༻͠࠶ݱੑ/ܧଓੑΛߴΊΔ -
$ sls deploy ...snip Serverless: Uploading service aws-ruby-function.zip file to
S3 (4.02 MB)... Serverless: Uploading service webpimagemagick.zip file to S3 (47.44 MB)... ...snip api keys: None endpoints: None functions: func1: eight-image-proccessor-dev-func1 func2: eight-image-proccessor-dev-func2 layers: webpimagemagick: arn:aws:lambda:ap-northeast-1:xxxxx:layer:webpimagemagick:9 Serverless: Removing old service artifacts from S3... 5. ϑϨʔϜϫʔΫΛར༻͠࠶ݱੑ/ܧଓੑΛߴΊΔ - deployίϚϯυΛୟ͚ͩ͘Ͱɺlambdaͱlayersͷύοέʔδϯά&σϓϩΠ͕Ͱ͖Δ - serverless(sls) deploy functionͱlayer͕ͦΕͧΕύοέʔδϯά σϓϩΠྃͨ͠functionsͱlayersͷใ -
def hello(event:, context:) { statusCode: 200, body: JSON.generate('Go Serverless v1.0!
Your function executed successfully!’) } end 5. ϑϨʔϜϫʔΫΛར༻͠࠶ݱੑ/ܧଓੑΛߴΊΔ - ϩʔΧϧڥͰͷlambdaͷಈ࡞֬ೝͰ͖Δ - serverless(sls) invoke local -f function໊ $ sls invoke local -f hello {"statusCode":200,"body":"\"Go Serverless v1.0! Your function executed successfully!\""} -
- ϐʔΫλΠϜͰ Lambda ͕ࣗಈͰεέʔϧ͠ཹ͕΄΅0ʹ - ͜Ε·Ͱӡ༻ऀ͕खಈͰ͍ͬͯͨӡ༻ίετ΄΅0ʹ - ຖϐʔΫ࣌ʹൃੜ͍ͯͨ͠ Ξϥʔτ &
εέʔϦϯάۀ͔Βͷ։์ . - ཹ͕ͳ͘ͳΔ = APIύϑΥʔϚϯε্ - ཹ࣌ʹൃੜͯ͠͠·͏ಉظతͳը૾มॲཧʹ͔͔͍ͬͯͨ ेʙඦ ms / req ͕ൃੜ͠ͳ͘ͳͬͨ✨ มΘͬͨ͜ͱ ࣗಈͰεέʔϧΞτ/Πϯ -
- Lambda ։ൃڥͷϝϯςφϯε - ࠓճͷΑ͏ͳ Ruby on Lambda ͷ։ൃڥΛҰ࡞ͬͯ͠·͑ɺ ࠓޙͷLambda
FunctionͷՃɾमਖ਼ɾআ༰қ , - εέʔϥϏϦςΟ͕ωοΫͰରԠͰ͖ͳ͔ͬͨػೳվળ͘͢͠ - ը૾ϑΥʔϚοταΠζͷ֦ு - ը૾ͷ࣭ͷ࠷దԽͳͲ มΘͬͨ͜ͱ -
- ۀͰRubyΛϝΠϯʹ৮͍ͬͯΔํ Lambda ͥͻ͏͠ - ڞ௨ॲཧΛGemԽ͢Δ͜ͱͰɺඇಉظॲཧΛ༰қʹLambdaʹ͍͚࣋ͬͯΔɻ - Serverless Framework
AWS SAM Λར༻͢Δ͜ͱͰίετΛॻ͚ͣʹ αʔόʔϨεͳ։ൃɾCI/CDڥΛߏஙͰ͖Δɻ - Native extentionʹґଘ͢Δgem֎෦ϥΠϒϥϦΛར༻͢Δ߹ Lambda ͱಉ ͷ࣮ߦڥͰϏϧυ͠σϓϩΠ͢Δɻ - `lambci/lambda` Λϕʔεʹͨ͠DockerڥͷߏஙΛ͢Δ͜ͱΛΦεεϝ͠·͢ ·ͱΊ -
ϦΞϧλΠϜϦίϝϯσʔγϣϯػߏ JAWS Days 2017 : https://www.slideshare.net/YotaroFujii/jaws-days-2017eight AWS Dev Day Tokyo
2017 : https://speakerdeck.com/yas/awsgazhi-erueightrikomendesiyonenzinfalseli-ce