Skip to content

Instantly share code, notes, and snippets.

@fujiwara
Last active March 18, 2016 11:00
Show Gist options
  • Save fujiwara/6a9dbb6353d31c03f396 to your computer and use it in GitHub Desktop.
Save fujiwara/6a9dbb6353d31c03f396 to your computer and use it in GitHub Desktop.

#[fit] Stretcher in 5 min

2015-8-5 @fujiwara


Stretcher is 何

github.com/fujiwara/stretcher

A 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

fit original


Deployment process

fit

  1. アプリケーションをbuildしてtar.gzにする
  2. 手順書(manifest)を書く
  3. tar.gz, manifestをS3(or httpd)に上げる
  4. consul event で manifest URLを通知

consul event -name deploy s3://...

✄--------- ここまでstretcherではない -------✄


fit

consul watch -type event -name deploy stretcher

✄------------ stretcherここから ------------✄

  1. eventからmanifest URLを取得
  2. tar.gzを取得してTMPDIRに展開
  3. rsync -av --deleteで更新
  4. post command実行
  • アプリケーション再起動など

Manifest

src: s3://example.com/app.tar.gz
checksum: e0840daaa97cd2cf2175f9e5d133ffb3324a2b93
dest: /home/stretcher/app
commands:
  pre:
    - echo 'staring deploy'
  post:
    - echo 'deploy done'
  success:
    - cat >> /path/to/success.log
  failure:
    - cat >> /path/to/failure.log
excludes:
  - "*.pid"
  - "*.socket"

某本番環境

AWS 上の某サービス (50〜100 instances)

tar.gz ~200MB

consul event 送信から約10秒で完了 (rollbackも!)

2015/08/05 14:58:30 Starting up stretcher agent
2015/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_src648982332
2015/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/sec
total size is 359702435  speedup is 453.59
2015/08/05 14:58:36 invoking command: /home/xxx/web/refresh_services.sh
2015/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 Dashboard

github.com/fujiwara/consul-kv-dashboard

speakerdeck.com/fujiwara3/consul-kv-dashboard

inline


Demo

stretcher/examples


オートスケールへの対応

Consul KV に最新の manifest URL を保存

インスタンス起動後

  1. consul join
  2. 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~

fit

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment