🦀

100日後にRustをちょっと知ってる人になる: [Day 56]はじめての Fermyon Cloud

2022/10/25に公開

Day 56 のテーマ

今日は2022年10月25日、ということで日本時間の昨夜未明から KubeCon + CloudNativeCon とそれの関連開催の各種カンファレンスがアメリカのデトロイトで始まりました。
昨晩はまだ KubeCon + CloudNativeCon 本体は開催されていなかったのですが、関連開催のいくとかのカンファレンスの中からぼくは Cloud Native Wasm Day を見ていました。
文字通り、Wasm、WebAssembly 関連の発表があったわけなのですが、その中には先日も少し記事化していた Wasm Workers Server を提供している VMware からの発表もありました。
ですが、今回一番ぼくが関心を持ったのは、正確には以前から持っていたのは、Fermyon (日本語的にはフェルミオンと発音) の各種発表でした。中でも Fermyon Cloud の発表は、ついにやってきましたね、という感じでした。

というわけで、今日は はじめての Fermyon Cloud 、という感じで触ってみたいと思います。

Fermyon Cloud の前に

WebAssembly アプリケーションの実行環境としての Fermyon Cloud の前に、本来だったら Fermyon が提供している次のプロジェクトを説明しておく必要があるのです。

  • Spin
  • Fermyon Platform

今日はそれを一旦スキップして、WebAssembly アプリケーションをビルド&デプロイして動作する流れを紹介したいと思います。

Spin

Spin は、一言で説明するならば、WebAssembly を使用して、アプリケーションを構築、デプロイ、実行するためのフレームワークである、といえます。
また、Spin は、アプリケーションの作成、配布、実行を支援する CLI を提供しています。

この Spin の導入の仕方や使い方などは、また今度。

Fermyon Platform

Fermyon Platform は、Spin によるアプリケーションや、その他の互換性のある WebAssembly ワークロードをホストするためのプラットフォームです。

Fermyon は 動作する際につぎのソリューションを使用しています:

この Fermyon Platform についても、また今度。

Fermyon Cloud

Spin をリリースした日に次のような質問があったそうです。

ホスティングサービスはありますか?Spinはすごいと思うけど、自分でサーバーを管理したくないんです。

開発者が自分のインフラをセットアップする必要がなくなると、もっと楽しい経験をすることができるはずだ、というモチベーションから Fermyon Cloud は生まれたそうです。

Fermyon Cloud は、Spin による Webアプリケーションを実行するためのプラットフォームです。
また、Fermyon Cloud のダッシュボードにログインして、アプリケーションの確認、ログファイルの閲覧、デプロイメントの管理を行うことができます。

この Fermyon CloudSpin アプリケーションを動作させるというところから想像できると思いますが、Fermyon CloudFermyon Platform の上に構築されています。

  • リリース管理: Bindle
  • スケジューリング: Nomad
    など

Fermyon Cloud へのアプリケーションデプロイ

繰り返しますが、Spin についての詳細な説明は今回はしませんので、そういうものだと思ってください。

0. テンプレートの取得

初めて Spin を使う場合、プロジェクトテンプレートが存在しないので、取得を行います。

spin templates install --git https://github.com/fermyon/spin
Copying remote template source
Installing template redis-rust...
Installing template http-grain...
Installing template http-swift...
Installing template http-c...
Installing template http-rust...
Installing template http-go...
Installing template http-zig...
Installing template redis-go...
Installed 8 template(s)

+-----------------------------------------------------------------+
| Name         Description                                        |
+=================================================================+
| http-c       HTTP request handler using C and the Zig toolchain |
| http-go      HTTP request handler using (Tiny)Go                |
| http-grain   HTTP request handler using Grain                   |
| http-rust    HTTP request handler using Rust                    |
| http-swift   HTTP request handler using SwiftWasm               |
| http-zig     HTTP request handler using Zig                     |
| redis-go     Redis message handler using (Tiny)Go               |
| redis-rust   Redis message handler using Rust                   |
+-----------------------------------------------------------------+

1. Spin プロジェクトの作成

spin CLI を使って次のコマンドで Spin プロジェクトを作成します。

spin new <テンプレート名> <プロジェクト名>

ここでは、Rust のプロジェクトを作成します。

spin new http-rust hello-rust

以下、対話式のオプション入力です。

Project description: Sping Getting Started
HTTP base: /
HTTP path: /...

2. 生成された Rust コード

以下のコードが自動生成されます:

  • lib.rs
  • Cargo.toml
  • spin.toml

ライブラリクレートのコード(lib.rs):

use anyhow::Result;
use spin_sdk::{
    http::{Request, Response},
    http_component,
};

/// A simple Spin HTTP component.
#[http_component]
fn hello_rust(req: Request) -> Result<Response> {
    println!("{:?}", req.headers());
    Ok(http::Response::builder()
        .status(200)
        .header("foo", "bar")
        .body(Some("Hello, Fermyon".into()))?)
}

Cargo.toml

[package]
name = "hello-rust"
authors = ["shinyay <shinya.com@gmail.com>"]
description = "Sping Getting Started"
version = "0.1.0"
edition = "2021"

[lib]
crate-type = [ "cdylib" ]

[dependencies]
# Useful crate to handle errors.
anyhow = "1"
# Crate to simplify working with bytes.
bytes = "1"
# General-purpose crate with common HTTP types.
http = "0.2"
# The Spin SDK.
spin-sdk = { git = "https://github.com/fermyon/spin", tag = "v0.6.0" }
# Crate that generates Rust Wasm bindings from a WebAssembly interface.
wit-bindgen-rust = { git = "https://github.com/bytecodealliance/wit-bindgen", rev = "cb871cfa1ee460b51eb1d144b175b9aab9c50aba" }

