Rustのshuttleを使ってみる【3】

Shuttleはいいぞ~、ナナオです。 今回で三回目になります、Shuttleのチュートリアル記事です。 複数のサービスを動かす shuttle_runtime::Serviceを実装してあげることで、Webサービスとスケジューラを同時に動かすようなユースケースが実装可能になります。 Welcome to Shuttle's Docs - Start Building Backends Fast - Shuttle こちらのチュートリアルではdiscordのBOTを動かしていますね。 以前までの実装にスケジューラを追加して、継続的にログにhello worldを出力させてみましょう。 ただactix-webでの実装がわからなかったので、axumの実装に直しました。 また、スケジューラにはtokio-cron-schedulerを使用しました。 依存関係は以下のとおりです。 [dependencies] axum = "0.6.20" shuttle-runtime = "0.31.0" tokio = "1.26.0" tokio-cron-scheduler = "0.9.4" では、以下が完成したコードです。 use axum::{routing::get, Router, response::IntoResponse}; use tokio_cron_scheduler::{Job, JobScheduler}; async fn hello_world() -> impl IntoResponse { "Hello World!" } pub struct MultipleService { router: Router, scheduler: JobScheduler, } impl MultipleService { pub async fn new() -> Result<MultipleService, shuttle_runtime::Error> { let router = Router::new() .route("/", get(hello_world)); let mut scheduler = JobScheduler::new().await.unwrap(); scheduler.add( Job::new("1/10 * * * * *", |_uuid, _l| { println!("I run every 10 seconds"); }).unwrap() ).await.unwrap(); Ok(Self { router, scheduler, }) } } #[shuttle_runtime::async_trait] impl shuttle_runtime::Service for MultipleService { async fn bind(mut self, addr: std::net::SocketAddr) -> Result<(), shuttle_runtime::Error> { let server = axum::Server::bind(&addr); let (_runner_hdl, _axum_hdl) = tokio::join!(self.scheduler.start(), server.serve(self.router.into_make_service())); Ok(()) } } #[shuttle_runtime::main] async fn main() -> Result<MultipleService, shuttle_runtime::Error> { MultipleService::new().await } 順番に説明します。 ...

11月 3, 2023 · にあえん

Rustのshuttleを使ってみる【2】

タダでもうれしいのはOSSだけ、ナナオです。 前回に引き続き、Shuttleを使ってみようと思います。 ワークスペースでプロジェクトをデプロイする shuttleはワークスペースをサポートしています。 これにより、複雑なコードをカプセル化しつつ、可読性高く開発することができます。 (私の最初のイメージでは、ワークスペースのメンバーそれぞれがプロジェクトとして独立した形でデプロイされるのかと思ってたんですが、ルートパッケージが一つのプロジェクトとして扱われるようになる感じでした…) Project structure - Shuttle ただし、既存のパッケージをプロジェクトとして独立させるみたいなことをするのは少し厄介です。 というのも、どうやらそもそもローカルにあるCargoディレクトリの移動ということが想定されていないためか、既にデプロイしているディレクトリを移動するとデプロイができなくなってしまいます。 また、内部的にgitのコミットを追っているというのもあり、gitの管理をいったん外すといったことができなくなります。 つまり、新たに作成したワークスペースのメンバーに既存のCargoパッケージを追加する場合、本来はルートパッケージ側でgitを管理したいのにそれができなくなってしまうということが考えられます。 (まぁこの辺は単に私のドキュメントの読み込み不足という可能性もあるので、その辺は指摘あればコメントください) ということで、前回の記事で作成したプロジェクトは一旦リモートのプロジェクトからは削除して、新たにワークスペース単位でリソース管理ができるようにしてみましょう。 まずはベースになるルートパッケージを作成します。 cargo new shuttle-playground 次に、前回作成したプロジェクトを削除します。 # 前回作成したshuttle-playground-nanaoを削除します # 削除前にサーバーを止めておく必要がある cargo shuttle stop # 停止後に削除ができるようになる cargo shuttle project delete これできれいになりました! 次にルートプロジェクト内に前回のshuttle-playground-nanaoを移動します。 ローカルでの名前は変えておきましょうか。 mv shuttle-playground-nanao shuttle-playground/backend backendをワークスペースのメンバーに追加してあげます。 [workspace] members = [ "backend", ] このままのパッケージ名だとありふれているため競合してしまいますが、ルートパッケージ配下にShuttle.tomlを作成することで解決できます。 ここでは以前と同じ名前にしておきましょう。 name = "shuttle-playground-nanao" この状態で、ルートパッケージのファーストコミットを行っておきます。 git add --all git commit -m "first commit" ではデプロイしていきます。 # Shuttleプロジェクトを開始 cargo shuttle project start # プロジェクトにデプロイ cargo shuttle deploy デプロイ後、アクセスした様子が以下になります。 ...

11月 2, 2023 · にあえん

Rustのshuttleを使ってみる【1】

Rustで無料で建てられるサーバーがあるだって?やったー!ナナオです。 今回はそんなshuttleが気になったので使ってみます。 Installation - Shuttle Shuttleとは インフラ構築なしでバックエンドをデプロイできるサービスです。 firebaseと似たような、いわゆるBaaSってやつですね。 主な使い方としては簡易なWebサーバーの構築や、Discordクライアントとして使用できるようです。 無料プランの中でデータ永続化サービスとしてPostgresも使えるので、結構充実しています。 #[shuttle_runtime::main] async fn main( // automatic db provisioning + hands you back an authenticated connection pool #[shuttle_shared_db::Postgres] pool: PgPool, ) -> ShuttleRocket<...> { // application code } 以下のライブラリをサポートしているため、これらのライブラリの使用経験があればすぐにでもデプロイができると思います。 Axum Actix Web Rocket Warp Tower Salvo Poem Tide Thruster shuttle-next 早速使ってみる まずはshuttle cliをインストールしておきます。 cargo install shuttle CLIからshuttleアプリケーションを初期化できます。 質問形式でプロジェクトをセットアップできます。 > cargo shuttle init First, let's log in to your Shuttle account. If your browser did not automatically open, go to https://console.shuttle.rs/new-project ✔ API key · ******** What do you want to name your project? It will be hosted at ${project_name}.shuttleapp.rs, so choose something unique! ✔ Project name · shuttle-playground-nanao Where should we create this project? ✔ Directory · C:\Users\Nanao\Project\study\shuttle-playground Shuttle works with a range of web frameworks. Which one do you want to use? ✔ Framework · actix-web Creating project "shuttle-playground-nanao" in "C:\Users\Nanao\Project\study\shuttle-playground" Hint: Check the examples repo for a full list of templates: https://github.com/shuttle-hq/shuttle-examples Hint: You can also use `cargo shuttle init --from` to clone templates. See https://docs.shuttle.rs/getting-started/shuttle-commands or run `cargo shuttle init --help` ✔ Claim the project name "shuttle-playground-nanao" by starting a project container on Shuttle? · yes Project "shuttle-playground-nanao" is ready Your project will sleep if it is idle for 30 minutes. To change the idle time refer to the docs: https://docs.shuttle.rs/getting-started/idle-projects Run `cargo shuttle deploy --allow-dirty` to deploy your Shuttle service. You can `cd` to the directory, then: Run `cargo shuttle run` to run the app locally. APIキーが必要なため、事前にブラウザ側でshuttleのコンソールにログインしている必要があります。 ...

11月 2, 2023 · にあえん