Rso's Jotter

日々の開発の知見のメモやその他雑記

Redmineをサービスから自前のサーバに移行する方法

背景

背景として、社内の業務では主にRedmineを使って案件管理をしています。 今までは MyRedmineというSaaSサービスを使って管理していましたが、 業務チームでは結構Redmineをがっつり使い込んでいて、 効率化のためにいくつかプラグインを入れたり、業務効率をもっと計測したいという要望がありました。

MyRedmineでは入れられるプラグインが制限されており、自前で作ったプラグインを入れることができないので、 Redmineをオンプレで動かすように変更することにしました。

Redmineをわざわざ自前の環境に移行するなんて例はそんなにないかと思いますが、 対応した内容と所感を書いておこうと思います。

ざっくりの流れ

移行の流れ以下の図にざっくりと書きました。この図に沿って説明します。

f:id:rso:20190207235458p:plain

初回データ移行

まず、既存環境のデータをそのまま新環境に移し替えます。MyRedmineを使用していた場合、MySQLのダンプと添付ファイルのバックアップを取得してもらえるので、 そちらを使用します。今回、移行前と新環境のバージョンは同じものを使用したので、MySQLのダンプをそのまま取り込めば一旦動かすことができました(機密の本番データがある場合は、取り込む前に削除します)

スキーマが同じなので、DBのダンプを移し替えるだけでほとんど移行できるのはとても簡単ですね。

既存の業務の継続

移行のための開発、データ整理作業を行っているあいだ、業務チームは継続して現行の環境を使用しました。移行開発中、以下の制約を付与しました

  • カスタムフィールドの修正、更新禁止
  • トラッカーの修正禁止

今回、プラグイン開発と同時にトラッカーやカスタムフィールドの見直しを同時に行ったため、修正内容が競合しないように、移行開発中は上記の制約を設けました。 ちなみに、ユーザ情報の追加、修正はOKとしました。

プラグインの開発、各種フィールドの整理

初回移行した構成をベースにプラグイン開発を行います。また、合わせてカスタムフィールドやトラッカーの見直しを行います。 移行した構成がベースになっているので、開発途中の状況を業務チームに確認してもらうこともできます。

データ移行(本番)

ここが移行のキモなのですが、新環境で開発したプラグインと整理したカスタムフィールド、トラッカーの内容を維持しつつ、業務データとユーザ情報のみ アップデートします。今回移行の対象としたテーブルを以下に示します。

| attachments                         |
| custom_values                       |
| email_addresses                     |
| issue_relations                     |
| issues                              |
| journal_details                     |
| journals                            |
| member_roles                        |
| members                             |
| user_preferences                    |
| users                               |

Redmineはデータの整合性はアプリケーションレベルでとっているので、DB自体に外部キー制約はありません。なのでテーブル移行の順序は気にせずデータを入れても大丈夫です。 (その分、動かすまでエラーかどうか分かりませんが・・・)

最後に、移行時間中に現行環境で更新があったものを差分適応して、業務チームに引き渡しました。

結果として、移行途中はいくつか混乱はありましたが、それほど大きな混乱なく切り替えができました。 こうやって触ってみると、Redmine本体がDBをまるっと移行するだけでそのまま使えて、テーブル設計もわかりやすく名前をみただけで大体の動きが予想でき、 必要なものだけ差し替えれっばうまく動くので、本当によく出来ていることが実感できます。

AWS ECS奮闘メモ

ECS奮闘メモ

社内の案件管理システムをアップデートする際に、AWS ECSを使う構成に変更してみました。 もともとコンテナはDocker開発環境単体で動かすぐらいしかしていなかったので、本番でコンテナを動かすのは初めての試みでした。

本番で動かすためのDockerfileの書き方もロクにわかっていない状態からスタートして、個人的にハマったポイントを残しておきます。

ECS選定理由

コンテナのオーケストレーションサービスとして色々候補があると思いました、今回はECSを採用しました。その理由としては、

  • 基本的に社内のサービスはAWSで動いている
  • Kubernetes よりも学習コストが低そう
  • インフラ構築も片手間で行うので、そこまで時間はかけられない