[workspace]

spin.toml:

spin_version = "1"
authors = ["shinyay <shinyay@abc.xyz>"]
description = "Sping Getting Started"
name = "hello-rust"
trigger = { type = "http", base = "/" }
version = "0.1.0"

[[component]]
id = "hello-rust"
source = "target/wasm32-wasi/release/hello_rust.wasm"
[component.trigger]
route = "/..."
[component.build]
command = "cargo build --target wasm32-wasi --release"

3. Spin アプリケーションのビルド

作成したアプリケーションのディレクトリに異動し、spin CLI を使って次のコマンドででビルドします:

spin build
Executing the build command for component hello-rust: cargo build --target wasm32-wasi --release
   Compiling version_check v0.9.4
   Compiling anyhow v1.0.66
   Compiling memchr v2.5.0
   Compiling pulldown-cmark v0.8.0
   Compiling tinyvec_macros v0.1.0
   Compiling proc-macro2 v1.0.47
   Compiling bitflags v1.3.2
   Compiling quote v1.0.21
   Compiling unicode-xid v0.2.4
   Compiling id-arena v2.2.1
   Compiling unicode-ident v1.0.5
   Compiling syn v1.0.103
   Compiling unicode-segmentation v1.10.0
   Compiling wit-bindgen-gen-rust-wasm v0.2.0 (https://github.com/bytecodealliance/wit-bindgen?rev=cb871cfa1ee460b51eb1d144b175b9aab9c50aba#cb871cfa)
   Compiling async-trait v0.1.58
   Compiling bytes v1.2.1
   Compiling fnv v1.0.7
   Compiling itoa v1.0.4
   Compiling percent-encoding v2.2.0
   Compiling tinyvec v1.6.0
   Compiling form_urlencoded v1.1.0
   Compiling heck v0.3.3
   Compiling unicase v2.6.0
   Compiling http v0.2.8
   Compiling unicode-normalization v0.1.22
   Compiling wit-parser v0.2.0 (https://github.com/bytecodealliance/wit-bindgen?rev=cb871cfa1ee460b51eb1d144b175b9aab9c50aba#cb871cfa)
   Compiling wit-bindgen-gen-core v0.2.0 (https://github.com/bytecodealliance/wit-bindgen?rev=cb871cfa1ee460b51eb1d144b175b9aab9c50aba#cb871cfa)
   Compiling wit-bindgen-gen-rust v0.2.0 (https://github.com/bytecodealliance/wit-bindgen?rev=cb871cfa1ee460b51eb1d144b175b9aab9c50aba#cb871cfa)
   Compiling wit-bindgen-rust-impl v0.2.0 (https://github.com/bytecodealliance/wit-bindgen?rev=cb871cfa1ee460b51eb1d144b175b9aab9c50aba#cb871cfa)
   Compiling wit-bindgen-rust v0.2.0 (https://github.com/bytecodealliance/wit-bindgen?rev=cb871cfa1ee460b51eb1d144b175b9aab9c50aba#cb871cfa)
   Compiling spin-macro v0.1.0 (https://github.com/fermyon/spin?tag=v0.6.0#12a50379)
   Compiling spin-sdk v0.6.0 (https://github.com/fermyon/spin?tag=v0.6.0#12a50379)
   Compiling hello-rust v0.1.0 (/Users/yanagiharas/Works/docs/doc-to-zenn/codes/day_56_fermyon-cloud/hello-rust)
    Finished release [optimized] target(s) in 11.43s
Successfully ran the build command for the Spin components.

4. Fermyon Cloud へのログイン

spin CLI を使って次のコマンドで Fermyon Cloud にログインします。

spin login
Copy your one-time code:

ABCDEFGH

...and open the authorization page in your browser:

https://cloud.fermyon.com/device-authorization

Waiting for device authorization...
Waiting for device authorization...
Waiting for device authorization...
Waiting for device authorization...
Waiting for device authorization...
Device authorized!

5. Fermyon Cloud へのデプロイ

spin CLI を使って次のコマンドでビルドしたアプリケーションを Fermyon Cloud にデプロイします。

spin deploy
Uploading hello-rust version 0.1.0+r5cc7a066...
Deploying...
Waiting for application to become ready........ ready
Available Routes:
  hello-rust: https://hello-rust-abcdefgh.fermyon.app (wildcard)

6. Fermyon Cloud のアプリケーションにアクセス

まず、Fermyon Cloud のダッシュボードにアクセスします。

次に、ダッシュボードから表示されているデプロイしたアプリケーション hello-rust をクリックするか、または spin deploy の実行時に表示されていた Available Routes にアクセスします。

Hello, Fermyon と表示されているアプリケーションにアクセスが出来ました。

Day 56 のまとめ

今回は、今日開催された Cloud Native Wasm Day でアナウンスされた Fermyon Cloud について紹介しました。
実際の細かなアプリケーションの作成に関わる、Spin などは今回の説明からは割愛しましたけれど流れは分かったと思います。

WebAssembly のソースを作った後、ビルドをしてからのデプロイまでの流れの中で、生成された WebAssembly のイメージについて特に意識することもなかったと思います。

このように、Fermyon Cloud、そして Spin を使うと WebAssembly であることを忘れてしまいそうなくらいのコード作成へのフォーカスができることが分かったと思います。
今後この Fermyon Cloud を使っての Rust アプリケーション開発について詳細にみていきたいと思います。

GitHubで編集を提案

Discussion