【Actix】RustをAzure Functionsで使う方法

投稿日: 更新日:

環境💻

OS: Ubuntu 22.04.2 (WSL2)

Azure Functions Core Tools: 4.0.5148

rustc: 1.68.2

VSCodeの拡張機能などの設定は済んでいるとします

1.プロジェクトを作成する

VSCodeから関数を作成します。

関数の作成

Custom Handlerを選択

言語選択画面

HTTP triggerを選択

テンプレート選択画面

関数名を入力。今回はHttpTrigger1とします。

関数名の入力画面

Anonymousを選択

認証レベルの設定

2.関数を作成する

以下のコマンドでCargoパッケージを作成します。名前はhandlerとします

cargo init --name handler

そしたら、dependenciesに依存関係を追加します

[dependencies]
actix-web = "4"

次に、src/main.rsに以下のコードを書いてください。function_nameの部分は1で作成した関数名と同じにしてください。

use actix_web::{App, get, HttpServer, HttpResponse, Responder, web };
use std::net::Ipv4Addr;

#[get("")]
async fn hello() -> impl Responder {
    HttpResponse::Ok().body("Hello world!")
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    let port_key = "FUNCTIONS_CUSTOMHANDLER_PORT";
    let port: u16 = match std::env::var(port_key) {
        Ok(val) => val.parse().unwrap(),
        Err(_) => 3000,
    };

    let function_name = "HttpTrigger1";
    HttpServer::new( move || {
        App::new()
            .service(web::scope(format!("api/{}", function_name).as_str()).service(hello))
    })
    .bind((Ipv4Addr::LOCALHOST, port))?
    .run()
    .await
}

次に、ビルドします。

cargo build --release

そして、成果物をコピーします

cp target/release/handler .

3.関数アプリの設定

host.jsonを開いてcustomHandlerの部分を以下のように書き換えます。

"customHandler": {
  "description": {
    "defaultExecutablePath": "handler",
    "workingDirectory": "",
    "arguments": []
  },
  "enableForwardingHttpRequest": true
}

4.ローカルで実行する

以下のコマンドで実行できます

func start

そして、http://localhost:7071/api/HttpTrigger1 にアクセスしてください。以下の画像のようになれば成功です!

ローカルでの実行結果

5.デプロイする

デプロイに不要な物を記載します。.funcignoreに以下を書き加えてください。

target

そして、Azure用にコンパイルしなければなりません。functionsのOSによって異なります。

functionsのOSがLinuxの場合

.cargo/configに以下の内容を書きます。.cargoディレクトリが無い場合は作成してください。

[target.x86_64-unknown-linux-musl]
linker = "rust-lld"

musl-toolsをインストールします。

sudo apt install musl-tools

そして、以下のコマンドをそれぞれ実行してください。

rustup target add x86_64-unknown-linux-musl
cargo build --release --target=x86_64-unknown-linux-musl
cp target/x86_64-unknown-linux-musl/release/handler .

functionsのOSがWindowsの場合

.cargo/configに以下の内容を書きます。.cargoディレクトリが無い場合は作成してください。

[target.x86_64-pc-windows-gnu]
linker = "x86_64-w64-mingw32-gcc"

mingw-w64をインストールします

sudo apt install mingw-w64

そして、以下のコマンドをそれぞれ実行してください。

rustup target add x86_64-pc-windows-gnu
cargo build --release --target=x86_64-pc-windows-gnu
cp target/x86_64-pc-windows-gnu/release/handler.exe .

host.jsonを開いてcustomHandlerの部分を以下のように書き換えます。

handlerhandler.exeと書き換えました。

"customHandler": {
  "description": {
    "defaultExecutablePath": "handler.exe",
    "workingDirectory": "",
    "arguments": []
  },
  "enableForwardingHttpRequest": true
}

後は、以下のボタンで関数をデプロイします。

デプロイボタン

関数のURLにアクセスし、ローカルで実行した時と同じ結果が表示されれば成功です。

デプロイ後の実行結果

書いた人

profile_image

お茶の葉

物理とプログラミングが好きな人