TypeScript における envsafe のようなライブラリが Ruby にも欲しい
見つけたRubyのライブラリ
近いかもしれないが、既存コードの環境変数を参照している箇所に手をいれる必要があるのがネック
.env.sample
を設定ファイルとして利用するのは頭いいかも。そして既存コードに手を加えなくても良いのがいい
「言語依存しない単一バイナリで動作するツール」という方向でも探してみる
単体で実行できるコマンドにはなっていないが、これをベースに CLI を作るとよさそう
背景
以前 Next.js で envsafe を使ってて、環境変数の定義もれや値の設定ミス(型の違い)が早期に発見できていた。
Ruby / Rails においても同様の環境変数の設定ミスを早期に発見するための仕組みが欲しい。
Ruby / Rails で環境変数を扱うライブラリを調査する
dotenv
リポジトリ名やREADMEは dotenv
だけど、dotenv-rails
= dotenv
ってことらしい...
感想
必須キーの設定ができるらしい (思い出してきた)
# config/initializers/dotenv.rb
Dotenv.require_keys("SERVICE_APP_ID", "SERVICE_KEY", "SERVICE_SECRET")
開発環境やCI環境向けの環境変数を .env*
ファイルで管理しましょう。という目的のライブラリなので、欲しい機能はではなさそう。
dry-validation
(環境変数に限らず)データの型検査を行うライブラリ
感想
サンプルコード(上記ページからの引用)
class NewUserContract < Dry::Validation::Contract
params do
required(:email).filled(:string)
required(:age).value(:integer)
end
rule(:email) do
unless /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i.match?(value)
key.failure('has invalid format')
end
end
rule(:age) do
key.failure('must be greater than 18') if value <= 18
end
end
contract = NewUserContract.new
contract.call(email: 'jane@doe.org', age: '17')
# #<Dry::Validation::Result{:email=>"jane@doe.org", :age=>17} errors={:age=>["must be greater than 18"]}>
サンプルコードも期待してるものに近いように思えるが...
今であればオリジナルのDSLより、RBS 使うのが良さそう... ⇒ RBS は静的な型検査なので実行時の環境変数型検査はできない
RBS でできることを調べる
(TBD)
ActiveModel::Validation
Ruby 界隈でバリデーションといえば Rails の ActiveModel::Validation だ
ほしいもの
- MUST: アプリケーション起動前に必要な環境変数が揃っていることが確認できる
- MUST: 現在の環境変数を読み取り、
.env
形式で標準出力/ファイルに出力できる - MAY: ローカル環境やCI/CD環境でも動いてほしい
- MAY: 型のチェックができると良い
- MAY: Markdown 形式でドキュメントを出力できる
要件
-
ENV
に必須のkey
が存在しているかチェックできる - その値があらかじめ想定した値になっているかチェックできる
- たとえば:
- Boolean:
true | false
- URL:
http(s)://
で始まる - email: ... (略)
- とか
- Boolean:
- たとえば:
悩みどころ
環境変数を利用するための設定ファイルをこれ以上増やしたくない
-
ECS TaskDefinition (ecspresso)-
--envfile=ENVFILE
で.env
ファイルを読み込める
-
.env
-
compose.yml
- docker compose は
env_file
で.env
ファイルを読み込める
- docker compose は
こうしてみると、 .env
形式に出力する機能があればなんとかなりそう
悩みどころ(2)
ecspresso の tfstate Plugin とかで実現していたことが出来なくなると辛い
Bash のコマンド置換 ( $(command ... )
)のような仕組みがあると良いかもしれない。
それさえできれば、tfstate-lookup
や AWS CLI などの CLI ツールと組み合わせてどうにでもなりそう。
言語依存しない単一バイナリで動作するツールでも良いかもしれない