SIerにいる若手開発者(プログラマ)が知るべき運用とは その1

最初に

今会社で実業務しつつ、新人研修をやっていたりするのですが、 プログラムを書くのはJava研修的なものでやってきているけど、例外catchしてprintStacktraceとか 書いているのはいいけど、なんで書いているのか、実業務でどう使われる?とか いろいろ足りていない、、、というか知るわけないのでちょっとここでまとめて 教えようと思います。

私の経験で見てきたこと中心なので、間違っているとかあると思いますので、 もし何かあればコメントいただけたら幸いです。

システム運用とは?

システム運用って何でしょうか??開発系の部署と運用系の部署があって・・・は聞いているかも? で、私がやっているのは開発系であり、運用なんて関係ないよねー あ、ここでいう運用はシステム運用の事です。

って、そんなことないです。

システムの一連の流れとしては、開発してリリースすると運用が始まります。 ほとんどのシステムは開発より運用の方が長いです。 そして開発時にいろいろ運用を意識していないと後々運用側が困ったり余計なコストがかかったり 下手するとシステムを直す必要まで出てきてしまいます。

ってちょっと横道に行った。運用とは?ですが wikipedia見たらこんな感じでした。 「システム運用(-うんよう)とは、コンピュータシステム等のシステムが停止することなく、利用顧客に対してつつがなくサービスを提供できるよう当該環境を維持管理すること。」

システム運用 - Wikipedia

「つつがなくサービスを提供」するためには何をする必要があるのか?

大きく言うと2つに分かれます。

  • 定型作業
  • 非定型作業

ここでは大きく「定型作業」とはある流れに従った作業とします。非定型はその逆で流れがない、つまりマニュアルなどが作れるかどうか?です。 システム運用は「定型作業」と「非定型作業」を毎日行って「つつがなくサービスを提供」しています。

定型作業

じゃあ定型作業ってどんなものがあるのか?例えばこんなものです。

  • システムからある申請が出された場合に、その内容を印刷して郵送する
  • 月に1回システムの利用状況を資料に取りまとめてみんなに共有する
  • 手順書に従い、サーバに入ってコマンドを実行する

などなど。 基本的には手順教えてもらえれば誰でもできる、さらに発生日時が決まっていることが多いです。

非定型作業

こちらはマニュアルなど存在せず、エンジニアなどが考えて対処する必要があります。例えば

  • WEBのシステムがさっきまで使えていたのに画面が全くでなくなったのでなんとかしなくてはならない
  • 処理の合計金額がおかしくなっておりお客さんからクレームが来た

などなど。 手順などなく基本的に想定外で、いつ起こるかわかりません。胃が痛くなりそう・・・(笑)

システム運用の理想形

運用者の目線からすると理想はこれです。

何もしていないけどつつがなくサービスを提供されている

これが最強w ただこれを実現するためには、 サーバなどは絶対に落ちることはなく、書いたプログラムは絶対にバグはなく、 ユーザがやりたいことはすべてシステム化できている必要があります。

無理w

なので、そんな非現実的な理想はともかくですが、 運用者としたらやりたくない作業は以下の順番になります。 細かく区切ればいくらでもあげられそうですが、いったん下記と定義します。 つまり開発者は作成したシステムで発生する事象がなるべく下記で下の方に近づくことを目指せば 運用者から感謝されます。

  1. いつ何が起こったか情報も何もなく、意味不明で何をしていいのかわからない非定型作業
  2. いつ何が起こったかだけはわかるが、意味不明で何をしていいのかわからない非定型作業
  3. 非定型ではあるが必要な情報はそろっており、頑張ればなんとかなる非定型作業
  4. 手順が整備されていない定型作業
  5. 手順が整備されている定型作業
  6. 何もしない

システムが運用者に情報を伝える手段

いったん目線の角度を変えますが、システムが運用者に情報を伝える手段はざっくり以下になります。

  • ログ
  • 監視
  • メール/電話/チャットなど人間が普段コミュニケーションに使うツール

※1 監視にかかってメールじゃん!とかはいったん気にしないでw ※2 電話とかチャットとかもありますが、SIerで自動電話とかなかなか使えないのでいったん忘れて。

ログ

これはあまり説明いらない気もしますが、多くの場合は単純にファイルにログの情報を出します。DBなどの場合もあります。 運用としては運用者が見てみるか!と思ったら見ることができます。 基本的にログが能動的に運用者に何か起きたよ!とトリガーを引いてくれることはありません。

監視

そのままですが、システムの状態を監視して想定外の状態になった場合は特定のアクションを実行します。 JP1やHinemosがその代表で世の中にはたくさんのミドルウェアがあります。 メジャーどころの監視としては以下のような監視です。

  • CPUやメモリ、ディスクなどにちゃんと余裕があるかどうかを監視
  • プロセス(Tomcatなど)がちゃんとあがっているかどうかを監視
  • ログに特定の文言が出てこないかどうか監視
  • HTTPのステータスや電文の中身が正常であるかどうか監視

特定のアクションとしては、単純に監視ソフトウェア上で赤文字で出したり、「人間が普段のコミュニケーションに使うツール(メール/電話/チャットなど)」に通知したり、パトカーみたいなランプを光らせたり何らかで運用者に伝えます。

人間が普段のコミュニケーションに使うツール(メール/電話/チャットなど)

これは上記で書いた監視で想定外の場合、もしくは単純にシステム内の機能として運用者に通知してあげるという機能を作ってあげる必要があります。 プログラムとして以下のようなコードを書くだけ。

if(運用が必要な場合) {
    運用者にメールを送信する
}

実際にコードを書く際にどうすべきなのか?

やっと本題w 先ほども書いた以下の順序が下に下がるようなソースを書く必要があります。

  1. いつ何が起こったか情報も何もなく、意味不明で何をしていいのかわからない非定型作業
  2. いつ何が起こったかだけはわかるが、意味不明で何をしていいのかわからない非定型作業
  3. 非定型ではあるが必要な情報はそろっており、頑張ればなんとかなる非定型作業
  4. 手順が整備されていない定型作業
  5. 手順が整備されている定型作業
  6. 何もしない

次の記事に続きます。

SIerにいる若手開発者(プログラマ)が知るべき運用とは その2 - のんびりプログラムのお勉強でも・・・・・・・