Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Heroku と EC Booster と私 & Heroku ちょこっと Deep Dive
Takashi Masuda
November 09, 2018
Technology
0
530
Heroku と EC Booster と私 & Heroku ちょこっと Deep Dive
2018-11-09 フィードフォース社内技術勉強会のプレゼン資料です。
https://developer.feedforce.jp/entry/2018/11/14/140000
Takashi Masuda
November 09, 2018
Tweet
Share
More Decks by Takashi Masuda
See All by Takashi Masuda
本を聴く毎日を送っています
masutaka
0
13
ボッチLookML開発者兼データ整備人を連れてきたよ!
masutaka
0
23
ここがつらいよ普段使いのLinux
masutaka
0
20
4月から取り組んできたLookerの導入から実装までのお話
masutaka
0
57
HerokuでSidekiqを監視する方法を確立した
masutaka
0
160
デプロイで止まらないバッチ処理を求めて
masutaka
1
44
デプロイ元をCircleCIからHerokuに乗り換えた
masutaka
0
48
esaを支えたい技術
masutaka
0
510
Introduce heroku.yml
masutaka
0
410
Other Decks in Technology
See All in Technology
越境チャレンジの現在地 〜Epic大臣制度の今〜
yousak
0
860
ラブグラフ紹介資料 〜プロダクト解体新書〜 / Lovegraph Product Deck
lovegraph
0
150
ノーメンテナンス運用実現のためのノウハウ/ColoplTech-05-02
colopl
0
160
覗いてみよう!現場のスクラムチーム
tkredman
0
1k
SlackBotで あらゆる業務を自動化。問い合わせ〜DevOpsまで #CODT2022
kogatakanori
0
740
Build 2022で発表されたWindowsアプリ開発のあれこれ振り返ろう
hatsunea
1
370
2022年度新卒技術研修「良いコードの書き方」講義
excitejp
PRO
0
290
PUTとPOSTどっち使う?
hankehly
0
180
IoTLT88-NTKanazawa-laundry-dry
yukima0707
0
210
スタートアップと技術選定と AWS
track3jyo
PRO
0
300
ROS再入門-はじめてのSLAM-
miura55
0
390
Azure Arc Virtual MachineとAzure Arc Resource Bridge / VM provisioning through Azure portal on Azure Stack HCI (preview)
sashizaki
0
110
Featured
See All Featured
Art, The Web, and Tiny UX
lynnandtonic
280
17k
The Art of Programming - Codeland 2020
erikaheidi
32
10k
How to name files
jennybc
40
61k
StorybookのUI Testing Handbookを読んだ
zakiyama
5
2.2k
The World Runs on Bad Software
bkeepers
PRO
57
5.3k
Docker and Python
trallard
27
1.6k
Keith and Marios Guide to Fast Websites
keithpitt
404
21k
WebSockets: Embracing the real-time Web
robhawkes
57
5.2k
Infographics Made Easy
chrislema
233
17k
A Tale of Four Properties
chriscoyier
149
21k
Scaling GitHub
holman
451
140k
How To Stay Up To Date on Web Technology
chriscoyier
780
250k
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ͨ͠
͓ΘΓ