という感じでした。Kubernetesもやってみたかったんですが、まずは敷居の低そうなECSを選択しました(その結果、いろいろハマりましたが・・) また別にコンテナ化しなくても、HerokuなどのPaaSに載せてしまうてもあったのですが、今回のプロダクトがサーバ間でEFSのような共有ストレージをマウントする必要があったので、その辺りをHerokuでやろうとするそれはそれで構築が面倒かなと思い、選択しませんでした。

ECSハマりポイント

ECSについてドキュメントも流し読み状態で始めたので、作業してから気づく点が色々ありました。その中でハマりポイントを残しておきます。

Fargate で EFSマウントができない。

AWS公式に以下のようにECSでEFSマウントするチュートリアルが載っていたので、できるものかと思ってFargateで構築を進めていました。

チュートリアル: Amazon ECS での Amazon EFS ファイルシステムの使用 - Amazon Elastic Container Service

ALBからFargateコンテナへのロードバランシングが終わったタイミングで、EFSマウント方法を調べていたら、 以下の記事を見つけ、なんとFargateはEFSマウントする術がないことを知りました・・ (公式での記述は見つけられませんでした)

https://forums.aws.amazon.com/thread.jspa?messageID=816397&tstart=0

そこでFargateでのコンテナを動かすのは諦めて、従来のEC2インスタンス場で動くコンテナで再構築しました。

ネットワークの種別が awsvpc だと外のネットワークにアウトバウンド通信できない

Fargateで作成したコンテナと同様にデプロイ完了して疎通してみると途中でなぜか上手く動かない状態でした。 よくよく調べるとコンテナから外のネットワークに出ようとする処理のところで詰まっていることが分かりました。

こちらの現象については、 コンテナのネットワーク種別がデフォルトで awsvpc になっているのですが、この状態だと 外へのアクセスができないとのことでした。

タスクネットワーキングと awsvpc ネットワークモード - Amazon Elastic Container Service

対策としては、以下の2つがあります。

  • NATゲートウェイを構築する。
  • ネットワーク種別を bridge にする。

NATゲートウェイを構築してもよかったのですが、手っ取り早いネットワーク種別を bridge に変更して対応しました。

コンテナデプロイ時にポートが競合してデプロイできない

コンテナが無事動いて、バージョンの異なるコンテナをリリースしたら、すでにポートが使用されているためデプロイできないというエラーが 遭遇しました。

タスクを終了させればデプロイできますが、このままだとダウンタイムが発生してしまいまいます。

対策としてはロードバランサが割り振りするポートを動的に設定してやれば解消しました。

ECS の動的ポートマッピングをセットアップする

ECS使ってみての所感

コンテナオーケストレーションツールをロクに触っていない状態で色々試しましたが、なんとか動くようになるまで 結構時間を食ってしまいました。上記のハマりポイント以外の所感としては、

  • 従来のECSとFargateの制約の違いが把握しづらい。Qiita系のドキュメントやAWS チュートリアルも従来のECSの物が多いが、Fargateに関する情報が見つかりづらかった。
  • VPCの仕組みなど、既存の設定が流用できるのは強みだが、その仕組みを理解していないと、キャッチアップに時間を取られる。
  • そもそもの前段の話で、本番向けのDockerfileとタスク定義を作るためのベストプラクティスがわからず、色々悩んでしまった。

慣れてしまえばあとあと便利になると思いますが、まだ慣れていないのでそこまで便利感の享受をできていない状態です。 コンテナオーケストレーションすごい便利!と早く言えるようになりたいですね。

2018年振り返り

ブログ再開します

ずいぶん長いこと間が空いてしまいましたが、またブログを再開しようかと思います。

主に業務で行なっている開発に関する知見や、それ以外の雑記などを書いていこうかと。

その前に、若干もう2月になってしまいましたが、2018年の振り返りを書いておきます。 以下の内容はほぼ自分のためのログの記録となります。

2018年振り返り

1月

去年と開発体制を変えて、ミャンマーから開発者2名を受け入れることに。 2ヶ月間日本に来てもらって、開発に慣れてもらうことが目的だった。

2月

