credentials.yml.enc デプロイ 設定 本番環境

 Rails5.2から、以前のsecrets.ymlに変わって新たに導入されるようになった秘密情報の管理ファイルであるcredentials.ymlの使い方をまとめる。

 

 <やること>

AWSのS3バケットのSECRET_ACCESS_KEYをcredentials.ymlでアクセス・管理できるようにする

●そのSECRET_ACCESS_KEYを環境変数に保存することでセキュリティを高める

 

<追記:失敗しました。①はやらないことにします>

 

環境変数にSECRET_ACCESS_KEYを記述する

# ローカル環境
$ vim ~/.zshrc # または~/.bash_profile

# iを押してインサートモードに移行し、下記を追記する。 export AWS_ACCESS_KEY_ID='Access key ID' export AWS_SECRET_ACCESS_KEY='Secret access key' # 編集が終わったらescapeキーを押してから:wqと入力して保存・終了
$ source ~/.bash_profile  
# 本番環境
$ sudo vim /etc/environment
# iを押してインサートモードに移行し、下記を追記する。
export AWS_ACCESS_KEY_ID='Access key ID' 
export AWS_SECRET_ACCESS_KEY='Secret access key'
# 編集が終わったらescapeキーを押してから:wqと入力して保存・終了

# 編集した環境変数を適用するために一旦ログアウトします。
$ exit

 

 環境変数から呼び出すように設定しましたが、うまくS3に投稿できませんでした。Carrierwaveがcredentials.ymlの値を呼び出したら

access_key_id: [/"AWS_ACCESS_KEY_ID"/] 

 で呼び出されてしまってちゃんと値が出力されませんでした。credentials.ymlを使えば暗号化されるのでわざわざ環境変数から呼び出す必要ないので、もう環境変数に入れるのはやめます。

 

②credentials.yml.encに設定を記述

 config/credentials.yml.enc

$ EDITOR=vim bin/rails credentials:edit
# vimでcredentialsの中身を記述する
# ↓#がついているのをとる
aws:
access_key_id: 自分のAWS_ACCESS_KEY_ID
secret_access_key: 自分のAWS_SECRET_ACCESS_KEY 
# master.keyで暗号化されるので安心

secret_key_base:  94cd28a0bbe83b737292da7928f2f5fca17937922b0a79a64c22cc4999d87d3426808ad3ea655e7a68652d6e3e3c1021339ceb87ee615322351640bed63ce8bd

#secret_key_baseは必ず最下段に置くようにする

 

③carrierwave.rbに設定を記述

 S3に画像保存をする目的でこの設定をするので、画像保存のためのgemであるCarrierwaveを設定します。

 config/initializers/carrierwave.rb

require 'carrierwave/storage/abstract'
require 'carrierwave/storage/file'
require 'carrierwave/storage/fog'

CarrierWave.configure do |config|
  config.storage = :fog
  config.fog_provider = 'fog/aws'
  config.fog_credentials = {
    provider: 'AWS',
    aws_access_key_id: Rails.application.credentials.aws[:access_key_id],
    aws_secret_access_key: Rails.application.credenrials.aws[:secret_access_key],
    region: 'ap-northeast-1'
  }

  config.fog_directory  = 'バケット名'
  config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/バケット名'
end

 

 こんな感じ。Rails.application.credentials.aws[:access_key_id],のところが以前のsecrets.ymlと呼び出し方が違う。[:access_key_id]というようにキー名指定になっているので注意。自分はここの間違いで時間食った。

 

 このCarrierwaveの設定でcredentials.ymlの変数を呼び出して、SECRET_ACCESS_KEYやらを取得しています。

 

④master.keyを本番環境にコピーしてくる

 credentials.ymlは暗号化されているのでGithubに乗って他人に見られても大丈夫です。この暗号を解くキーがmaster.keyに記述されます。だからmaster.keyファイルは外部に漏れてはいけない。.gitignoreに自動で追加されています。

 さて、問題なのは.gitignoreされているのでデプロイしても本番環境にmaster.keyは存在していない状態になっています。なので、credentials.ymlの暗号が解けない!という状態。エラーになる。

 このままでは意味がないので、githubを介さずに、直接本番環境にmaster.keyをコピーして使えるようにします。

 

 ローカル環境

$ scp -i .ssh/example.pem AppName/config/master.key ec2-user@11.222.333.44:/var/www/AppName/shared/config/
# ディレクトリ構造は各自合わせてください

 〜各部分の解説〜

● scp  -i    … Secure Copy Protocolというsshを利用したセキュリティ高いLinuxの転送コマンドです。

(参考)https://qiita.com/chihiro/items/142ebe6980a498b5d4a7

 

● .ssh/example.pem …SSLサーバ証明書とかに使われる.pemファイルの保存場所の指定。本番環境にアクセスするのに必要な鍵情報が入っているので、指定する必要がある。

参考:https://www.ecoop.net/memo/archives/guide-for-pem.html

 今回のコマンドはこの.sshディレクトリが存在するディレクトリ上で実行する。(コマンドの実行は.pemファイルがどこに保存されているかで決まってくるので注意が必要)

 

● AppName/config/master.key … ローカル環境におけるmasuter.keyの所在地の指定。基本configディレクトリ配下でしょう

 

● ec2-user@11.222.333.44:/var/www/AppName/shared/config/ … 本番環境におけるコピー先の指定。このconfigディレクトリ配下にmaster.keyをコピーしてくる。IPアドレスとかディレクトリ構造は各自ご確認。

 

 先に書いた通りディレクトリ構造が正しく指定できてないとエラーが出続けるので、根気よく頑張ってください。

参考:https://qiita.com/yuuuking/items/53a37a2e998972be32b8

 

※追記※もっと簡単に、本番環境でmaster.keyを作成して、本番環境でvim をして、ローカルのmaster.keyの内容をコピペすればいいという。う、う、う、、、、。

 

⑤deploy.rbに設定を記述

 config/deploy.rb

set :linked_files, fetch(:linked_files, []).push("config/master.key")

 

 この set :linked_files, というdeployオプションは、本番環境のsharedディレクトリにあるファイルのシンボリックリンクをcurrentディレクトリに作ってくれるというものである。

シンボリックリンク」…ショートカットとかエイリアスのようなもの。参照場所への連結通路を作ってくれる。

 本番環境のsharedディレクトリは、デプロイによってver.更新されても共通で参照されるディレクトリ(設定ファイルが入ったものとか)が格納されるディレクトリである。

 現在、sharedには④の行程でコピーしてきたmaster.keyがある。これをデプロイ最新状態のcurrentディレクトリで使えるようにシンボリックリンクを作るっていう設定である。

 この設定はシンボリックリンクを作るだけだから、sharedへのファイルコピーが必要だってわけですね。

参考:https://qiita.com/aplifyjp/items/5d24394dbd03712a2f1f

 

⑥本番環境でmaster.keyがあるか確認する設定

 config/environments/production.rb

config.require_master_key = true

   #でコメントアウトされているので解除。master.keyがなかったらエラーを表示してくれるよ。これでファイルがつくれてないとかの設定ミスに気づけます?

 

 

以上です。

 

 これでcredentials.yml.encで秘密鍵が扱えるようになります。

 

参考:https://qiita.com/yuuuking/items/53a37a2e998972be32b8