初投稿です。Rust で書いたウェブアプリケーションが Heroku で動くと嬉しい、という話をします。
ローカルで動かす
これは、GET /hello-heroku
と叩くと "Hello, Heroku!"
と喋るアプリケーションです。
Cargo.toml
[package]
name = "hello-heroku"
version = "0.1.0"
authors = []
[dependencies]
shio = "0.2.0"
structopt = "0.1.6"
structopt-derive = "0.1.6"
src/main.rs
extern crate shio;
extern crate structopt;
#[macro_use]
extern crate structopt_derive;
use shio::prelude::*;
use structopt::StructOpt;
#[derive(StructOpt)]
#[structopt(name = "hello-heroku", about = "Hello, Heroku!")]
struct Options {
#[structopt(short = "p", long = "port", default_value = "7878")]
port: u16,
}
fn hello_heroku(_: Context) -> Response {
Response::with("Hello, Heroku!")
}
fn main() {
let options = Options::from_args();
Shio::default()
.route((Method::Get, "/hello-heroku", hello_heroku))
.run(format!(":{}", options.port))
.unwrap()
}
structopt という crate が便利なので使うと良いと思います。
$ cargo run -- -p 8000
$ curl localhost:8000/hello-heroku
Hello, Heroku!
楽しい!₍₍ (ง╹◡╹)ว ⁾⁾
Docker で動かす
これは、アプリケーションを乗せたイメージです。Heroku で動かす場合、公開するポート番号は環境変数 PORT
に渡される1ので、そのようにします。
Dockerfile
FROM rust:1.22.1
RUN mkdir /app
COPY ./Cargo.toml /app/Cargo.toml
COPY ./src /app/src
WORKDIR /app
RUN cargo build --release
CMD cargo run --release -- -p $PORT
ビルドにわりと時間かかるのが最高です。私のマシンが非力すぎるという説もある。
$ docker build -t hello-heroku .
$ docker run -it --rm -e "PORT=8000" -p 8000:8000 hello-heroku
$ curl localhost:8000/hello-heroku
Hello, Heroku!
楽しい!₍₍ (ง╹◡╹)ว ⁾⁾
Heroku で動かす
イメージをプッシュし、アプリケーションをデプロイします。
$ heroku container:push --app YOUR_APP_NAME web
やりました。
$ curl https://YOUR_APP_NAME.herokuapp.com/hello-heroku
Hello, Heroku!
楽しい!₍₍ (ง╹◡╹)ว ⁾⁾
やっていく
Docker を使うと Heroku にシュッとデプロイできて最高です。SSR (Server-Side Rust) をやっていきましょう。