ミャンマー部隊と共に開発実施。案件管理システムのステータスに関する考え方をもっと汎用的にするために、 ステータス管理機能の設計を着手。これがなかなか思うようにいかず難航する。。

3月

開発はこの辺りから混迷してきて、スケジュールがどうなるか分からなくなってきた。 ミャンマーから来た2名は祖国に帰還。あとはリモートで継続して開発してもらうことに。 しかしプライペートではこのタイミングで第一子誕生! 職場と家庭が両方忙しくて、混乱の月だった。

4月

開発は遅延しているところもあるが、要件定義をやり直すということトップから連絡があった。 要件が決まるまでいわゆるインフラ的な整備を行なっていたが、3週間たってもあまりまとまりのあるものにならなかった。 それほど今回の業務要件と精査とスコープを決めるのが難しいということが分かる。

5月

開発のスケジュールの混迷と息子の夜泣きが合間って、日夜忙しい時間に。 生まれて数ヶ月の子供は夜泣いて育児も慣れないなか、自分も嫁も憔悴していた時間帯。 開発は終わらないが、夜遅くまで仕事している訳にもいかないタイミング。

6月

開発の期限がこの月だったので、開発がいよいよ佳境に。 終電オーバーしつつもなんとか開発環境。しかしその内容は・・・

7月

開発の区切りがついたのと、今後の体制を検討するとのことで、 ミャンマー体制はここで終了。 一旦リリースはしたものの、経営サイトどの要望との乖離が激しく、 今までコミュニケーションがうまくとれてなかったことが露呈する。

8月

再度仕切り直しのため、体制変更、PMも変更された。 要件を再度ヒアリングするために、福岡の現場に伺う。

9月

仕切り直しを行なったものの、開発の方向性をどこに持っていくかが擦り合わず、 停滞していた時期。メンバーのモチベーションも停滞している時期。

10月

開発の方向性相変わらず決まらず。再度体制を変更するような方向性で調整。

11月

新たにメンバーがきて開発体制も変更。

12月

PMを交代して仕切り直し。 もう一度要件定義からやり直す感じ。

振り返って

開発の話がメインになってしまったが、6月までは開発が忙しくて、 そのあと半年は開発の方向性を決める波に飲まれてしまって、ほとんど進みのない一年だった。 開発も難航したが、自分は開発がやりたいのかマネジメントがやりたいのか、色々考えさせられる一年だった。

外貨の両替


香港で一番両替レートがいいと言われているチョンキンマンション(重慶大厦)に行ってみた。
九龍の尖沙咀にあり、入り口には安宿の客引きインド人に声をかけられるので、若干中に入りづらい。


ある程度奥に行くと確かにマーケットレートとほぼ同じぐらいのレートで両替してくれる店がいくつかあった。
(自分はTRADEWAVEというインド人がやっている店で両替した)


香港在住の人に聞いたら、香港の人はこの場所にはほとんど入らないとのこと。
九龍の高層ビルが立ち並ぶ中でこんなエリアがあることが驚き。


日本での外貨の両替

諸事情で香港ドルを数十万程度両替しないまま日本に持って帰ってきてしまったけど、
日本での両替はすこぶるレートが悪い。

香港ドルの買取レート(TTB)が15円前半なのに対して、店頭では12円台ぐらい。。


なにかほかによいレートのものがないか調べてみたけど、外貨を送って両替してくれるサービス
なるものがあるとのこと。


大黒屋 外貨両替サービス
http://gaika.e-daikoku.com/


外貨両替ドルユーロ
https://doru.jp/



大黒屋のレートはよくないけど、外貨両替ドルユーロのレートは国内の両替ではかなりよいレートとなっている。
ほかの口コミを見ると、主には外貨の購入に使われているみたいだけど、自分は外貨の売却を依頼。


方法としては外貨を書留で郵送して、日本円を指定の口座に入金してもらうというもの。


正直外貨の送付から入金までは不安はあったが、確認完了から入金まで2営業日程度で完了したので、
便利なサービスだと思う。


円 -> 外貨の両替は海外でやればいいと思うが、 外貨 -> 円の両替に関しては重宝すると思う。
空港で両替すると足元を見られるので、そのような場合は持って帰ってココで売却するのがオススメ。