#hashi_wantedly
Stretcher in 5 min2015-8-5 @fujiwara
View Slide
Stretcher is Կgithub.com/fujiwara/stretcherA deployment tool with Consul / Serf event.Consul / Serf ͱ࿈ܞͯ͠ಈ͘σϓϩΠπʔϧ(࣮ Consul/Serf ͳ͠Ͱಈ͖·͢)
ͳͥ࡞ͬͨͷ͔(Ҏલ) rsync ʹΑΔதԝϗετ͔ΒͷdeployΦʔτεέʔϧʹରԠͰ͖ͳ͍֤ϗετ͔ΒrsyncͰpull? → buildதʹrsync͞ΕͨΒ…͕ଟ͍ͱฒྻssh + rsync͕ͭΒ͍AMI࡞Γ͠ & ΠϯελϯεೖΕସ͑ͯͳ͍inspired by github.com/sorah/mamiya,AWS CodeDeploy
ઃܭࢥAWS͡Όͳͯ͘ಈ͘GoͰॻ͘(ࣗͷdeployָ͕)rsync͔ͯ͠ΒίϚϯυ࣮ߦɺͱ͍͏ϑϩʔ౿ऻConsul eventͰΠϕϯτ௨Consul ͱૄ݁߹ (consul watch Ͱىಈ)
Architecture
Deployment process1. ΞϓϦέʔγϣϯΛbuildͯ͠tar.gzʹ͢Δ2. खॱॻ(manifest)Λॻ͘3. tar.gz, manifestΛS3(or httpd)ʹ্͛Δ4. consul event Ͱ manifest URLΛ௨consul event -name deploy s3://...✄--------- ͜͜·ͰstretcherͰͳ͍ -------✄
consul watch -type event -name deploy stretcher✄------------ stretcher͔͜͜Β ------------✄1. event͔Βmanifest URLΛऔಘ2. tar.gzΛऔಘͯ͠TMPDIRʹల։3. rsync -av --deleteͰߋ৽4. post command࣮ߦ• ΞϓϦέʔγϣϯ࠶ىಈͳͲ
Manifestsrc: s3://example.com/app.tar.gzchecksum: e0840daaa97cd2cf2175f9e5d133ffb3324a2b93dest: /home/stretcher/appcommands:pre:- echo 'staring deploy'post:- echo 'deploy done'success:- cat >> /path/to/success.logfailure:- cat >> /path/to/failure.logexcludes:- "*.pid"- "*.socket"
ຊ൪ڥAWS ্ͷαʔϏε (50ʙ100 instances)tar.gz ~200MBconsul event ૹ৴͔Β10ඵͰྃ (rollback!)2015/08/05 14:58:30 Starting up stretcher agent2015/08/05 14:58:30 Waiting for consul events from STDIN...2015/08/05 14:58:30 Executing manifest: s3://...2015/08/05 14:58:33 Extract archive: /dev/shm/stretcher539962129 to /dev/shm/stretcher_src6489823322015/08/05 14:58:36 rsync [-av --delete --exclude-from/dev/shm/stretcher_src648982332/conf/rsync_exclude.web/dev/shm/stretcher_src648982332/ /home/xxx/web/]2015/08/05 14:58:36 sending incremental file list...sent 787780 bytes received 5230 bytes 1586020.00 bytes/sectotal size is 359702435 speedup is 453.592015/08/05 14:58:36 invoking command: /home/xxx/web/refresh_services.sh2015/08/05 14:58:41 success.2015/08/05 14:58:41 Deploy manifest succeeded.
ྃΛͭΠϕϯτૹ৴ݩͰશͷ࣮ߦ͕͔ྃΒͳ͍• post commandͰ deploy ID Λ KV ʹૹ৴• Consul KV Dashboard Ͱશͷ ID ͕ἧ͏ͷΛͭ
ϩάΛݟΔ͕ଟ͍ͱ…• success/failure command Ͱ࣮ߦϩάΛ KV ʹ• Consul KV Dashboard Ͱঢ়ଶ͕มԽͨ͠ΒτϦΨˠ௨
Consul KV Dashboardgithub.com/fujiwara/consul-kv-dashboardspeakerdeck.com/fujiwara3/consul-kv-dashboard
Demostretcher/examples
ΦʔτεέʔϧͷରԠConsul KV ʹ࠷৽ͷ manifest URL ΛอଘΠϯελϯεىಈޙ1. consul join2. stretcher ࣮ߦ3. ࠷৽ͷmanifest URLΛKV͔Βऔಘ4. ࣗࣗʹ event Λૹ৴
ΦʔτεέʔϧͰͷҙ× AMIʹ͍ͬͯΔݹ͍ΞϓϦ͕ىಈ○ ࠷৽ͷ deploy IDͰͳ͍߹ىಈ͠ͳ͍deploy࣌: unique ͳ ID Λൃߦ• ϑΝΠϧʹॻ͍ͯ tar ʹೖΕΔ• Consul KV ʹೖΕΔىಈ࣌:ϩʔΧϧϑΝΠϧͷ ID ͱ KV Λൺֱ• ৯͍ҧͬͯͨΒ sleep 10 && exit → daemontoolsͰ࠶ىಈ
Serf ରԠ (v0.1.0~)serf agent -event-handler="user:deploy=stretcher"serf event deploy "s3://..."ڥม SERF_USER_EVENT Ͱಈ࡞Γସ͑ͳͷͰ…echo "s3://..." | SERF_USER_EVENT=deploy stretcher࣮ Consul / Serf Ͱͳͯ͘ىಈՄೳ
એYAPC::Asia 2015Ͱͬͱ͍Ζ͍Ζ͠·͢2015-8-21 13:10~