LoginSignup
66
64

More than 3 years have passed since last update.

たった30分でわかるcredentials.yml.enc[rails5.2] - 環境変数を定義する使い方 -

Last updated at Posted at 2020-01-28

「正直デプロイもあんまりわかっていないんです」
そんな方向けに簡単にCredentials.ymlの説明を記載していきます。

credentials.ymlとは何??

「credentials.ymlとはそもそも何でしょう??」
>環境変数をまとめる場所です。

rails5.1までは、環境変数を""複数の場所に""定義しないといけなかった
環境毎に secrets.yml secrets.yml.enc ENV['SECRET_KEY_BASE'] の何処に値を設定すれば良いのかわかりづらい

「 めんどくさいから、1箇所にまとめない? 」

となって、一つにまとめたのがcredentials.yml.encです。

役割としては、Githubなどに公開したくない秘密鍵、ID、PW関連を変数として定義して、隠す場所となります。

公開したくないものを環境変数で定義して、非公開にするための場所とだけ認識されれば大丈夫です。

つまり、credentials.ymlは情報の金庫です

仕組み

credentials.ymlという金庫はどうやって守られているのでしょうか?
>master.keyで暗号化されています。
>master.keyは金庫を開ける鍵の役割です。
>この鍵がある状態でコマンドを入力すると、環境変数の定義・編集ができ、値を取得できます。

master.keyの数字とアルファベットの羅列を元に,credentials.ymlは暗号化されています。

だからmaster.keyが鍵の役割なのです。

この暗号化を解除するには、master.keyの羅列を利用する必要があり、
暗号化を解除することを""復号化""と言います。

要点はcredentials.ymlが金庫で、開けるにはmaster.keyが必要ということ。暗号化された情報を解読することを””復号化””という。

どうやって利用するの?

master.keyがある状態で、下記のコマンドを実行

編集画面を開く

ターミナル
$ EDITOR="vi" bin/rails credentials:edit

すると編集画面が表示される。

スクリーンショット 2020-01-14 18.32.12.png

編集をするために「i」を入力
スクリーンショット 2020-01-14 18.35.52.png

すると 『 ----挿入(INSERT)---- 』と表示されるので、入力が可能となります。

保存するときは、『 esc 』キーを押してから、『 :wq 』を押して保存します。

では、環境変数を定義していきましょう

■補足
これで表示されない場合は、master.keyが存在しないか、間違ったmaster.keyを保有しているかのどちらかです。

ちなみに上記のコマンドをmaster.keyが”ない”状態で実行すると,新しくmaster.keyが作成されるが、元のmaster.keyとは違うため暗号化が解除できずエラーが表示されます。
チーム開発の場合、誰か開ける人にmaster.keyを共有してもらう必要があります。

どうやって環境変数を定義するの?

では、操作方法に戻ります。
開いたcredentials.ymlで下記を定義した場合、

credentials.yml
aws:
  access_key_id: 123
  secret_access_key: 345

awsの
 access_key_id(環境変数) = 123(IDの値)
 secret_access_key(環境変数) = 345(PWの値)
と定義されています。

要は"変数"に値を定義しているだけです。
X = 3と変わりません。

どうやって定義した環境変数を利用するの?

まずcredentials.ymlの環境変数を利用する型が決まっています。

 Rails.application.credentials.~~

上記のように記述すると、「credentials.ymlからデータを引っ張るよお」という意味になります。

じゃあ、credentials.ymlのどこのデータを引っ張るの??

credentials.yml
aws:
  access_key_id: 123
  secret_access_key: 345

と定義してますから、

型: Rails.application.credentials.~~

# aws: のデータに関する項目だから、awsをつけます。
Rails.application.credentials.aws

# aws:のaccess_key_id:を取得したいなら(ハッシュオブジェクトと同じ方法で)
Rails.application.credentials.aws[:access_key_id]

# aws:のsecret_access_key:を取得したいなら(ハッシュオブジェクトと同じ方法で)
Rails.application.credentials.aws[:secret_access_key]

