Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Living with legacy systems

fukudat
February 14, 2019

Living with legacy systems

デブサミ2019 14-A-6 「レガシーのいい感じの付き合い方」

fukudat

February 14, 2019
Tweet

Other Decks in Technology

Transcript

  1. 時期 1999年頃〜 2015年10月〜 2016年6月 2016年7月〜 2017年11月 2017年12月〜 2018年4月 2018年4月〜 名称

    カイゼン前 カイゼン 事始め ECナビ AWS移行 旧管理系 AWS移行 カイゼン 継続中 環境 オンプレ オンプレ オンプレ →AWS(大半) AWS(大半) →AWS AWS カイゼンに取り組んだ2015年〜2018年の活動をお伝えし、 最後に振り返ります。 全体構成
  2. カイゼン事始め 時期 1999年頃〜 2015年10月〜 2016年6月 2016年7月〜 2017年11月 2017年12月〜 2018年4月 2018年4月〜

    名称 カイゼン前 カイゼン 事始め ECナビ AWS移行 旧管理系 AWS移行 カイゼン 継続中 環境 オンプレ オンプレ オンプレ →AWS(大半) AWS(大半) →AWS AWS
  3. • 【社内用語】 • 1単位 ◦ 対象:画面系:URL、バッチ系:crontabでの1行 ◦ 対象外:システム内部モジュール • 事業とシステムのインターフェースのような箇所に論点を絞る

    ことで、事業部全体で必要性の議論しやすくする。 ◦ より上段で必要性が判断できれば、詳細な必要性は後で 調べればよい。 事始め① 調査(機能とは?)
  4. 調査&葬り後の現状 • インフラは、問題の量と複雑さ & オンプレ環境の制約 & 管轄 の問題が絡み合い、「少しずつカイゼンしていく」ことができな い。 •

    アプリケーションは、必要十分に絞った。機能追加と修正は随 時発生。 • アプリケーションをカイゼンするには、コントロールできるインフ ラがあると、進みが早い。
  5. 問題選定 • いま、取り組む! ◦ 自由なインフラ ▪ インフラとアプリを管轄を分けずに運用する ▪ レイヤー間で権限を分けず、開発者がコントロール可 能な状態にする。

    ◦ AWS移行 ▪ サービス全体をオンプレからAWS移行する ◦ 開発しやすい環境整備 ▪ 環境に依らず、アプリケーションを誰でも同じ開発フ ローで開発できるように、整備しておく
  6. 問題選定 • 先送り! ◦ アプリケーションの根本的見直し ▪ インフラの後で。 ◦ その他 ▪

    ソースコード&データベースがeuc-jp ▪ Oracleから卒業 ▪ 古いインフラ資産のリプレース(監視/ログ/LDAPなど ▪ 他サービスのAWS移転 ▪ サービス間の密結合・依存性の撤廃 ▪ メール配信サーバリプレース ▪ etc...
  7. ECナビAWS移行 時期 1999年頃〜 2015年10月〜 2016年6月 2016年7月〜 2017年11月 2017年12月〜 2018年4月 2018年4月〜

    名称 カイゼン前 カイゼン 事始め ECナビ AWS移行 旧管理系 AWS移行 カイゼン 継続中 環境 オンプレ オンプレ オンプレ →AWS(大半) AWS(大半) →AWS AWS
  8. 移行方針 • こだわる ◦ 自由なインフラを実現する ◦ AWS移行 ◦ 開発しやすい環境整備 •

    こだわらない ◦ 積極的に改良しない。既存要件を踏まえればよし。 ▪ アプリケーションのアーキテクチャ ▪ サーバ構成、ミドルウェア ▪ 監視、ログ収集
  9. 移行先(範囲別詳細 • ecnavi-web ◦ EC2 ▪ 問題無さそう • MySQL ◦

    RDS MySQL ▪ 問題無さそう • Oracle ◦ RDS Oracle ▪ 不安…?
  10. 不安とは? • Enterprise Edition & RAC & アプライアンス • 既存と近しい要件が、RDS上では無い。

    • サービスレベルを変えない前提での、RDS上での最適構成が 不明。
  11. RDS移行 • ランニングコストの問題 ◦ Enterprise Edition(既存スライド案) ▪ 高価! ◦ Standard

    Edition(ダウングレード案) ▪ (価格だけ見ると)お値打ち! • ダウングレード案を深掘り、他の観点で実現可能か を検討していく
  12. ダウングレード案を検証 • 機能差 ◦ パフォーマンス情報収集が自前 ◦ メンテナンス作業が自前 • パフォーマンス ◦

    問題なし • データ移行時の互換性、移行時間 ◦ 問題なし • ※追加での開発および運用工数が発生するも、それでも断然 お得。
  13. • CloudFormationテンプレートでコード化 • sandbox環境と本番環境を用意 ◦ sandboxは、開発者に広く権限を渡し、試して壊すをやりや すく。 ◦ 本番は、sandboxで作った構成を再現すれば良い •

    レビューフロー(※開発者のスキルに合わせて ◦ 実際に構成を作ってからレビュー ◦ 不安であれば実際に作る前にレビュー 解説) AWSリソース構築
  14. 解説) プロビジョニング • Puppetマニフェストで管理 ◦ オンプレで利用されていたものをほぼコピー • 開発しやすい環境整備の視点で、改善した点 ◦ Puppetのversionを2系から当時の最新の4系へ

    ▪ 2系は、web上でノウハウ探せない状態 ◦ CircleCIでマニフェスト適用を試せるように ▪ 実際のサーバに依存したコードがあった為
  15. 旧管理系AWS移行 時期 1999年頃〜 2015年10月〜 2016年6月 2016年7月〜 2017年11月 2017年12月〜 2018年4月 2018年4月〜

    名称 カイゼン前 カイゼン 事始め ECナビ AWS移行 旧管理系 AWS移行 カイゼン 継続中 環境 オンプレ オンプレ オンプレ →AWS(大半) AWS(大半) →AWS AWS
  16. レガシーあるある問題(※一部抜粋 • ユニットテストが書かれていないコード多数 • 継続的なテストが行われていないため、知らない間に動かなくなっている • 積み重なったパッチ的な対応の結果、膨れ上がったクラス • 同じような機能を持つライブラリ •

    Subversion の複数リポジトリが複雑に配置 • サードパーティのコードがリポジトリに含まれている • crontab で華麗にスケジューリング、順序が重要! • 局所最適結果として乱立するフレームワークとその亜種。 • アプリ間やアプリ-FW間の依存も強く、絶妙なバランスで動いている • 絶対パスによるファイルの参照 • 実行環境に依存するパラメータのハードコーディング • 他とは異なる開発/デプロイフロー(本番サーバーでsvn up) • 学習コストが高くなり結果として属人化 (※小さい問題は、他にも多数) :
  17. 単にEC2に移行した場合に残る問題 • アプリケーションやフレームワーク ◦ 数の多さ×レガシー満載 ◦ 開発しにくい環境 ▪ 膨れ上がった Subversion

    リポジトリ ▪ 本番環境に ssh ログイン & svn up • インフラ ◦ 「古い」ままのリスク ◦ 既にAWSで稼動中のシステムと異なる構成
  18. 移行時の改善ポイント • 開発しやすい環境整備 ◦ Subversion から Git へ ◦ パッケージ管理ツール(Composer/Carton)の導入

    ▪ Subversionレポジトリにコミットされた、サードパーティ のコードを移設 ◦ Jenkins による自動デプロイ • 自由なインフラ ◦ マシンイメージをAWS上の既存システムと同一に 。
  19. 解説) テスト環境 • 「ECナビAWS移行」で構築した、CFn + Puppet で作成。 • AWS LambdaでCFnのChangeSetを作成し、日次でRDSスナッ

    プショットからリストア • 本番環境とはネットワーク上分離。メールサーバーは、送信を 外向けにブロック • エラー通知はSlackに転送し、エラー状況を可視化
  20. 解説) テスト方法 • バッチ1つずつ ◦ 1.テスト環境でテスト ▪ 結果が、現行本番環境とテスト環境で比較して同一で あることで担保 •

    既存仕様で、メールでこと細かに実行結果が送ら れくるので、活用。 ◦ 2.テストがクリアしたら、新本番環境へ移行。現行本番環 境で停止。 • 実際実施してみると、想定通りには、いかず。
  21. バッチ一つ動かしてみると • ユニットテストが書かれていないコード多数 • 継続的なテストが行われていないため、知らない間に動かなくなっている • 積み重なったパッチ的な対応の結果、膨れ上がったクラス • 同じような機能を持つライブラリ •

    Subversion の複数リポジトリが複雑に配置 • サードパーティのコードがリポジトリに含まれている • crontab で華麗にスケジューリング、順序が重要! • 局所最適結果として乱立するフレームワークとその亜種 • 絶対パスによるファイルの参照 • 実行環境に依存するパラメータのハードコーディング • 他とは異なる開発/デプロイフロー(本番サーバーでsvn up) • 学習コストが高くなり結果として属人化 : エラーおおすぎ
  22. 軌道修正後の進捗 • Slackエラー件数推移 ◦ 2018/1/21 1982 件 ← 全実行スタート ◦

    2018/1/30 528 件 ← 潰し回る日々 ◦ 2018/2/10 23 件 ← ほぼ問題無し • バッチは、まとまった単位で段階的に移行 • 管理画面は運用者含め、みんなでE2Eテスト後、一気に移行
  23. 時期 1999年頃〜 2015年10月〜 2016年6月 2016年7月〜 2017年3月 2017年4月〜 2018年9月 2018年10月〜 名称

    カイゼン前 カイゼン 事始め ECナビ AWS移行 旧管理系 AWS移行 カイゼン 継続中 環境 オンプレ オンプレ オンプレ→AWS(大半) AWS(大半)→AWS AWS カイゼン実績 • 全サービスのAWS移転、開発しやすい環境整備、アプリ・イン フラ運用、葬り済みの機能
  24. • 現状把握から始める ◦ レガシーシステムの事実をカイゼンの立脚点とする • いま取り組む事を絞る ◦ 効果x工数のコスパの良さで見極める • 建設的先送り

    ◦ 色々手を出す位なら、先送る。 ◦ 周辺状況の変化により、あとの方が対応しやすくなること もある。 各個撃破を実現する基本動作