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

現実世界のシステムにモダンなアーキテクチャを取り入れる技術

Avatar for ebi216 ebi216
October 05, 2023

 現実世界のシステムにモダンなアーキテクチャを取り入れる技術

Avatar for ebi216

ebi216

October 05, 2023
Tweet

Other Decks in Technology

Transcript

  1. - 井瀬 篤 - ラクーンHD 技術戦略部 システム管理チーム 所属 (5年目) -

    SREっぽいこと - プラットフォームエンジニアリングっぽいこと - データエンジニアリングっぽいこと - 前職もインフラエンジニア (ネットワーク・セキュリティ系) - 趣味 自己紹介
  2. 基本的な設計はサービス開始初期のまま、仮想化やアプリのリプレース などちょっとずつアップデートされ受け継がれてきた - デプロイ方法は? - SCPでアップロードして… - アプリによってはデプロイスクリプトがある - エラーログは?

    - SSHでtailして… - 設定変更は? - SSHでコンフィグファイルを編集して… マイクロサービス??? クラウド???オートスケール??? ザ・レガシーシステム
  3. 1. ビルド 1. ビルドサーバにsshでログイン 2. masterブランチをpull 3. ビルドコマンドを実行 2. 配布

    1. APサーバにsshでログイン 2. 現用のjarファイルをバックアップ 3. ビルドサーバから新しいjarをscpでコピー 3. 適用 1. ロードバランサーからAPサーバを切り離すスクリプトを実行 2. APサーバでサービスを再起動 3. ロードバランサーにAPサーバを戻すスクリプトを実行 4. 動作確認 1. APサーバにsshでログイン 2. エラーログファイルをtail -fで半日ほど監視 リリース手順の例
  4. 1. ビルド 1. ビルドサーバにsshでログイン 2. masterブランチをpull 3. ビルドコマンドを実行 2. 配布

    1. APサーバにsshでログイン 2. 現用のjarファイルをバックアップ 3. ビルドサーバから新しいjarをscpでコピー 3. 適用 1. ロードバランサーからAPサーバを切り離すスクリプトを実行 2. APサーバでサービスを再起動 3. ロードバランサーにAPサーバを戻すスクリプトを実行 4. 動作確認 1. APサーバにsshでログイン 2. エラーログファイルをtail -fで半日ほど監視 リリース手順の例 アプリによって scpするものや 保存場所が違う ログの場所は? どのサーバにssh すればいい?
  5. 外部システムとアプリの依存性 設定変更 デプロイ サーバ 設定 ファイルA アプリA ディレクトリ hoge 環境変数X

    サーバ 設定 ファイルB アプリB 環境変数Y アプリによって必要なものが違う -> アプリの数だけ周辺システムの構成パターンが生まれる ディレクトリ foo ディレクトリ bar NFSサーバ SCP
  6. ビルド・デプロイシステム Dockerコンテナ化 サーバ コンテナイメージ 設定 ファイル アプリ ディレクトリ 環境変数 設定変更

    デプロイ サーバ 設定 ファイル アプリ ディレクトリ 環境変数 ポート サーバ 設定 ファイル アプリ ディレクトリ 環境変数 Dockerfile docker build コンテナ サーバ コンテナ docker pull docker run
  7. 目標: アプリの外部環境依存を減らして、周辺システムを共通化する やること: - Dockerコンテナ化 - Twelve-Factor Appに近づける - 共通周辺システムの構築

    (サーバ・ビルド・デプロイ・開発環境など) やらないこと: - アプリの大幅な改修 (マイクロサービス化など) - インフラの大幅な改修 (Kubernetesなど) やること
  8. アプリの実行 APサーバ systemd Java アプリ docker compose up docker- compose.yml

    version: ‘3’ services: app: image: gitlab/superdelivery/ec-app:$COMMIT_HASH docker-compose.yml Jenkins COMMIT_HASH 環境変数を書き換え - サーバ上にdocker-compose.yml があり、systemdがdocker compose upすることでアプリが 起動する - コンテナイメージはタグの部分 が環境変数になっており、 Jenkinsで環境変数定義ファイル を書き換えることで、イメージ を切り替えることができる
  9. 1. 準備・設計 ◦ システムの依存関係を把握する ◦ 設計ガイドラインを作成する 2. システム基盤の構築 ◦ 開発・テスト環境

    ◦ CI/CDシステム ◦ ログ基盤 3. アプリの修正 ◦ 設計ガイドラインに合わせる ◦ Dockerfileを書く ◦ CIを導入する 4. 開発・テスト環境の移行 5. 本番環境の移行 進め方
  10. 1. 準備・設計 ◦ システムの依存関係を把握する ◦ 設計ガイドラインを作成する 2. システム基盤の構築 ◦ 開発・テスト環境

    ◦ CI/CDシステム ◦ ログ基盤 3. アプリの修正 ◦ 設計ガイドラインに合わせる ◦ Dockerfileを書く ◦ CIを導入する 4. 開発・テスト環境の移行 5. 本番環境の移行 1. 準備・設計
  11. 例1) リポジトリ間でデプロイのタイミングに依存性がある - 1つのデプロイジョブで複数のリポジトリ対応が必要 - デプロイジョブはアプリのリポジトリとは別に管理 - アプリのリポジトリにはコンテナイメージに必要なものだけ入れる 1. 準備・設計

    - システムの依存関係を把握する ECサイトアプリ用 リポジトリ ソース コード Dockerfil e GitLab-CI 静的ファイル用 リポジトリ CSS 画像 Dockerfil e GitLab-CI デプロイジョブ用 リポジトリ スクリプト Jenkinsfile
  12. 例2) ファイルの受け渡し方法がバラバラ NFSに統一する改修を実施 1. 準備・設計 - システムの依存関係を把握する APサーバ バッチサーバ ECサイト

    アプリ (Java) バッチ① ファイル NFSサーバ バッチ② ファイル SCPで読み込み NFSで読み込み 出力 出力
  13. 例3) ローカルコマンド実行 - アプリからsendmailコマンドを実行してメール送信していた - コンテナ内にPostfixを立ち上げることができないので、ネットワ ーク経由(SMTP)で連携するように変更が必要 1. 準備・設計 -

    システムの依存関係を把握する APサーバ ECサイト アプリ (Java) Postfix sendmail コマンド メール送信 インターネット APサーバ Postfix メール送信 インターネット ECサイト アプリ (Java) SMTP
  14. ガイドラインの内容 - 環境固有の設定は環境変数で定義 - ファイルの保管・受け渡しはNFSサーバに限定 - docker volume・バインドマウントは原則利用不可 - 1トランザクションの処理時間の上限は5分

    - グレースフルシャットダウンの待機時間 - ログは標準出力にJSON形式で出力 - ログフォーマットの必須フィールド - @timestamp: 日時をISO8601(TZあり・ミリ秒精度)形式で - level: 次のいずれか → DEBUG|INFO|WARN|ERROR|FATAL - type: ログフォーマット識別用 ※次ページで解説 - message: ログの本文 1. 準備・設計 - 設計ガイドラインを作成する
  15. ログフォーマットについて - フォーマットがバラバラだと集約や検索するときに問題になる - どんなログでも存在するであろうフィールドをガイドライン化 - その他のフィールドの追加は任意 - 1) どのログにどんなフィールドが存在するか、2)

    複数のログで同名 のフィールドがあるが意味合いが異なる場合に区別するため、typeを 利用する - typeにはLoggerの名前を使用するケースが多い 1. 準備・設計 - 設計ガイドラインを作成する {“type”: “file_dl_func”, path: “/download/shita/file”, “size”: 142} → 142KB のファイルを/download/shita/fileにダウンロードした {“type”: “access_log”, path: “/shouhin/osara1”, “size”: 254430} → /shouhin/osara1 にアクセスがあって 254.43KB 返した
  16. 1. 準備・設計 ◦ システムの依存関係を把握する ◦ 設計ガイドラインを作成する 2. システム基盤の構築 ◦ 開発・テスト環境

    ◦ CI/CDシステム ◦ ログ基盤 3. アプリの修正 ◦ 設計ガイドラインに合わせる ◦ Dockerfileを書く ◦ CIを導入する 4. 開発・テスト環境の移行 5. 本番環境の移行 2. システム基盤の構築
  17. 開発環境 - VS Code - Docker in WSL デザイナーさんでも使い やすいようにGUIのイン

    ストーラを開発 2. システム基盤の構築 - 開発・テスト環境
  18. 1. 準備・設計 ◦ システムの依存関係を把握する ◦ 設計ガイドラインを作成する 2. システム基盤の構築 ◦ 開発・テスト環境

    ◦ CI/CDシステム ◦ ログ基盤 3. アプリの修正 ◦ 設計ガイドラインに合わせる ◦ Dockerfileを書く ◦ CIを導入する 4. 開発・テスト環境の移行 5. 本番環境の移行 3. アプリの修正
  19. 1. 準備・設計 ◦ システムの依存関係を把握する ◦ 設計ガイドラインを作成する 2. システム基盤の構築 ◦ 開発・テスト環境

    ◦ CI/CDシステム ◦ ログ基盤 3. アプリの修正 ◦ 設計ガイドラインに合わせる ◦ Dockerfileを書く ◦ CIを導入する 4. 開発・テスト環境の移行 5. 本番環境の移行 4. 開発・テスト環境の移行
  20. 1. 準備・設計 ◦ システムの依存関係を把握する ◦ 設計ガイドラインを作成する 2. システム基盤の構築 ◦ 開発・テスト環境

    ◦ CI/CDシステム ◦ ログ基盤 3. アプリの修正 ◦ 設計ガイドラインに合わせる ◦ Dockerfileを書く ◦ CIを導入する 4. 開発・テスト環境の移行 5. 本番環境の移行 5. 本番環境の移行
  21. 1. ビルド 1. ビルドサーバにsshでログイン 2. masterブランチをpull 3. ビルドコマンドを実行 2. 配布

    1. APサーバにsshでログイン 2. 現用のjarファイルをバックアップ 3. ビルドサーバから新しいjarをscp でコピー 3. 適用 1. ロードバランサーからAPサーバを 切り離すスクリプトを実行 2. APサーバでサービスを再起動 3. ロードバランサーにAPサーバを戻 すスクリプトを実行 4. 動作確認 1. APサーバにsshでログイン 2. エラーログファイルをtail -fで半 日ほど監視 リリース手順の例 1. ブラウザでJenkinsを開く 2. リリースしたいリポジトリに対応したジ ョブを選択する 3. リリースしたいコミットを入力してジョ ブを実行する 4. エラーが起きればSlackに通知がくるの でチェックする
  22. - エンジニア・デザイナーからは好評 - 特に開発・テスト環境やログ調査 - 環境の変化もあまり抵抗なく受け入れてもらえた - 誰かがやってくれるのを実はみんな待っていたのかもしれない - 開発環境のトラブルも減った

    - 開発環境がWSL内に閉じているので、トラブルがあれば、 まるごと作り直せばいい - 改善が必要な点も - 環境変数の管理が煩雑だった - CI/CDなどを管理するプラットフォームエンジニアが不足 - NFSに扱いづらさがあるので、オブジェクトストレージに移行 するべき やってどうだったか?