のようにすると環境変数の値を取得できます。
ですから、database.ymlで環境変数を入れたい場合は

# access_key_id = Rails.application.credentials.aws[:access_key_id]としたいなら、
access_key_id: <%= Rails.application.credentials.aws[:access_key_id] %>

# secret_access_key = Rails.application.credentials.aws[:secret_access_key]としたいなら、
secret_access_key: <%= Rails.application.credentials.aws[:secret_access_key] %>

つまり

Rails.application.credentials. + ハッシュオブジェクト名 +[:キー]

練習問題

問題1

環境変数が下記の定義の場合、

credentials.yml
PAYJP:
  access_key_id: fgrffd1r43r # 値が非公開
  secret_access_key: 233512435trga # 値が非公開

環境変数を取得するには、下記となる。

型: <%= Rails.application.credentials.~~ %>

<%= Rails.application.credentials.PAYJP[:access_key_id] %> #credentials.ymlからデータを取得
<%= Rails.application.credentials.PAYJP[:secret_access_key] %> #credentials.ymlからデータを取得

実際に定義するとこんな感じです

access_key_id: <%= Rails.application.credentials.PAYJP[:access_key_id] %>
secret_access_key: <%= Rails.application.credentials.PAYJP[:secret_access_key] %>

問題2

環境変数が下記の定義の場合、

credentials.yml
db:
  database: fgrffd1r43r # 値が非公開
  username: root # 値が非公開
  password: dteradsfga2435 #非公開
  socket: /tmp/mysql.sock

環境変数を取得するには、下記となる。

型: <%= Rails.application.credentials.~~ %>

<%= Rails.application.credentials.db[:database] %> #credentials.ymlからdbの:databaseを取得
<%= Rails.application.credentials.db[:username] %> #credentials.ymlからdbの:usernameを取得
<%= Rails.application.credentials.db[:password] %> #credentials.ymlからdbのpasswordを取得
<%= Rails.application.credentials.db[:socket] %>  #credentials.ymlからdbのsocketを取得

実際にdatabase.ymlに定義した場合

database.yml
型: Rails.application.credentials.~~

production:
  <<: *default
  database: <%= Rails.application.credentials.db[:database] %> # databaseには環境変数のdbを利用している
  username: <%= Rails.application.credentials.db[:username] %>
  password: <%= Rails.application.credentials.db[:password] %>
  socket: <%= Rails.application.credentials.db[:socket] %>

このように

Rails.application.credentials. + ハッシュオブジェクト名 +[:キー]

で利用できます。

理解を深める

database.yml
型: Rails.application.credentials.~~

production:
  <<: *default
  database: <%= Rails.application.credentials.db[:database] %> # databaseには環境変数のdbを利用している
  username: <%= Rails.application.credentials.db[:username] %>
  password: <%= Rails.application.credentials.db[:password] %>
  socket: <%= Rails.application.credentials.db[:socket] %>
コントローラー上で使う

@database =  Rails.application.credentials.db[:database] 

Dockerで利用する場合

Rails on Dockerでcredentialsをeditしたい

Dockerfileに追加
apt-get install -y vim
Dockerfile
FROM ruby:2.5.1

RUN apt-get update -qq && \
    apt-get install -y build-essential \ 
                      libpq-dev \
                      git \
                      vim
#yarnのインストール
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
    apt-get update && apt-get install -y yarn

#Nodejsをバージョン指定してインストール
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - && \
apt-get install nodejs

RUN mkdir /app_name 
ENV APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn
ENV APP_ROOT /app_name 
WORKDIR $APP_ROOT

ADD ./Gemfile $APP_ROOT/Gemfile
ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock

RUN gem install bundler -v 2.1.4
RUN bundle install
ADD . $APP_ROOT
buildして反映
$ docker-compose build
credetial.ymlの編集
$ docker-compose run -e EDITOR=vim web rails credentials:edit
66
64
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
66
64