先週の金曜日の出来事になってしまうけれど、DevOps カンファレンス #1 に行って来た。
主催者の @marqs さん、発表者の @mizzy さん、@marqs さん、@kuwa_tw さん、@hiroshi19790209 さん、@riywo さん、講演ありがとうございました!!!
mizzy さんによる DevOps 入門、から始まり、それぞれ所属されている組織内での DevOps のやり方、個人手金は現在一人 DevOps している身として、とても参考になりました。
それぞれの発表者の資料は、@marps さんのブログにまとまっていると思うので、それちを参考にしてもらうとして、DevOps カンファレンス #1 を振り返って個人的な感想を書いてみたいと思います。
まず、DevOps 的な内容として、前職の思い出が思い出されます。当時は、いわゆるスタートアップで、世界中の人たちのたくさんの人々に使ってもらうことを目標にしてさまざまなウェブサービスを作っており、おもに Dev 側(プログラマー面)、Ops 側(インフラ面)、両方の立場で業務をするという貴重な体験をしました。
まず最初に僕が携わったのは、世界デビューを目前としているとある写真共有サービスでした。当時、そこでは次のような内容で、ウェブサービスの改良を行っていました。
- ウェブサービスの改良をするエンジニアがいる
- インフラを担当するインフラエンジニア一人がいる
- それらを統括するマネージャ兼 CTO がいる
- 週一回、バグトラックシステムを使い、CTO が今週やることをアサインする(当然ながら会社としての方向を兼ね合いもあります)
- エンジニアが実装した内容を確認する、QA エンジニア 1 名がおり、エンジニアが実装した内容を開発環境で徹底的にテストして確認する、QA エンジニアが OK しないものに関しては本番環境へリリースしない(本番環境のデータベースなどが必用であれば、開発環境に個人情報をつぶした形で十分なデータベースを用意して、QA エンジニアにテストしていただく)
- インフラ面で改善する場合には、事前にメンテナンスのスケジューリングをして、必用な場面であれば QA エンジニアにメンテナンス中にテストしてもらう、問題がないようであればリリースする
当時であれば、スタートアップという場面では、非常に優秀なエンジニア、QA エンジニア、がいるという、今思い返すと、とても恵まれている環境でした。
ここでの DevOps 的な役割は、次のような感じで暗黙な感じになっていました。
- プログラマーは、ウェブサービスの改善・改良にひたすら専念する
- QA エンジニアは、プログラマーの実装した内容をできる限りで本番環境に近い形でテストして、問題がなければ QA エンジニア自身が rsync などで本番環境にリリースする
- インフラエンジニアは、トラフィックなどを監視して必須な改善を実施する、アーキテクチャーに大きな変更を伴うときには、CTO / CEO に対して情報共有を行い、その改善が必須かどうか判断して実施する、大きなアーキテクチャーの改善を伴うときにはメンテナンス時に QA エンジニアにも待機してもらいテストしてもらう
僕は、このときプログラマー、インフラエンジニア、の両方の担当になりました。当然ながら、時期はずれています^^
このとき大きな失敗をしたのかどちらのか、お分かりでしょうか?当然ながら、インフラエンジニアのときに大きな失敗をしました。。。。このときのことは今も貴重な体験となっており、忘れもしません。当時は写真共有サービスのため、ストレージの増強(つまり、当時はより大容量のものにハードディスクを入れ替える作業)を僕が担当したときのことです。。。
このときに大きな失敗をしました。具体的には、次のような前提条件になります。
- 当時は、active / backup タイプの DRBD + NFS(NFS は大人の事情でトラフィックを分散させる目的で写真へのアクセスを分散させるだけの目的で使用していました) で、ストレージを組んでおり、一台のストレージが落ちてしまうと一部の写真全てにアクセスできなくなる可能性があること
- 写真の枚数は、rsync すると差分の計算だけで半日程度かかってしまうが、メンテナンス直前までサービスを影響のない範囲で rsync を繰り返し実行していた
ここで、スケジューリングしたメンテナンス時刻になりました。
僕は、QA エンジニアに待機してもらいながら、次の作業を実施しました。
- サービスをメンテナンス状態にしてもらう、写真をアップロードできないように、念のためサービスもメンテナンス状態にした(当然ながら、特定の社内ネットワークからののみ、mod_rewrite を駆使してアクセスな可能な状態にした)
- メンテナンス設定後、データの追加がなくなったことを確認して、最後の rsync を実施した(これについても時間がかかるため、想定の時間もメンテナンス時間に含まれています)
rsync 後、念のため wc -l ですべての写真の数を確認して、QA エンジニアに一通りのサービスを確認してもらったあと、サービスをメンテナンス状態から解除しました。
。。。
しばらく問題がなかったので、僕と QA エンジニアは帰宅して休むことにしました(徹夜作業だったため)。
僕が休もうとした直前、CTO から電話がきました!!!
CTO から、昔貼り付けた写真のブログにおいて、その写真が閲覧できないことを確認したという連絡でした。
その連絡を受けて、僕は飛び起きて、その対象となるブログ(そのときは CTO 自身の個人ブログの昔の記事)を閲覧したところ、確かにストレージを組み替えてから写真が 404 になっていました。。。。
その原因は、アーキテクチャーの抜本的な理由により、昔貼り付けられた写真については閲覧できないデメリットがある前提のもと(PV がほとんどないため、mod_rewite ルールによる互換性の問題)、アーキテクチャーの変更をしたのが理由であったのですが、CTO/CEO/QA エンジニア に対してしっかりと Ops 側(インフラ側)が情報共有をしていないために大きな失敗をしました。。。当時は、僕の責任なので誤る言葉もありません。。。申し訳ありません。。。
このときは、Dev/Opts という二つの役割は違う人にあったことも大きいですが、Ops 側のアーキテクチャーを変更する上でのメリット・デメリット、を正確に Dev に共有できなかったが大きな失敗を生んでしまった原因であったと今も反省しています。
DevOps カンファレンスでは、それぞれの会社が置かれている状況やそれまでの運用形態により、各社さまざまな運用形態があり、それに相応する歴史があり、その歴史に対応するべき対策があったりと、同じウェブ業界でもこんなにも違うものなのかを感じたカンファレンスでもありました。
現在、僕は小規模のサービスを一人で DevOps している環境にしていますので、えらそうなことはまったくいえないのですが、とても重要な一つのポリシーをして、次のことがいえると思います。
その対策をして、Dev / Ops / ユーザ / みんな、そのウェブサービスに対して幸せになることができるか???
本当にみんなその対策で幸せになるのでしょうか?その対策で不幸せになる人はいないでしょうか?もしいるとすると、その人は不幸せになることを伝えて納得をもらっていますか???納得をもらえなら、その対策は絶対にすべきではないです。なぜなら、あとで必ず絶対にそして近い将来、とても困る場面があるからです。
技術的なことでも、必ずメリット・デメリットが伴うことが多いと思います。技術的なら、デメリットに対してメリットを許容するべき内容であるのか、デメリットはメリットを超えてみんなを不幸にしないのか、そんなことが考えられます
対象となるウェブサービスの性質、信頼性、などを考えると、一概に答えが出る問題では当然ながらないので、自分がかかわっているウェブサービスに対して、例えインフラエンジニアの担当だったとしても、僕が俺が私がこのウェブサービスを支えているいるんだ、これが僕が俺が私が担当しているサービスで、一番仕事の中で重要なウェブサービスであると、当事者意識を持ち続けることが大切なんだと思います。
個人的な過去の体験を振り返ると、Dev 側のみであったことは、正直当事者意識はすこし薄くなってしまったと反省しています、反面 Ops 側になった瞬間当事者意識はかなり大きくなった(PC を肌身離さずようになった!)と思います。これはかなり調子のいい例だと思いますが、Dev でも Ops でも、同じレベルの当事者意識をもつカルチャーを作ることが DevOps なカルチャーを作る、そんな材料の一つになっているかもしれないと感じた DevOps カンファレンス #1 でした。
個人的には、ほぼ一人 DevOps している人が少ないかもしれないで、#2 で機会があればほぼ一人 DevOps につて話したいと思います!
Tags: devops