2016-11 / 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

2016-11-05 (土)

yaml_vault が AWS での Rails 環境変数つらい問題を解決したと思う [Rails][AWS]

※ 弊社 feedforce で毎週行っている、インフラ共有会を元にした記事で
す。AWS で Rails を使っている方を想定していますが、数人規模のチー
ムを意識した内容になっています。

こちらの記事で yaml_vault を知ったので、実際に試してみました。

yaml_vault+KMSでRailsアプリのconfig/secrets.ymlを暗号化してgitにコミットして管理する - Qiita


環境変数つらい


SaaS の API Key などの秘匿情報をコードに埋め込まないために、Rails
dotenv を使っている方も多いかと思います。

しかし、README.md にあるように作者の @bkeepers さんは production
での利用は奨励していません。

dotenv was originally created to load configuration variables into
`ENV` in *development*. There are typically better ways to manage
configuration in production environments - such as
`/etc/environment` managed by Puppet or Chef, `heroku config`, etc.


とは言え、/etc/environment を Chef の Encrypted Data Bag 等で構成
管理するのも管理レイヤーが違うためモヤモヤします。それに、稼働中の
プロセスの環境変数が書き換わったか確認するのは、なかなか面倒です。

以上の問題を yaml_vault が解決してくれました。@joker1007 さんに感謝!

joker1007/yaml_vault

Yaml file encryption/decryption helper.



運用例


例えばこんな config/secrets.yml があったとします。development と
test は隠す必要がないためベタ書きですが、staging と production は
環境変数で設定しています。

development:
  secret_key_base: c4eeb5e80b2fbcc568efc7b8c2587a274330dfd7ce6b023d7049d61f682fcef88b7c9106b27bb7aa8d3750ea0a64008f94508ac45feaffc1ace638fa2a4c14ca

test:
  secret_key_base: 1d7a7dc6e551abe00bd1f8aa87f43cec198bcd0689a812d74c5344da9af89a965f29a4e00420c565a6f5b0908bde523ad08f6594f2878c44fc3321bf53b33f87

staging:
  secret_key_base: <%= ENV['SECRET_KEY_BASE'] %>
  bugsnag_api_key: <%= ENV['BUGSNAG_API_KEY'] %>

production:
  secret_key_base: <%= ENV['SECRET_KEY_BASE'] %>
  bugsnag_api_key: <%= ENV['BUGSNAG_API_KEY'] %>



一旦、ベタ書きにします。

development:
  secret_key_base: c4eeb5e80b2fbcc568efc7b8c2587a274330dfd7ce6b023d7049d61f682fcef88b7c9106b27bb7aa8d3750ea0a64008f94508ac45feaffc1ace638fa2a4c14ca

test:
  secret_key_base: 1d7a7dc6e551abe00bd1f8aa87f43cec198bcd0689a812d74c5344da9af89a965f29a4e00420c565a6f5b0908bde523ad08f6594f2878c44fc3321bf53b33f87

staging:
  secret_key_base: 955ea7c99a3069837ef818b1b962ced42a6c4d6d80d0537103a2b4c5cb9e0d1b0ea0bc32d772e1334c284d93787558564fcec2f8fbe7e4334dea6234b2ee27b1
  bugsnag_api_key: 0123456789

production:
  secret_key_base: 3fbeb3a538327484033ceaabc6454ed5a8d7dee9d5875b5b6b4c3cffc4bb461c13783ab9dd6a0cd78be310882649d116fb2b1276a9c324faa86ade594b69acb2
  bugsnag_api_key: 0123456789



以下のコマンドを実行します。

$ bundle exec yaml_vault encrypt config/secrets.yml \
-o config/encrypted_secrets.yml -k production,staging \
--cryptor=aws-kms --aws-kms-key-id=alias/hoge-rails


暗号化された config/encrypted_secrets.yml が作られます。

---
development:
  secret_key_base: c4eeb5e80b2fbcc568efc7b8c2587a274330dfd7ce6b023d7049d61f682fcef88b7c9106b27bb7aa8d3750ea0a64008f94508ac45feaffc1ace638fa2a4c14ca
test:
  secret_key_base: 1d7a7dc6e551abe00bd1f8aa87f43cec198bcd0689a812d74c5344da9af89a965f29a4e00420c565a6f5b0908bde523ad08f6594f2878c44fc3321bf53b33f87
