axumに関するところのメモ
直接関係ないけどtracingのメモ
[dependencies]
anyhow = "1.0.51"
axum = "0.4.2"
lambda-web = { version = "0.1.8", features=["hyper"] }
tokio = { version = "1", features = ["full"] }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = [ "std", "env-filter" ] }
env-filterのfeaturesを追加しておくと、RUST_LOG変数からログの設定を読み込める
mainの上の方にtracing_subscriber::fmt::init()をするとRUST_LOG変数からログの設定を読み込みます。
しかし、tracing_subscriber::fmt().init()しても環境変数から読み込まない。ということでEnvFilterを使います。
with_span_eventsをセットすると #[tracing::instrument(level="trace"] を設定したような関数で処理時間などのを表示可能
tracing_subscriber::fmt().with_env_filter(EnvFilter::from_default_env()).with_span_events(FmtSpan::CLOSE).init();
tracing::info!("kkkkk");
tracing::debug!("fsadfa");
#[tracing::instrument(level="info")]
fn x() -> () {
todo!()
}
axumをaws lambdaで実行させる方法
lambda-webのドキュメントからほぼコピペ
[dependencies]
anyhow = "1.0.51"
axum = "0.4.2"
lambda-web = { version = "0.1.8", features=["hyper"] }
tokio = { version = "1", features = ["full"] }
#[tokio::main]
async fn main() -> Result<(), LambdaError> {
tracing_subscriber::fmt().with_span_events(FmtSpan::CLOSE).init();
// build our application with a route
let app = Router::new()
// `GET /` goes to `root`
.route("/", get(root))
if is_running_on_lambda() {
// Run app on AWS Lambda
run_hyper_on_lambda(app).await?;
} else {
// Run app on local server
let addr = SocketAddr::from(([127, 0, 0, 1], 8080));
axum::Server::bind(&addr).serve(app.into_make_service()).await?;
}
Ok(())
}
Middlewareを作るとき( ..)φ
基本的に
の通りでやればOK
なんで self.inner.clone() だけではだめで、 std::mem::replace(&mut self.inner, clone); しているのかが謎。
ぶっちゃけ self.inner.clone()だけして inner.call(req) してみたけどエラーも何も出ない。。。
req.extensions_mut().insert("あああああああああああ".to_string());
とかしてあげてハンドラー?側で
async fn hogehoge_handler(Extension(yyy): Extension<String>) -> String {
todo!()
}
とかすると yyyy には あああああああああああ が入ります。
MiddleWare側からデータを渡したいときに便利!
Middlewareの処理順番
let app = Router::new()
// `GET /` goes to `root`
.route("/", get(root))
.route( "/count", get( shared_count))
.layer(layer_fn(|inner| MyMiddleware { inner }))
.layer(AddExtensionLayer::new(sample))
.layer(AddExtensionLayer::new("sfsafa".to_string()));
基本的にLayerの処理順は下から上に。
req.extensions().get::<String>()とか使ってデータを取る時は下で先に定義されてないととれませんよという話
LambdaとAxumで作りたいかなと思っているこの頃ですが、AzureFunctionsにも載せられるらしいね。
Azureはちょっと使いづらいイメージも。
Axumやってて、Cache-Controlなどのヘッダをデフォルト設定したい。
Middleware作ってやるんかなーと思ったらやってくれるのあったぽい