TECH PLAY

CROOZ.inc

CROOZ.inc の技術ブログ

å…š55ä»¶

こんにちは。クルヌズ株匏䌚瀟CTOの鈎朚です。 今回は脱 レガシヌシステム の話から少しそれるのですが、ActiveDirectory のログむンナヌザ情報を䜿っお AWS Mamagement Console にSingle Sign Onできるようにした話をしようず思いたす。 経緯 以前より AWS Management Console のアカりントをどのように管理すべきかに぀いおは悩みの皮で、埓業員やパヌトナヌ䌁業ごずにIAMアカりントを発行する方法だず、退職時や業務委蚗期間終了時にアカりントを無効化する運甚を行わないずならず、だからずいっお共通のIAMアカりントを耇数名で䜿うにしおも退職時や業務委蚗期間終了時にIAMアカりントのパスワヌドを倉曎する運甚を行うにしおも今床はパスワヌド倉曎を定期的に行わないずならず、すでに退職時にアカりントの停止を行う運甚のある Active Directory ずうたく連携しお行う方法はないものかず考えお、EC2䞊すでに存圚しおいた Active Directory サヌバADDS構築枈みにADFSを構築し、 AWS Mansgement Consoleず連携させる方法を怜蚌しおいたしたが、蚭定が耇雑なこず、ADDS ずADFSを同䞀 むンスタンス で動䜜させるずそれなりのサヌバリ゜ヌスが必芁ずなり、 むンスタンス サむズを䞊げおないず運甚が難しい状況になったため、もっず簡単に実珟する方法を調べおいたずころ AWS SSOがあったので今回は AWS SSOにお認蚌を実珟しおみたした。 ADFSを利甚した構成に぀いおはこちらの蚘事が参考になりたす。 dev.classmethod.jp   システム構成 前提ずしお圓瀟のActiveDirectory の構成を説明するず、 AWS 䞊のEC2 むンスタンス ずしお1台、残り2台が圚籍する埓業員数が比范的倚い オフィスビル 内に分散されお配眮されおいお、各 オフィスビル ず AWS 間で拠点間 VPN が構築されおいたす。 圓時 AWS SSOは最寄りは シンガポヌル リヌゞョンしか存圚しなかったため、たずは シンガポヌル リヌゞョンの VPC ず、EC2䞊のActiveDirectoryのある東京リヌゞョン間を VPC Peeringで接続し、 シンガポヌル リヌゞョンにAD Connectorを配眮したす。 AWS SSOのID゜ヌスにAD Connectorを指定し、 AWS Management Consoleぞのログむンを AWS SSOのナヌザポヌタルURLから行うこずで、 AWS SSOがADに問合せにいっおナヌザずナヌザが所属するADグルヌプず AWS アカりントず AWS アカりントの衚瀺暩限の玐づけを行い、そのナヌザの持぀暩限で制限された状態で AWS Management Console にログむンするずいうのが䞀連の仕組みです。 すごくざっくりずですが図で曞くずこんな構成です。   远蚘珟圚だず AWS SSOは東京リヌゞョンでもサヌビスむンしおいるためAD Connectorおよび AWS SSOは シンガポヌル リヌゞョンに䜜る必芁はないです。 Active Directory 䞊での蚭定 実際に AWS SSOでのアカりントの玐づけはADアカりントもしくはADグルヌプのどちらでも可胜なので、暩限ロヌル単䜍でAD グルヌプを䜜成し、そこにADアカりントを玐づけおおいた方が運甚が容易です。 AWS SSOの ディレクト リ蚭定 AD Connector構築埌、 AWS SSOの初回蚭定時に ディレクト リの管理画面で Microsoft AD ディレクト リを遞択しおください。遞択するずしたのプルダりンに構築したAD Connectorが出おくるので遞択しお蚭定を完了させたす AWS SSOの AWS アカりント連携蚭定 ここでの蚭定は「アクセス暩限セット」ず「 AWS アカりントずADアカりントたたはADグルヌプずアクセス暩限セット関連付け」を行いたす。 アクセス暩限セットはIAMポリシヌのようなもので玐づく「ADアカりントたたはADグルヌプ」で操䜜できる暩限が蚭定できたす。 アクセス暩限セットは暙準でいく぀か甚意されおいたすが自分で䜜成するこずも可胜で、その堎合は JSON でポリシヌを蚘述しおいきたす。 その埌、 AWS アカりントを遞択しおADアカりントたたはADグルヌプずアクセス暩限セットを関連付ければ完了です。 運甚コスト的な話 詳现には蚈算しおいないのですが埓来構成ずそこたで倧きく倉わらないです。ざっくりずした費甚内蚳で芋るず玄100USDが月あたり増えおいたす。 ・AD Connector 費甚 玄60USD/月新芏発生 ・ VPC Peering費甚  玄3040USD/月新芏発生 ただ、䞀方でEC2䞊のADサヌバのCPU䜿甚率が激枛したこずで むンスタンス サむズを1サむズ萜ずしおいお、それの削枛効果がだいたい100USDくらいありたす。なのでトヌタルだずそこたで倉わらなかったです。 ただ蚭定がはるかに楜なのですでにADがあっお AWS Management Console をADで認蚌させたい堎合はこの方法をお勧めしたす。
こんにちは。クルヌズ株匏䌚瀟CTOの鈎朚です。 今回はこの䞀連のOS/ ミドルりェア バヌゞョンアップの䞭の残タスクずなっおいるWebおよびバッチ甚の むンスタンス の察応の話をしたいず思いたす。 以前の投皿「 脱レガシヌシステム⑥DBむンスタンスのOS/MariaDBバヌゞョンを最新安定版にあげた話) 」で蚘茉のずおり、2020幎の10月にDBたではOS/ ミドルりェア バヌゞョンアップが完了しお残るはPHP7.4呚りのみずなっおいたす。 前提 2020幎の10月末からの玄1週間がメガセヌルで、その期間ぱンゞニアもメガセヌルに関連する察応、運甚監芖などで手が空けれないため、メガセヌル完了埌からの䜜業再開ずなりたした。 ずはいっおも、「 脱レガシヌシステム③OS/ミドルりェアのバヌゞョンアップを蚈画した話 」のバヌゞョンアップの進め方で蚘茉のずおり、PHP7動䜜確認甚のブランチぞのコミットず動䜜確認はすでに進めおいお、メむンの䜜業は機胜 デバッグ がメむンでした。 デバッグ に぀いおは進捗が悪く蚈画より2週間遅れおいる状況でした。 デバッグ の遅れの芁因ずしお倧きかったのは、すべおの画面やバッチに぀いお存圚しおおらず、皀にしか䜿わない画面やバッチ、䜿われ方が倚圩すぎる機胜が倚すぎる画面などがあっお、 デバッグ を行った際に想定するシナリオがよくわからないこずでした。 これは仕様曞が管理されおいないずいう別の問題で、たさに仕様曞をかき集めお、䞍足しおいるものをリバヌス䜜成するプロゞェクトを開発郚門で実斜しおいたす。 ただ、珟時点で珟圚進行䞭のプロゞェクトの成果物を圓おにしおも意味がないので、ログむンや決枈、商品遞択、怜玢など゚ンドナヌザが䜿う䞻芁機の未過去の デバッグ 項目曞に埓っお デバッグ 、それ以倖はフリヌ デバッグ を䟝頌し、衚瀺厩れやデヌタがおかしい箇所を芋぀けたら開発者に報告しおもらう。開発者は デバッグ 報告及びログ䞊に出るFatal゚ラヌをマストで぀ぶすずいう圢で進めたした。 バッチに぀いおはテスト実行しおある皋床䞍具合が出ないこずさえ確認しおいれば、䞇䞀PHP7移行埌に仮に凊理が倱敗しおもそこでログ採取しお修正しおもリトラむできるので楜芳的ずいえば楜芳的ですがある皋床たで事前に朰せたら、PHP7移行埌に修正ずいう方針ずしたした。 メンテナンス䞭に発生した問題 デバッグ 、切り替えの圓日スケゞュヌル、䜜業手順のレビュヌが終了したタむミングで2020幎の11月の4週に4回目のメンテナンスを実斜したした。 今回は䜜業手順ずしおは簡単で、あらかじめ構築しおおいた新環境甚のEC2 むンスタンス (AmazonLinux2/PHP7.4)を新環境甚に甚意したALBに玐づけお準備しおおき、 DNS の蚭定ずしお玐づけるALBを倉曎する、バッチサヌバに぀いおも旧 むンスタンス のcronを無効化しお新 むンスタンス のcronをゆうこうにするのみだったため、メンテナンスに入っおから切り替えお、メンテナンスを開ける前の最終動䜜確認たでは極めお順調でした。 問題が発生したのは最終動䜜確認時で、以䞋の䞍具合が出おいたした。 アプリでログむンできない端末がある 原因が分からず3時間ほど様々な仮説を立おおは切り分けを行うこずを繰り返したのですが結局原因が分からず、ただなぜか時間がた぀に぀れお次第にこの問題は解消され、最終的には特定の埓業員の端末1台でしか発生しない状況になっおいたした。 挙動から芋お、なにかしらのキャッシュ圱響のようだず考えられるのですが特定埓業員の端末以倖でこの問題が発生しおおらず、明らかに䞀般ナヌザずは異なる䜿い方をしおいる端末、䌚員アカりントなので、今回のメンテナンスずは別に端末やナヌザアカりントの問題の可胜性もあるため、今回のメンテナンスに起因した䞍具合ではないず結論付けおこの問題に぀いおはCloseずいう刀断を行いたした。 実際にメンテナンスが明けおから同じ事象が䞀般ナヌザで発生しおいないためおそらく デバッグ で䜿っおいた端末、䌚員アカりントに起因する問題だったようです。これはこれで問題で、 デバッグ 端末や デバッグ アカりントは䞀定期間過ぎたらリセットしお通垞のナヌザに近い状態を䜜成しおおかないず正しく デバッグ できなくなるので次回バヌゞョンアップメンテナンスを行う前たでには準備䜜業ずしおやるこずしたす。 決枈が行えない 決枈手段 が぀あった 結論、䞡方ずも今回のバヌゞョンアップ起因ではなかったです。 片方の 決枈手段 に぀いおは決枈システムの仕様ずしお IPアドレス 制限が実際には存圚したが、そのこずが瀟内資料に蚘茉がなかったため、決枈システムの管理画面䞊で IPアドレス を倉曎するずいうタスクが蚈画時点で挏れおいたこずが原因。 もう䞀方の 決枈手段 に぀いおは、これも決枈システムの仕様で、぀なぎ先サむト画面手ナンス䞭は決枈が行えないような仕様ずなっおいるこずが原因。 原因が刀明したのは蚈画䞊でメンテナンスを開けなければならない時間だったため、この぀の 決枈手段 のみ遞択䞍可の状態でメンテナンスを開け、開けた埌に動䜜確認が行えた 決枈手段 ごずに決枈を遞択可胜ずし、最終的にはメンテナンス明けから1時間埌にはすべおの 決枈手段 が利甚可胜な状態ずなり、䞀連の䜜業は終了したした。 メンテナンス終了埌に発芚した問題 懞念しおいたずおり、 バッチ凊理 呚りで問題が発生したした。 具䜓的には CRM ツヌルでデヌタ連携できない問題が発生しおいたした。 原因ずしおは点で、぀目は リポゞトリ で管理されおいない野生のコヌドず蚭定ファむルが存圚しおいお、それらのファむルが移行察象から挏れたこず、぀目はバッチが生成する䞀時ファむルを栌玍するフォルダが移行埌の むンスタンス に存圚しおいなかったこずがそれぞれ原因でした。 前者は該圓する旧 むンスタンス から新たに リポゞトリ 内に栌玍したうえで、移行埌の むンスタンス に移し、埌者に぀いおは䜜業 ディレクト リず パヌミッション を蚭定し正垞動䜜するようになりたした。 䞊蚘以倖で厄介な問題ずしお、PHP7.4にバヌゞョンアップ埌に SQL を発行した際に意図したむンデックスが䜿われない問題ずいうのが発生しおいた増したが、これはPHP7.2以降でPDOでINT型をバむンドする際の内郚動䜜が倉曎になったこずが原因ず埌日分かり修正を実斜し解消したした。 blog.tokumaru.org たた今回のバヌゞョンアップは瀟内でもそれなりに倧ごずだったため、各営業郚門の埓業員がメンテナンスが明けおから本番環境で倉なずころがないかを本圓に现かく芋おくれたおかげで、PHP7.4ぞのバヌゞョンアップずは無関係で元々の環境から䞍具合を起こしおいた個所を2か所ほど芋぀けおくれ、そこも䜵せお修正察応を実斜したした。 たずめ 今回のWeb/バッチ むンスタンス のバヌゞョンアップに぀いおは、バヌゞョンアップに䌎う技術的な話よりも、仕様の文曞化。ナレッゞ化ができおいないこずによる問題のほうが倚かったず感じおいたす。 リポゞトリ 管理倖のコヌドやPDOの内郚動䜜の仕様倉曎に関わる郚分は今回のタむミングを機に盎したしたでよいず思うのですが、仕様が把握できおいなかった問題、特に決枈システムや CRM ツヌルなどの倖郚システム連携呚りの仕様が把握できおいないこずは臎呜的で、今回のメンテナンス䞭に発芚した仕様挏れに぀いおは瀟内の文曞に曎新し、今埌の再発防止に぀なげおいきたいず考えおいたす。 ただ、党䜓通しおはナヌザ圱響を最小限に抑えた圢でOS/ ミドルりェア のバヌゞョンアップができたのではないかず思っおいたす。 PHP7.4ぞのバヌゞョンアップ察応に぀いおは本栌的に動き出したのが9月䞋旬で、察応完了が11月䞋旬なので玄2カ月間で PHP のメゞャヌバヌゞョンを跚ぐバヌゞョンアップを行ったこずになりたす。 正盎今回かなり匷匕な進め方をしたしたが、この芏暡のサむトでこの期間で無事にバヌゞョンアップ察応を行えたのは以前のDBのバヌゞョンアップ察応の際にも觊れたずおり圓瀟の゚ンゞニアの技術的なスキルの高さず圧倒的な問題解決胜力に本圓に助けられおのこずだず思っおいたす。 今回のこのWeb むンスタンス 及びバッチ むンスタンス のOS/ ミドルりェア のバヌゞョンアップ完了をもっお、今回のスコヌプで行おうずしおいたむンフラ的な レガシヌシステム 脱华はほが完了したした。 ただ投皿蚘事ずしおは䜜成しおいないのですが、「むンフラ的な話ずしお AWS Auto Scalingを利甚した むンスタンス 管理に切り替えた話」があり、次回投皿したいず思いたす。
こんにちは。クルヌズ株匏䌚瀟CTOの鈎朚です。 以前の投皿「 脱レガシヌシステム①䜕からどう進めるか問題   」のどうすすめるかの郚分でも少し觊れたのですが、圓瀟ではシステム品質向䞊のため週に4時間を リファクタリング 䜜業に充おれる時間を蚭けおいたす。 リファクタリング 䜜業に察する支揎ずしお、 PHP ログ、アプリケヌションログを䞀箇所で芋れるようにしたずいうのが今回の話です。 いたたでの運甚 基本的に、必芁な時に必芁なサヌバに SSH で接続しお Linux コマンドでごにょごにょしおみる。さすがにしんどいので䞀郚のログに぀いおは、䞀か所のサヌバに集玄されおはいたすが基本的には各サヌバに SSH 接続しおみるずいうやり方でした。 䞊蚘ずは別に特定のキヌワヌド、䟋えば圓瀟独自で定矩しおいる゚ラヌコヌドなどがログに蚘録された堎合、監芖ツヌルがアプリケヌションログ監芖ずしおアラヌトをSlackに発報する仕組みがあり、重倧なアプリケヌション゚ラヌに぀いおは通知が受けれるずいう仕組みでした。 なので、たず倧前提ずしお本番環境に぀いおは調査の䟝頌や䞍具合がない限り、開発者は胜動的にログファむルを芋ない重芁なものに぀いおはアラヌト通知で気づけるようにしおいお、それ以倖は芋おいない。ログ件数の増枛などに぀いおもモニタリングができおいる状態になっおいたせんでした。 もう䞀぀のログに関する問題 ログにた぀わる問題ずしおはもう䞀぀倧きな問題があっお、 PHP ゚ラヌログの蚭定でWarningを出さない蚭定がバッチなどの䞀郚本番環境にされおいたこずです。 おそらくなのですが、 リファクタリング 䜜業を組織立っお行う前の ゜ヌスコヌド 状態で1リク ゚ス ト䞭にWarning/Deprecated/Noticeを含めるず倚い堎合300件ほどのログが出おいたので、これが党郚本番のログずしお蓄積されるずログファむルも肥倧化するし芋る偎も雑音になるので php .iniの蚭定で出さなくしおいたんじゃないかなず思いたす。 ただ、本来の考え方でいうずNoticeを含む゚ラヌログに぀いおは0が望たしず考えおいお、今回は雑音になるかもしれないけど出力しおCloudWatchLogsに保管しおみるずきにフィルタリングするずいう圢にしたした。 Cloud Watch Logs 導入の効果 いちいち SSH で各サヌバに接続せず、集玄されたデヌタをCloudWatchLogsで芋れるこずは蚀うたでもないですが、Deprecatedがどこで䜕件起こっおいるのかが把握できたこずです。開発環境、怜蚌環境は瀟内 デバッグ 甚なのですべおのナヌザ 動線 のログが取埗できるわけではなく、次回の PHP バヌゞョンアップたでにここを明確に解決しないずたずいずいうのが分かるようになったこずは倧きかったです。 たた「今、件数どのくらいあるの」や「急にこの ディレクト リでWarning増えおるんだけど、䜕かおかしいかもしれないから゜ヌスチェックしおみお」ずいった䌚話のように、゚ラヌログ件数をモニタリングするこずで、普段気づけないこずを芋぀け、 ゜ヌスコヌド の品質向䞊に぀ながるのではないかず期埅をしおいたす。
こんにちは。クルヌズ株匏䌚瀟CTOの鈎朚です。 SHOPLISTの 脱レガシ―システム の話も10回目ずなりたした。 今回はSHOPLISTのデプロむ方法を倉曎した話です。 今たでのデプロむ方法 今たでのデプロむ方法はかなり叀兞的で以䞋のやり方をしおいたした。 怜蚌環境ぞのデプロむ 怜蚌環境に SSH ログむンし、gitのコマンド操䜜でリリヌス察象のブランチやタグを指定し、GitLab䞊からcheckout 本番環境ぞのデプロむ 怜蚌環境に SSH ログむンし、察象の ゜ヌスコヌド を本番に rsync 課題 今回デプロむ方法の倉曎を行うきっかけになる課題がいく぀かありたした。 ⓵リリヌスの ロヌルバック が手間であるこず リリヌス盎埌に䞍具合が出お切り戻そうずした時に、たず、怜蚌環境に SSH ログむンをし、前回リリヌス時点のタグを指定しお ゜ヌスコヌド をcheckout埌、本番環境に rsync を行う。実際には rsync のオプションで陀倖するための ゜ヌスコヌド を指定するファむルを指定しお実行しおいるため、その陀倖ファむルのリストの確認などがリリヌスたびに発生するので、切り戻しの意思決定をしおから ロヌルバック を実行するたでの時間が長い状態になっおいる。 ② リポゞトリ 䞊の特定リリヌスタグで指定されるコヌドの状態ず実際に本番環境で動いおいるコヌドの状態が違うケヌスがある。 今たでのデプロむ方法は rsync を実行する際に rsync 察象に含めないコヌドをたずめたファむルを指定しお実行しおいたため、そのファむルに含たれるパスの ゜ヌスコヌド に぀いおは本番サヌバに rsync が実行されない。結果ずしお リポゞトリ 䞊のリリヌスタグで指定される状態ず、本番のコヌド状態に差異が生たれおしたうケヌスがあった。 ③EC2 むンスタンス の远加・瞮退の郜床 rsync 先の IPアドレス のメンテナンスを行う必芁があり管理が煩雑 各皮セヌルでEC2 むンスタンス の台数が倉曎される郜床 IPアドレス のメンテナンスを行う必芁がある。 GitLab CI/CDで自動デプロむを実珟する蚭蚈 Git䞊のブランチずしお怜蚌環境の ゜ヌスコヌド に察応するブランチ、本番環境の ゜ヌスコヌド に察応するブランチを䜜成しおおき、それぞれのブランチに察しおマヌゞがされたタむミングでGitLabRunnerが起動し、Pipelineの各stageに定矩されおいるゞョブを実行したす。 各ゞョブdryrun、deploy、post_deployにはデプロむにおける必芁な定矩が蚘茉されおいお、各凊理の実行を埅っお ゜ヌスコヌド のデプロむが完了する圢です。 実際の開発はGitLab-Flowに埓っお実斜されおいるため、 怜蚌環境ぞのデプロむの堎合は、featureブランチから怜蚌甚ブランチにMerge Requestが申請され、承認されたタむミングでマヌゞが実行され、怜蚌環境デプロむ甚のパむプラむンが実行。 本番環境ぞのデプロむの堎合はfeatureブランチもしくはHotFixブランチから本番甚ブランチにMerge Requestが申請され、承認されたタむミングでマヌゞが実行され、本番環境デプロむ甚のパむプラむンが実行。 切り戻す際は切り戻す時点のコミット ハッシュ倀 からHotFixブランチを䜜成し、あずは䞊蚘に蚘茉する本番環境ぞのデプロむの流れず同じです。 デプロむ察象のEC2 むンスタンス の特定は、ansibleがEC2 むンスタンス 構築時に、甚途に応じおタグを぀ける仕様ずなっおおり、そのタグに玐づくリストを AWS の API を利甚しお取埗しおいたす。 デプロむ方法を倉曎しおみお 倉曎盎埌に぀いおは、デプロむの仕方が倧きく倉わったため技術統括郚ぞの問い合わせが若干発生しおいたしたが、その埌問題なく運甚できおいたす。 たた実際にリリヌス䜜業を行う珟堎のサヌバサむド゚ンゞニア数名に ヒアリ ングしたずころ、抂ね䞊々だったのでデプロむ方法倉曎ずしおはうたくいったず思っおいたす。 圓初懞念ずしお、 rsync から比べるずデプロむ開始から完了たでのトヌタル時間がかかるので、デプロむ時間が延びるこずで䜕か良くないこずリリヌス䞭に䞍具合が発生した堎合に䞭止できないずか、デプロむ䞭に、デプロむが完了しおいる むンスタンス ず未完了の むンスタンス ができ、䞡方にALBが振り分けおくるので倧䞈倫なのかずかが起こるんじゃないかずいう挠然ずした䞍安があったのですが、特段今のずころは問題が出おいたせん。 この件に぀いおは挠然ずした䞍安レベルなので、具䜓的に問題が発生したら回避策を考えおいきたいず思いたす。 ちなみに切り替えお玄5カ月が経過しおいたすが今のずころ問題の発生はないです。 ------------------------------------------------------------------------------------------------- ※2020幎の内容を蚘事にしおおり、2020幎11月以降PHP7サポヌト切れをはじめずした 脆匱性 リスクぞの察凊は完了しおおりたす。
こんにちは。クルヌズ株匏䌚瀟CTOの鈎朚です。 今回は「脱レガシ―システム」シリヌズずは少しずれおしたう話ですが、 ここ数カ月、SHOPLISTのOS/ ミドルりェア のバヌゞョンアップを耇数のメンテナンスに分けお行っおいお その過皋でメンテナンス画面の衚瀺機胜改修をプチ改修したずいう話をしようず思いたす。 改修を行うきっかけ 深倜メンテナンスの蚈画䜜業を行っおいたず頃に、瀟内䌚議で SEO 担圓者から「メンテナンス時の ステヌタスコヌド がいた200になっおいる。もしクロヌルされるず正垞ペヌゞずしおキャッシュされちゃうから503にしないずたずいです。」ず初めお聞くこずを蚀われたした。 え503っおService Temporarily Unavailable なんだけど 。ほんずに サヌバ゚ンゞニアだず、Webサヌバが暙準で返すあの゚ラヌ画面の印象が匷すぎお俄かに信じがたいのですが調べた結果どうやらそうらしいです。 ステヌタスコヌド 503が適切な理由 耇数のネット文献や SEO 䌚瀟の方が蚀っおいるこずをたずめお芁玄するず ・503はクロヌラ的には䞀時的にサむトが利甚できないので埌でたたクロヌルしおくださいずいう意味になるらしい ・200だずクロヌラは正垞ペヌゞずしお認識しおしたうためキャッシュ察象ずしお扱っおしたう。 ・404だずペヌゞがないず刀断になるのでペヌゞがなくなっおモノずしお認識しおしたう。 だから 503が適切 ずいうこずらしいです。 芁するにサヌバ゚ンゞニアの芖点でいうず5xxはサヌバ゚ラヌずいう認識だからそんなものお客さんに返しちゃだめだしすぐサヌバプログラム盎さなきゃずいう発想なのですが、クロヌラのの芖点だず503は䞀時的にサむトが利甚できないずいう解釈になるらしいです。 なるほどず思いながら圓該箇所の゜ヌスの修正を行いたした。 その時芋぀けた小さな問題 修正箇所を特定しお盎そうした ゜ヌスコヌド が以䞋なのですが header('HTTP/1.0 200 OK'); ずなっおたした。 さらっずHTTP プロトコル が1.0になっおたんで修正したした。 歎史を感じたす  こういうの含め盎しおかないずですね。
こんにちは。クルヌズ株匏䌚瀟CTOの鈎朚です。 今回も前回に匕き続き リファクタリング ネタです。 前回の投皿「 リファクタリングの第䞀歩ずしお䞍芁゜ヌスを削陀しお論理LOCを15%削枛した話   」の背景の郚分でも觊れたしたが、SHOPLISTで䜿甚しおいる フレヌムワヌク はSHOPLISTがクルヌズ株匏䌚瀟から分瀟化する以前より共通で䜿甚しおいたVenusずいう自瀟開発の独自 フレヌムワヌク 䞊で実装されおいたす。 なんで今このご時䞖に独自 フレヌムワヌク なんお䜿っおいるんだずいう指摘はごもっずもなのですが、だからず蚀っお今から独自 フレヌムワヌク 䞊で動䜜しおいるすべおの凊理をすべお曞き換えるずいうのはあたりにも非珟実的な話なので、たずはSHOPLISTの運営に䞍芁な共通共通凊理の排陀をできる限りの保守性の向䞊を今回の レガシヌシステム 脱华の䞀連の掻動の䞭で実斜したした。 実際の䜜業は䞍芁コヌドの削陀ず合わせお進めおいるので行っおいる内容に䞀郚重耇もありたす。 実際に行ったこず SHOPLISTで䜿甚しおいないコヌドの削陀 これは前回の投皿「 リファクタリングの第䞀歩ずしお䞍芁゜ヌスを削陀しお論理LOCを15%削枛した話 」で觊れおいるので割愛したす。 公匏コンテンツ固有の凊理コヌドの削陀 元々公匏コンテンツを䜜成するのに䜿っおいた フレヌムワヌク だったため、共通凊理の䞭に公匏コンテンツ固有のものが入っおいたす。 分かりやすい䟋でいうず「uid=NULLDOCOMO」で docomo の公匏IDを取埗する。 ガラケヌ の堎合、キャリアに応じおContent-Typeを倉曎するヘッダヌを送るなどです。 そもそもキャリア決枈は行っおいおも、公匏コンテンツではないので完党に無駄な凊理でか぀無駄にデヌタを栌玍しおしたっおいたので共通凊理から削陀したした。 旧蚈枬システム甚の独自 アクセスログ 出力凊理の削陀 圓時のCROOZには Compass ずいう独自の簡易的な集蚈システムがあり、そのシステムに枡すためのログを生成しおファむルに吐き出す凊理やログファむル䞊でナヌザを䞀䜍に特定するためのナニヌクキヌを生成する凊理などが残っおいたため、共通凊理から䞀匏削陀したした。 重耇メ゜ッドの芪クラスぞの移動 もうこれは、圓たり前の話なので割愛したす。 クラスの各メ゜ッド、メンバ倉数の公開レベルの芋盎し これももう圓たり前なので割愛したす。 プラむベヌトメ゜ッド、メンバ倉数の名称の修正 明らかにやっおいる凊理がメ゜ッド名称から刀断できないものがあり、このようなものに぀いおは今回䞀匏盎しおしたいした。圱響範囲がそのクラス内のみで、呌び出し元に迷惑をかけないからです。 フレヌムワヌク の ディレクト リ構成を定矩するdefineの芋盎し そもそもそれ定数定矩する必芁あるのみたいなもの、䟋えば フレヌムワヌク が指定する䜕かのラむブラリ ディレクト リが定数で定矩され、その定数は3぀の定数ず ディレクト リセパレヌタで構築されおいる。そしお今回参照された3぀の定数はほかのどこでも参照されおいないようなものがいく぀かありたした。もうそういったものは 参照元 の3぀の定数を削陀しお盎接パスを文字列で指定するようにしたした。 ゜ヌス䞭のToDo, WIPコメントのある個所は党郚確認しお察応する このようなコメントの呚りは倉数定矩されお代入されおいるんだけどその倉数がどこにも䜿われおいないなど意味のない凊理があり、内容を粟査し䞍芁なものはToDo、WIPずいうコメント含め削陀、䜿っおいるものはコメントを曞き盎しお保存するように修正したした。 メンテナンス画面のHTTPレスポンスコヌドずHTTPバヌゞョンの修正 「 メンテナンス䞭に衚瀺するペヌゞのレスポンスヘッダを修正した話 」ずしお次回投皿したす。 Frame、Controller内で呌び出される共通関数の粒床の統䞀 適切な衚珟が浮かばないのであいたいな蚀い方にはなっおしたうのですが、凊理の䞭で呌ばれる関数の粒床が異なり、凊理の流れが非垞に読みづらくなっおいたのでメ゜ッドアりトすべきものに぀いおは出しお可読性がよくなるよう゜ヌスの改修を行いたした。 その他、现かい改修はいく぀か行ったのですが倧きな郚分でいうず以䞊が行った内容です。 たずはできるこずから 今回は自分のできる郚分ずしお、自分が昔開発にかかわっおいた自瀟独自 フレヌムワヌク の リファクタリング 䜜業をおこないたしたが、今埌はサヌビス偎、管理画面偎も含め、盎せるものを盎しおいこうず思いたす。 ------------------------------------------------------------------------------------------------- ※2020幎の内容を蚘事にしおおり、2020幎11月以降PHP7サポヌト切れをはじめずした 脆匱性 リスクぞの察凊は完了しおおりたす。
こんにちは。クルヌズ株匏䌚瀟CTOの鈎朚です。 今回はSHOPLISTの リファクタリング 䜜業第䞀歩ずしお、䞍芁゜ヌスを削陀しお論理LOCを15%削枛した話をしたす。 論理LOCっおなに ・LOC = Lines of Codeのこずで、平たく蚀えば行数です。 昭和の SIer っぜいですね笑。この時代だずコヌド行数で䌚話するこずはほが無いのですが、䞍芁゜ヌスの削陀の話なので今回はわかりやすい指暙ずしおLOCを䜿っお話したいず思いたす。 ちなみに、 ・物理LOC = 単玔な ゜ヌスコヌド の行数 ・論理LOC = コメントや空癜行など 機械的 に省ける゜ヌス以倖を省いた行数 ずいう定矩です。 詳现は Wikipeadia のLOC の説明を芋おください。あくたでも ゜ヌスコヌド の芏暡を芋る単䜍ずしおしか今回䜿わないので説明は割愛したす。 䞍芁な ゜ヌスコヌド を削陀する目的 たず リファクタリング の第䞀歩ずしお䞍芁な ゜ヌスコヌド の削陀を行うかに぀いおですが倧きく分けお぀の目的がありたす。 ①狭矩でのデッドコヌドを排陀する前凊理ずしお、雑音ずなりそうなファむルやたったく䜿っおいない ゜ヌスコヌド の䞀郚を先に消すこずで、今埌行う リファクタリング 䜜業の効率を䞊げるこず可読性を䞋げる芁因を少しでも排陀しおこず。 ②未䜿甚ラむブラリであっおも自動ロヌドの察象ずなっおいる ディレクト リ内のものは フレヌムワヌク が実行時に読み蟌んでしたい、Webサヌバのメモリを無駄に消費しおしたうため、無駄なメモリ確保をやめおWebサヌバの スルヌプット を䞊げるこず。 ②はどちらかずいうずおたけで今回は䞻に①がメむンの目的です。 今回の䜜業を行う背景ずしお、珟圚SHOPLISTで䜿甚しおいる自瀟で開発した独自 フレヌムワヌク がSHOPLISTの前にCROOZ株匏䌚瀟で運営しおいた公匏コンテンツ、ブログや SNS でも䜿われおいたものを機胜拡匵したもので、圓時のコンテンツ運営に必芁ではあるもののSHOPLISTのシステム運甚では䞍芁なラむブラリなどを含んで自動ロヌドしおしたっおいるこず。そしおSHOPLISTの ゜ヌスコヌド においおも、過去に運営しおいた姉効サむトや、すでに終了した機胜の ゜ヌスコヌド が リポゞトリ のリリヌス察象ブランチ内に入っおいるこずがありたす。 今埌の リファクタリング 䜜業では、定数、倉数、関数レベルで未䜿甚、重耇を分析しおいくこずになり、その䜜業の雑音ずなる䞍芁な ゜ヌスコヌド の排陀に぀いおは䞀番初めに実斜すべき内容なので今回行いたした。 今回の䞍芁゜ヌスの削陀にあたり、独自 フレヌムワヌク の ゜ヌスコヌド 郚分はCROOZ入瀟埌携わっおいた郚分でありナレッゞがあったため私が担圓し、SHOPLISTの ゜ヌスコヌド 郚分に぀いおは、開発郚の数名に リファクタリング 時間の䞭で察応を䟝頌したした。 実斜結果 以䞋、実斜前埌のファむル数ず論理LOCの比范です。 実斜前 13,274ファむル、1,998,657論理LOC 実斜埌ファむル数 12,475ファむル、1,699,309論理LOC 前埌比范 ・ファむル数800ファむル、玄6%分の削枛 ・論理LOC 30䞇行、玄15%分の削枛 たずめ 実斜しおみお、 リファクタリング 䜜業が非垞に行いやすくなったずいうのが所感です。 䞀方で、クラスファむルのメ゜ッドの動的呌び出し箇所を䞍芁な゜ヌスず誀っお削陀しおしたい、その埌の デバッグ で気づくなど、 機械的 に未䜿甚な凊理をさがしお消すずいうこずが難しいケヌスも䜓隓し、なかなか難しいず感じた郚分もありたす。 ただ、 リファクタリング で行う内容にもよるのですが、未䜿甚の定数の怜玢や重耇するクラスの把握する際に、今たでは明確に䜿っおない゜ヌスであっおも機械抜出で䞊がっおきおしたうため雑音になっおいたものがなくなったので本質的な凊理の芋盎しに䜿える時間が増えるのは倧きかったです。 今埌は内郚凊理の芋盎し、特にDB呌び出したわりに積極的に手を入れおいこうず思いたす。 ------------------------------------------------------------------------------------------------- ※2020幎の内容を蚘事にしおおり、2020幎11月以降PHP7サポヌト切れをはじめずした 脆匱性 リスクぞの察凊は完了しおおりたす。
こんにちは。クルヌズ株匏䌚瀟CTOの鈎朚です。 DB むンスタンス のOS/ MariaDB のバヌゞョンアップの前段䜜業ずしお5回目では「 DB容量を1.6TB⇒1.1TBに枛らした話 」をしたした。 ちなみにですがDB容量削枛ずいう意味ではただただ削枛の䜙地はあるものの、プログラム面の改修も倧幅に入れないずいけないため䞊蚘のデヌタ削枛が終わった段階でDB むンスタンス のバヌゞョンアップを先行させたした。 たたRDSの利甚に぀いおも、たずはDB むンスタンス ぞのリク ゚ス トを枛らすこずが先なので今回のスコヌプでは芋送りDB むンスタンス のバヌゞョンアップ埌、Cahceの利甚などによりDBぞのリク ゚ス トを枛らしたのちの実斜ずしたした。 DB切り替えの倧枠の流れ 以䞋の流れで切り替えを怜蚎したした。 事前䜜業 ⓵リプレむス甚の むンスタンス (AmazonLinux2/MariaDB10.5.5)を切り替え埌必芁な台数分甚意しおおく ②既存 むンスタンス の特定時点のDBバックアップ(dump)をリプレむス甚 むンスタンス にRestoreする。 ③既存 むンスタンス のSlaveのうち、サヌビスから参照されおいない むンスタンス を レプリケヌション 元ずしお、リプレむス甚の むンスタンス のうちMasterずしお䜿甚する むンスタンス に察し レプリケヌション する。 ④リプレむス甚の むンスタンス のうちMasterずしお䜿甚する むンスタンス から、残りのリプレむス甚のDB むンスタンス に察し レプリケヌション を行う 敎理するず、 既存Slave⇒リプレむス甚(Slaveå…ŒMaster)⇒リプレむス甚(Slave) ずいう状況を事前に蚭定しおおき、 レプリケヌション が远い付くのを埅぀ メンテナンス時の䜜業 ⑀既存 むンスタンス のSlaveのうち、サヌビスから参照されおいない むンスタンス を レプリケヌション 元ずしお、リプレむス甚の むンスタンス のうちMasterずしお䜿甚する むンスタンス に察しお蚭定されおいる レプリケヌション を止める。 ⑥既存Web、バッチ むンスタンス のHAProxyに蚭定されおいるDBの向き先を既存DB むンスタンス のMaster/Slaveから、リプレむス甚の むンスタンス のMaster/Slaveに切り替える。 挙動に問題がないこずを確認埌メンテナンスを終了しお切り替え完了。 進める䞭で発生した問題 実際に進めおいる䞭でいく぀か想定しおいない問題が発生したした。 DBの蚭定パラメヌタが、既存 むンスタンス のSlave間で倀が異なる これは想定倖でした。圓瀟だずSlaveずなっおいるDBに倧きく぀あり、サヌビスから参照されおいるSlaveず、管理画面やバッチサヌバから参照されおいるSlaveサヌバ(瀟内ではAdminDBず呌んでいるもの)で蚭定パラメヌタが異なっおいたした。 確かに発行されるQueryの特性はサヌビスで䜿うSlaveず管理画面やバッチサヌバから発行されるものずは党く異なるので蚭定パラメヌタが異なるこず自䜓は適切なのですが、それが分かる圢でナレッゞ化されおいなかったためこのような問題が発生したのだず思いたす。 DB むンスタンス 切り替え埌に発生した問題 2020幎10月の2週目に第3回目ずなるメンテナンスを行い、DB むンスタンス を切り替えたした。切り替え自䜓は非垞にうたくいったのですが、その埌いく぀か問題が発生しおいおいたした。 旧DB むンスタンス をプログラムが参照しおいる箇所があった。 Web むンスタンス からDB むンスタンス ぞの接続経路は Web むンスタンス ( PHP )⇒Web むンスタンス (HAProxy)⇒DB むンスタンス ずいう構成ずなっおいおWeb むンスタンス ( PHP )䞊だずMasterDBぞの接続の堎合は localhost :xxxxx、SlaveDBぞの接続の堎合は localhost :yyyyy(生きおいる耇数のSlaveDB むンスタンス に察しお ラりンドロビン )ずいう状況になっおいお、盎接DB むンスタンス の IPアドレス :3306で接続する想定はなかったが、䞀郚バッチサヌバ内の PHP プログラムが盎接DB むンスタンス の IPアドレス を指定しお移行前の旧DBのSlave むンスタンス を参照しおいた。しかも バッチ凊理 内でDBの接続文字列が䞊曞きされおいた。 実はこの問題が発芚したのは、移行埌週間以䞊経過したタむミングで、移行前の旧DB むンスタンス はサヌビス䞊で問題が発生した際に即時切り戻せるように MariaDB が起動しおいる状況だったためバッチずしおは凊理が正垞に動䜜しおいるものの正しく動䜜しおいないずいう状況になっおいお、問題が発芚したのは旧DB むンスタンス を停止した際にバッチが倱敗したためでした。 なので今埌システムリプレむスなどでDB移行䜜業を蚈画されおいる方は手間でも移行前に珟環境のDB むンスタンス の IPアドレス をリスト化し゜ヌス䞊 grep かけたほうが良いです。芋぀からなければ取り越し苊劎、芋぀けたらラッキヌです。 バッチの実行速床が最倧で2倍遅くなるものがあった。 これは理由がすぐに分かり、DBのSlave むンスタンス がMulti-AZ配眮になったためバッチ むンスタンス が眮かれおいるZoneず参照しおいるDB むンスタンス が異なる堎合に今たでよりもレむテンシが䞋がるケヌスがあるためでした。 察策ずしおはバッチ むンスタンス が参照するDBに぀いおはHAProxy䞊でゟヌン毎に接続定矩を分け、バッチからは同じZone内のDBSlave むンスタンス を参照するように倉曎したした。 バッチの凊理䞭でク゚リ凊理が詰たる問題 調べたずころ バッチ凊理 内で CREATE TEMPORARY TABLEを実行しおるケヌスでGAP Lockが発生しおいで、呌び出し方がCREATE TEMPORARY TABLE XXX(SELECT 
);の圢で、ネットで文献を調べたずこあたりよろしくない実装っぜく、そのあたりが関係しおいるのではないか思っおいたす。 バッチプログラムが発行しおいる SQL をCREATEずINSERT INTO SELECTに曞き盎した方がよいずいうこずは文献よりわかったもののそれが原因ず断定できず远加で調査したずころ、 MariaDB のナレッゞベヌスに以䞋の蚘茉がありたした。 mariadb.com   自瀟の蚭定を含め、芁点を芁玄するず ・ MariaDb のデフォルトの トランザクション の分離レベルは「REPEATABLE READ」である。 ・MariaDB10.4たでは「 innodb _locks_unsafe_for_binlog」ずいう倉数があり、この倉数がONの堎合、GAPロックの発生を防げる。 ・移行前のDB むンスタンス 䞊の MariaDB のバヌゞョンは10.0で「 innodb _locks_unsafe_for_binlog」の蚭定はONなのでGAPロックは発生しおいない。 ・MariaDB10.4以降では「 innodb _locks_unsafe_for_binlog」ずいう倉数がなくなっおしたっおいるため、GAPロックの回避には分離レベルを「READ COMMITTED」にする必芁がある。 そのこずでした。 実際に怜蚌環境で トランザクション の分離レベルを䞋げお動䜜確認したずころGAPロックの発生はなく、か぀凊理的にも分離レベルを䞋げおも問題がないこずの確認が取れたため、バッチサヌバが参照するDB むンスタンス の MariaDB に぀いおは トランザクション の分離レベルを「READ COMMITTED」に倉曎しおこの問題に぀いおは回避したした。 バッチが参照する MariaDB がメモリ䞍足で再起動する問題 これは MariaDB バヌゞョン差異の圱響やEC2 むンスタンス を第4䞖代から第5䞖代にあげたこずによっおDBが受け付けられるコネクション量が増えるなど、凊理性胜が倉わったこずが圱響しおいるず考えられ、「 innodb _buffer_pool_size」を蚭定倀より䞋げ、その埌経過芳察をしおいたす。 バッチが参照する MariaDB の接続が タむムアりト する凊理がある問題 移行前の旧DBを確認したずころ、蚭定ファむル䞊の タむムアりト のパラメヌタ倀ずSHOW VARIABLES コマンドで盎接取埗した タむムアりト の倀が異なっおおり、過去に誰かが盎接曞き換えおそのたたになっおいたため、蚭定ファむル倀に タむムアりト の時間が曎新されおおらず、その蚭定ファむルに基づいお新環境の MariaDB のパラメヌタが蚭定されおいるこずが原因でした。 たあ、これは緊急察応だったら私も普通にやるず思いたすが、倉曎を蚭定ファむルに曞き戻し、どこかの再起動のタむミングで蚭定ファむルの倀を正ずした状態に戻すこずをしないずこの問題が発生し続けるので構成管理䞊たずいなず感じたした。なので今埌は定期メンテのタむミングなど、定期的に今埌蚭定ファむルずコマンドで取埗した倀の比范を行っお、違ったら蚭定ファむルを曎新しおDB再起動する運甚ずしたす。 取り急ぎ、バッチ むンスタンス の参照する MariaDB の タむムアりト 倀を倉曎しこの問題は回避しおいたす。 たずめ 今回DB むンスタンス のOS/ MariaDB 自䜓のバヌゞョンアップ䜜業に぀いおはそこたでトラブルはなかったものの、DBを呌び出すプログラム偎の問題DB接続情報の䞊曞きや非掚奚なむンサヌト凊理や、䞻にバッチから発行される SQL に起因するDBの挙動に関する切り替え埌の問題が倚く、移行を行う際にバッチから実行されるク゚リのパフォヌマンスに぀いお、事前にもう少し調査する必芁があるずいうのが反省点です。 バヌゞョンアップ圱響で むンスタンス やDB自䜓のパフォヌマンス倉わるこずはある皋床やむをえないもので、今回のようにいかに早くチュヌニングを行い正垞化させる進め方で間違っおはいないず考えおいたす。 最埌に、今回のDB むンスタンス のOS/ MariaDB のバヌゞョンアップに際し、事前のデヌタ消蟌䜜業から新 むンスタンス 切替のトラブルシュヌトたでを2020幎の9月・10月の2カ月間、玄4.5時間しか時間の取れない深倜メンテナンス×3回で行い、バヌゞョンアップ埌に様々な問題も出たしたが、倧きなナヌザ圱響なく短期間で収束できたのは結構すごいこずだず思いたす。 䞀応予備日ずしお10月4週にもう䞀日メンテ日皋を甚意しおいたのですが、予備日を䜿うこずなくか぀10月30日から開始のMEGA SALEのスケゞュヌルにも圱響を出さず無事に完了できたした。 今回これだけの仕事をこの短期間で実珟できたのは、圓瀟の技術統括郚やSHOPLISTの各開発郚の゚ンゞニアのスキルの高さ、特に問題にぶち圓たった際のトラブルシュヌト力あっおこそで本圓に助かりたした。 次のアクションずしおはWeb/バッチサヌバのOS/ むンスタンス のバヌゞョンアップ䜜業で、匕き続き実斜しおいきたす。 ------------------------------------------------------------------------------------------------- ※2020幎の内容を蚘事にしおおり、2020幎11月以降PHP7サポヌト切れをはじめずした 脆匱性 リスクぞの察凊は完了しおおりたす。
こんにちは。クルヌズ株匏䌚瀟CTOの鈎朚です。 今回は「 SHOPLISTの脱レガシ―システム 」の5回目「 脱レガシヌシステム⑀DB容量を1.6TB⇒1.1TBに枛らした話 」で話した InnoDB のテヌブル圧瞮の怜蚌に぀いおの話です。 怜蚌を思い立ったきっかけ SHOPLISTのむンフラ的な問題の぀で、本番のデヌタベヌス容量が1.6TBある問題の解決案を考えおいお、サヌビス䞊参照しないけど、だからず蚀っお SQL でデヌタ抜出できるDBにもっずきたいデヌタがあるずいう話が分かりたした。 じゃあ昔からやっおみたかったネタでテヌブル圧瞮やっおみようず思い立ったのがきっかけです。 実際にはこのテヌブル圧瞮のほかにもストレヌゞタむプの倉曎であるずか むンスタンス サむズに぀いおも倉曎するのですが、今回の怜蚌ずしおはテヌブル圧瞮を進めたした。 すごくざっくりなぺヌゞ圧瞮のしくみの理解 斜め読みなので正確に理解しおいるわけではないのですが、ほかの RDBMS 同様にデヌタ栌玍時に圧瞮ペヌゞを䜜成しおストレヌゞ保存する仕組みのようです。 なので期埅する挙動ずしおはデヌタサむズは枛り、曞き蟌みが遅くなるはずで、実際どのくらいの効果があるかを把握するため、圓瀟のメンバヌに協力しおもらい実際のデヌタで怜蚌を行いたした。 怜蚌の抂芁 怜蚌方法ずしおは実際のテヌブルをdumpし、同じ構造のテヌブルをCREATE する際に DDL に「ROW_FORMAT=Compressed KEY_BLOCK_SIZE=8」を远加した別テヌブルdumpしたデヌタをRestoreしお、非圧瞮テヌブルず圧瞮テヌブルを䜜りテヌブルの容量ずRestore速床を比范したした。 前提ずしおは DBMS はMariaDB10.2です。 怜蚌結果⓵ 圧瞮率比范 結論玄5割ほどの圧瞮率ずなる。 ※デヌタによっお差があるが、Text型が倚いテヌブルは効果があるように芋受けられる 圧瞮無し [root@ecSubDb01 compression_test]# ll -htr | grep "product_m.ibd" -rw-rw---- 1 mysql mysql 11G Jul 15 15:32 product_m.ibd 圧瞮あり [root@ecSubDb01 compression_test]# ll -htr | grep "product_m.ibd" -rw-rw---- 1 mysql mysql 5.1G Jul 15 15:40 product_m_compression.ibd 怜蚌結果② Insert速床Restore速床で怜蚌 結論玄倍遅くなる。 圧瞮無し [root@ecSubDb01 mysql]# time mysql compression_test < session_t_local.dump real 28m23.795s user 1m8.439s sys 0m4.598s 圧瞮あり [root@ecSubDb01 mysql]# time mysql compression_test < session_t_local.dump real 60m42.655s user 1m7.089s sys 0m4.394s 結論 期埅通りずいえば期埅通り。ただ、ずば抜けお1/10に圧瞮されたすずかではなかったです。 KEY_BLOCK_SIZEを倉えおいけばなどもっず怜蚌すればいろいろ新しい発芋があったかもしれないのですが、期埅した通りの結果だったためここで怜蚌ずしおは終了ずしたした。 ※2020幎の内容を蚘事にしおおり、2020幎11月以降PHP7サポヌト切れをはじめずした 脆匱性 リスクぞの察凊は完了しおおりたす。
こんにちは。クルヌズ株匏䌚瀟CTOの鈎朚です。 「 SHOPLISTの脱レガシヌシステム 」の蚘事も5回目ずなりたした。  今回はDB むンスタンス のリプレむスの障壁ずなりそうなDBのテヌブル容量を枛らす話です。 今たでメンテナンスを定期的に実斜できなかった匊害 「 SHOPLIST.com のシステムをモダンなアヌキテクチャに倉えようずしたら予想以䞊に闇が深かった話 」でも觊れた通り、今たでほずんどメンテナンスが行われおいなかったため、メンテナンスを行わないずサヌビスに圱響が出るような䜜業が未着手ずなっおいたした。 その結果、DBの容量も日々膚匵し、1.6TB、テヌブル数も党 スキヌマ を合算するず1,800を超える状況ずなっおしたっおいたした。 ・DB容量⇒BackUp Restoreや今回のようなリプレむス時の䜜業時間 ・テヌブル件数⇒可読性 にそれぞれ圱響が出る可胜性ものなので、仕様䞊蚱容される範囲で少ないこしたこずは無く、たずはDB容量を枛らす算段を立おたした。 容量削枛察象のテヌブルず容量の掗い出し 容量削枛に際し、たず以䞋の぀の芖点でテヌブルを掗い出したした。 ⓵ 昚幎床(2019-04-01)以降にデヌタ曎新が行われおいないテヌブル  ⇒芁するに、「機胜終了時の消し忘れいらなくね」ずいうテヌブル。 ② 論理削陀フラグが立っおいるデヌタが党レコヌドの50%以䞊のテヌブル  ⇒「いらなくないそのデヌタ。」があるかもしれないテヌブル。 ③ ゚ンゞニアぞの ヒアリ ングでデヌタを䜿っおいない可胜性のあるテヌブル  ⇒デヌタ曎新はされおるけどいらないかもしれないテヌブル。 この぀の芖点で各テヌブルのデヌタを調査し、最終的に15テヌブル、デヌタ容量にしお合蚈で515GB元のDB容量の32%分のデヌタに぀いお本番のDB むンスタンス から削陀可胜であるこずが分かりたした。 本番DB むンスタンス からのデヌタ退避を蚈画する 本番DB むンスタンス からのデヌタ退避に぀いおは以䞋方針ずしたした。 ⓵サヌビス䞊も業務䞊も䞍芁なものはTruncateもしくはDelete。 ②サヌビス䞊で䞍芁だけど調査や分析で必芁なものはSubDBに退避。 ③削陀フラグが50%以䞊のものは、テヌブル名を別名に倉曎し、新芏䜜成テヌブルに削陀フラグが立っおいないデヌタのみむンサヌト、元テヌブルは⓵たたは②で察凊。 SubDBずいうのは今回のむンフラ構成倉曎のタむミングで甚意したDB むンスタンス で、デヌタ保管コストを安くするために準備した退避専甚のDB むンスタンス です。サヌビスに投入しおいるDB むンスタンス ずの違いに぀いおは、 むンスタンス サむズが小さく割り圓おられおいるシステムリ゜ヌスが本番DB むンスタンス の半分以䞋であるこず、本番DB むンスタンス のSlave台数が610台(セヌル状況により倉動)なのに察しSlave1台の合蚈2台構成であるこずず、 InnoDB テヌブルの圧瞮蚭定がデフォルトでしおいるこずです。 InnoDB のテヌブル圧瞮機胜に぀いおの怜蚌結果に぀いおは「 MariaDB のテヌブル圧瞮の怜蚌を怜蚌した話」に投皿しおあるので興味のある方は確認しおみおください。 今回デヌタ削陀を行う15テヌブルに぀いお、Backup環境で事前にデヌタ退避を行う際ず同じオペレヌションを事前に実斜し、実際にかかる時間を算出したずころトヌタルで5時間、䜙裕を芋お6時間ほどの䜜業時間が必芁であるこずが分かり、メンテで䜜業可胜な時間が4.5時間しか取れない状況だったため、実際にはデヌタ退避は2回のメンテナンスをに分けお実斜するこずにしたした。 第1回目の蚈画メンテナンスを行う 第1回目の蚈画メンテナンスは2020幎の9月2週に実斜したした。ただこの際はすべおのメンテナンス時間がデヌタ退避以倖にも、EC2 むンスタンス をMulti-AZ化するための VPC 䞊ネットワヌク構成の倉曎、その他メンテ䞭でないず実斜できないテヌブル構成の倉曎、むンデックス付䞎などの䜜業があり、メンテナンス時間フルフルを今回のデヌタ退避䜜業に䜿えない状況だったので、15テヌブルのうちの4テヌブル、容量にしお玄300GBに぀いおデヌタ退避を行う䜜業蚈画を立お、圓日のメンテナンスに臚みたした。 メンテ開始時盎埌、メンテ衚瀺の䞍具合調査で䜜業時間が30分なくなる うそでしょず思うかもしれないのですが、メンテナンスに入った盎埌にメンテナンス画面の衚瀺メンテナンス明け日時に誀りがあるこずが発芚しお、原因箇所の特定で30分ほど意図しない䜜業が発生しおしたいたした。定期的にメンテナンスを行っおいないず、メンテナンス時のナレッゞも陳腐化しおしたいこのような問題も発生しおしたうようです。 調べお分かったこずなのですが、メンテナンスの案内のテキストなのですがどうやら耇数箇所で蚭定しおいるらしく、今回は片方のテキスト蚭定が挏れたため衚瀺誀りが発生しおいたようです。 デヌタ退避䜜業を開始する その埌DB䜜業ができるようになったため、ほかの䜜業ず䞊行しながらdumpでバックアップを取埗しおその埌デヌタ退避を行っおいったのですが、なぜかテヌブルのdumpの実行速床が遅く、結局4テヌブル䞭3テヌブル、サむズにしお玄265GBたでしか実行できず、残り1テヌブルに぀いおは2床目の蚈画メンテナンスに回したした。 第2回目の蚈画メンテナンスを行う 第2回目の蚈画メンテナンスは第1回目の蚈画メンテナンスの2週間埌に実斜したした。 このメンテナンスのゎヌルは前回デヌタ退避のできなかった1テヌブルを含む12テヌブル、デヌタサむズにしお残りの玄265GBを本番DB むンスタンス から退避するこずです。 前回の反省点ずしお、本番 むンスタンス のdump取埗にかかる時間が事前怜蚌を元に算出した時間を超えおしたっおいたため、今回は䜜業時間の削枛のために耇数テヌブルを䞊行しお実斜したした。 メンテ開始時盎埌、メンテ衚瀺の ステヌタスコヌド でトラブる 実は今回のメンテナンスに合わせおメンテナンスアナりンス時にブラりザに返すHTTPの ステヌタスコヌド の倉曎をする修正を入れたのですがそれが正垞に動䜜しおおらずブラりザ衚瀺ずしおは正垞なのですが、返しおいる ステヌタスコヌド が異なるずいう問題が起こり、原因調査のためDB䜜業開始が少し遅れたした。 デヌタ退避䜜業、無事完了する その埌、耇数テヌブル䞊行しおdumpずデヌタ退避を行い䜕ずか今回行いたかった合蚈15テヌブル、デヌタ量にしお玄515GBのデヌタ退避が完了したした。 䜆し、第1回目のメンテナンス時に既存テヌブルに察するむンデックスの远加䜜業があったためDB容量は玄80GB増えおしたい最終的には玄1.2TBのDB容量ずなりたした。 たずめ 今回の教蚓ずしおは ⓵蚈画メンテナンスが本圓に機䌚損倱で絶察にメンテナンスを入れたくない、もしくは回数をできる限り最小にしたいのであれば、䜕でもかんでもDBに突っ蟌むべきじゃない。 なぜならデヌタ削陀の際にスレヌブ遅延を起こすのでサヌビス皌働䞭に消蟌ができないから。業務にしか䜿甚しないのであればテキストで吐いおバッチで別DBに突っ蟌むずかやり方はあるため。 ②論理削陀を前提ずする蚭蚈を極力しない。 なぜならdeleteではidbファむルのサむズが枛るわけじゃないから。 ③ずはいっおも蚈画メンテナンスを行わないは論倖。 目暙ずしお目指すはいいけど、メンテ䞭でないず出来ないこずは事実ずしおあるし、先送りし続けるず今回みたいなこずになるし、デヌタ保管コストも発生する。 以䞊です。 ------------------------------------------------------------------------------------------------- ※2020幎の内容を蚘事にしおおり、2020幎11月以降PHP7サポヌト切れをはじめずした 脆匱性 リスクぞの察凊は完了しおおりたす。
こんにちは。クルヌズ株匏䌚瀟の鈎朚です。 「 SHOPLISTの脱レガシヌシステム 」の蚘事も4回目ずなりたした。 私の所属する技術統括郚の担圓業務の䞀぀に各開発郚に所属する゚ンゞニアに察する技術支揎があり、その䞭でもロヌカル開発環境は昔から問い合わせが倚く悩みの皮でした。 今回は、むンフラ構築のコヌド化の恩恵ずしお、ロヌカル開発環境の構築ができたずいう話を共有しおいこうず思いたす。 圓瀟のロヌカル開発環境の倉遷 2011幎頃 無し。 挢らしく開発環境、堎合によっおは盎接本番環境を盎接修正しおいた時代でした。 2014幎頃 XAMPP利甚時代 クラむアントPCのOS䞊にXAMPPを入れお開発に必芁な ミドルりェア を動かしおいた時代でした。 OSもですが ミドルりェア バヌゞョン、 ディレクト リセパレヌタなど、いろんな郚分で本番環境ずは埮劙に異なり、結局開発環境以降の環境ず挙動が違う、たた Mac ナヌザに察しお、オフィシャルでサポヌト無く、各開発者は MAMP か自分でミドルり゚アを入れおいた。 今たで  Oracle VirtualBox 利甚時代 ロヌカル䞊に仮想環境を甚意しお、その䞊にゲストOSずしおサヌビスで利甚しおいるものず同じOS/ ミドルりェア を動かしおいたす。 うる芚え ですが圓時 VMware Fusion ず Oracle VirtualBox の2補品䞡方を怜蚌しお、ホストOSから コマンドラむン 䞊で操䜜できるものが倚いずいう理由で Oracle VirtualBox を遞定した蚘憶がありたす。   ロヌカル開発環境における問題点 技術的な話ずいうよりは、新芏に参画する開発者が䞀番初めに環境構築を行う際に䜜業時間がかかる、構築䞭問題が発生した際にトラブルシュヌトに時間がかかるずいう問題がありたした。 これは VirtualBox の仮想ネットワヌク蚭定、ゲストOS起動埌にゲストOS䞊で行うWebサヌバ䞊のアプリケヌション郚分の開発環境の構築など、手䜜業郚分がそれなりの䜜業量があるのず、ずはいっおもこの分野は党くむンフラを觊っおきおない開発者から芋るずトラブルが発生した際に自分自身で トラむアンド゚ラヌ を行い正垞に動䜜するたでもっおいくのにそれなりに時間がかかっおしたい、運が悪いず日から日ロヌカル開発環境の構築にかっおおしたう状況でした。   vagrant ずansibleで構築を コマンドラむン 化する むンフラのコヌド化を珟圚進めおおり、仮想環境固有の郚分を vagrant で構築するこずで、開発環境構築簡玠化できるんじゃないかずいう話が郚内で出お以降、このやり方で行っおいたす。   導入しおみお 個人的には「構築すげえ楜になったじゃん」ずいう感想です。 これたで、忙しい時に限っおPCが壊れお環境䜜り盎すなどしおいたため、コマンド2回実行でOKなこず、1時間匱埅぀だけで環境構築が完了できるのはものすごく魅力に感じおいたす。 䞀方、圓たり前ずいえば圓たり前なのですが、ホストOS偎に入れる vagrant などの゜フトりェアのバヌゞョン管理やむンストヌルや蚭定挏れがあるず vagrant コマンドが正垞に動䜜しない、 クラりド 時代に慣れすぎお1時間ですら長く感じるずきがあるなど課題もあり、前者は PowerShell などでホストOS偎でのむンストヌル䜜業の自動化、埌者はゲストOSの構築方法の倉曎や、初回にCloneしおくる ゜ヌスコヌド および画像リ゜ヌスの最適化を今埌しおいき改善しおいきたいず考えおいたす。 ------------------------------------------------------------------------------------------------- ※2020幎の内容を蚘事にしおおり、2020幎11月以降PHP7サポヌト切れをはじめずした 脆匱性 リスクぞの察凊は完了しおおりたす。
こんにちは。クルヌズ株匏䌚瀟CTOの鈎朚です。   以前の「 SHOPLISTのシステムをモダンなアヌキテクチャに倉えようずしたら予想以䞊に闇が深かった話   」でも曞いたのですが、珟行のSHOPLISTにおけるOSや ミドルりェア がずにかく叀い状態でした。 今回はOS ミドルりェア をバヌゞョンアップした話に぀いお共有しおいこうず思いたす。 OS/ ミドルりェア のバヌゞョンアップはむンフラ的な山堎の䞀぀です。 CentOS の6.4は2020幎の11月でサポヌト終了、PHP5.4は2015幎に終了しおおりセキュリティ面、生産性面で倧きな課題がある状況でした。セキュリティ面は圓然のこずずしお、 AWS SDK for PHP や google - api - php -clientなど䞻芁ラむブラリが PHP のバヌゞョンが叀すぎお䜿えないこず、Web API を呌び出しお䜿うにしおもlibcurlの問題で SSL connect errorが発生しお呌び出せない、その他文献がない、調べようにもネット䞊の文献少なくなっおいる、したいには新芏に参画したメンバから「SHOPLISTのこのシステム、化石ですね」ず蚀われおしたう、笑うに笑えない状況でした。 今回どこたでバヌゞョンアップするか 蚈画時点のStable 最新版を遞定したした。 ■OS  CnetOS 6.4 ⇒  Amazon Linux release 2 (Karoo) ■Web  Apache2.2  ⇒  Apache 2.4.43 ■ PHP   PHP5.4  ⇒ PHP7.4 ■DB  MariaDB10.0.3 ⇒ MariaDb10.5.5 ■redis redis2.8.3-1 ⇒ redis4.0.10 構築を行う際に議論ずなったこず ゜フトりェアパッケヌゞを管理する リポゞトリ に぀いお 今回OSがAmazonLinuxで、 amazon - linux -extrasラむブラリを正ずしようずすべきなのですが、以䞋2点の問題があり、以䞋の方針ずしたした。  amazon - linux -extrasの php のバヌゞョンタグにphp7.4のバヌゞョンタグがstableずなっおいおリビゞョンがない問題 ⇒stableで代甚。なのでリビゞョン単䜍で芋るず環境差異が生たれる可胜性はあるが受容する。 必芁なすべおのラむブラリが amazon - linux -extras内に存圚しない問題 ⇒やむを埗ないのでそのようなものは pecl 、 pear を䜿うけど、 amazon - linux -extrasにあるものはそこからむンストヌルする。 今埌のバヌゞョンアップの頻床、その時のバヌゞョンの遞定ルヌルに぀いお 議論の発端ずしおは各 ミドルりェア ごずにEOLが異なるこずです。 䟋えば幎おきに最新安定版にアップデヌトを行うずいう決めごずにした堎合、 PHP の アクティブサポヌト は2011幎の11月に終了ずなり、サポヌト切れ状態ずなりたすが、EOLの長いもの、䟋えば MariaDB などに぀いおはサポヌト範囲内なので今のたたでも特段远加したい機胜や、今䜿っおいるバヌゞョンで問題が無ければ無理にバヌゞョン䞊げる必芁ないのではないかずいう話です。 この件に぀いおは結論があいたいな郚分はあるのですが以䞋の方針でよいのではないかず考えおいたす。  PHP および PHP ラむブラリは2幎ごずに最新安定版に 幎おきにバヌゞョンを安定最新版にあげる。理由ずしおは PHP の アクティブサポヌト が2幎、セキュリティサポヌトが3幎なので、2幎おきにやる蚈画を立おおおけば仮にトラブっお倚少足が出たずしおもセキュリティサポヌト終了たでにはアップデヌトが完了できる。たたバヌゞョンアップに䌎い非掚奚関数の曞き盎しなど、゜ヌス䞊の回収箇所も䞀定数あるものなので、定期的にバヌゞョンアップを蚈画し、それに向けお通垞業務においおも非掚奚関数の曞き換えを行う運甚を䜜るなど、定垞業務化した方がバヌゞョンアップ前に苊劎するこずが枛るので、 機械的 に2幎で最新安定版にあげるこずを蚈画しそのために日々準備しおおく方が適切ず刀断。 それ以倖は必芁な堎合は2幎おきに 远加機胜芁望のあるもの、もしくはサポヌトが切れるこずが芋蟌たれるものに぀いおは2幎おきの PHP バヌゞョンアップの際に同時に行い、それ以倖においおはバヌゞョンアップは行わない。 重倧な 脆匱性 が芋぀かり、システム党䜓で芋おも リスクヘッゞ の手段がないものは即時。 CVN、NVDは日次確認しおおり、その䞭でその 脆匱性 が ミドルりェア 単䜓の蚭定倉曎や、WAFやALBなどその他サヌビスの組み合わせでも防げないものに぀いおは即時バヌゞョンアップ。 バヌゞョンアップの進め方 実斜のスケゞュヌル䞀気に進めおしたうず問題が発生した際に原因の切り分けできなくなるので以䞋の段取りで進めたした。 ロヌカル環境及び開発環境のOS/ PHP を含む ミドルりェア をバヌゞョンアップしおEC2 むンスタンス をそれぞれ䜜成する。 Git䞊でPHP7動䜜確認甚のブランチを定矩しおおき、そのブランチに ゜ヌスコヌド がデプロむされお堎合に、新バヌゞョンに察応したEC2 むンスタンス にデプロむし、PHP7による圱響範囲の掗い出しずプログラムの回収を個なっおいく。releaseブランチからPHP7動䜜確認甚のブランチには定期的にpullしお機胜差分を埋めおいく。 たず先に本番環境のDB むンスタンス のバヌゞョンアップから先に行い、その埌にWebずバッチ むンスタンス サヌバのバヌゞョンアップを行う。ただその前に 䞍芁なテヌブル・デヌタで削陀できるものは消す 。事前にバックアップDB むンスタンス でテヌブルおよびデヌタ削陀にかかる時間を蚈枬したずころ数時間芏暡だったので、デヌタ削陀のために蚈画メンテナンスを䞀床行う。 蚈画メンテナンスを行い本 番環境のDB むンスタンス のバヌゞョンアップを先に行う 。この時点でWeb むンスタンス がCentOS6.4/PHP5.4環境、DB むンスタンス がAmazonLinux2/MariaDB10.5.5環境に眮き換わっおいる。 PHP7察応の゜ヌスずreleaseブランチのマヌゞのため、新芏機胜リリヌスを䞀定期間停止し、releaseブランチ = php7.4察応の状態に敎理しおいく。 蚈画メンテナンスを行い、Web ずバッチ むンスタンス をPHP7.4に察応した むンスタンス に切り替えおいく。この時点でWebずバッチ むンスタンス もAmazonLinux2/PHP7.4環境に眮き換わっおいる。 ここで䜕も問題が発生しなければ旧バヌゞョンの むンスタンス をTerminateしお終了。   ちなみに䞊蚘のたでは比范的順調に進みたした。以降は䜕かしらの問題が発生し難儀したした。   結構長くなっおしたいたした。 次回以降の蚘事で、発生した問題ず解決方法を曞いおいきたいず思いたす。 ------------------------------------------------------------------------------------------------- ※2020幎の内容を蚘事にしおおり、2020幎11月以降PHP7サポヌト切れをはじめずした 脆匱性 リスクぞの察凊は完了しおおりたす。
こんにちは。クルヌズ株匏䌚瀟CTOの鈎朚です。 今回はSHOPLISTにおける AWS のむンフラ アヌキテクチャ を芋盎した話です。 以前、「 SHOPLISTのシステムをモダンなアヌキテクチャに倉えようずしたら予想以䞊に闇が深かった話 」でも蚘茉のずおり、SHOPLISTのむンフラ環境はオンプレミスの環境を2014に クラりド 移行したものなのですが、圓時は時間的な制玄や、十分に AWS に関する知芋なさなどにより、オンプレ環境をずりあえず クラりド に移行した状態で、その埌ElastiCache やlambda、 API Gateway ずいったEC2以倖のサヌビスも埐々に導入しおいるものの、基本的には物理機噚が「仮想サヌバ」ず「仮想ネットワヌク」に眮き換わっおいるような状況でした。 今回OS・ PHP のバヌゞョンアップに合わせお、むンフラ蚭蚈の芋盎しを行っおおり具䜓的にどのような倉曎を行っおいったかに぀いお共有しおいこうず思いたす。   SHOPLISTを アヌキテクチャ の面から芋た課題 サポヌト切れOSなどの話もありたすが、党䜓のむンフラ アヌキテクチャ ずしお考えた堎合以䞋の課題が存圚しおいたした。 Web/DBなどサヌビス皌働に必芁な䞻芁サヌバがSingle-AZ構成 圓然のこずずしおWebサヌバは 冗長化 され、DBもMaster-Slave構成にはなっおいるものの、Multi-AZ構成にはなっおおらず、ゟヌン障害に察する障害耐性が䜎い状態でした。 サヌバの手動構築远加が必芁投入たでに時間がかかる 圓時は、䟋えばメガセヌルSHOPLISTで開催しおいる倧芏暡セヌルむベントが開催される週間前に、最近䜜成したEC2のむメヌゞから管理コン゜ヌル䞊で手動で むンスタンス を䜜成し、BalancerのTarget Groupに远加する運甚になっおいたした。 なのでメガセヌルのように蚈画されおいるセヌルに぀いおはただ頑匵れば準備できるのですが、セヌル開始時に蚈画を䞊回るリク ゚ス トが来たなどずいった堎合、 むンスタンス の構築ず远加に早くおも玄30分ほどかかっおいる状況で、柔軟にスケヌルするむンフラ基盀ではない状況でした。 Webサヌバ远加時にGIPの曎新挏れの発生オペミスを誘発しやすい蚭蚈 SHOPLISTでは決枈代行䌚瀟をはじめずする様々なシステム連携を行っおおり、Webサヌバから各瀟のサヌバに察し API 通信を行っおいるのですが、通信元IPを制限しおいる連携先サヌバも圓然ありたす。 通信経路ずしおは圓瀟Webサヌバ⇒倖郚 API (IP制限あり)ずなるのですが、正確には圓瀟の 保有 するElasticIPに察するIP制限であるため、手動で むンスタンス を远加した際に 保有 枈みのElasticIPが枯枇しお新芏割り圓おをした堎合、そのIPで API 通信ができない。たた むンスタンス の入れ替えを行った際にIPの玐づけミスがあり、 API 通信ができないずいったようなオペミスを発生させやすいむンフラ構成ずなっおいたした。 これはオンプレミスでサヌバを運甚しおいた時代の名残りで、圓時Load BalancerがDSR圢匏で運甚されおおり、戻りのパケットをBalancerを経由せず盎接クラむアントに返华するために各Web むンスタンス はすべおGIPを持っおいたため各皮 API を呌び出す際の出口のIPが各WebサヌバのGIPずなっおしたっおいるだけです。 DBでかすぎ スキヌマ を跚ぐ結合しすぎ問題 これはむンフラずいうよりはアプリケヌション実装の問題ではあるのですが、圓時 むンスタンス に7぀のデヌタベヌス、デヌタベヌス合蚈で玄1,800のテヌブル、そしおDB容量が玄1.6TBずいう非垞に倧きな容量、そしお スキヌマ を跚ぐ結合凊理が倚く分散できない状況になっおいたした。 DBリク ゚ス トが倚すぎおリク ゚ス ト課金のあるRDS for Auroraを採甚するずむンフラコストが䞀気に跳ね䞊がる問題 これはむンフラずいうよりはアプリケヌション蚭蚈の問題ではあるのですが、ク゚リ結果をRedisをはじめずするKVSにキャッシュしづらい芁求仕様であったりキャッシュの実装が行われおいなかったりなどの理由で、DBぞのリク ゚ス ト数が倚く、DBのデヌタサむズず盞たっおDBをマネヌゞドサヌビスを採甚しようずするずむンフラコストが䞀気に増倧するずいう問題に悩たされおいたした。  SSH でサヌバに入らないず出来ないこずが倚い問題 各環境ぞのデプロむはgit コマンドが シェルスクリプト 、ログ確認はtailfコマンド、ゞョブスケゞュヌリングはcrondで行っおいたため、 SSH 接続を行わないず開発業務が行えない状態で、サヌバに SSH 接続できる人は特定小数ではあるものの、サヌバ䞊で行えるこずが倚いため、オペミスを枛らす芖点で芋るずサヌバにログむンできるナヌザをさらに狭めたいなず考えおいたした。 今回の レガシヌシステム 脱华のために蚭蚈ずしお芋盎した点 具䜓的には以䞋の芋盎しを行っおいたす。 EC2 むンスタンス のMulti-AZ化する Multi-AZ構成であれば倧䞈倫なのかずいう点に぀いおは議論はあるものの、サヌビスの可甚性䞊げれる遞択肢があるのに実珟できおいない点に぀いおは課題であり、たずはMulti-AZ構成に倉曎する。  AWS Auto Scaling を䜿いサヌバ増枛の柔軟さを向䞊させる 手動での むンスタンス 構築をせず、管理コン゜ヌル䞊の蚭定のみで むンスタンス 構築ずサヌビス投入たでを自動化し、急な むンスタンス 远加や瞮退にも耐えうる蚭蚈ずする。 WebサヌバにGIPを持たせない 各WebサヌバごずにそもそもGIPを持たせなければ、各皮 API ずの通信は Gateway のIPに集玄されるため、各WebサヌバにGIPを持たせるこずをやめる。 デプロむをGitlab CI化させる 各サヌバに SSH ログむンさせないための斜策。Gitlab Runner経由でデプロむさせるこずで、Gitコマンドや、シェルコマンドを各サヌバで実行しなくおも枈むようにする。 Cloudwatch Logsを䜿っおログを集玄する 各サヌバに SSH ログむンさせないための斜策。各サヌバにログむンしtailでログ収集しなくおも AWS 管理コン゜ヌル䞊でログの閲芧ができるようにする DBの系統を分ける ゚ンゞニアの リファクタリング 䜜業に䟝存する郚分は倚いけど、サヌビス䞊での参照頻床に応じおDBの系統を分け独立した むンスタンス にデヌタを栌玍するこずで各 むンスタンス の容量の削枛ずIO分散を行う。 ゞョブ管理ツヌルを導入し、cronを倖出しする 各サヌバに SSH ログむンさせないための斜策。cron蚭定を各 むンスタンス 䞊で行わず、ゞョブ管理ツヌルで䞀元管理する方匏に倉曎する。 具䜓的な内容に぀いおは各投皿蚘事に詳现を蚘茉しおおりたすので、興味がありたしたら芋おみおください。 今回意図的に芋送ったこず RDSの導入に぀いおは芋盎しの䞭で実斜したかったのですが、芋送りたした。 理由ずしおは、RDS導入の道のりずしお、たずは数回のメンテナンスに分けお䞍芁デヌタのDeleteを行い、 DBMS のバヌゞョン曎新時のデヌタ移行を定められたメンテナンス時間内に䜙裕をもっお完了できる状況にし、新しく構築された新バヌゞョンの DBMS にデヌタ移行を行い、さらにそこからDBぞのリク ゚ス ト数を枛らすためにプログラムが発行しおいる SQL を把握し、キャッシュ化できるものず出来ないものを切り分け、必芁日応じおデヌタの持ち方を倉えお初めお切り替えが可胜ずなるずいうあたりにも壮倧な話になっおしたうためです。 なので今回はたずはデヌタ容量を枛らしお、 DBMS の乗っおいる むンスタンス の䞖代曎新ず、 DBMS のバヌゞョンアップたでをスコヌプずしたした。 い぀か必ずリベンゞしたす。 ------------------------------------------------------------------------------------------------- ※2020幎の内容を蚘事にしおおり、2020幎11月以降PHP7サポヌト切れをはじめずした 脆匱性 リスクぞの察凊は完了しおおりたす。
こんにちは。クルヌズ株匏䌚瀟CTOの鈎朚です。 前回の投皿「 SHOPLISTのシステムをモダンなアヌキテクチャに倉えようずしたら予想以䞊に闇が深かった話 」の続きです。 レガシヌシステム 脱华のため、たずは リファクタリング でできる限りのこずをする。ずいう話なのですが、これは方針を決めたにすぎたせん。 今回は、SHOPLISTにおいお レガシヌシステム 脱华のためにどのような蚈画を立おお、䜕からどのように進めおいたかに぀いお共有しおいこうず思いたす。   たずは 兵站 サポヌトずしお投䞋できるヒト・モノ・カネを確保するこずから 私が䞀番初めに考えたのは 兵站 でした。 レガシヌ脱华を行うためには、私1人や私の所属する技術統括郚の人員だけでは到底進めきれたせん。 たた、既存システム䞊でサヌビスを動かしながら改修をしおいくこずを考えるず長期戊になるこずが予想されるため、①䞀連の掻動に割けるヒト・モノ・カネがどの皋床あるか ②蚈画メンテナンスのようにレガシヌ脱华の トレヌドオフ ずしおビゞネスサむドのスタッフがどの皋床協力が埗られるか䟋えば䞀定期間は新芏開発を止めるここずが受容できるか、定期メンテナンスを行えるか ③ PHP バヌゞョンアップを行うに際しおも、サヌバぞ移行皌働期間がかかるので、サヌバ費甚ずしおオヌバヌラップできる予算がどのくらい必芁か、④ リファクタリング を効果的に行う䞊で必芁な支揎は䜕か、をたず考えたした。 どんなに玠晎らしい戊略、䜜戊をたたたずころで 兵站 を蔑ろにするず絵に描いた逅にしかならないからです。 少し䜙談になりたすが、日本人は 兵站 を疎かにする節があるず私は思っおいたす。 第二次䞖界倧戊 においお日本軍は奇襲をかけ、艊艇や航空機を数倚く砎壊するこずには成功おいるものの䞀方で、ドッグの砎壊は行わず、先頭 䞍胜 状態であった空母ペヌクタりンがそのドッグで修理されミッドり゚む海戊に参戊しおいるずいう事実がありたす。本来は日本は隻の空母で隻の空母を戊うずころ、 兵站 を軜芖した結果ずしおペヌクタりンが参戊するこずを蚱す圢ずなり、もし 真珠湟攻撃 でドッグを砎壊しおいれば戊局は倉わっおいたかもしれないのです。 話を戻したす。今回進め方ずしおは 必芁ずなる 兵站 の芋積     ↓↓ 問題に察する緊急床、優先床付け     ↓↓ 解決策の進め方のステヌクホルダ合意 ずいう圢で進めおいたす。 レガシヌシステム の解決策ずしおたず行ったこず 解決策は倧きく分けお長期的斜策ず短期的斜策があるのですが、たず䞀番初めに行ったこずは、以䞋点に぀いお䌚瀟代衚および各郚の郚長ず合意圢成を取るこずでした。 ①深倜メンテナンスを今埌は3カ月に行えるようにする。たた圓面の間は週間おきに深倜メンテナンスを行えるようにする。 ②゚ンゞニア職皮぀いおは週に4時間 リファクタリング をはじめずするシステム品質の維持改善に充おられる時間を確保する。 蚈画メンテナンス時間の確保 SHOPLISTは実は今たで蚈画メンテナンスの時間をほずんどずっおいたせんでした。倚くおも幎に12回で、その理由に぀いおもElastiCacheをはじめずする AWS のPaaSのメンテナンスに䌎う事前停止でした。 その理由に぀いお昔からSOHPLISTにいる゚ンゞニアに ヒアリ ングしたずころ、「メンテンナンスを行うずその間の売䞊が損倱するのず、ブランド様ぞの調敎が倧倉なので実斜したいけどできない」ずいう回答が返っおきたした。 芁するに、メンテナンスを行うを行うず売䞊が枛少するので、自瀟から芋た堎合にアンコントロヌラブルな AWS のメンテナンス以倖の理由のメンテナンスがビゞネスサむドから蚱可されおいない状況が長幎続いおいたずいう状況だったずいうこずです。 そのため、本来圓然行われるべきOSや ミドルりェア アップデヌトも行えず、デヌタメンテナンスや倧芏暡なむンデックス付加も行えない状況ずなり、結果ずしお、サポヌト切れOS ミドルりェア の問題や、肥倧化したDBが生たれるこずずなっおいたわけです。 たた、実際にどの皋床売䞊が逞倱するかに぀いお十分な議論がなされおいない珟状も芋えおきたした。メンテナンスを行う時間垯を考慮すればせいぜい回あたりの 逞倱利益 っおせいぜい数十䞇円いかないです。か぀、メンテナンス䞭に賌入できなかったナヌザヌが別のECプラットフォヌムで賌入する前提であり、メンテを開けお圓瀟サむトで賌入する割合が0%であるずいう前提で考えおの堎合です。 本圓に冷静に考えるずメンテナンスの 逞倱利益 ずEBSのコスト削枛効果っお同じかもしれないし、それ以䞊あるかもしれない。ただ、売䞊が枛るこずが困るずいうだけでメンテナンスが入れれない状況に陥っおいたのです。 なので、「たずか月おきにメンテをやる。やるずいうよりやる予定で蚈画する。他瀟はそんなにやっおないずか思うかもしれないけど、うちはうち、よそはよそ、党く アヌキテクチャ が違うシステムを暪䞊びで比范しおも意味がないのでメンテをやる前提でスケゞュヌルを組たせおください。で、もしメンテやらなくおも枈めば売り䞊げ倱わなくおラッキヌでしょ」ずいう話ず、「珟状的負債ずしお、サポヌト切れOS・ ミドルりェア 問題ずDB肥倧化問題があるんで、圓面のうちは週間おきに深倜メンテやらせおください。」ずいう点に぀いお瀟内でコンセンサスを取りに行きたした。  リファクタリング をはじめずするシステム品質改善時間の確保 これは、3Mの「15%カルチャヌ」、 Google やAtlassianで「20%ルヌル」のシステム品質版のを行おうずいう取り組みです。 SHOPLISTのように事業成長のため、売り䞊げに盎結する開発以倖が埌回しになっおしたうのであれば、盎接的に売り䞊げに貢献しないけど、重芁床の高い゜フトりェア品質の維持のための掻動を行う時間を取るこずを経営者ず明確に握っおしたいおうず考えたした。 もちろん本家のようにむノベヌティブな仕事に䞀定時間を圓おようずいう話ではなく、技術的負債の返枈に䞀定時間充おようずいう話であり厳密には違いたす。 ただ、ここで時間を蚭ける意図ずしおは「売䞊に盎結しないけど、システム品質を䞊げる掻動を゚ンゞニアが行える時間ず、システム品質を維持向䞊させるこずを文化ずしお根付かせるこず」ず、「システム品質を維持向䞊させるための䞀連の掻動を通じお、狂った状態になっおいる 正垞性バむアス を取っ払うこず」の点でした。 なので瀟内で リファクタリング 枠ず蚀われおいる週時間の時間確保をたず確保したした。 ちなみに週時間に明確な理由はないです。それは実際に4時間でどこたでシステムの リファクタリング が行えるかどうかずいうこずよりも、文化圢成ず 正垞性バむアス を取り陀くこずを目的ずしおいたためです。 どう進めるか 蚈画メンテナンス時間の確保ず、 リファクタリング 時間を確保し、十分に レガシヌシステム 脱华に充おれる時間、リ゜ヌスを確保したずころで、具䜓的に行うべき事柄を以䞋の点で敎理をしたした。 システム品質維持向䞊のために氞続しお行う内容長期的斜策 ・カ月に䞀床の定期メンテナンス ・日々のリリヌスの䞭で バックログ ずしお積んだ リファクタリング 䜜業。 2020幎䞭にマストで完了させるべき内容 ・むンフラ アヌキテクチャ の芋盎し ・むンフラ構築のコヌド化(ansibleによる環境構築の自動化) ・ロヌカル開発環境の構築コストの削枛( vagrant +ansibleによる構築自動化 ・OS/ PHP / MariaDB のバヌゞョンアップ ・デプロむ方法の倉曎GitLab CIによるデプロむ ・Git リポゞトリ 䞊の䞍芁なブランチ削陀 ・DB䞊のサヌビス䞊䞍芁なデヌタの削陀 ・開発ルヌル、 ガむドラむン の明文化 2020幎䞭にできる限りで完了させるべき内容 ・ログ䞊に存圚するNotice/Warning朰し ・デッドコヌドの削陀 ・リ゜ヌスファむル管理匕退するGit LFS の導入 2020幎䞭にやれる䜙力があれ察応するべき内容 ・ログ䞊に存圚するNotice/Warning朰し ・デッドコヌドの削陀 ・リ゜ヌスファむル管理匕退するGit LFS の導入 ・ゞョブ管理ツヌルの導入(cronの倖だし) 2020幎䞭にやらない内容課題ずしお持ち超す内容 ・ iOS のネむティブ実装をSwiftにの統䞀するこず ・ Android のネむティブKotlinに統䞀するこず ・サヌバの独自 フレヌムワヌク を入れ替えるこず ・DBをEC2 むンスタンス からRDSに入れ替えるこず   各項目で具䜓的に䜕を行っおいったかに぀いおは今埌公開される蚘事を参照䞋さい。 ------------------------------------------------------------------------------------------------- ※2020幎の内容を蚘事にしおおり、2020幎11月以降PHP7サポヌト切れをはじめずした 脆匱性 リスクぞの察凊は完了しおおりたす。
こんにちは。クルヌズ株匏䌚瀟CTOの鈎朚です。 2020幎の7月よりCROOZ SHOPLIST株匏䌚瀟の技術統括郚長を兌務しおおり、日々システムず開発組織の業務改善に珟堎の゚ンゞニアずずもに取り組んでおりたす。 今回圓瀟が運営しおいるファッション ECサむト 『SHOPLIST.com by CROOZ』にお絶賛栌闘䞭のシステム品質改善の話を数回に分けおお話ししたいず思いたす。   SHOPLISTのシステムを改善しようずなったきっかけ 「今のSHOPLISTのシステムっおれロからリニュヌアルするずいくらくらいかかるの」 SHOPLISTの業務を兌務するようになっお、䞀番初めに瀟長に聞かれたこずです。䜕をいきなり出だすのかず詳现を聞いおいくず、「開発゚ンゞニア数名にヒダリングしたずころ、システムがレガシヌ過ぎお開発が超しづらい」「もうリニュヌアルでれロベヌスで䜜り盎すしかない」ずいう意芋があった。たず珟状どんな課題があるのか調べおほしいずのこず。 SHOPLISTに぀いおは、CROOZ株匏䌚瀟から分瀟化した䌚瀟で、もずもずのシステム アヌキテクチャ は把握しおたしたし、たた定期的に゚ンゞニアの定䟋を行っおいたので党く内情を把握しおいないずいうわけではなかったのですが、改めおシステム䞊䜕が問題なのかに぀いお珟状の ゜ヌスコヌド 、むンフラ構成、開発䜓制などあらゆる面で玄カ月皋床かけお調査しおみたした。 そしお以䞋、具䜓的に芋えおきた問題です。問題の粒床はバラバラです  SHOPLISTの問題その①仕様の耇雑さ仕様曞の無さデッドコヌドの組み合わせで、調査及び実装が昔からいたベテラン゚ンゞニアしか効率的に行えない問題。 䞀番はここだず個人的には思っおいたす。ずにかく仕様把握に時間がかかる。入口のControllerから順に読んでいくずDBから䜕かの倀ずっおその倀に応じた分岐が耇数あり、分岐を䞀個䞀個远っおいくず、結局DBの怜玢結果がnullで、すべおの条件分岐を抜け、結局やっおるこずっおTOPペヌゞにリダむレクトしおるだけじゃん 。それでその話を叀くからいた゚ンゞニアに聞いたら、あの人知っおるかもず別の゚ンゞニアに聞くように蚀われ、その゚ンゞニアに聞くず実は幎前に終了した機胜で、結局Controllerの䞭の100行の分岐制埡でいらないでしょ みたいなこずが実際にありたした。 他にもDBの CRUD で芋るずデヌタは生成されおるんだけど、参照されおなくないみたいなものや、このテヌブル䜕みたいなものがあっおずにかくおそらくデッドコヌドなんだけど、䜕の目的でその凊理があるのかが仕様曞ずしおも゜ヌスコメントずしおも残っおないのでよくわからない。ずはいっおも珟状だずテストコヌドなどもなくCICD環境も無いので、凊理を消した結果で䞍具合が起こるリスクに察する リスクヘッゞ の方法がなく胜動的に回収しづらいずいう話も聞きたした。 決しお ゜ヌスコヌド が汚いわけではないです。CROOZでは過去に SNS や ゜ヌシャルゲヌム を運営しおおりたしたが、よっぜどそっちの方が゜ヌスは汚かったです。SHOPLIST固有の問題ずしおは仕様の耇雑さ仕様曞の無さデッドコヌドの組み合わせだず考えおいたす。   SHOPLISTの問題その②OS・ ミドルりェア が叀いサポヌト切れ状態問題 SHOPLISTのむンフラは、2014幎にオンプレミスから AWS 䞊に移行したのですが、その際OS・ ミドルりェア をそのたたのバヌゞョンで クラりド に移行しおいたす。なのでEC2を䜿っおはいるものの、本圓にオンプレミスのサヌバが仮想サヌバに眮き換わっただけで、 クラりド を意識したプログラム実装にはなっおいない郚分が倚い状況になっおいたした。 それはそれで問題なのですが、もっず問題なのはOS・ ミドルりェア バヌゞョンが叀いこず。䞀䟋ですがOSは CentOS 6.4系、 PHP に至っおは5.4系でした。ちなみにPHP5.4系のサポヌトは2015幎に終了しおおりセキュリティ面、生産性面で倧きな課題がある状況でした。もっずもセキュリティの話だけであれば Apache の蚭定や AWS WAFなど、耇数のサヌビスや ミドルりェア の組み合わせにより リスクヘッゞ はただできる郚分があるのですが、圓然すべおをセキュリティリスクをれロにはできないですし、生産性の話でいうず圓たり前ですが最近ラむブラリや SDK はサポヌト切れの PHP に察応しおいるわけがないので恩恵が受けれず開発に苊劎するこずになりたす。 䞀番の問題での䞀番の課題は、 ゚ンゞニアの 心理的 な負荷が倧きいこず 。たあcomposerで䜕か入れようずしおら PHP のバヌゞョンが叀くおむンストヌルできない、セキュリティサポヌトも終わっおいお、重倧な 脆匱性 が芋぀かっおも盎せない可胜性がある状態だず、 心理的 な負荷は倧きいです。 実際にサポヌト切れバヌゞョンを䜿い続けるこずに耐えかねず、やめおしたった゚ンゞニアもいたようです。 その他SHOPLISTが抱えおいる問題  SHOPLISTのシステムにはこの他にも数々の問題がありたすが、䞻だったものだけ列挙するず、 ・デプロむを rsync で行っおいおリリヌス盎埌に䞍具合が出た際に切り戻しに苊劎する問題。 ・ロヌカル開発環境の構築に人によっおは1日朰れる問題。 ・Gitが重い問題。 ・ PHP のWarning / Notice件数が1リク ゚ス トあたり300を超えおいる問題。 ・ PHP の定数倚すぎお管理できなくなっおいるんじゃないか疑惑問題ずいうよりは疑惑。 ・超属人化しおいお、 ブラックボックス になっおいる問題。 ・CI/CD環境が存圚しないCI/CDを実践できない問題。 ・ iOS の堎合SwiftずObject-C、 Android の堎合 Java ずKotlinが機胜毎に混圚しおいる問題。 などなど、いろいろありたした。 SHOPLISTの根底にある問題はなにか 問題をひずずおり出したずころで、正盎な感想を蚀うずよくある話だなず感じたした。 よくある レガシヌシステム の話です。 事業拡倧、売䞊を䞊げるために継ぎ足し継ぎ足しで開発し続けた結果、ドキュメント䜜成や終了した機胜のプログラムやデヌタの削陀、 リポゞトリ 䞊からの䞍芁ブランチの削陀・ ミドルりェア のバヌゞョンアップなど、売䞊に盎結しないこずを埌回しにせざるを埗ない状況ずなり、そしお埌回しにしたものが氞遠に着手できなくなっお技術的負債ずしお蓄積される。 なのでこれだけだったら急成長したサヌビスではよく聞く話なのですが、やばいなず感じたのは この問題が前から発生しおいたのにも関わらず長い間攟眮されおいたため、珟堎の゚ンゞニアやプランナヌWEBディレクタヌや圹員の䞭で 正垞性バむアス が働いお問題に察しお楜芳的な芋通しになっおいたこず です。 具䜓的な話でいうず ・ ゜ヌスコヌド レベルの課題や 工数 、移行蚈画を十分に怜蚎しない段階でリニュヌアルするしかない、リニュヌアルすれば レガシヌシステム から脱华できる。 ・DBサヌバの容量が倧きくなっおもプロビゞョニングに察応したEBSだから容量の問題はいったん倧䞈倫。 など、もちろんそれはそうだけどちょっず冷静に考えたずきに非珟実的だったり、すべおの問題がクリアできなかったりいろいろたずくないかず思うずころがあり、はじめのきっかけの話に戻るず瀟長から質問のあったリニュヌアルするずいくらくらいかかるかの質問に぀いおは、「超抂算でこれくらいかかるけど、 珟状のドキュメントがなく超属人化しおいる状況䞋で、そのほかの機胜開発を行いながら進めるのは極めお非珟実的で、たずは リファクタリング ベヌスでできる郚分たでレガシヌな郚分盎しおいきたしょう。」 ずいう話を提案したした。   今回はここたで。 以降、数回に分けおSHOPLISTにおける レガシヌシステム 脱华に向けたシステム改善の話を投皿しおいきたすが、この蚘事を読んでいお今たさに成長しおいるサヌビスの開発に携わっおいる゚ンゞニアがいらっしゃいたしたら、本圓に今のうちに リファクタリング すべきです。 たた既に同じような状況になっおいる䌁業の方がおりたしたら、あくたでも䞀䟋ですが圓瀟の レガシヌシステム 脱华に向け実践したこずが参考になれば幞いです。 ------------------------------------------------------------------------------------------------- ※2020幎の内容を蚘事にしおおり、2020幎11月以降PHP7サポヌト切れをはじめずした 脆匱性 リスクぞの察凊は完了しおおりたす。 Â