staging:
  secret_key_base: AQECAHi181o2hUvlZ9UTXBtv1MzPPujmGDFezmSybnYV90TnAwAAAOwwgekGCSqGSIb3DQEHBqCB2zCB2AIBADCB0gYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAy3dSJNIu/qCeKnZpsCARCAgaRAnkrMBvl9uUHOIawv5JkjH7BhGQluET8XVzVfar6md9GC9x3WF55kW7+ZGeY5Y5I+LtLiOaghH/2rZfIw/bIdjU1nkflnGyQpTnD97sbqIzr6OcFLUH5lLv4WXkTk07hlzLERg9sSQ6rGUMgUCtWyP1cwKyb/2C3rl4DpZu9+gCwKU4hCGFeYUWEFV/MQ9dO/0RbetVUw/WZ+G3ySnB9AVqOVMA==
  bugsnag_api_key: AQECAHi181o2hUvlZ9UTXBtv1MzPPujmGDFezmSybnYV90TnAwAAAHEwbwYJKoZIhvcNAQcGoGIwYAIBADBbBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDMm0fS5bpOEx/elwkgIBEIAuCsJ365ViKogCNKFsrQmr5yh8KYgkWWulSFcAmGnf+y97/ZudS3JqDK7QbXSzTw==
production:
  secret_key_base: AQECAHi181o2hUvlZ9UTXBtv1MzPPujmGDFezmSybnYV90TnAwAAAOwwgekGCSqGSIb3DQEHBqCB2zCB2AIBADCB0gYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAxMSH3wGwI9iMEm/foCARCAgaTzl9w/NXy3bGSlmlilQffQkofaUNmG/eODW7cRoRlCEyYTSp5yZk0eLcLO6SU8AqC3lM5AfJyGtFY4/oXjQwVub3z/33ud/A9UKiEBXEHEODm0/kd4eldkLdna/e2st74XG5qsO9t7pmKlcKFPzZGG1x9rNetyuJGOmvEvz9ZpAyC2obYCl3itrVGlsrElX7VTYqVPLON/PwWSXdq+79zL4j6rzQ==
  bugsnag_api_key: AQECAHi181o2hUvlZ9UTXBtv1MzPPujmGDFezmSybnYV90TnAwAAAHEwbwYJKoZIhvcNAQcGoGIwYAIBADBbBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDBtD3T8V6xkOq9bdsQIBEIAu8s0QcAsrULVMdgdycg5u4rU02seGa1sszDBxxXnKQ3KoQPUB0HGcGNksZUFqlw==



※ この例では $AWS_ACCESS_KEY_ID, $AWS_SECRET_ACCESS_KEY,
$AWS_DEFAULT_REGION を direnv で設定しています。設定しない場合はそ
れぞれ --aws-access-key-id, --aws-secret-access-key, --aws-region
オプションが必要です。

今後は、作成された config/encrypted_secrets.yml を git で管理して
いきます。config/secrets.yml は git 管理下から外し、.gitignore に
追加しておきます。

以下のコマンドをデプロイ時の hook に仕掛ければ、Production と
Staging の Rails は環境変数を使うことなく config/secrets.yml を
参照することが出来ます。

$ bundle exec yaml_vault decrypt config/encrypted_secrets.yml \
-o config/secrets.yml -k production,staging \
--cryptor=aws-kms --aws-kms-key-id=alias/hoge-rails


※ EC2 インスタンスに IAM Role を付けることを忘れないようにしましょ
う。でないと、$AWS_ACCESS_KEY_ID, $AWS_SECRET_ACCESS_KEY,
$AWS_DEFAULT_REGION の設定が必要になり、本末転倒です。

この例では Development と Test 環境は単純コピーで良いです。

$ cp config/encrypted_secrets.yml config/secrets.yml


事前準備


Gemfile に以下を追記し、bundle install しておきます。

group :development do
  gem 'yaml_vault'
end



AWS IAM のコンソールから KMS の Encryption Key を作成します。
Region は前述の $AWS_DEFAULT_REGION と合わせておきます。

https://console.aws.amazon.com/iam/home#encryptionKeys

今回は hoge-rails という alias の Encryption Key を作りました。

最初に紹介した記事では IAM Group が使える Encryption Key にしてい
ますが、数人規模のチームなら専用の IAM User を作っても良いかもしれ
ません。

あと、サーバではなくアプリが必要とするリソースなので、Terraform で
管理するかは議論の余地があると思います。

