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

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


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

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

#### 「 めんどくさいから、１箇所にまとめない？ 」
となって、一つにまとめたのが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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/ef028fcc-46da-dbf1-df6f-666a1118be53.png)

編集をするために「i」を入力
![スクリーンショット 2020-01-14 18.35.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/5eee2bcc-b444-9e77-1237-d77a4aedc23d.png)

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

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


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

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

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


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

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

```ruby: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の環境変数を利用する型が決まっています。

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

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

```ruby:credentials.yml
aws:
  access_key_id: 123
  secret_access_key: 345
```
と定義してますから、

```ruby
型： 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で環境変数を入れたい場合は

```ruby:
# 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


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

```ruby:credentials.yml
PAYJP:
  access_key_id: fgrffd1r43r # 値が非公開
  secret_access_key: 233512435trga # 値が非公開
```
環境変数を取得するには、下記となる。

```ruby:
型： <%= Rails.application.credentials.~~ %>

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

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

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


## 問題2


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

```ruby:credentials.yml
db:
  database: fgrffd1r43r # 値が非公開
  username: root # 値が非公開
  password: dteradsfga2435 #非公開
  socket: /tmp/mysql.sock
```
環境変数を取得するには、下記となる。

```ruby:
型： <%= 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に定義した場合

```ruby: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. + ハッシュオブジェクト名 +[:キー]
```
で利用できます。

## 理解を深める

```ruby: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] %>
```

```ruby:コントローラー上で使う

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

# Dockerで利用する場合

[Rails on Dockerでcredentialsをeditしたい](https://qiita.com/at-946/items/8630ddd411d1e6a651c6)

```dockerfile:Dockerfileに追加
apt-get install -y vim
```

```dockerfile: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
```