🦀

100日後にRustをちょっと知ってる人になる: [Day 90]Fermyon Spin v0.7.0

2022/12/19に公開

Day 90 のテーマ

Day 87、そしてDay 88 といろいろなモジュールの新しくリリースされたバージョンを見てみました。
そして今日も新しいものの発表があったので、それを見てみようと思います。

Day 57 で紹介をしていた Fermyon Spin が 12 月 16 日にv0.7.0 が発表されていました。今日はそのアップデートについて見たみたいと思います。

Fermyon Spin

Spin については Day 57 の中で使い方について紹介をしているので、そちらを見て欲しいと思います。
簡単に少しだけ説明すると、WebAssemby をコンパイルターゲットとするフレームワークです。フレームワークというと、ある特定の言語で作業効率をよくするために用いられる事が多いと思います。この Spin は様々な多言語に対応しているフレームワークです。
Web アプリケーションやマイクロサービスのような HTTP リクエストへの応答を実行できる WebAssembly モジュールを作成するためのインターフェースを提供できるフレームワークになっています。

そして、ぼくがよく Spin を伝えるときに使っている代表的な 3 つのコマンドが次のものです。

✨spin new
🛠spin build
🚀spin deploy

極端な話でいうと、この 3 コマンドがあればビルドして実行することが可能となります。

Spin v0.7.0 インストール

Spin v0.7.0 の内容を見ていく前にとりあえず、インストールを行います。アップグレードも上書きインストールです。

$ curl -fsSL https://developer.fermyon.com/downloads/install.sh | bash

Step 1: Downloading: https://github.com/fermyon/spin/releases/download/v0.7.0/spin-v0.7.0-macos-amd64.tar.gz
Done...

Step 2: Decompressing: spin-v0.7.0-macos-amd64.tar.gz
x README.md
x LICENSE
x spin
spin 0.7.0 (73d315f 2022-12-15)
Done...

Step 3: Removing the downloaded tarball
Done...

You're good to go. Check here for the next steps: https://developer.fermyon.com/spin/quickstart
Run './spin' to get started

$ sudo mv spin /usr/local/bin/

これでアップグレード完了です。確認をしてみましょう。

$ spin -V

spin 0.7.0 (73d315f 2022-12-15)

0.7.0 になっていました✨

Spin v0.7.0

それでは、Spin v0.7.0 について見ていこうと思います。リリースノートはこちらです。

v0.7.0 では次のようなフィーチャーが追加されていました:

また、次のような連絡事項もありました。

ここで挙げられているアップデート内容をいくつか掘り下げて見てみたいと思います。

テンプレートはローカルでも更新が必要な場合あり

とりあえず、テンプレートの変更を行っておきます。

spin templates install --git https://github.com/fermyon/spin --update

以下のようなテンプレートが更新・インストールされました。

Copying remote template source
Installing template redis-rust...
Installing template static-fileserver...
Installing template http-grain...
Installing template http-swift...
Installing template http-c...
Installing template redirect...
Installing template http-rust...
Installing template http-go...
Installing template http-zig...
Installing template http-empty...
Installing template redis-go...
Installed 11 template(s)

+------------------------------------------------------------------------+
| Name                Description                                        |
+========================================================================+
| http-c              HTTP request handler using C and the Zig toolchain |
| http-empty          HTTP application with no components                |
| 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                     |
| redirect            Redirects a HTTP route                             |
| redis-go            Redis message handler using (Tiny)Go               |
| redis-rust          Redis message handler using Rust                   |
| static-fileserver   Serves static files from an asset directory        |
+------------------------------------------------------------------------+

以前は、8 種類だったので次のものが増えていますね。

  • http-empty
  • redirect
  • static-fileserver
+-----------------------------------------------------------------+
| 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                   |
+-----------------------------------------------------------------+

Hashicorp Vault との統合

Hashicorp Vault はとても有名な機密情報の管理ツールなのでご存知の方も多いのではないでしょうか。トークンや、パスワード、また証明書暗号鍵といった機密情報へのアクセスを安全に保管し、厳密に制御するオープンソースツールです。UICLIHTTP APIを使用して機密データへのアクセスを安全に行うことができます。

