Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Heroku と EC Booster と私 & Heroku ちょこっと Deep Dive
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Takashi Masuda
November 09, 2018
Technology
1.1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Heroku と EC Booster と私 & Heroku ちょこっと Deep Dive
2018-11-09 フィードフォース社内技術勉強会のプレゼン資料です。
https://developer.feedforce.jp/entry/2018/11/14/140000
Takashi Masuda
November 09, 2018
More Decks by Takashi Masuda
See All by Takashi Masuda
マスタカネットの紹介 〜悠久なる変更履歴〜
masutaka
0
9
最近の情報収集方法 2025
masutaka
0
85
自分のブログをCloudFront+HerokuからCloud Runに移行した
masutaka
0
180
BigQuery経由で使うGoogleスプレッドシートのスキーマ管理
masutaka
0
370
本を聴く毎日を送っています
masutaka
0
100
ボッチLookML開発者兼データ整備人を連れてきたよ!
masutaka
0
150
ここがつらいよ普段使いのLinux
masutaka
0
380
4月から取り組んできたLookerの導入から実装までのお話
masutaka
0
190
HerokuでSidekiqを監視する方法を確立した
masutaka
0
650
Other Decks in Technology
See All in Technology
はじめてのWDM
miyukichi_ospf
1
140
貴方はどのエンジニアリングを磨くのか
hatyibei
0
130
Zoom2Youtube.Claude
kawaguti
PRO
3
490
ゼロをイチにする仕事が終わったあと
smasato
0
340
地域 SRE コミュニティ最前線 / SRE NEXT 2026 Discussion Night Track C
muziyoshiz
0
210
ZOZOTOWNの進化と信頼性を両立する負荷試験
zozotech
PRO
2
160
誤解だらけの開発生産性 / Myths and Misconceptions about Developer Productivity
i35_267
1
240
DMM.com 購入改善推進チーム におけるCodeRabbitを用いた レビューフロー改善の一例
ysknsid25
2
620
LLMやAIエージェントをソフトウェアに組み込むプラクティス
shibuiwilliam
1
360
Compose 新機能総まとめ / What's New in Jetpack Compose
yanzm
0
170
インフラと開発の垣根を超えていき!〜元AWSインフラエンジニアがAWS開発で奮闘している話〜
hatahata021
1
170
しくみを学んで使いこなそう GitHub Copilot app
torumakabe
2
240
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
100
6.2k
Site-Speed That Sticks
csswizardry
13
1.2k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
1k
Fireside Chat
paigeccino
42
4k
YesSQL, Process and Tooling at Scale
rocio
174
15k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
370
Balancing Empowerment & Direction
lara
6
1.2k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Odyssey Design
rkendrick25
PRO
2
730
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Transcript
)FSPLVͱ&$#PPTUFSͱࢲ !NBTVUBLB
w 1BB4ʢ1MBUGPSNBTB4FSWJDFʣͷͻͱͭ w ։ൃऀΠϯϑϥͷཧΛؾʹ͢Δ͜ͱͳ͘ɺ ΞϓϦέʔγϣϯΛσϓϩΠ͢Δ͜ͱ͕ग़དྷΔ IUUQTIFSPLVDPN
w &$αΠτͷӡӦऀ͕࠷͔̑Β(PPHMFγϣο ϐϯάࠂΛ࢝ΊΒΕΔαʔϏε w ද͖XFCαʔϏεͰ͋Δ͕ɺཪଆͰׂͱ ΰϦΰϦͱόονॲཧ͕ಈ͍͍ͯΔ IUUQTFDCPPTUFSKQ
ࢲ w ૿ాو࢜ʢ!NBTVUBLBʣ w ੩Ԭݝদࢢग़ w ݄)FSPLVσϏϡʔ w ݄&$#PPTUFSʹδϣΠ
ϯɻຊ൪ڥ͕)FSPLVͩͬͨ w ݄&$#PPTUFSͷ)FSPLV पลΛΠΠײ͡ʹ࢝͠ΊΔ IUUQTNBTVUBLBOFUDIBMPXIUNM
&$#PPTUFS)FSPLVͰ ಈ͍͍ͯ·͢ɻ
%ZOPͷมભ XFC XPSLFS BE@XPSLFS 4UBOEBSE9
4UBOEBSE9 4UBOEBSE9 1FSGPSNBODF. 4UBOEBSE9 ͯ̍͢ 4UBOEBSE9
%ZOP w )FSPLVͰΞϓϦέʔγϣϯΛ࣮ߦ͢ΔͨΊͷܰ ྔίϯςφ w αʔόʔͱஔͯ͋͠ͳ͕ͪؒҧ͍Ͱ ͳ͍ IUUQTKQIFSPLVDPNEZOPT
&$#PPTUFSͷ1SPDpMF release: bin/rails db:migrate db:seed # Web app web: bin/rails
s -p $PORT -e $RAILS_ENV worker: PROCESS_TYPE=worker bundle exec sidekiq -C config/sidekiq.yml # Ad app ad_worker: PROCESS_TYPE=ad_worker bundle exec sidekiq -C config/sidekiq.yml
1SPDpMF w %ZOPʹΑ࣮ͬͯߦ͞ΕΔίϚϯυΛఆٛͨ͠ϑΝΠϧ w QSPDFTTUZQFDPNNBOEͱ͍͏TZOUBY w )FSPLVͰXFCͱSFMFBTFಛผͳQSPDFTTUZQF w ଞͷQSPDFTTUZQFҙʹ૿͢͜ͱ͕ग़དྷΔ w
͍ͭ͘·Ͱ૿ͤΒΕΔͷͩΖ͏ʁ IUUQTEFWDFOUFSIFSPLVDPNBSUJDMFTQSPDpMF
"EEPOͷมભ )FSPLV 1PTUHSFT )FSPLV 3FEJT -PHHJOH .POJUPSJOH
)PCCZ%FW 1SFNJVN 4UBOEBSE /FX3FMJD )BXLF 1BQFSUSBJM -PH%/" ϓϥϯঢ়گʹԠ্ͯ͛͡Լ͛ͨ͠
w ಛච͖͢ͳ͠ w ݄಄ʹ1BQFSUSBJM͕ఀࢭͨͨ͠ΊɺݟΓ Λ͚ͭͯ-PH%/" ʹҠߦͨ͘͠Β͍ IUUQTMPHEOBDPN
࠷ۙͬͨ͜ͱ w )FSPLVΛ5FSSBGPSNͰཧͯ͠ɺมߋΛίʔυ ͰදݱͰ͖ΔΑ͏ʹͨ͠ w δϣϒͷεέδϡʔϧ࣮ߦΛIFBMUIDIFDLTJP Ͱࢹ͠ɺ5FSSBGPSNͰཧͨ͠ w %PDLFSPO)FSPLVͬͯ3FEBTIΛཱͯͨ
IUUQTHJUIVCDPNXJMMOFUSFEBTIPOIFSPLV IUUQTIFBMUIDIFDLTJP
՝ͷҰ෦ w σϓϩΠ͕͍ʢڧʣ w CVJMEQBDLΛෳ͍ͬͯΔͨΊɻ%PDLFSPO)FSPLVʹ͢Δ͔ w 8FCΞϓϦέʔγϣϯͷύϑΥʔϚϯεΛݕ౼͖͠Ε͍ͯͳ͍ w ·ͩͦ͜·ͰͰͳ͍͕ɻϨΠςϯγʔʹߦ͖ண͘ؾ ͢Δ
w ϝτϦΫεࢹ͕ग़དྷ͍ͯͳ͍ w /FX3FMJD"EEPO"1.ͳͷͰํੑ͕ҧ͏
)FSPLVͷྑ͍ͱ͜Ζ w ΠϯϑϥΛ͋·ΓҙࣝͤͣʹαʔϏεΛ࢝ΊΒΕΔ w ࠓͷͱ͜Ζͱͯ҆ఆ͍ͯ͠Δ w ʢͨ·ͨ·ͩͱࢥ͏͕ʣϝϯςφϯεΟϯυ͕·ͩ dճ͔͠ͳ͍ w "84ͱൺ੍͕ͯଟ͍
w ݩΈࠐΈΤϯδχΞͷ݂͕૽͙
)FSPLVͷྑ͘ͳ͍ͱ͜Ζ w %ZOPͷछྨ͕গͳ͍ w ྫ4UBOEBSE9 NP ͷͻͱ্͕ͭ1FSGPSNBODF. NP
w গ͠ͷมߋͰྉ͕ۚάοͱ্͕Δ͜ͱ͕͋Δɻ͏গ͠બࢶ͕ ཉ͍͠ w "EEPOͷྉۚઃఆ͕ಠಛ w %ZOPͷॏΈ͕Ճຯ͞ΕΔ͜ͱ͕͋Δʢྫ1SPDFTT4DIFEVMFS "EEPOʣ
ײ w )FSPLVྑ͍αʔϏε w ࠓͷͱ͜Ζɺεέʔϧ໘Ͱෆ҆ͳ͍ɻϨΠς ϯγʔͱɺର֎తͳҙຯͰͷηΩϡϦςΟ ෆ҆ w "84($1ͷҠߦࢹʹೖΕͯɺ%PDLFSJ[F ͳͲ͍ͬͯ͘
None
)FSPLV%FFQ%JWF !NBTVUBLB
)FSPLV%FFQ%JWF !NBTVUBLB ͪΐͬ͜ͱ
σϓϩΠͷྲྀΕʢͬ͘͟Γʣ )FSPLV"QQΛ࡞Δʢ࠷ॳͷҰճʣ HJUQVTI͢Δ 4MVH͕࡞ΒΕΔ 4MVHΛಡΈࠐΈɺ৽ͨͳ%ZOP͕࡞ΒΕΔ IUUQTEFWDFOUFSIFSPLVDPNBSUJDMFTIPXIFSPLVXPSLT
4MVHͱʁ w TMVHDPNQJMFSʹΑͬͯɺύοέʔδϯά͞Εͨ ͷ w HJUQVTI͢ΔͱϦϙδτϦ͕ύοέʔδϯά͞ ΕΔɻCVJMEQBDLͳͲؚΊΒΕΔ w ΞϓϦέʔγϣϯىಈ࣌ʹɺ4MVH%ZOPʹμ ϯϩʔυˍల։͞ΕΔ
IUUQTEFWDFOUFSIFSPLVDPNBSUJDMFTTMVHDPNQJMFS
͜ͷఔ͔͠ใ͕ͳ͍ IUUQTEBTICPBSEIFSPLVDPNBQQT\BQQOBNF^TFUUJOHT $ heroku apps:info --json -a {app-name} | jq
.app.slug_size ͰαΠζ͕͔Δ
ͩͬͨΒɺ
4MVHΛμϯϩʔυͯ͠ΈΑ͏ʂ
͕࣌ؒ͋Ε࣮ԋ $ APP_NAME={app-name} $ LATEST_SLUG_ID=$(heroku releases --json -a $APP_NAME |
jq -r '.[0].slug.id') $ SLUG_URL=$(curl -n https://api.heroku.com/apps/${APP_NAME}/slugs/${LATEST_SLUG_ID} \ -H "Accept: application/vnd.heroku+json; version=3" | jq -r '.blob.url') $ curl -Lo ${LATEST_SLUG_ID}.tar.gz $SLUG_URL IUUQTEFWDFOUFSIFSPLVDPNBSUJDMFTQMBUGPSNBQJSFGFSFODFTMVHJOGP ˞࠷৽ͷϦϦʔεʹඥ͍ͨ4MVHΛμϯϩʔυ
4MVHUBSCBMMͷ த app ├── .bundle ├── ʢϦϙδτϦͷϑΝΠϧʣ └── vendor ├──
bundle │ └ʢলུʣ └── ruby-2.4.4 └── bin ├── erb ├── gem ├── irb ├── rake ├── rdoc ├── ri ├── ruby └── ruby.exe -> ruby IFSPLVSVCZCVJMEQBDL Λ͍ͬͯΔ߹ɺ SVCZͦͷͷWFOEPS CVOEMFͳͲؚ·Εͯ ͍Δɻ
ʢ͓·͚ʣ 4MVHΛखಈͰ࡞ͬͯϦϦʔεͯ͠ΈΑ͏ʂ
͕࣌ؒ͋Ε࣮ԋ $SFBUJOH4MVHTGSPN4DSBUDI IUUQTEFWDFOUFSIFSPLVDPNBSUJDMFTQMBUGPSNBQJSFGFSFODFTMVHJOGP SVCZͷCVJMEQBDLΛμϯϩʔυ͠ల։ɺSVCZTDSJQUΛ ՃɺUBSCBMMʹ͢Δ 4MVH$SFBUF"1*Λୟ͘ͱɺΞοϓϩʔυ༻63-͕ฦͬͯ͘ Δ
Ξοϓϩʔυ༻63-ʹUBSCBMMΛΞοϓϩʔυ͢Δ 1045BQQTBQQSFMFBTFT͢ΕɺϦϦʔεྃ
੍ݶ͍Ζ͍Ζ͋Δ w 4MVHαΠζ$PNQJMFͯ͠.J#·ͰʢѹॖαΠζʣ w ʹ.J#͔Β.J#ʹ্͕ͬͨ w ʹ.J#͔Β.J#ʹ্͕ͬͨ w 4MVH$PNQJMF࣌ؒ·Ͱ w
ϢʔβʹΑΔΞϓϦͷHJUૢ࡞࣌ؒʹճ·Ͱ w ϦϙδτϦαΠζඇѹॖͰ(#·Ͱ w ͦͷଞ IUUQTEFWDFOUFSIFSPLVDPNBSUJDMFTMJNJUT
ࢼ͠ʹɺ
4MVHαΠζΛݮΒͯ͠ΈΑ͏ʂ
4MVHʹؚΊΔϑΝΠϧΛݮΒ͢ IFSPLVSFQPQMVHJOΛ͏
4MVHʹؚΊΔϑΝΠϧΛݮΒ͢ w HJUϦϙδτϦ͔ΒෆཁͳϑΝΠϧΛআ͢Δ w 4MVHʹؚΊͨ͘ͳ͍ϑΝΠϧΛTMVHJHOPSFʹॻ ͘ IUUQTEFWDFOUFSIFSPLVDPNBSUJDMFTTMVHDPNQJMFSJHOPSJOHpMFTXJUITMVHJHOPSF
IFSPLVSFQPQMVHJOΛ͏ $ heroku plugins:install heroku-repo $ heroku repo:gc -a {app-name}
$ heroku repo:purge_cache -a {app-name} $ git commit --allow-empty -m 'Decrease slug size' $ git push heroku master IUUQTHJUIVCDPNIFSPLVIFSPLVSFQP
IFSPLVSFQPHD (&5IUUQTBQJIFSPLVDPNBQQT\BQQOBNF^CVJME NFUBEBUBͯ͠ɺϦϙδτϦ(&5༻63-Λऔಘ͢ΔɻUBSCBMM͕ ಘΒΕΔ IFSVLVSVOͯ͠ɺμϯϩʔυͨ͠ϦϙδτϦʹରͯ͠ɺ HJUHDBHHSFTTJWF͢Δ UBSCBMMʹݻΊͯɺͰಘΒΕͨ165༻63-ʹ165͢Δ
࣍ճͷσϓϩΠͰεϦϜʹͳͬͨHJUϦϙδτϦ͕ΘΕΔ IUUQTHJUIVCDPNIFSPLVIFSPLVSFQPCMPCWDPNNBOETHDKT
IFSPLVSFQPQVSHF@DBDIF (&5IUUQTBQJIFSPLVDPNBQQT\BQQOBNF^CVJME NFUBEBUBͯ͠ɺΩϟογϡ(&5༻63-Λऔಘ͢ΔɻUBS CBMM͕ಘΒΕΔ IFSVLVSVOͯ͠ɺμϯϩʔυͨ͠Ωϟογϡͷ͏ͪɺ WFOEPSIFSPLVҎ֎Λͯ͢আ͢Δ UBSCBMMʹݻΊͯɺͰಘΒΕͨ165༻63-ʹ165͢Δ
࣍ճͷσϓϩΠͰ৽نʹCVOEMFJOTUBMMߦΘΕΔ IUUQTHJUIVCDPNIFSPLVIFSPLVSFQPCMPCWDPNNBOETQVSHF@DBDIFKT
ࢀߟWFOEPSIFSPLVͷத vendor └── heroku ├── buildpack_ruby_version (ruby-2.4.4) ├── buildpack_version (v196)
├── bundler_version (1.15.2) ├── ruby_version (ruby 2.4.4p296 (2018-03-28 revision 63013) [x86_64-linux]) ├── rubygems_version (2.6.14.1) ├── secret_key_base ([SECRET]) └── stack (heroku-16) ˞IFSPLVSVCZCVJMEQBDLΛ͍ͬͯΔ߹ɻ ׅހϑΝΠϧͷத
ࢀߟCVJMENFUBEBUB"1*ͷ ϨεϙϯεʢQSJWBUF"1* ʣ $ curl -n https://api.heroku.com/apps/github-organization-watcher/build-metadata \ -H "Accept:
application/vnd.heroku+json; version=3.build-metadata" { "app":{ "id":"<UUID>", "name":"github-organization-watcher" }, "cache_delete_url":"<CACHE_URL>", "cache_get_url":"<CACHE_URL>", "cache_put_url":"<CACHE_URL>", "repo_delete_url":"<REPO_URL>", "repo_get_url":"<REPO_URL>", "repo_put_url":"<REPO_URL>" } # <CACHE_URL> # https://s3-external-1.amazonaws.com/heroku_repos/heroku.com/cache/<NUMBERS>.tgz? AWSAccessKeyId=<SECRET>&Signature=<SECRET>&Expires=<NUMBERS> # <REPO_URL> # https://s3-external-1.amazonaws.com/heroku_repos/heroku.com/<NUMBERS>.tgz? AWSAccessKeyId=<SECRET>&Signature=<SECRET>&Expires=<NUMBERS>
͔ͬͨ͜ͱ w IFSPLVSFQPHDϦϙδτϦαΠζ͕ݮΔͩ ͚ɻσϓϩΠଟগ͘ͳΔͱࢥ͏͕ɺ4MVHα ΠζݮΒͳ͍ w IFSPLVSFQPQVSHF@DBDIF͕4MVHαΠζΛݮ Β͢
͞Βʹ͔ͬͨ͜ͱ w 4MVHͷUBSCBMM4ͷIFSPLVTMVHTVTόέοτʹ͋Δ Α͏ͩ w ϦϙδτϦͷUBSCBMM4ͷIFSPLV@SFQPTόέοτͷ IFSPLVDPNҎԼʹ͋ΔΑ͏ͩ w ΩϟογϡͷUBSCBMM4ͷIFSPLV@SFQPTόέοτͷ DBDIFҎԼʹ͋ΔΑ͏ͩ
˞)FSPLVͷ3FHJPO͕VTͷ߹ɻ4ͷ3FHJPOͯ͢7JSHJOJB T FYUFSOBM ͩͬͨ
σϓϩΠͷྲྀΕʢ࠶ܝʣ )FSPLV"QQΛ࡞Δʢ࠷ॳͷҰճʣ HJUQVTI͢Δ 4MVH͕࡞ΒΕΔ 4MVHΛಡΈࠐΈɺ৽ͨͳ%ZOP͕࡞ΒΕΔ IUUQTEFWDFOUFSIFSPLVDPNBSUJDMFTIPXIFSPLVXPSLT
σϓϩΠͷྲྀΕʢ࠶ܝʣ )FSPLV"QQΛ࡞Δʢ࠷ॳͷҰճʣ HJUQVTI͢Δ 4MVH͕࡞ΒΕΔ 4MVHΛಡΈࠐΈɺ৽ͨͳ%ZOP͕࡞ΒΕΔ IUUQTEFWDFOUFSIFSPLVDPNBSUJDMFTIPXIFSPLVXPSLT
4MVH UH[ ϦϙδτϦ UH[ Ωϟογϡ UH[ HJUQVTI 4MVHDPNQJMFS (JUϦϙδτϦ #VJMEQBDL
T ૾ਤ
ײ w )FSPLVྑ͍αʔϏεʢೋճʣ w 4MVHCVJMENFUBEBUB͔Β૾Λૡཱ͖ͯΒΕ Δ w ۀͰαʔϏεΛ࡞Δͱ͖ɺ·ͣ)FSPLVͰ࡞ ΕΔ͔ߟ͑Δͱྑ͍ͱࢥͬͨ
ࡶײ w ࠓճʮۀͰಘͨࣝ ЋʯΛͬͯൃද͢ Δ͜ͱ͕ग़དྷͨ w ձ͕ࣾ৽͍ٕ͠ज़ΛࣗવͱֶशͰ͖ΔͰ͋Δ ͱɺ݈શͩͱࢥͬͨ w ൃදͷͰʮݸਓͷֶशʯͱʮۀͰಘͨࣝʯ
ΛબͰ͖Δͱྑ͍
ใऩू w IUUQTEFWDFOUFSIFSPLVDPNDBUFHPSJFTIFSPLVBSDIJUFDUVSF w Ұ࣍ใɻॆ࣮͓ͯ͠ΓಡΈ͍͢ w IUUQTCMPHIFSPLVDPN IUUQTEFWDFOUFSIFSPLVDPNDIBOHFMPH w )FSPLVͷ࠷৽ใ
w IUUQCIBUFOBOFKQTFBSDIUBH R)FSPLVTBGFPOTPSUSFDFOUVTFST w ΧδϡΞϧͳใ w )FSPLV+14MBDL6TFS(SPVQ w ࠷ۙ4JHO6Qͨ͠
͓ΘΓ