credentials.yml.enc デプロイ 設定 本番環境
Rails5.2から、以前のsecrets.ymlに変わって新たに導入されるようになった秘密情報の管理ファイルであるcredentials.ymlの使い方をまとめる。
<やること>
●AWSのS3バケットのSECRET_ACCESS_KEYをcredentials.ymlでアクセス・管理できるようにする
●その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