
シェア:
KarlはVonageのDeveloper Advocateで、RubyサーバSDKのメンテナンスとコミュニティの開発者エクスペリエンスの向上に注力しています。彼は学ぶこと、ものを作ること、知識を共有すること、そして一般的にウェブ技術に関連することが大好きです。
Rubyで環境変数を扱う
所要時間:2 分
ウェブアプリケーションを扱うとき、開発者は多くの異なる可動部分を扱う必要があります。たいていの場合、私たちはそれらの個々の部品が何であるか、そしてそれらがどのように機能するかについて、立ち止まって考えることはありません。この記事では、これらのパーツの1つだけを探ります: 環境変数.
RubyのWebアプリケーションをビルドしてデプロイしたことがある人なら、おそらく環境変数を使ったことがあるだろう。そのアプリケーションがRuby on Railsでビルドされたものであれば、環境変数に RAILS_ENVを 'production'を設定する必要があるでしょう。アプリケーションが外部サービスやAPIを統合しているのであれば、それらのサービスの認証情報を管理するために環境変数を使ったことがあるでしょう。
しかし、具体的にはどうなのか。 環境変数環境変数です、 なぜ役に立つのか、そして どのようにRubyアプリケーションを開発したりデプロイしたりするときに活用できるのでしょうか。
環境変数とは?
その名前が示すように、環境変数はアプリケーションが動作する環境に関する情報を格納する変数です。変数の概念やその仕組みについては、すでによくご存じだと思いますので、2番目の「環境」についてもう少し詳しく見ていきましょう。
ここでいう環境とは、プログラムが実行されるオペレーティング・システムを指すこともあれば、プログラムの実行に使われるプロセスを指すこともある。いくつかの例を見れば、このことが少しはっきりするかもしれない。
コンピュータでターミナル・ウィンドウを開くと、シェル・プロセスが起動します。Shellは基本的に、Shell経由で発行されたコマンドを処理して結果を出力することで、システムとの対話を可能にするプログラムです。たとえば、ローカルマシンでRailsアプリケーションを起動するとき、次のようなコマンドを発行します。 rails sを実行すると、次のような出力が表示されます:
=> Booting Puma
=> Rails 7.0.4.3 application starting in development
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 5.6.5 (ruby 3.0.0-p0) ("Birdie's Version")
* Min threads: 5
* Max threads: 5
* Environment: development
* PID: 126917
* Listening on http://127.0.0.1:3000
* Listening on http://[::1]:3000
Use Ctrl-C to stop
このプロセス(シェル)は、それが実行される環境について知っていることがあり、その知っていることを変数に格納します。プロセスは親プロセスから環境変数のコピーを継承するので、シェルはオペレーティング・システム(より具体的にはカーネル)の環境変数のコピーを持っています。同様に、シェルで実行されるプロセスは、そのシェルの環境変数のコピーを継承します。
環境変数へのアクセス
UNIXベースのシステム(LinuxやOSXなど)では envコマンドでアクセスできる。Windowsにも同等の setコマンドもありますが、この記事ではUNIXベースのシステムで使われるコマンドのみを取り上げます。
特定の環境変数を出力したい場合は printenvコマンドを使うことができる。例えば、自分のシステムに設定されている言語を確認したい場合、次のコマンドを実行する。 printenvコマンドの後に、このデータを含む環境変数の名前を続ける。 LANG.これで言語が出力される。 en_GB.UTF-8:
$ printenv LANG
en_GB.UTF-8Ruby中心の例は次のようになる。 RUBY_VERSION:
$ printenv RUBY_VERSION
ruby-3.2.2シェルからRubyプロセスを実行する場合、そのプロセスが使用するRubyのバージョンです。Rubyのバージョン・マネージャーがインストールされている場合、例えば chruby, rbenvまたは rvmを実行してみてください。 printenv RUBY_VERSIONを実行し、バージョン・マネージャーでRubyのバージョンを変更してから、もう一度 printenv RUBY_VERSIONをもう一度実行してみてください。変更したRubyのバージョンが表示されるはずです。
Rubyのプロセスといえば、Rubyプログラム内からRubyの ENVオブジェクトを使ってアクセスすることができる。Rubyの Rubyのドキュメントの説明では
ENVは環境変数のハッシュライク・アクセッサである。
この ENVクラスには、オブジェクトに格納された値を操作するためのメソッドがいくつかあります。 ENVオブジェクトに格納されている値を操作することができます。この記事では、ブラケット記法を使って値にアクセスすることだけに焦点を当てますが、その他の機能については、Rubyのドキュメントを参照してください。 のドキュメント.
RubyのHashから値にアクセスするのと同じように、環境変数の名前をキーとして、ENVから環境変数の値にブラケット記法でアクセスすることができる。
ENV['RUBY_VERSION'] # => ruby-3.2.2
変数名を渡すことに注意、 RUBY_VERSIONを文字列として ENV括弧に渡すことに注意。
シェルで試してみよう:
$ printenv RUBY_VERSION
ruby-3.2.2
$ ruby -e "puts ENV['RUBY_VERSION']"
ruby-3.2.2上記の例では、まず printenvコマンドを使ってシェルの RUBY_VERSION環境変数の値を出力します。 ruby-3.2.2.次に rubyコマンドを -eオプションを付けてコマンドを起動する。これはRubyインタプリタに、Rubyコードとして渡した文字列を実行しないように指示する。このRubyコードは、オブジェクトの ENVオブジェクトの RUBY_VERSIONキーに関連付けられた値を出力します。見ての通り 'RUBY_VERSION'の値は、親プロセスであるシェルプロセスの RUBY_VERSIONの値と同じです。
環境変数の設定
ここまでは、既存の環境変数にアクセスする方法についてだけ説明してきた。しかし、自分で環境変数を設定するようになると、さらに便利になる。
UNIXベースのシェルでは、環境変数は、代入構文と組み合わせた exportコマンドと代入構文を組み合わせて設定することができる:
$ export FOO=bar
$ printenv FOO
bar既存の環境変数と同様に、プロセス内で作成した環境変数も、子プロセスに継承される。ここでも、Rubyプロセス内でこのことを試してみることができる。
$ export FOO=bar
$ printenv FOO
bar
$ ruby -e "puts ENV['FOO']"
bar注意すべき重要な点は、兄弟プロセスは環境変数を共有するのではなく、それぞれのコピーを保持するということである。つ目のターミナル・ウィンドウを開いて printenv FOOを実行しても、何も出力されない。
同様に、プロセス内で作成された環境変数は、そのプロセスとともに消滅する。例えば export FOO=barを実行し、ターミナル・ウィンドウを閉じてから、新しいターミナル・ウィンドウを開いて printenv FOOを実行しても、何も出力されません。
なぜ環境変数を使うのか?
環境変数の主な用途の1つは、アプリケーションの開発やデプロイ時に設定データを設定することです。のような外部サービスを使うときに API 認証情報を設定するのが一般的な例です。 Vonage Communications API.
例えば、Rubyのファイルに send_sms.rb.このファイルのコードは Vonage SMS APIを使ってを使用して Vonage Ruby SDK.Vonage SMS API へのリクエストを認証するには、Vonage SMS API のインスタンスに Vonage::Clientオブジェクトをインスタンス化する必要があります。 api_keyそして api_secret.
client = Vonage::Client.new(api_key: 'abc123', api_secret: 'ab1CDef2GhIjkLmn')
client.sms.send(from: 'Ruby', to: '447700900000', text: 'Hello world')一般に、このような認証情報をソースコードにハードコーディングすることは避けたいでしょう。そのコードを GitHub のようなバージョン管理サービスにコミットすることになるでしょう。リポジトリが公開されていないとしても、API の認証情報を Git の履歴に残すのはあまりいい考えとは言えません。さらに、開発環境と本番環境 (そしてステージングや QA などの他の環境) で異なる API 認証情報を使うこともあるでしょう。環境変数は、ソースコードを変更することなくデプロイ時に更新することができます。
Rubyアプリケーションの文脈では、ここでRubyの ENVオブジェクトを活用できる。更新された send_sms.rbコードは次のようになる:
client = Vonage::Client.new(api_key: ENV['VONAGE_API_KEY'], api_secret: ENV['VONAGE_API_SECRET'])
client.sms.send(from: 'Ruby', to: '447700900000', text: 'Hello world')そうすれば exportを使って VONAGE_API_KEYと VONAGE_API_SECRETを環境変数として設定できる:
$ export VONAGE_API_KEY=abc123 VONAGE_API_SECRET=ab1CDef2GhIjkLmnその後 send_sms.rbファイルを実行すると ENVオブジェクトは、あなたが設定した環境変数にアクセスできるようになります。
$ ruby send_sms.rb余談だが、もし api_keyと api_secretキーワード引数を Vonage::Client.newを渡さなかった場合、Vonage Ruby SDK は自動的に ENVオブジェクトに VONAGE_API_KEYと VONAGE_API_SECRET.認証のためにAPIキーとシークレットを必要とするVonage APIを使用する際にこれらの環境変数が設定されている限り、次のようにオブジェクトをインスタンス化することができます。 Vonage::Clientオブジェクトをインスタンス化できます:
client = Vonage::Client.newRailsアプリの内部でこれが実際に動いているのを見たいですか?チュートリアルの Ruby on RailsでSMSを送信するを使ったSMS送信のチュートリアルをご覧ください。
環境変数の使い方
これまでの例では、環境変数を設定するために exportを使って環境変数を設定してきました。新しいシェルや環境でRubyのプロセスを実行するたびにこれを行うのは、特に設定する環境変数の数が多い場合には、少々手間がかかります。幸いなことに、開発環境でも本番環境でも利用できる他の解決策があります。
開発中
開発における素晴らしい選択肢は dotenv ライブラリー.これはRubyGemで、RubyGemにインクルードしたり、ローカルにインストールしたりすることができる。 Gemfileにインクルードするか、ローカルにインストールすることができます。これを使うには、Rubyプロジェクトのルートに .envファイルを作成する必要がある。そのファイルの中で、アプリケーションが必要とする環境変数をキーと値のペアで定義します。
VONAGE_API_KEY=abc123
VONAGE_API_SECRET=ab1CDef2GhIjkLmnRubyアプリケーションで requiregemの loadメソッドを呼び出すことができます。 Dotenvクラスのメソッドを呼び出します。これにより .envファイルに定義されたすべての環境変数が ENVオブジェクトにロードされます。
require 'dotenv'
Dotenv.load
client = Vonage::Client.new(api_key: ENV['VONAGE_API_KEY'], api_secret: ENV['VONAGE_API_SECRET'])
client.sms.send(from: 'Ruby', to: '447700900000', text: 'Hello world')また dotenv-rails gemもライブラリの一部として含まれており、これは特にRailsアプリケーションで使うためのものです。使い方は標準の dotenvgemとは使い方が若干異なりますが、コンセプトは同じです。
このライブラリには他にもいくつかの機能がある。 ドキュメント.
を使うか、それとも dotenvあるいは dotenv-railsを使うにせよ .envファイルを .gitignoreに追加して Git リポジトリにチェックされないようにしましょう。
Webhookテストが必要なRailsアプリを構築している場合、dotenvと一緒にngrokを使いたいでしょう。私たちの Rails + ngrokセットアップガイドをご覧ください。
生産中
ドキュメントによると が本番で dotenv を使用できますが他のツールやオプションの方が本番環境での環境変数の管理に適しています。
構成管理ツール シェフ, Puppetおよび アンシブルなどはパワフルで機能が充実している。これらのツールは、おそらく大規模な作業に最も適しているが、小規模なプロジェクトでは、いくつかの環境変数を設定するだけなら大げさかもしれない。
のようなコンテナ化ソリューション ドッカーのようなコンテナ化ソリューションは 特定の方法のようなコンテナ化ソリューションでは、APIキーのような機密データのための環境変数を扱う特別な方法が用意されている。
もしあなたが レンダーまたは Herokuなどのサービスを使用している場合、一般的に環境変数をキーと値のペアとして、サービスが提供するUI内で設定することができます。よく使われる環境変数の中には、あなたのために設定されるものもあります。 は自動的に
RAILS_ENVを設定します。productionに自動的に設定されます。
Render Environment Variable form
Railsの資格情報についての簡単なメモ
Rails に特化して作業する場合は、環境変数を使用する代わりに Rails認証情報を使うことです!
まとめ
今回はここまで!この記事が興味深く、有益なものであったことを願っている。
環境変数が実際のメッセージング体験に力を発揮するのを見る準備ができたら、次のチュートリアルをチェックしよう。 をご覧ください。.このチュートリアルでは、環境設定、Rails、Vonage Messages APIを組み合わせた実用的なユースケースを紹介しています。
質問や共有したいことがありますか?Vonageコミュニティ VonageコミュニティSlackまたは 開発者向けニュースレターでフォローしてください。 X(旧Twitter)YouTubeチャンネル YouTubeチャンネルビデオチュートリアルを購読する。 LinkedInのVonage開発者ページ開発者が学び、コミュニティとつながるためのスペースです。つながりを維持し、進捗状況を共有し、最新の開発者向けニュース、ヒント、イベントを把握してください!


