100日後にRustをちょっと知ってる人になる: [Day 90]Fermyon Spin v0.7.0
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 では次のようなフィーチャーが追加されていました:
- Hashicorp Vault との統合
- MySQL データベースへの接続の実験的サポート
- 既存のアプリケーションにコンポーネントを追加する「spin add」コマンド
- Redis のセット操作に対応
- Web URL からの Wasm モジュールのフェッチに対応
- Linux ARM64上でのSpinの実行をサポート
- JavaScriptおよびTypescriptアプリケーションの実験的サポート
- Wasmtime 3.0.0 ベース
また、次のような連絡事項もありました。
- Ubuntu 18.04 のサポートを終了
-
テンプレートはローカルでも更新が必要な場合あり
spin templates install --git https://github.com/fermyon/spin --update
ここで挙げられているアップデート内容をいくつか掘り下げて見てみたいと思います。
テンプレートはローカルでも更新が必要な場合あり
とりあえず、テンプレートの変更を行っておきます。
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 はとても有名な機密情報の管理ツールなのでご存知の方も多いのではないでしょうか。トークンや、パスワード、また証明書、暗号鍵といった機密情報へのアクセスを安全に保管し、厳密に制御するオープンソースツールです。UI、CLI、HTTP APIを使用して機密データへのアクセスを安全に行うことができます。
それでは、Vault にデータを入れてみます。
vault server -dev -dev-root-token-id root
vault kv put secret/password value="my-name-is-yanashin18618!"
ここでは、vault server
と vault 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, ¶ms)?;
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 より一足先に公開されていたのが、この JavaScript と TypeScript の SDK です。
この 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 の正式リリースに向けて、更に期待して注目していきたいと思います。
- Spin 0.7.0 アップデート内容のgit a振り返り
- Hashicorp Vault との統合
- MySQL データベースへの接続の実験的サポート
- 既存のアプリケーションにコンポーネントを追加する「spin add」コマンド
- Redis のセット操作に対応
- Web URL からの Wasm モジュールのフェッチに対応
- Linux ARM64上でのSpinの実行をサポート
- JavaScriptおよびTypescriptアプリケーションの実験的サポート
- Wasmtime 3.0.0 ベース
- Ubuntu 18.04 のサポートを終了
-
テンプレートはローカルでも更新が必要な場合あり
spin templates install --git https://github.com/fermyon/spin --update
Discussion