65738


たとえば、 ruby/python/js といったスクリプト系言語で(Web)アプリを記述した場合には、それを用いて実際のサーバーにデプロイする際には、

  1. インタプリター本体を管理するツール(e.g. rbenv/pyenv/nodenv)をいれて、想定バージョンのインタプリタをインストール
  2. ソースコードをアップロード
  3. パッケージ管理ライブラリ(e.g. gem, pip, npm)を用いて依存ライブラリのインストール

を行うかなと思っています。

# 質問

rust で何かしらの (cli や web) アプリを作成した際に、それを既存の unix
系サーバーにデプロイするにあたっては、どのようなフローが一般的でしょうか？


CC BY-SA 4.0
2020-04-18T05:55:42.917
65735
2020-04-18T08:10:09.240
754
question
rust
rust で書いた (cli) アプリを、素朴なサーバー(e.g. ec2 など)にデプロイする際のステップは？


Rustでアプリを開発するときの基本的な手順はすでにご存知であるという前提で回答しますね。例えば`Cargo.toml`で依存クレートを指定したり、`cargo
build
--release`でアプリをビルドしたりする方法については知っているものとします。（ご存知なければ[この辺](https://doc.rust-
jp.rs/book/second-edition/ch01-03-hello-cargo.html)を読んでください）

Rustはコンパイル言語ですので、Rubyなどのスクリプト言語とは異なり、アプリを実行する環境にコンパイラなどのRustツールチェインをインストールする必要はありません。開発環境のOSとデプロイ環境のOSが同じなら、基本的に`target/release`ディレクトリにある単一のバイナリファイルをサーバーにコピーするだけでデプロイが完了します。

例えばUbuntuでビルドしたバイナリをEC2のUbuntu環境にコピーしたときは当然動きますし、同じLinuxなら別のディストリビューション（Amazon
Linuxなど）にコピーしても動くのが普通です。

バイナリファイルには依存しているクレートの内容も含まれています。ですから `gem install`のような操作も不要です。

一方、バイナリファイルに含まれないものもあります。

  * Webアプリの場合はHTMLテンプレートや画像のようなリソースファイル
  * Rust以外の言語で書かれたライブラリ（ネイティブライブラリなど） 
    * 例：MySQL、PostgreSQLのクライアントライブラリ、OpenSSL

前者はバイナリと一緒にコピーして、後者はOSの`apt`や`yum`などのパッケージ管理システムでインストールすることになります。

もし開発環境とデプロイ環境のOSが異なるなら、CIを使って自動ビルドするのが良いでしょう。また、OSが一致する場合でも、手元でビルドすると何かとミスをする機会が増えてしまうので、CIで自動ビルドするほうが安全かもしれません。リポジトリをGitHubに置いているならGitHub
Actions、TravisCI、CircleCIなどが使えますし、GitLabに置いているならGitLab Actionsが使えます。

まとめると、

  * CIをセットアップして、デプロイ環境向けのバイナリを自動ビルドできるようにする 
    * Webアプリなどではリソースファイルとバイナリを一緒にしてtarballに固めておく
  * CIで作成したファイルをサーバーにコピーする
  * ネイティブライブラリをサーバーにインストールする

なお、Linuxではネイティブライブラリもバイナリに含めることもできます。以前、記事を書いたので参考にしてください。

  * [RustのLinux muslターゲット（その1：Linux向けのポータブルなバイナリを作る）](https://blog.rust-jp.rs/tatsuya6502/posts/2019-12-statically-linked-binary/)


CC BY-SA 4.0
2020-04-18T08:10:09.240
65738
2020-04-18T08:10:09.240
14101
65735
answer