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

Toilの撲滅 システム構成のコード化(X as Code)でチーム開発・サービス運用を効率化する

Toilの撲滅 システム構成のコード化(X as Code)でチーム開発・サービス運用を効率化する

2018年4~5月開催「ブートキャンプ特別講座」の資料になります。

Recruit Technologies

July 23, 2018
Tweet

More Decks by Recruit Technologies

Other Decks in Technology

Transcript

  1.  サービス運用とは  定型業務  非定型業務  ケーススタディ:非定型業務を円滑に行うために  サービスをリリースするということ

     チーム開発におけるリクルートの現状  システム構成のリクルートの現状  システム構成のコード化  システム構成のコード化(≒構成管理)とは  構成管理を自動反映しToilを撲滅する  ケーススタディ:システム停止を伴うリリース Agenda
  2.  サービス運用とは  定型業務  非定型業務  ケーススタディ:非定型業務を円滑に行うために  サービスをリリースするということ

     チーム開発におけるリクルートの現状  システム構成のリクルートの現状  システム構成のコード化  システム構成のコード化(≒構成管理)とは  構成管理を自動反映しToilを撲滅する  ケーススタディ:システム停止を伴うリリース Agenda
  3. サービス運用とは  我々はCS/CLへの新たな価値提供、競合優位性の維持のためにも新 しい価値を提供し続ける必要がある。  一方で、社会インフラとして世に提供したサービスを安心して利用 し続けてもらう責務も持ち合わせている。 4 「ソフトウェアエンジニアリングについては、誕生後に比べて 誕生前についての議論に遥かに多くの時間を費やすものの、

    システムのトータルコストの40〜90%は、そのシステムの 誕生後に生じるものと推定されます。」 出典: O'Reilly SREサイトリライアビリティエンジニアリング Googleもシステム維持/保守の重要性を説 いているように、運用フェーズは超重要。 運用も改善をし続けなければ社会インフラ としての安心を提供出来なくなる。
  4. 定型業務  定型業務は繰り返し実施される型化可能な業務。  経験則的に以下3つの業務が行われる事が多い。 6 定形業務は属人性を排除するために 「見える化」→「標準化」→「自動化」のStepで 自動化を進めていくのが一般的。 環境維持

    リリース 監視/ モニタリング  複数ある開発環境(テストを行う環境)をリ リース後に整備する。  案件を世に公開する業務  アプリやインフラを利用可能にする  システムリリース後に問題が無いか、システ ム情報を確認する。 項目 実施内容
  5. 定型業務:環境維持作業  環境維持作業とはローンチされたアプリやインフラ資源を開発環境 に適用する作業。  複数の案件が並行して走る事が多いため、環境によって適用する/し ないの状況が生まれるため複雑。 7 案件A 案件B

    案件C テスト 環境A テスト 環境B テスト 環境C C/O C/O C/O 開発&テスト 開発&テスト 開発&テスト • 案件Aの変更を 取り込みたい。 • 案件Aの変更は まだ取り込みた くない。 • 案件A、Bの変更 を取り込みたい。
  6. 非定型業務  非定型業務は突発的かつ型化しにくい業務。  型化しにくいが過去の知見を活かしながら実施していく必要があ る。 10 エンジニアの底力を試される技術力を高めやすい業務なので積極 的に実施してみるべき。※個人の意見です。 障害対応

    問い合わせ/ 調査  発生したアラートや問い合わせから原因を究 明し問題箇所を取り除く。  各所から来る問い合わせとその調査  調査結果から障害対応につながることも。 項目 実施内容
  7. 非定型業務:問い合わせ/調査  サービス利用者だけでなく、(APIを利用している場合などは)社内の 他サービスからも来る様々な依頼。  エンジニアまで来る問い合わせは担当サービスに対する技術的な問 い合わせがメイン。 12 ユーザー: エラー画面が出

    て動かないんだ けど。 ティア1  過去事象の確認  発生内容のヒア リング ヘルプ デスク ティア2  過去事象の確認  データの確認 営業 Dir ティア3  ログ/DBの確認  ソースの確認 エンジ ニア
  8. 非定型業務:実施において大切なこと  非定型業務ではどんな内容が来るか事前にはわからない。  だからこそシステムローンチまでに運用時に必要な情報を取るため の設計(≒非機能設計)が重要となる 13 性能設計 ログ設計 ディレクトリ

    設計  想定アクセス数  それに基づくマシン台数  出力項目  エラー特定のキーワード  アプリが配置される先やロ グが出力される先の定義  各ディレクトリのオーナー 設計項目 最低限やるべきこと  性能劣化によってアクセス 不能となる  問題発生時に原因が掴めな い(障害時間の長期化)  エンハンス時にエラーが発 生する 定義しないと。。。
  9. ケーススタディ:非定型業務を円滑に行うために  このケーススタディでは答えはありません。 (原因の特定を求めていません。)  ただ、実業務では今回のような(ほぼ)ノーヒントの問い合わせが来 る事があります。  その際に素早く/適切な原因究明ができる仕組みづくりの大切さを感 じてほしいです。

    16 システム構成を シンプルにする? ログにエラーが吐かれたら 連絡する手段を作る? 障害が起きない品質を 作り込む? ログをまとめて 見れるようにする? • 二人一組になってどうすれば原因究明を行いやすくなる か話し合いましょう。(15分) • 各組みで発表してもらいます。(15分)
  10.  サービス運用とは  定型業務  非定型業務  ケーススタディ:非定型業務を円滑に行うために  サービスをリリースするということ

     チーム開発におけるリクルートの現状  システム構成のリクルートの現状  システム構成のコード化  システム構成のコード化(≒構成管理)とは  構成管理を自動反映しToilを撲滅する  ケーススタディ:システム停止を伴うリリース Agenda
  11. チーム開発の現状  システム規模が大きくなるほど役割ごとにチームが分かれてくる。  ディレクター(MP)とエンジニアだけでなく、エンジニア内部でも別 れてくることが多い。 20 開発全体責任者 (主にGM) 開発統括

    テックリード クライアント アプリ カスタマ アプリ バッチ アプリ 営業支援 アプリ スマデアプリ 運用 QA UI/UX 基盤 統括 領域 担当 領域 横断 エンジニアの チーム設計例
  12. チーム開発の現状  エンジニアのチームが複数になってくることとサービスの成長には 相関関係がある。  そしてサービスはその成長の段階に応じて求められてくる事が異な る。 21 規模 導入期

    成長期 成熟期  まずはフィジビリ  早く世に新しいものを  競業に勝つ  新しい機能をどんどんロー ンチ  競合劣位の防止  機能提供に加えて、 サービス品質をより高める フェーズ マインド
  13. チーム開発の現状  サービスの成長によって求められるものが異なるのと同様に、 開発内部のチームそれぞれによっても守るべきものが異なってくる。 22 クライアント アプリ カスタマ アプリ バッチ

    アプリ 営業支援 アプリ スマデアプリ 運用 QA UI/UX 基盤 領域 担当 領域 横断 担当 守るべきもの  機能追加の速度 (いいものをより早く) →変化へのプレッシャー  機能追加の品質 (安全、安心に) →安定へのプレッシャー
  14. チーム開発の現状:(参考)あるサービスの場合  あるサービスの運用フェーズにおける作業割合を紐解くとリリース 作業の占める割合がとても多くなっていた。 24 2% 環境切り替え 16% リリース 52%

    問い合わせ 22% 調査 8% 作業状況  環境切り替え(開発環境切り替え)にて他チームとの作業 依存があるため環境利用までに最大1Wのリードタイム がかかる構造。  リリース作業にて述べ2W人員張り付きが必要。  リリースリハリハ、リハ、本番と計3回のリリース が月次で行われている。  リリース作業にて他チームとの作業依存と利用する ツールの多さから一気通貫での作業実施が出来な い。  (上記に紐づき)手順書の作成、レビューといった付 帯作業も増加。
  15. チーム開発の現状:(参考)あるサービスの場合  そのサービスのリリース作業の作業内訳を見てみるとアドオンに よって作業負荷が増加していた。 25 作業名 概要 自動化 アプリビルド WARファイルの作成

    ◦ 資源配置 WARファイルのAPサーバ への配置 ◦ メンテ画面配置 Sorryページの設置 × DDL適用 DBオブジェクト更新 × コンテンツminify JSファイルのminify × コンテンツ配置 JS/imgファイルのAPサー バ配置 ◦ コンテンツ配置(CDN) JS/imgファイルのCDN キャッシュクリア × 他シスデータ連携 他シス向けDB更新 × Cacheサーバデータ再配置 Redisへのデータ更新 × 新しい機能の追加や、関係 者の増加によって、当初想 定したリリースがどんどん 肥大化することがある。
  16. チーム開発の現状:まとめ  サービスの成長につれ規模だけでなく開発体制(特性)も変化する。  その変化を見据えたリリースの仕組みを作る必要がある。  仕組みづくりではリリース自体の自動化を目的とせず、リリース対 象と作業両方のコード化/構成管理を行う必要がある。 26 高負荷運用業務(リリース業務)

    DB変更 手順作成 DB変更 アプリ 手順作成 JP1 リリース アプリ リリース リリース 内容確認 JP1 手順作成 MW変更 手順作成 作業 内容確認 MW リリース ボトルネック 他シス関連 リリース 後続作業に依存 が高い 作業時間が長 く、環境数に応 じて線形に増加 する ボトルネックを特定し、リリースの仕組みを作る。
  17.  RAFTEL上で構築される最大公約数的な構成。  全ての機能は複数台で可用性を高めている。 システム構成の現状 28 Web Apache nginx AP

    Tomcat Search Solr DB Oracle Batch JP1  静的コンテンツ表出  利用者の制御/バランシング  アプリケーション配置/実行  全文検索  データ保存(CS系のデータ保存)  リレーショナルDB  データ保存(CS/CL両方のデータ保存)  バッチ実行制御  エラー発生時の通知 構成 担当する役割
  18. システム構成の現状  Rのサービスの基本はリボンモデル。  多くのサービスはこのリボンモデルにもとづいて設計される。 30 Action Customer Client カスタマ提供価値

    クライアント提供価値 社会提供価値 カスタマの多種多様なニーズを 満たしたり、新たな気付きを与 えること クライアントのサービスをカスタマ に適切に届けること カスタマとクライアントのベスト マッチングを最大化しつつ、事 業収益を上げること
  19.  サービス運用とは  定型業務  非定型業務  ケーススタディ:非定型業務を円滑に行うために  サービスをリリースするということ

     チーム開発におけるリクルートの現状  システム構成のリクルートの現状  システム構成のコード化  システム構成のコード化(≒構成管理)とは  構成管理を自動反映しToilを撲滅する  ケーススタディ:システム停止を伴うリリース Agenda
  20. 構成管理とは:技術選定  構成管理はあらゆるチームが関連するものとなる。  全てが一元管理されなければ陳腐化しアドオンが増える  そのため、技術的な先進性よりもエンジニアの手に馴染む(ある程度 枯れている)技術要素を選択する必要がある。 41 

    構成管理のようなサービス運用の目的は皆に利用し続けてもらうこ と。  サービスの機能と異なり利用者の多い技術要素を選択する。 構成管理 (サービス運用) 既存技術  利用者が多く、キャッチアッ プ負荷低  導入がスムーズに行き、継続 利用が見込める。 新技術  キャッチアップ負荷高  既存の技術と親和性が低い場 合も  陳腐化させない見極めが必 要。
  21. 構成管理とは:環境依存の分離  コード(振る舞いを記述したもの)は1ファイルのみを管理すべきであ る。  そのため、環境に依存する情報と、コードを分離して管理できる必 要がある。 42 開発 検品

    本番 リリース 構成管理(環境情報同梱) コードA 開発情報 コードA 検品情報 コードA 本番情報 開発 検品 本番 リリース 構成管理(環境情報分離) 開発情報 コードA 検品情報 本番情報
  22. 構成管理とは:テストスクリプト  記述したコード(振る舞い)は常にテスト可能な状態を保つ必要があ る。  コードの対となるテストもスクリプトとして管理できる必要があ る。 43  スケールしづらい

    (アプリ改修時にテスト範囲が限定)  影響範囲が可視化されない 手動のテストだと  テストを自動化して品質とスピー ドを維持するべき。  いつでもテスト可能とするために コードと合わせて管理するべき。
  23. 構成管理とは: (参考)管理すべき要素  管理対象はアプリケーションのソースコードだけにとらわれがちだ が他にも様々ある。 44 ディレクトリ マスタデータ (DML) DDL

    ジョブ定義 (JP1) アプリ 資源 JIRAチケ (手順) JIRAチケ (添付) OB ER 検品環境 GhE telnet sqlplus sqlplus JP1 Mgr telnet TeamCity telnet リリース対象 資源管理方法 作業方法 Conf 各環境 (一部GhE) telnet 資源の管理方法が構成管理に 従っていない場合、作業方法が 人手を介したものに依存しがち にになる。
  24. 構成管理とは: 責任範囲の切り分け  構成管理対象を1つの仕組みだけでリリースしようとすると破綻す る。  用途に応じた利用ツールの変更と透過的なリリース実行を多段的に 構成する。 45 リリース資源

    の受け渡し (構成管理) リリース資源 のビルド (ツール) リリース資源 の環境配置 (リリース) マスタデータ (DML) DDL ジョブ定義 (JP1) アプリソース MW Conf ディレクトリ config file YAML YAML YAML Java YAML Ansible (Python) Liquibase (Java) 独自ツール (Python) Maven (Java) 独自ツール (Python) Jenkins (build pipeline) 【ポイント】 1. 変更の多い内容はシンプルな 記述で構成管理 2. ビルド時には管理の内容に 応じた適切なツールを採用 3. リリース(運用時に操作する ツール)は透過的に実現でき る技術を採用 全体は複雑でも各レイヤはシンプルに
  25. 構成管理とは: HOT PEPPER Beautyでの事例  個々で具体的に何を/どう管理しているのかをHOT PEPPER Beauty での取り組みをベースとして紹介する。 46

    • 構成管理すべき内容とし てこの項目が含まれが、 必ずしも全てを管理しな くとも良い。 • 変更の発生頻度が高い物 を選んで管理するのが良 い。
  26. TeamCityでラップ 構成管理とは: HOT PEPPER Beautyでの事例  Javaアプリの配布にはMavenを利用。  オンライン、バッチともにJavaで実装されているものが多い 

    MavenをキックするためにJetBrains社のTeamCityというツールを 利用。 48 Maven compile test package deploy リポジトリ コード テスト スクリプト Prpirties • リリースに関連する作業は Mavenだけで完結可能 • しかし統一したUT環境を提供 するためにTeamCityでラップ している ※利用当時他のCI/CDツール ではパフォーマンスが出ず TCを利用。
  27. 構成管理とは: HOT PEPPER Beautyでの事例  バッチ(JP1) の配布には独自ツールを利用。  前述の透過的なリリース実現のためにシンプルなツールを提供。 49

    開発環境 検品環境 本番環境 Exp/Impツール JP1定義 開発情報 検品情報 本番情報 • JP1定義自体のテストは 出来ない。 • 開発環境で作られたもの をベースとして利用。 • 開発環境で作られたもの に各環境の固有情報をバ インドし利用。
  28. 構成管理を自動反映しToilを撲滅する ハンズオントレーニング  ここまで伝えてきた構成管理を実際に利用しながら自動化との連携 を理解してもらいます。  全てをこなすことは難しいので以下のツールを駆使しながらリリー スを実行してもらいます。 53 Ansible

     Webサーバのconf書き換え  今回はメンテナンスページへの誘導を担当 Liquibase  DDLの更新  今回はテーブルに新たなカラムを追加 Maven  アーティファクト(WAR)の作成  リリース向けのアプリケーションを作成する Jenkins  上記のツールの実行と制御
  29. ケーススタディ:依存関係のある機能のリリース  担当している「ToDoリストサービス」のに新機能が追加されること になりました。  今回はDBに大きな変更が入るためメンテナンスページに飛ばす必要 があります。 54 Web (nginx)

    Ap (Tomcat) DB (Oracle) Jenkins ① rewrite設定でメンテページに誘導する ② テーブルにカラムを追加する ③ 修正版のアプリを配置する ④ 内部動確で全体的な動作確認 ⑤ 問題なければメンテページを元に戻す (外部公開する。) 単純なシステム構成でもDBの変更が伴うとリリースが複雑 になる場合が多い。
  30. 構成管理を自動反映しToilを撲滅する ケーススタディ接続情報 55 1.踏み台ログインssh $ [email protected] -p 443 2. training_keypair.pemを入れてssh通信する

    .sshディレクトリ作りpemをそこに置く ※training_keypair.pemのパーミッションは400で $ ssh -i .ssh/training_keypair.pem ec2-user@EC2のIPアドレス 3.tomcatの起動 $ sudo /usr/local/tomcat8/bin/startup.sh 4.nginx confのservernameを変更しリロード $ sudo vi /etc/nginx/conf.d/training.conf → server_name 13.231.165.22; #この行のIPアドレスを自分のEC2のアドレスに! $ sudo service nginx reload 5.ブラウザからの起動確認 http://EC2のIPアドレス/ap/ 最後に、各自事前準備として作業を実施して下さい。 また、気になるポイントがあれば講師まで。