それでは、Vault にデータを入れてみます。

vault server -dev -dev-root-token-id root
vault kv put secret/password value="my-name-is-yanashin18618!"

ここでは、vault servervault kv というコマンドを使い登録を行いました。それぞれのコマンドの詳細な内容については次の公式ドキュメントで紹介されています。

このようにして Vault に登録したデータを runtime-config.toml を使用して spin に読み込み設定を行います。このファイルは spin の起動時に読み込まれる構成ファイルです。

以下のような toml を定義します。

[[config_provider]]
type = "vault"
url = "<adress-to-vault>"
token = "root"
mount = "secret"

あとは、取得を行うのみです。

let password:Result<String, spin_sdk::config::Error> = spin_sdk::config::get("password");

MySQL データベースへの接続の実験的サポート

v0.7.0 では、Spin アプリケーションから MySQL データベースへの接続をサポートされるようになりました。

このデータベースサポートは、WASI の提案の中で次の wasi-sql というものがあるのですが、それに従っているようです。

次のようにして、参照を行うようです。

fn get(id: i32) -> Result<Response> {

     let address = spin_sdk::config::get("database")?;

     let sql = "SELECT id, first_name, last_name FROM employee WHERE id = ?";
     let params = vec![ParameterValue::Int32(id)];
     let rowset = mysql::query(&address, sql, &params)?;

     match rowset.rows.first() {
         None => Ok(http::Response::builder().status(404).body(None)?),
         Some(row) => {
             let emp = as_emp(row)?;
             let response = format!("{:?}", emp);
             Ok(http::Response::builder()
                 .status(200)
                 .body(Some(response.into()))?)
         }
     }
 }

既存のアプリケーションにコンポーネントを追加する「spin add」コマンド

今までの Spin プロジェクトは、1 アプリケーションにつき、1 コンポーネントでした。spin new で作ったプロジェクトに含まれるコンポーネントで開発を行っていました。今回、spin add コマンドにより 1 プロジェクトに対して複数のコンポーネントを追加することができるようになりました。

空のプロジェクトを要して、追加をしてみます。

spin new http-empty

中身は toml が置かれているだけの空のプロジェクトです。

$ ls

spin.toml

spin add を使用して、コンポーネントを追加してみます。

$ spin add http-rust
$ spin add http-go

以下のようにコンポーネントが追加されています。これで、1 アプリケーションに複数のコンポーネント、それも複数の言語で作ることが可能になります。モジュラーモノリスのような構成が作れそうですね。

$ ls
go-component/   rust-component/ spin.toml

JavaScriptおよびTypescriptアプリケーションの実験的サポート

12 月 3 日に spin v0.7.0 より一足先に公開されていたのが、この JavaScriptTypeScriptSDK です。

この SDK に Spin が対応したことで、JavaScriptとTypeScriptのアプリケーションの開発が行えるようになりました。

JavaScript による Hello World なサンプルはこちらです。

export async function handleRequest(request) {
  return {
    status: 200,
    headers: { "content-type": "text/plain" },
    body: encoder.encode("Hello JavaScript").buffer,
  };
}

Wasmtime 3.0.0 ベース

この Spin v0.7.0 は Wasmtime 3.0.0 の上で開発されています。古いバージョンを使用している場合は、アップグレードをしてください。

例えば、次のように古いバージョンを使用している場合です。

$ wasmtime -V

wasmtime-cli 0.40.1

上書きインストールをして、アップグレードを行ってください。

curl https://wasmtime.dev/install.sh -sSf | bash
$ wasmtime -V

wasmtime-cli 3.0.1

Day 90 のまとめ

WebAssembly による Web アプリケーションのためのフレームワークな Fermyon Spin の最新バージョン、v0.7.0 のアップデートについて見てきました。
永続化まわりは、WASI としての仕様がまだまだ進化中ということもあって、これからを期待させるような内容にまだまだ留まっているところもあります。ですが、今回のアップデートによって一段とアプリケーションフレームワークの完成度が高まったと思いました。
v1.0.0 の正式リリースに向けて、更に期待して注目していきたいと思います。

GitHubで編集を提案

Discussion