DockerコンテナにRailsの環境変数を適用させる方法(aws::Sigv4::Errorsの解決法)
はじめに
Dockerを導入しコンテナを起動し、動作確認のために画像投稿したら以下のエラーが発生。
沼にハマったので解決法をメモします。
解決方法
結論から言うとS3導入後の**「環境変数がない」**というのが原因です。
自分は、ローカルで設定したしsource ~/.zshrc
も行って、うまくできているはずなのに...と沼にハマりました(笑)
なぜローカルで環境変数を設定して読み込んだのにエラーが起こるのか...
理由はコンテナで環境変数を設定できていないからです。
コンテナの概念は**「隔離された空間」**です。つまり、コンテナを作成・起動したら以前のrails s
コマンドでサーバーを起動していた環境とは別の環境になっているということです。
もう解決方法は見えたと思いますが、コンテナ内にも環境変数を設定してあげれば解決できます。
そこで僕の場合は、コンテナ内でも、どの環境にも環境変数を1度設定するだけで適用できる方法を採用しました。
具体的にはdotenb-rails
というGemを導入しました。
Gem dotenb-railsの導入
このdotenv-rails
とは環境変数を管理してくれるGemです。
このGemを導入し、アプリディレクトリに.env
ファイルを作成することで1つのファイルで環境変数を管理し、そのファイルに環境変数を設定するだけで全環境に環境変数を適用することができます。
1) Gemfileに記述
gem 'dotenv-rails'
bundle install
これで導入できました。
次に環境変数を設定していきましょう!
2).envを作成し環境変数を設定する
touch .env
上記のコマンドを実行でも、エディタに直接作成していただいても構いません。
このファイルを作成し、設定したい環境変数を記述していきましょう。
環境ごとに環境変数を変えたい場合などは以下の記事がとても参考になるのでぜひ見てみてください。
【Rails】dotenv-railsの導入方法と使い方を理解して環境変数を管理しよう!
ここでは.envの記述のみ解説します。
AWS_ACCESS_KEY_ID = '値'
AWS_SECRET_ACCESS_KEY = '値'
ターミナルでrails c
を実行すると以下が出力されます。
irb(main):002:0> ENV['AWS_ACCESS_KEY_ID']
=> '値'
irb(main):993:0> ENV['AWS_SECRET_ACCESS_KEY']
=> '値'
エラーの解決にはこの2つのみの設定で大丈夫ですが、他にも設定してある・したい方は記述を追加する必要があります。
3).gitignoreへの記述
環境変数の設定ができましたが、このままだとgitにpushしてしまった場合、環境変数の中身を公開することになってしまいます。
そのため.gitignore
ファイルに.env
を追記しcommit履歴に表示されないようにしpushを未然に防がないといけません。
# 1番下の行
.env
上記のように記述するだけでgitからは存在しないファイルとして扱ってもらうことができます。
4)環境変数の利用
これで環境変数の設定ができたので、後は使用したいところで呼び出すだけで利用できます。
非常に便利なGemなので、ぜひ使ってみてください
Discussion