production環境の秘匿情報を出し分けたい。

## 環境によって出し分けたいもの
- 環境変数
 - 秘匿情報
- config gem
 - それ以外 

## 環境変数の課題
- マスター管理がむずい
- DMで受け渡しをしないといけない
- APIキーなどのランダム文字列だとコピペミスに気が付きにくい
- リリースの手順が増える

## rails5.2から追加されたcredential機能
- git管理ができる
- クレデンシャル
	- rails5.2から 
	- RAILS_ENVでの出し分けができない 
- multi environment credentials
	- rails6から
	- RAILS_ENVでの出し分けができる
	
## さらに同じrails env内でも出し分けたい

### 前提
AWS環境にdevelopment(開発用), staging(検証用), prod(公開用)の3環境を用意している。
3環境ともRAILS_ENVは一律production
環境変数`TIER_ENV`を用意して3環境の判別を行っている。

## やりたいこと
- production環境の秘匿情報を出し分けたい。
- production.yml.encで

```
production:
 api_key:
staging:
 api_key:
development:
 api_key:
```

と名前を切って出し分けているのを

```
production/production.yml.enc
production/staging.yml.enc
production/development.yml.enc
```
とファイル単位で分けたい。

- staging.rbなど`config/environments/`にproduction.rbのコピーを追加するのは避けたい

## やったこと
### -h　を読む
`bin/rails credentials:edit -h`

```
In addition to that, the default credentials lookup paths can be overridden through
`config.credentials.content_path` and `config.credentials.key_path`.
```

### 読み込むファイル設定
config/application.rb


```
config.credentials.content_path = Rails.root.join("config/credentials/#{ENV['RAILS_ENV']}/#{ENV['TIER_ENV']}.yml.enc")
config.credentials.key_path = Rails.root.join("config/credentials/#{ENV['RAILS_ENV']}/#{ENV['TIER_ENV']}.key")
```

### 平仄を合わせる
```
production/production.yml.enc
production/staging.yml.enc
production/development.yml.enc
development.yml.enc
test.yml.enc
```

になっているので
これまで3環境の判別に使っていた`TIER_ENV`にlocal, testと言う値を追加して

```
production/production.yml.enc
production/staging.yml.enc
production/development.yml.enc
development/local.yml.enc
test/test.yml.enc
```


### 書き換える
- `config/credentials.yml.enc`の中身を下記コマンドで各環境ファイルに移動する

#### コマンド
- `-e`オプションでパス指定する

- productionモード
    - production

        ```
        EDITOR='vi' bin/rails credentials:edit -e production/production
        ```
        
    - staging
    
        ```
        EDITOR='vi' bin/rails credentials:edit -e production/staging
        ```
    
    - development
    
        ```
        EDITOR='vi' bin/rails credentials:edit -e production/development
        ```

- developmentモード

```
    EDITOR='vi' bin/rails credentials:edit -e development/local
```
- testモード

```
    EDITOR='vi' bin/rails credentials:edit -e test/test
```

### 動作確認方法
- springのプロセスを殺す 
- 下記コマンドで起動したpryで`Rails.application.credentials`
の結果の` @content_path`と`@key_path`が指定したファイルになっていること
- 下記のような指定方法で設定した値が復号できること

```
Rails.application.credentials[:hoge]
=> local
```
#### コマンド
- RAILS_ENVと`-e`オプションも指定する
    - productionモード
        - production
        
        ```
        RAILS_ENV=production TIER_ENV=production bin/rails c -e production
        ```
        - staging
        
        ```
        RAILS_ENV=production TIER_ENV=staging bin/rails c -e production
        ```
        - development
        
        ```
        RAILS_ENV=production TIER_ENV=development bin/rails c -e production
        ```
    - developmentモード
    
    ```
    RAILS_ENV=development TIER_ENV=local bin/rails c -e development
    ```
    - testモード
    testの時はrails consoleで確認できなかったのでspecのどこかでbinding.pry


### 環境へ適用
- elasticbeanstalkの場合ヘルスチェックを無視する
- RAILS_MASTER_KEYの値を修正する
例えばstg環境の場合`RAILS_MASTER_KEY`を`config/credentials/production/staging.key`の値に設定する
- デプロイコマンドの実行
- puma/puma.logを確認する
- エラーが出ていたら修正する(seacret_key_baseがないと怒られた)
- 疎通確認

## 感想
- credentials:editの際content_pathで指定してるんだから`-e`オプションを付けなくてもそっちを見て欲しかった。
- 本番反映がうまく行かないと思ったらRACK_ENVによる指定になっているのに気づかずしんどかった
- 下記にすれば`RAILS_ENV`でも`RACK_ENV`でもいけると思ったがダメだった
```
"config/credentials/#{Rails.env}/#{ENV['TIER_ENV']}.yml.enc"
```