現在業務委託エンジニアとして開発基盤まわりのお手伝いをしている@amyroiです。Calendarが盛り上がっていますね。今回はその手順、ノウハウを書いていこうと思います。して廃止するのプロジェクトのリポジトリに公開したくない秘密情報をdotenvで管理してhost毎に管理する為によく使われるdotenvですが、host側の管理となると会社の規模によってはインフラ担当者に依頼が発生し、いちエンジニアが管理できない。dotenvファイルを暗号化する機構を別で持つ事もあり、一つの環境変数を変更するのにインフラから作業が切り離せない。host毎の環境変数管理を管理する便利なgemがちゃんとあるのでconfigに変更しようよ。環境変数をconfigに変更しいちエンジニア側で管理を完結できるようになった。itamaeなどの構成管理が不要になる。自動化させることによりプロジェクトに参加したばかりのエンジニアでも意識する必要がない。いいことづくめですね何を使うの?実際に対応したRails,Rubyのバージョンと実現するために使ったgemを紹介します。KMSRspec3capistranobin/setup始める前に事前調査と設計をしてから手をつけるのが得策です。事前準備(調査)編と導入編に分けました。2回目となるconfigへの移行作業の規模が大きく、なかなか大掛かりとなりました。調査と設計をしっかりしていくのがポイントとなります。事前準備(調査)編dotenvで管理している機構を確認するまずはdotenvがリリース環境で展開されどのような構成で動作しているのかを確認します。実例dotenvの各ホストへの配布にitamae,暗号化にyaml_vaultを利用していました。こちらは全てインフラ側で行われていました。dotenvとは別に独自環境変数のclass定義がありました。enviromentsの目的を明確にする。testのenviromentsの意味を明確にします。ciでのテストで使っている環境変数に相違がある場合がありました。みなさんはそんな事しないと思いますが何があるか分かりませんね。ここは前もって整理しておきましょう。各enviromentsで使われいてる環境変数を復号化して一覧にします。dotenv以外の独自環境変数classがないかチェックし移行対象にします。必要のない環境変数の洗い出しをします。dotenv以外に独自にclassからYAML.loadさせてアプリ固有の環境変数を作っていました。一部の変数はdotenvから呼び出すというスパゲッティ。使われていない環境変数が残っている事、独自定義の環境変数もどきと重複のチェックも行います。呼び出し元が統一されていたら楽ですが、そうもいきません。ENV['GOOGLE_CLIENT_ID']ENV["GOOGLE_CLIENT_ID"]ENV.exists?('GOOGLE_CLIENT_ID')プロジェクト内でRails.env.{enviroment}?で制御している箇所を洗い出す環境変数をつかっているのにRails.env.{enviroment}?でif分制御している箇所があったりします。[enviromentsの目的を明確にする]でローカルとdevelopmentで違う値を使いたいときなどにハードコーディングしている場合がありますのでリファクタしていくことにしましょう。導入(設計)編まだ実装しません。暗号化の仕組みを選定し、設計をしていきます。暗号化の仕組みを選定する候補sekrets(https://github.com/ahoward/sekrets)Rails5.1から導入される秘密情報の暗号化の参考にされているsekretsが有力候補でしたが、ファイル事暗号化してしまう為、環境変数名がリポジトリ上で確認できません。yaml_vault(https://github.com/joker1007/yaml_vault)jokerさんのyaml_vault、vaultキー配下のkeyのvalueだけ暗号化してくれます。key管理にKMSが使える。本来ならsekretsにするところですが、key名までも暗号化されてしまうと変数名すらわからない状態になってしまう為、yaml_vaultを採用しました。運用しやすくするためにrakeタスクを作成することにしました。内で復号化capistranoデプロイ時deployコマンドに仕込みます。デプロイ時deployタスクに仕込みます。導入(実装)編やっと実装していきます。対象外のファイル、配置構成を下記としました。cookie,sessionkey等。enviroments共通の設定ファイル。production.ymlconfigファイルに環境変数を移動する。整理した環境変数をconfigファイルに移動していきます。命名規則も綺麗にしていきましょう。サンプルENV['GOOGLE_CLIENT_ID']=>Settings.google.client_iddotenvとconfigの変数の対応表を作ります。Rspecでの単体テスト用に作っていきます。懐かしいjpmobileの絵文字のconversion_tableを思い出して作りました。このconversion_tableがあれば動作テストを減らすこともできますし、もし移行によるバグが発生しても変更された変数名が他のエンジニアでも容易にチェックできます。'google.client_id'}削除対象の環境変数は対応表にはいれません。その代わりSpecに検証対象外のkeyとして残しておきます。yaml_vaultのrakeタスクを作成する。ここでyaml_vaultのrakeタスクを作ります。理由yaml_vaultのISSUEにも上がっていますが、現時点(2017/08/04)でyaml_vaultは暗号化対象yamlのvaultキー配下をデフォルトで暗号化します。となりかっこ悪いオプションで暗号化対象のkeyを渡すとvaultキー以外でも暗号化してくれますが、全て指定しないと他が暗号化されないまま出力されてしまう。エンジニアの日々の運用をしやすいようにSettingsファイル配下のkey一覧を取得して、keyを指定せずに暗号化復号化できるようにrakeタスクを作りました。実例をお見せしたいですが、ここは公開していないコードになる為割愛します。実行タスクは下記のようにしました。サーバーへのデプロイ時のタスクにそれぞれ上記で作ったrakeタスクを組み込んでいきます。'config:decrypted'dotenvからconfig移行のテストを書くこれが一番大事ですね。rakeタスクのspecはもちろんですが、dotenvとconfigの変数の対応表を使い、specを作っていきます。各enviroments毎にループさせ、Dotenv.loadをした値と、復号化したconfigファイルの値が一致しているのかのテストを書いていきます。ここで値チェックは終わりです。環境変数の削除の準備ができましたのでconfigの変数名に置換していきます。ここは対応表を使って置換していくのがいいでしょう。コードのリファクタ独自環境変数用のクラス、if分制御している箇所をリファクタしていきます。動作テスト各enviroments用のテスト環境を作り、動作テストを行います。dotenv削除itamae側のdotenv配置ロジックを削除リポジトリ内にサンプルのdotenv等があればそちらも削除リリース!移行作業を行います。変更点が多いので監視をしましょう。動作テストしてリリースしたら後処理を行います。リリース後ホスト内にあるdotenvファイル群を削除していきます。移行完了お疲れ様でした!最後に(感想など)KMSの設定やテスト環境の構築などは省略しました。dotenvをリリース環境で使っているプロジェクトもまだまだあるんだなというのが正直な感想。テスト・デプロイも全て担当したのでやった感あり。これから移行して行こうと思っている方々の参考になるかな。できればRails標準のEnumを使いたかったので、gemを作りました。host動くサンプルもこちらに作っています。github.com特徴ApplicationRecordにincludeする事により、enum設定してあるカラム全てに自動でi18nの翻訳を対応できるようにしています。i18nのスコープが独自の階層で定義していてもscopを引数に渡すことで既存のi18n定義も呼び出せるようにしています。リモートワークについて3日目の記事です。徐々にネタがかぶっていきそうなので先に書いたもん勝ちですね。2日目は佐々木さんでした。サムネイルが最高ですね。仕事環境とツールについて話そうと思います。はじめに自己紹介@amyroiサーバーサイドエンジニアフリーランスを5年経験後女性向けのサービスLocariの開発に参加するために最近Wondershakeに入社しました。リモートワークのきっかけフリーランスを始めたのが2011年でした。この2011年をきっかけに自宅作業の環境整備をしいられる企業が多くありました。この年に完全リモートでシステム開発を請け負うエージェントの社長に出会い本格的にリモートワークを開始することになりました。リモート環境整備5年の間に自宅でのリモート環境の整備を二転三転させながら、今はとても快適な環境となってきたので紹介します。リビングに合うダイニングテーブルを購入しました。テーブルの脚をセミオーダーでカットし、キーボードを打つ時に肩が上がらない高さにしました。椅子お店の人の勧めで最初にバロンチェアを購入しました。生地の反発力が強く、すぐに疲れるようになってしまい売却。www.offinet.comもう一つ悩んでいたCassicoチェアを購入しなおしました。これは女性専用の椅子でCSの人達やOLさんの多いオフィスで使われているそうです。www.itoki.jpツールタイムログリモートで困るのが稼働時間が見えないこと。稼働時間の提出が必要ない場合があると、自分もどれくらい稼働しているのか見えないのが不安になる時があります。使っていたのがtogglです。自分用のタスク管理ツールとしてHiTaskを使っていました。各プロジェクトと事業用のタスクをまとめて管理していました。hitask.com最近Asanaを見つけたので今使うならこっちがオススメ。始業時間が決まっている会社の場合は毎日朝会と夕会をビデオ会議でしていました。これがあるとリモートでも気持ちが引き締まるので結構好きでした。夜型の多い業界ですが、ここ数年は残業禁止の契約が多かったため、1日の働く時間を決めてその時間に100%集中して仕事を終えるということをしてきました。すると、周りが勝手にそのリズムに合わせてくれるようになりました。帰ってしまう前に決める事はこの時間内に決めてしまおう。早く帰る人がいるから俺たちももう帰ろう。リリース前や緊急時は別ですが、健全なサイクルが回り始めたりしました。監視ツール監視...されてますかね?#姐さんの為に働いてますさいごに明日はshirokuraさんのリモートワーク4日目の記事です。Meetupに行ってきました。久しぶりのRails系の勉強会かも。ただのメモですがそのうち綺麗にするかも。さんqiita.com7月のRails5リリース後すぐにプロダクトのRails5へアップデートしたのをよく覚えている。updateしてPR送る自社システムを常に使っていた。PR作った時点で、Rails4.2でもmergeできるものが有ることに気付き、は先にmergeをした。APIモードActonCable未使用だったのも比較的悩むこともなかった要因かも。Railsブランチの監視を常にしていた。最速リリースをあえて目指してみた。性能テストはちゃんとはしてないけど、バッチとか遅くなかった。意識していなかった部分。Tech業界の動向についてスタイラー小関氏。Summit業界横断のイベントがなかなかない日本は業種ごとに人材の流動性がなく、また業種ごとのハブが存在しない。その為テクノロジーの活用が遅れている。アジアのファッション業界について。中国のVC投資はBATが投資合戦をしている。Facebook上で顧客の質問をコメントで受けて店舗に流入。Alipay等で決算後、messengerで住所送って発送してもらう。Techの内情、ぶっちゃけトーク!アパレルの人はITに抵抗ある?知識がなかった部分と上の人間も理解が出てきたところITが必要なのか?の発言などWeb業界からするとアパレル業界はまだIT進んでいないと思われているが他業者よりは危機意識があるほう。社内にファッションブレインは居るのか業界人いる(シタテル)顧問にも業界の人がいる(aircloset)エンジニア・法務意外はファッション出身社(terminal)立ち上げ時はいなかったが重視して採用した。バランスが大事(スタイラー)イベントと終えての感想200人超えの大きなイベントでアパレル業界の人が多いかと思いきや、参加者中ファッション業界が一番少なく、IT関連の方が圧倒的に多かった。男性も女性もお洒落に際立っている方々が多く、香水の香りが充満してとても居心地のいい空間でした。私の隣の席はなぜかおっさんロマンスグレーでした。airClosetは会場に有料会員は皆無で残念そうだったのが印象的。私は会員登録済みだが有料会員まではしておらず。ライト会員月額6800円はお試しでも少しポチりにくい金額と感じたがディープユーザーにはレギュラープランでも十分お安いのかもしれない。ファッション業界でRailsを使っている会社があるとは驚きでした。最適な出会い』という言葉がとても響いた1日でした。サンドイッチ美味しかった。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。