Rust LT #4 で LT をした

rust.connpass.com

これに参加して5分枠で発表した。

テーマ決め

AtCoder Problems というサービスのバックエンドを Rust で書いていたので、それについて発表しようと思った。

github.com

技術的にはそこまで難しくなく、やっていることはドキュメントを読めば誰でもできるレベルなので話をするかは迷ったが、 Rust コミュニティの性質上、低レイヤーや言語仕様に関する発表が多いことが予想され、ライトな発表があってもよいだろうと考えた。サービス上にはクローラー、サーバーレス REST API、 DB 更新バッチの大きく分けて 3 つのアプリケーションが存在したが、サーバーレス API が身近で面白いだろうと考え、これについて話すことにした。

準備

いざスライドを作り始めてみると、想像以上に書くことがなく、AWS 公式ブログの内容を日本語訳しただけのスライドになってしまった。

aws.amazon.com

このブログにあるとおりに Lambda を組み、API Gateway でつなぎこんでやれば、本当に 5 分程度で Rust 製のサーバーレス API ができてしまう。つまりスライドを使って説明している間にデプロイで来てしまうのだ。というわけで、スライドを使った発表はやめ、実際に Rust + Lambda + API Gateway で作ってその場でデプロイすることにした。

実際に練習としてやってみると、crate のダウンロードやコンパイルに時間がかかって 5 分をオーバーしてしまったり、simple_logger や serde などを使っているおかげで見た目の複雑さが増していたりなど、発表する上での問題点を見つけた。これらについて、必要な crate はあらかじめコンパイルしておいたり、不要なコードは削除したりして対処した。

発表

実際に発表で書いた(コピペして削った)コードがこちら。

#[macro_use]
extern crate lambda_runtime as lambda;
use lambda::error::HandlerError;

use serde_json::{json, Value};

use std::error::Error;

fn main() -> Result<(), Box<dyn Error>> {
    lambda!(my_handler);

    Ok(())
}

fn my_handler(e: Value, c: lambda::Context) -> Result<Value, HandlerError> {
    let name = e
        .get("pathParameters")
        .unwrap()
        .get("name")
        .unwrap()
        .as_str()
        .unwrap();

    Ok(json!({
        "isBase64Encoded": false,
        "statusCode": 200,
        "body": format!("Hello {}!\n",name)
    }))
}

isBase64EncodedisBase64と書いてしまったおかげで Internal Server Error が発生してしまったときはもうダメかと思ったが、すぐに発見できたおかげで何とか完成にたどり着けた。ただ、入力部を実装する前に、バグからのデバッグ成功で会場が盛り上がってしまったので、入力部も含めて真に REST API にしていく部分が若干おまけっぽくなってしまった。次に発表するときは最初にゴールを明確にしておきたい。