システムアーキテクチャ設計で考えることを整理してみた

この記事は [BrainPad AdventCalendar 2018](https://qiita.com/advent-calendar/2018/brainpad) 6日目の記事です。

　実際のシステム開発では、開発規模だったり緊急度だったり重要度だったりを考慮しなければならないため、経験を頼りに臨機応変に対応することが多いのではないでしょうか。

　本記事ではシステムアーキテクチャ設計の検討事項について簡単ではありますが整理してみました。

# システムアーキテクチャ設計について思うところ
　企業は利益や利益率の増加、コスト削減といったビジネス課題を解決するための手段として情報システムを導入するわけですが、私はそれを実現するための重要な要素の一つにシステムアーキテクチャ設計があると考えています。
早速ですが、本題に入りましょう！！
# システムアーキテクチャ設計の検討事項
　システムアーキテクチャ設計では、システム稼働上の要件を検討し適切なシステム構成にするために必要な要素を明確化するわけですが、検討項目をざっと列挙したいと思います。

## 操作性要件に関する設計
　ヒューマンインタフェースには、CUI（Character-based User Interface）とGUI（Graphical User Interface）があります。システムの操作性を向上するには、これらの表示内容の理解、コマンドやデータの入力操作等を容易にする必要があります。そこで、次に挙げるようなことを標準化することを検討します。

- 入力デバイスの種類や使用方法
- 画面デザインや操作手順に関する仕様
- フールプルーフに関する設計ルール

## 性能・処理能力要件に関する設計
　予測されるピーク時の最大処理量を考慮し、レスポンスタイム、ターンアラウンドタイム、データ量の制約条件を実現するために次に挙げるようなことを検討します。

- CPU性能
- メモリの性能と容量
- ディスク装置の性能と容量
- I/Oインタフェースの性能
- 入出力装置の性能について割り当てるリソース

　上記以外にも、将来的な需要予測を基にキャパシティプランニングを行い、ソフトウエアの処理能力の向上を目指した仮想記憶管理、入出力バッファ管理、スプーリング、アプリケーションソフトウエアの通信処理能力といったことも重要になります。

## セキュリティ要件に関する設計
　クライアントサイドとサーバサイド両者のセキュリテイ対策を設計します。
　クライアントサイドの主なセキュリテイ対策は以下の通りです。

- 無操作状態の時間による自動ロック等の不正使用防止
- セキュリティ設定の適性化
- ベンダが提供するセキュリティパッチの速やかな適用
- 不正プログラミング侵入防止のためにセキュリティソフトウェア選定やセキュリティ設定

　サーバサイドの主なセキュリテイ対策は以下の通りです。

- サーバへの侵入防止
- DoS攻撃によるサーバ資源の枯渇やサービス停止の防止
- なりすまし防止
- 各サーバコンポーネントの多層防御によるサーバの要塞化
- Webサーバやメールサーバ等のサーバ特性に応じたセキュリテイ対策

　また、プログラムの脆弱性を利用した攻撃を防止するためのセキュアプログラミングも重要になります。

## 内部統制要件に関する設計
　経済産業省が公開している [システム監査基準](http://www.meti.go.jp/policy/netsecurity/downloadfiles/system_kansa.pdf) 及び [システム管理基準](http://www.meti.go.jp/policy/netsecurity/downloadfiles/system_kanri.pdf) にて、情報システムの監査・管理基準が定められています。これを参考にして統制目的に合わせて次に挙げるようなことを考慮して、リスクコントロールの仕組みを設計します。

- 誤操作を予防し、悪意のある操作を牽制する。
- 問題発生を発見し、警告する。
- 発見した問題を修正し、現状回復させる。

## システム構成要件に関する設計
要求される性能・処理能力、信頼性、セキュリティ、システム運用管理等に関して、次に挙げるようなことを設計します。

- ハードウエア構成
 - クライアントやサーバのCPU性能
 - メモリの性能と容量
 - ディスク装置の性能と容量
 - クライアントやサーバの台数
 - 機能分散する際のサーバの種類

- ソフトウエア構成
 - OSの種類やバージョン
 - そのOS上で動作するアプリケーションソフトウエアの種類
 - 機能分散、セキュリティ、運用管理支援等の観点からどのように配置するか

- ネットワーク構成
 - LAN規格
 - LAN間接続装置の種類と配置
 - VLAN構成の設定
 - ネットワークに接続するクライアントやサーバへのIPアドレスの割り当て
 - 利用するWANの種類とプロトコル

- データベース構成
 - DBMSの種類
 - システムからデータベースへのアクセスパス
 - DBサーバを搭載するストレージシステムの種類や構成

　上記を踏まえて、処理能力要件に対する負荷分散構成、信頼性要件を実現する冗長構成等を総合的に検討し、システム構成の方式設計を行うことが重要になります。


## データ活用要件に関する設計
　データの入出力環境や連携処理等に着目し、データ処理の効率向上に適したデータ処理を行うため、次に挙げるようなことを設計します。

- データ管理
 - ファイルやデータベース等の業務特性やデータ特性に応じたデータの管理方法

- データ共用
 - 複数のユーザがデータを共有する場合、データアクセスに関する排他制御方式

- データの機密性保持
 - データ暗号化やデータアクセス制御等のデータの機密性維持方式

- データの信憑性（信頼性）維持
 - 不正アクセスや障害によるデータ破損の防止
 - バックアップによるデータ復元
 - ログを利用したロールバックやロールフォワード
 - メッセージ認証方式による改ざん防止
 - データ操作に対する承認手続き

- データの可用性維持
 - ディスクミラーリングなどの冗長構成技術を適用し、データへのアクセスパス多重化
 - ハードウェア保守によって、ディスク装置障害の予防

- データ連携処理
 - 属性名を標準化し、ディレクトリサービスや分散データベースのリソース配置を意識させる- ことなくデータアクセスできる環境の構築
 - データ更新のタイミングを考慮して、授受したデータの有効性の確保

- データアクセス集中
 - サーバ処理負荷分散構成等のシステム構成技術の導入
 - レプリケーション機能を利用したデータベースの分散配置
 - ミラーサーバ、ミラーサイト等を構成したアクセス分散

- データ破棄
 - ディスク装置を物理的に破棄
 - 専用ソフトウェアを利用して意味のないデータに上書き

## 拡張性要件に関する設計
　トランザクション処理要求が集中した場合における処理プロセスの動的な拡張性や負荷分散構成等の方式に関して設計します。
　将来的なシステム増強を考慮して、CPUの増強、メモリやディスクの増強、クライアントやサーバの増加、通信経路の多重化等を踏まえたシステムの拡張性を確保しておくことも重要になります。
　適切な設計をするには、知識だけでなく豊富なシステム運用経験を要するので、毎度難しい部分だといつも感じています。

## 信頼性要件に関する設計
　システムを正常にサービス維持するため、次に挙げるようなことを設計します。

- システムの信頼性を適切に評価するためのシステム稼働率、平均システムダウン率等の指標を設定する。
- ハードウエアの信頼性を確保するための製品選定基準を設定し、ソフトウエアの品質を確保するための開発方式を設計する。
- システムを構成するハードウエアやソフトウエアを日常自己点検、予防保守、定期保守といった形で点検し、障害が予測される部分を事前に改修する。
- 監視対象項目を設定して、その項目の限界値を超えたら自動的に異常を運用担当者等に通知したり、システムの稼働状況を監視するための監視装置や監視機能を設計する。
- ハードウエアやソフトウエアの実行履歴、システムやファイル等へのアクセス履歴等の管理対応項目情報をハードディスク等に時系列に記憶し、障害の早期発見、障害の切り分け、障害原因究明のためにシステム稼働状況を追跡できるようにモニタリング機能を設計する。
- システムやシステム要素の構成を冗長化することによって、障害が発生しても、システムの稼働を継続させる高信頼化アプローチを設計する。

# まとめ
　ブレインパッドでは、クラウドサービスとしてGCPをよく使用しますが、本記事で記載したことを良きに計らってくれます。しかし、要件やコスト感を十分に考慮して十分過ぎず・不足しない形でシステム構築を行い、将来の機能追加や需要予測を見越して拡張性のあるシステムアーキテクチャ設計を行う必要があると思います。システム運用経験って大事ですね。