😀

DockerコンテナにRailsの環境変数を適用させる方法(aws::Sigv4::Errorsの解決法)

2020/12/28に公開

はじめに

Dockerを導入しコンテナを起動し、動作確認のために画像投稿したら以下のエラーが発生。
沼にハマったので解決法をメモします。

aaaaa.png

解決方法

結論から言うとS3導入後の**「環境変数がない」**というのが原因です。
自分は、ローカルで設定したしsource ~/.zshrcも行って、うまくできているはずなのに...と沼にハマりました(笑)

なぜローカルで環境変数を設定して読み込んだのにエラーが起こるのか...

理由はコンテナで環境変数を設定できていないからです。
コンテナの概念は**「隔離された空間」**です。つまり、コンテナを作成・起動したら以前のrails sコマンドでサーバーを起動していた環境とは別の環境になっているということです。

もう解決方法は見えたと思いますが、コンテナ内にも環境変数を設定してあげれば解決できます。
そこで僕の場合は、コンテナ内でも、どの環境にも環境変数を1度設定するだけで適用できる方法を採用しました。
具体的にはdotenb-railsというGemを導入しました。

Gem dotenb-railsの導入

このdotenv-railsとは環境変数を管理してくれるGemです。
このGemを導入し、アプリディレクトリに.envファイルを作成することで1つのファイルで環境変数を管理し、そのファイルに環境変数を設定するだけで全環境に環境変数を適用することができます。

1) Gemfileに記述

Gemfile
gem 'dotenv-rails'
ターミナル
bundle install

これで導入できました。
次に環境変数を設定していきましょう!

2).envを作成し環境変数を設定する

ターミナル
touch .env

上記のコマンドを実行でも、エディタに直接作成していただいても構いません。
このファイルを作成し、設定したい環境変数を記述していきましょう。

環境ごとに環境変数を変えたい場合などは以下の記事がとても参考になるのでぜひ見てみてください。

【Rails】dotenv-railsの導入方法と使い方を理解して環境変数を管理しよう!

ここでは.envの記述のみ解説します。

.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を未然に防がないといけません。

.gitignore
# 1番下の行
.env

上記のように記述するだけでgitからは存在しないファイルとして扱ってもらうことができます。

4)環境変数の利用

これで環境変数の設定ができたので、後は使用したいところで呼び出すだけで利用できます。
非常に便利なGemなので、ぜひ使ってみてください

参考文献

【Rails】dotenv-railsの導入方法と使い方を理解して環境変数を管理しよう!

Discussion