scramble cadenza

技術ネタのガラクタ置き場

capistrano-net_storage を使ってみた

イントロ

小さいプロジェクトで capistrano を使っていると、最初は問題ないものの、気づいたらサービスが成長してサーバーが増えてきて、デプロイに時間がかかってくる、という話はよくある(?)と思う。

デプロイに時間がかかると色々とストレスで、所謂 pull 型 deploy を検討したくなってくる。

今の pull 型 deploy ってどんなものがあるのだろう、という疑問から色々調べてみて、最終的には capistrano-net_storage を採用することにした。

capistrano-net_storage を使ってみて、

  • pull 型 deploy の恩恵を受けられている
  • 移行も問題なく行われた
  • 数ヶ月運用した限りでは、大きな問題は出てない

ということで、ここまでの知見をまとめてみた。

前提

  • 小規模 ~ 中規模なサービスです
  • 色々と古臭い事情により、Docker 化までたどり着いていない
  • capistrano を使っている
  • 現在のプロジェクトは、master にマージされたら即 deploy
    • 頻度は一日 2 ~ 5 回

対抗馬

有名所はこのあたり、なのかな。

capistrano-net_storage の良いところ

他の候補と比べて優位に感じた部分。

  • capistrano の plugin として実装されていて、現在 capistrano を使っているプロジェクトでも、移行が比較的楽
  • デプロイ対象のサーバー側に、特別なミドルウェアをインストールする必要が無い
    • 必要なものは awscli だけ
  • capistrano の資産を活かせる

現状の環境と比較し、ちょっと pull 型にしてみたいんや! という自分のワガママに答えてくれたのが超嬉しい。

導入

公式

DeNADev/capistrano-net_storage: Capistrano Plugin for Fast Deployment via Remote Storage DeNADev/capistrano-net_storage-s3: Capistrano::NetStorage Plugin for Deployment via Amazon S3

capistrano-net_storage とは

絵を見れば、なんとなくどんな事をやっているかわかる。

  • capistrano で pull 型 deploy の実装
  • DeNA 先輩がメンテしていらっしゃる

使い方

REDAME.md の通り。以下を config/deploy.rb に書くだけ。

set :scm, :net_storage
set :net_storage_transport, Capistrano::NetStorage::S3::Transport

# デプロイ対象サーバー(図で言うところの `app server`)で unzip が無い場合はこちら
set :net_storage_archiver, Capistrano::NetStorage::Archiver::TarGzip

# s3 の bucket, prefix 名
set :net_storage_s3_bucket, 'capistrano-deployments'
set :net_storage_s3_archives_directory, 'awesome-project'

感想

  • 導入が楽で効果も高いし、コスパ良し。
    • capistrano の良いところを使いつつ、pull 型 deploy できるのは嬉しい
    • 中身をみたけど、しっかりと作られている印象
  • capistrano に乗っかっているので、元のやり方に戻したい!という場合でもすぐに戻せた
    • 「普通の deploy -> capistrano-net_storage の deploy -> 普通の deploy」みたいのも動くのが嬉しい
      • 突然失敗しても安心して対応できる
    • 別のやり方だと、こう簡単にはうまくいかないと思う
    • デプロイ回数が多いプロジェクトなので「突然デプロイできなくなるのは困る」という大人の事情もあった
  • 図の (3) の download する部分が awscli で実装されている点に注意
    • deploy 対象のサーバーに awscli を install する必要があることを意味する
      • 入っていないと、プラグインを自作することになる、と思う。
    • デフォルトの awscli が一番楽な気はする
      • plugable になっていて、自分でカスタマイズできるようになっている
  • deploy サーバーに zip が残るので、思わぬ容量増加に注意
    • .local_repo というディレクトリ内に、世代分の zip ファイル + ディレクトリが作成される
    • そこそこ大きい rails のプロジェクトの場合は、気づかぬ間にディスクが圧迫されるかも

まとめ

capistrano 使っているなら capistrano-net_storage 素晴らしいと思う。
現代にはもっと良い技術が沢山あり、そちらにサラッと乗り換えたいものの、色々過去の経緯なりで中々そうはいかないこともある。

そんな状況下で、「サーバー台数が増えてもデプロイに時間がかからない」はかなり心強い。
コスパの良いその場しのぎになった、というお話でした。