Rails6でRedisを利用する
概要
railsのセッション情報の保存先はcookieなのですが
このままだと4kbまでしか保存できなかったりセッションリプレイのセキュリティリスクがあります。
rails的にはセッションに重要な情報を置くなというスタンスらしいですが(ソース見つからず)
とはいえ、制限があったりセキュリティリスクがあるというところでredisなどのストレージに保存したい要求もあります。
(この仕様は根が深そうだ)
ライブラリを入れる
redis-rails
が昔は使われていたようですが
rails5.2以降からはフラグメントキャッシュの仕様が追加されたとかで利用されなくなっています。
セッションストレージを利用したい場合はredis-actionpack
を利用するようですのでこちらをgemに追加してください。
gem 'redis-actionpack'
redis-actionpackの設定をする
以下の内容をconfig/initializers/session_store.rb
に設定。
それぞれのオプションはredis-actionpackを参照してください。
# {Rails.application.class.parent_name.downcase}は変えたほうがいいかも、rails6.1でparent_nameが削除されるみたい MyApplication::Application.config.session_store :redis_store, servers: ["redis://localhost:6379/0/session"], expire_after: 90.minutes, key: "_#{Rails.application.class.parent_name.downcase}_session", threadsafe: true, signed: true, secure: true
※ railsの設定次第では設定するファイルが違うかもしれません。
余談
redisは今回始めて設定したのですが、redisのセキュリティは基本的にパスワードは設定せず
信頼されたクライアントが接続することを前提に設計されているみたいですね。
ただ、設定をうまくできず不正アクセスが多いとのことでパスワードをつけないで起動した場合は「protected mode」で自動的に起動するようです。
(ちなみにDocker環境で利用しているredis:alpineではデフォルトでOFF設定になるみたいです)
役に立つかわからない情報
Docker環境でsigned: true
の時にアクセスの度にredisサーバーに新しいセッションが作られるという現象に遭遇した。
ここを参考にしてください、依存ライブラリが新しいと発生するらしい。
https://github.com/redis-store/redis-actionpack/issues/33
ただ、これにするとcookieの暗号化…正確にはセッションIDの暗号化…が無くなるようです、暗号化が影響して不具合が発生しているようです。
GithubとJiraをUnitoを使って連携する
Unitoとは?
UnitoとはJiraとGithub、WrikeとJira、JiraとTrelloなどの組み合わせで
相互同期(または一方同期)が簡単にできるWebサービスです。
組み合わせについてこちらのページをご確認ください。
https://unito.io/upcoming-integrations/
例えばJiraとGithubではJiraの特定の課題タイプとGithubのissueが同期することができます(条件設定可能)
つまりGithubに存在するissueは、詳細情報含めて自動的にJiraと同期され、逆にJiraに存在する課題もissueに存在します。
メリット
- 課題の管理を一元化することができる(情報も同期されるので内容の違いも無く管理コストが下がる)
- 様々なサービスの連携処理を自社で管理する必要が無い
デメリット
主観
Unitoで事前に同期に対応しているサービス確認する必要はあるが
同期に対応しているサービスだけ使っていて、それぞれのサービスで課題を管理しているという状況であれば管理コストの削減が期待できる。
Jiraを普段使っていて、Github、Trelloを使っていてJiraの状況に合わせて手動でこれらのサービスの状態も変えている
または厳密なルールを設けてGithubとJiraを連携している(ラベルとか付けたり、Jiraだと設定次第では同期のような事も可能なので)
こういった事はUnitoを使えばものすごく単純なフローになり、ヒューマンエラーの防止と
情報が常に新しいことを保証することができるようになる。
ただ、使い始め1ヶ月ぐらいは慣れる + 同期の設定のため、一時的に管理者に負荷がかかる可能性があるので
導入するときはある程度時間が取れる時に導入をしたほうが良い。
Unitoを使ってみる
動画の通りですが何をしているのかこちらでも簡単に紹介します。
1. 同期の作成を行い、連携先を設定する
最初に行うのはどのサービスとどのサービスを同期させるのかという設定が必要です
事前にUnitoと連携していおいたサービスが利用可能です。
双方同期も出来ますし一方同期も可能ですので矢印でそれを設定してください。
Tips.
Unitoと連携する時の注意
ここで連携したユーザーが同期された課題やissueの投稿者やbotの管理者になるので注意。
Jiraに普段使ってるアカウントを連携すると、そのアカウントが報告者の同期された課題がたくさん作成されたりしますので
お金に余裕があるならばBotユーザーを作りこちらで連携させておきたいところです。
参照
https://guide.unito.io/en/articles/3478467-how-to-set-up-a-sync
2. フィルターの設定をする
デフォルトの状態だとすべてのissueや課題を同期してしまうので
条件を設けて同期するissueや課題を絞り込むことができます。
例えばJiraであれば以下のような条件で同期する課題を絞り込むことができます
どんな事ができるのか一度見てみるといいと思います。
- 案件タイプが「タスク」の課題
- ラベルに「同期」がついている課題
参照
https://guide.unito.io/en/articles/3478467-how-to-set-up-a-sync#which-tasks-are-allowed-to-sync
3. 同期するフィールドの設定
基本、いじらなくても問題ないですが
この情報は一方同期で良いとか細かい同期項目をしたい場合はここで調整してください。
Tips.
JiraとGithubを同期する場合、LabelsをGithubからJiraへの一方同期にした方が良いです。
Jira側とGithub側でラベルの設定数が違うと基本
多い方のラベル設定に同期されてしまうようで最終的にUnitoの同期ログにエラーが出てきてしまいました
(もしかすると設定が悪いだけかもしれませんが留意しておくといいかも)
参照
4. オプションの設定
ヘルプが見つからなかったのですが、以下の2つが設定可能だと思います。
- 同期をする以前のissueとか課題を同期するか?
- 自動同期設定をするか?
※ 作成後に編集画面を開くとオプション項目が増えていたりするので見てみると良いです。
5. ユーザーの連携
今のままだと、JiraのユーザーAとGithubのユーザーAを判断することができず
Jira側の課題の担当者のユーザーAのとGithubのissueの担当者で同期することができません。
(Unitoから見ると同期するべき課題はわかるが、Jiraの担当者がGithubのどのアカウントと連携するかわからない)
なので、JiraとGithubのこのアカウントはユーザーAであると定義する必要があります。
Tips.
参照を見てほしいですが、設定する画面の更新頻度が1日に1回とかだと思います
それかUnitoと連携をしたタイミングで連携先からユーザー情報を取るのか…
なので、新しくチームに入った人が同期されるようになるには管理者側で設定が必要で
なおかつ1~2日後じゃないと同期されない点について注意してください。
参照
最後に
ここまで設定ができればあとは設定項目やヘルプを見ればなんとなくUnitoを使うことができるかと思います。
最初は課金対象ユーザーの算出方法だったり、余計な課題まで同期されてしまったり
エラーが出てるけど詳細がわからなかったりしますが、使いこなせるようになると管理コストを大幅に削減できる
サービスなので是非使いこなせるようになりましょう。
困った時に参考にしたい
RailsのMigrationでuniqueの追加・削除
ハマったのでメモ
ユニークキーを操作するときはunique: true
を必ず付ける必要がある。
# 単体のカラムにユニーク add_index :table_name, :hoge, unique: true remove_index :table_name, column: :hoge, unique: true # 複数のカラムにユニーク add_index :table_name, [:hoge, :foo], unique: true remove_index :table_name, column: [:hoge, :foo], unique: true
JiraでGithubと同期しながらWBSで管理する
3行ポイント
- JiraとGithubはUnitoというサービスを使うことで同期ができる
- Jiraの高度なロードマップより、WBS Gantt-Chart for Jiraの方が使い勝手がいい(次世代プロジェクトでは高度なロードマップが利用できない)
- コストは約Jira側Standardプラン+WBSで1000円(11〜20人)、UnitoはTeamプラン(〜20名)で6000円。(1人あたり約1300円。Unitoは高めだがメリットは多い)
要件
- チーム全体で20人以下(それ以上でも可能です)
- JiraでWBSで管理したい、ガントチャートも見たい
- Jiraのスクラム的な使い方は将来やりたいと思っているが、現状はウォーターフォールのように使う
- GithubのissueとJiraの特定の課題タイプの課題を同期させたい
- 汎用性高く利用したい(Jiraはかなり汎用性が高い)
この要件を満たしたJiraでの管理体制を整えたのでそのメモをここに残しておきたいと思います。
Jira
https://www.atlassian.com/ja/software/jira
JiraはStandardプランを利用する。
Premiumプランとの違いは主に以下の機能のありなしです。*1
- 高度なロードマップ機能
- プロジェクトのアーカイブ
- 課題タイプの階層構造カスタマイズ
- プロジェクト全体に適用できる自動化処理の制限なし(Standardは500 / 30日リクエストまで)
- 保存領域制限なし(Standardは250GBまで)
今回の要件ではこれらの機能は最終的には不要という判断になり、Standardになりました。
高度なロードマップ機能は、Jiraの次世代プロジェクトに非対応だったり、使い勝手が悪かったです
強いて言うならばカスタムフィールドを利用して期限を決められるので、よりJiraに寄り添った管理はできますが
それに対してあまりにもメリットがありませんでした。後述するアプリを利用したほうが遥かに使いやすいです。
他、「プロジェクト全体に適用できる自動化処理の制限なし」の機能ですが
こちらもStandardの500 / 30日リクエストで十分に足りますし、最悪、手間ですがプロジェクト個別にコピーして作成すれば同じことです。
Github
チームでプライベートリポジトリが無料で作成できるようになったのでGithubにはコストはかかりません。
ただしブランチの保護やドラフトプルリクエスト、Wikiなどの機能が制限されてしまうので
このあたりの機能が必要な方はTeamプランに入る必要があります。*2(約 月500円 / 人)
Unito
Unitoはサービス同士を連携させるHubみたいなサービスです
詳細は上のURLから公式サイトを見たほうがわかりやすいので興味のある方は見てください。
最初に書いておくと、かなり癖が強いサービスな印象です
細かいことをやろうと思うとそれなりにドキュメントを読まないといけないかもしれません。
課金対象ユーザーをActive users
と表現してるのですが
少し複雑なのでしっかり確認しておいたほうが良いです。
How does Unito pricing work? | Unito Help Center
また、プランの料金が高めです、しかし、Githubとの同期管理を外部に投げられ
issueの内容が全てJiraと同期される事で管理者、エンジニアの時短になり十分なコスト削減になるので
導入するメリットは非常に高いと感じます。*3
JiraとGithubを連携する
ここからは具体的な設定方法を記載します。
JiraをUnitoに連携する
1. Jiraマーケットプレイスから連携アプリをインストールする
「Sync Jira to Work Tools with Unito」というアプリをインストールしてください(無料)
Sync Jira to Work Tools with Unito | Atlassian Marketplace
2. Unito側でJiraと接続する
Unito側の管理画面の「Connections」からJiraの接続を行ってください。
注意点としてこの時点で接続したアカウントで同期された課題などが作成されるので
とある人が報告者の課題ばっかり立つ、みたいな事になってしまいますので、金銭に余裕があれば
同期用のアカウントをJiraで取得してそのアカウントとUnitoを連携させたいところです。
これでJiraとUnito側の連携は終了です。
GithubをUnitoに連携する
1. Unito側でGithubと接続する
Unito側の管理画面の「Connections」からGithubの接続を行ってください。
ここでも接続したときのアカウントがBotを利用しますので
できれば同期用のアカウントを取るか、削除を絶対に行わないユーザーで接続をしてください。
おそらくアプリのインストールを求められますのでそのアプリをインストールすると、自動的に連携がされます。
WindowsでDataGripのmysqldumpを利用する
結論
WindowsはMySQLが入っていないのでダウンロードする必要がある。
MySQL8以降だと--skip-column-statistics
を設定する必要がある。
インポートするときに--default-character-set=utf8
をしないといけないかも(環境による?)
動作環境
- Windows10
- DataGrip 2020.2
- MySQL 8
DataGripでdumpを使う
DataGripではデータベースやテーブルを右クリックするとmysqldumpを使ってエクスポートする項目があるがこれを使うためにはWindowsならmysqldump.exe
が必要になる。
なので、MySQL公式からMySQLをダウンロードして解凍する
解凍後は適当なフォルダに移動させておく。
mysqldump.exeを探す
DataGripでmysqldumpを使ってエクスポートするを押すとウィンドウが開き
mysqldump.exeまでのパスの入力を求められるので、解凍したフォルダのbinフォルダの中にあるmysqldump.exeを指定する。
その後、MySQL8の場合は--skip-column-statistics
を指定しないとエラーが出ることがあるので指定する
一度エクスポートしてみてエラーがでたら指定してみるほうが良いかも。
(このオプションはMySQL5.7以下で管理しているDBに対してMySQL8で操作しようとすると起こるエラーを防ぐ?)
インポートする
またもや右クリックからインポートもすることができるのでmysqlを使ってインポートを使う
こちらもmysqldumpと同じくmysql.exeまでのパスを求められるのでbinフォルダの中から探して指定する。
環境によってはUnknown command '\''.
が出るので--default-character-set=utf8
を指定しておくのが吉。
便利なオプション
INSERT文だけエクスポートする(+カラム名もいれる)
--no-create-info --complete-insert