「正直デプロイもあんまりわかっていないんです」
そんな方向けに簡単に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
すると編集画面が表示される。
すると 『 ----挿入(INSERT)---- 』と表示されるので、入力が可能となります。
保存するときは、『 esc 』キーを押してから、『 :wq 』を押して保存します。
では、環境変数を定義していきましょう
■補足
これで表示されない場合は、master.keyが存在しないか、間違ったmaster.keyを保有しているかのどちらかです。
ちなみに上記のコマンドをmaster.keyが”ない”状態で実行すると,新しくmaster.keyが作成されるが、元のmaster.keyとは違うため暗号化が解除できずエラーが表示されます。
チーム開発の場合、誰か開ける人にmaster.keyを共有してもらう必要があります。
どうやって環境変数を定義するの?
では、操作方法に戻ります。
開いた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のどこのデータを引っ張るの??
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
環境変数が下記の定義の場合、
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
環境変数が下記の定義の場合、
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に定義した場合
型: 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. + ハッシュオブジェクト名 +[:キー]
で利用できます。
理解を深める
型: 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したい
apt-get install -y vim
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
$ docker-compose build
$ docker-compose run -e EDITOR=vim web rails credentials:edit