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
6
最近の情報収集方法 2025
masutaka
0
82
自分のブログをCloudFront+HerokuからCloud Runに移行した
masutaka
0
180
BigQuery経由で使うGoogleスプレッドシートのスキーマ管理
masutaka
0
360
本を聴く毎日を送っています
masutaka
0
100
ボッチLookML開発者兼データ整備人を連れてきたよ!
masutaka
0
150
ここがつらいよ普段使いのLinux
masutaka
0
370
4月から取り組んできたLookerの導入から実装までのお話
masutaka
0
190
HerokuでSidekiqを監視する方法を確立した
masutaka
0
650
Other Decks in Technology
See All in Technology
AIはどのように 組織のアジリティを変えるのか?
junki
4
1.3k
Bucharest Tech Week 2026 - Guardians of the Cloud-Native Galaxy
edeandrea
PRO
0
140
IaC コードを資産へ:AWS CDK 社内ライブラリと横断展開 / aws-summit-japan-2026
gotok365
10
1.6k
AI-DLCを “そのまま導入しなかった”話 ~組織に合わせてアジャストした 私たちの実践共有~
hiroramos4
PRO
1
420
AIチャットの改善から見えた、良いAI体験とは / What Constitutes a Good AI Experience: Insights from Improving AI Chat
kubode
0
120
技術・能力を向上する原理原則 #きのこセッションa #きのこ2026
bash0c7
0
110
Zenoh on Zephyr on LiteX
takasehideki
2
110
Claude Codeをどのように キャッチアップしているか
oikon48
13
8.8k
自分が詳しくない領域でAIを使う #プロヒス2026
konifar
20
7.4k
クレデンシャル流出 ― 攻撃 3 時間 vs 復旧 10 時間。この非対称性にどう備えるか
kazzpapa3
3
550
ロボティクスの技術 / Robotics Technology
ks91
PRO
0
130
Agile and AI Redmine Japan 2026
hiranabe
4
470
Featured
See All Featured
The Cost Of JavaScript in 2023
addyosmani
55
10k
Leo the Paperboy
mayatellez
7
1.9k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
140
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
180
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
330
New Earth Scene 8
popppiees
3
2.4k
How to Ace a Technical Interview
jacobian
281
24k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.7k
Designing for Performance
lara
611
70k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.5k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
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ͨ͠
͓ΘΓ