【Rust】envファイルで環境毎に設定を管理したい

2022/05/20に公開

概要

RailsやNode.jsなど、様々な言語やフレームワークで用意されているdotenvでは、envファイルで環境変数を設定できます。Reactの環境変数をdotenv-cliで切り替えてみたで紹介されているdotenv-cliのようなものを利用することで、envファイルを環境毎に管理することもできます。
今回はrustでenvファイルを環境毎にどう管理するか、考えてみたのでメモ書きします。

対応方針

  • Rustのdotenvの使い方まとめの記事にまとめられている通り、rustでもdotenvのライブラリが用意されています。dotenv-cliのように環境毎に読み込むファイルを変える機能は無いですが、記事に指定されている通りファイルを指定して読み込めるので、今回はこの機能を使用します。
  • 対象とする環境は環境変数に直接設定するものとします。Rustで環境変数を扱うの記事の通り、std::envで値を取得します。

実装サンプル

例として、actix-webのmain関数でallowed_originに設定するドメインを、envファイルから取得します。

use actix_cors::Cors;
use actix_web::http;
use actix_web::App;
use actix_web::HttpServer;
use dotenv;
use std::env;

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    // 「ENVIRONMENT」という環境変数に事前に環境をセット(未設定の場合はlocal)
    let environment = match env::var("ENVIRONMENT") {
        Ok(val) => val,
        Err(_) => "local".to_string(),
    };
    // 環境毎にファイルを配置して読み込み
    dotenv::from_filename(".env.".to_string() + &environment).ok();

    HttpServer::new(|| {
        let cors = Cors::default()
	    // envファイルに設定したドメインを設定
            .allowed_origin(&env::var("FRONT_DOMAIN").unwrap())
            .allowed_methods(vec!["GET", "POST", "PUT", "OPTIONS", "DELETE"])
            .allowed_header(http::header::CONTENT_TYPE);
        App::new()
            .wrap(cors)
            .service(controller::search_controller::get_search_condition)
    })
    .bind("0.0.0.0:8080")?
    .run()
    .await
}

Discussion