事前準備はこれだけでした・・・!

追記(2016-12-02):
https://github.com/joker1007/yaml_vault/pull/6 がマージされたので、
Gemfile の記述をアップデートしました。

2016-11 / 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

最終更新時間: 2017-01-14 05:25

検索


最近の話題
- 2017-01-10
  完全に闇に落ちていた StartSSL に ¥3,603 課金してしまったお話
- 2017-01-03
  Software Design を 13 ヶ月分まとめ読みした
- 2016-12-19
  任意の Ruby オブジェクトを YAML として書く
  Ruby の $ERROR_INFO などの特殊変数は require 'English' が必要だったのか
- 2016-12-14
  不惑の年に風呂の良さを知った
- 2016-12-10
  bundle install で Your Gemfile.lock is corrupt. と怒られる件
- 2016-11-05
  yaml_vault が AWS での Rails 環境変数つらい問題を解決したと思う
- 2016-11-01
  ZenPad 3S 10 (Z500M) から始まる廃人生活
最近追記された記事
- 2015-06-07-1 (17日前)
- 2016-12-10-1 (35日前)
- 2016-11-05-1 (43日前)
- 2015-01-04-1 (51日前)
- 2016-11-01-1 (72日前)
- 2015-07-28-1 (96日前)
- 2016-09-29-1 (98日前)
- 2014-09-23-1 (179日前)
- 2016-06-07-1 (220日前)
- 2015-12-27-1 (380日前)
カテゴリ
- Anthy (3)
- Apache (11)
- Apple (1)
- ATOK (4)
- au (2)
- AWS (15)
- Bazaar (1)
- Berkshelf (2)
- BigQuery (1)
- BitBar (3)
- Book (85)
- Boxen (2)
- Bugsnag (1)
- C (26)
- capistrano (3)
- chalow (56)
- ChatWork (1)
- Chef (17)
- Chrome (3)
- Chromecast (1)
- CircleCI (7)
- Comics (2)
- Cooking (10)
- cvs (15)
- cygwin (12)
- D3.js (1)
- Debian (55)
- Docker (1)
- E-mail (8)
- elasticsearch (3)
- Emacs (219)
- Emacs講座 (10)
- English (4)
- feedforce (7)
- fetchmail (3)
- Firefox (20)
- Fluentd (4)
- ftp (1)
- Game (19)
- Gem (5)
- Git (8)
- GitHub (15)
- Go (5)
- Google (1)
- gpg (4)
- GrowthForecast (7)
- Health (2)
- Heroku (9)
- Homebrew (10)
- HTML (6)
- iBook (1)
- iPhone (14)
- IRC (1)
- Jenkins (8)
- Karabiner (1)
- KeySnail (3)
- Kibana (1)
- Kindle (1)
- Langrich (7)
- LDAP (6)
- Life (18)
- Linux (5)
- Mackerel (1)
- Mew (18)
- MongoDB (1)
- Mozilla (19)
- Music (1)
- MySQL (1)
- NAS (4)
- nginx (6)
- NHK (1)
- Node (1)
- ntp (4)
- OOP (1)
- OpenID (2)
- openssl (1)
- Opera (2)
- OSX (41)
- Perl (14)
- PHP (19)
- PostgreSQL (1)
- procmail (4)
- Programing (3)
- Puppet (1)
- Python (2)
- Rails (10)
- Rake (2)
- RaspberryPi (1)
- RedHat (29)
- Redmine (3)
- Rspec (1)
- Ruby (48)
- samba (3)
- screen (7)
- sed (5)
- serverspec (6)
- sh (8)
- Slack (2)
- Solaris9 (22)
- Spring (2)
- ssh (4)
- StatusNet (21)
- svn (12)
- Swift (1)
- Tablet (1)
- tdiary (3)
- Twitter (14)
- Twmode (6)
- Ubuntu (5)
- UNIX (102)
- vagrant (8)
- Video (21)
- vim (1)
- Wercker (9)
- Windows (29)
- Wine (3)
- XML (11)
- XP (1)
- zsh (25)
- インストールメモ (33)
- クイックシェイプ (12)
- ネタ (15)
- 勉強会 (13)
- 携帯 (6)
- 正規表現 (4)
過去ログ
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12
2002 : 01 02 03 04 05 06 07 08 09 10 11 12
2001 : 01 02 03 04 05 06 07 08 09 10 11 12
Google+