「インフラエンジニア」という肩書きは、ここ数年で意味が大きく変わった。昔は「サーバーを手で構築し、障害を手で直す」のが仕事だった。今は「自動化し、コード化し、人間が手を出さない仕組みを作る」のが仕事だ。
この変化の中心にある概念がSRE(Site Reliability Engineering)。Googleが提唱した「ソフトウェアエンジニアリングで運用問題を解決する」アプローチ。手動作業を「toil(苦役)」と呼び、システム化で排除することを是とする。
// コードと趣味の境界線上
「インフラエンジニア」という肩書きは、ここ数年で意味が大きく変わった。昔は「サーバーを手で構築し、障害を手で直す」のが仕事だった。今は「自動化し、コード化し、人間が手を出さない仕組みを作る」のが仕事だ。
この変化の中心にある概念がSRE(Site Reliability Engineering)。Googleが提唱した「ソフトウェアエンジニアリングで運用問題を解決する」アプローチ。手動作業を「toil(苦役)」と呼び、システム化で排除することを是とする。
本番障害。経験したことある人ならわかる、あの胃がキリキリする感覚。Slackが「サイトが落ちてます」で埋め尽くされ、手が震えながらSSHを叩く。何度か経験して学んだ「焦らない障害対応」の心得を共有する。
心得1:まず深呼吸、そして「何が起きてるか」を確認。 慌てて本番サーバーで適当なコマンドを叩くのが一番危ない。僕は過去に「`rm -rf /tmp`のつもりで`rm -rf / tmp`(スペースが余計)」をやらかした。まず`uptime`、`df -h`、`free -h`、`top`。基本の4つだけで状況の7割はわかる。
「障害が起きてから気づく」のと「障害の予兆を検知して事前に対処する」のでは、ユーザー体験が天地ほど違う。監視の目的は「ユーザーより先に気づく」ことだ。
監視設計で一番大事なのは「何を監視するか」を決めること。全部監視するとノイズの海に溺れる。「本当に重要な4つのシグナル」に絞るのが鉄則。
サーバーが1台なら、SSHでログインして`tail -f /var/log/nginx/access.log`で十分。でもサーバーが5台、10台と増えると、全サーバーをSSHで回ってログを見るのは無理ゲーになる。
ELKスタック(Elasticsearch + Logstash + Kibana)は、複数サーバーのログを一箇所に集めて検索・可視化する仕組み。でも本家ELKは重い。今は軽量版のLoki + Promtail + Grafanaの方が現実的。
SSL/TLS証明書、昔は年額1万円以上払って買うのが当たり前だった。更新を忘れてサイトが「危険」扱いになるのも日常茶飯事。Let’s Encryptがその常識を完全に破壊した。
Let’s Encryptは無料でSSL証明書を発行してくれる認証局。90日ごとに更新が必要だけど、certbotで自動化すれば実質永久的に無料。僕のブログも含め、個人サイトのHTTPS化を一気に進めた立役者だ。
自宅サーバーで5つも6つもサービスを動かしてると、ポート番号でアクセスするのが面倒になる。Jellyfinは:8096、Giteaは:3000、Grafanaは:3001…。全部覚えられない。
リバースプロキシで全部の入り口を一つにまとめるのがスマートな解決策だ。Nginxを玄関に置いて、ドメイン名でアクセス先を振り分ける。`jellyfin.mame-mame.org`はJellyfinへ、`git.mame-mame.org`はGiteaへ——全部443番ポートでOK。
Terraformが「インフラを作る」ツールなら、Ansibleは「サーバーを設定する」ツール。EC2を立てた後、nginxを入れて、設定ファイルを配置して、サービスを起動して…という手順を全てYAMLで書ける。
Ansibleの最大の特徴はエージェントレスなこと。管理対象のサーバーに専用のソフトウェアをインストールする必要がない。SSHで繋いで、Pythonでコマンドを実行するだけ。シンプルさが段違い。
AWSのマネジメントコンソールでEC2を作って、セキュリティグループを設定して、ELBに紐付けて…。手動でやると15分。でも環境が3つ(dev/stg/prod)になったら45分。さらに東京とバージニアでやったら倍。もうやってられない。
Terraform(HashiCorp)は、HCLという宣言的言語でインフラを定義するツール。「このVPCがあって、このサブネットがあって、このEC2があって…」とコードに書く。`terraform apply`一発で全リソースが構築される。
「プッシュしたら自動でテストが走って、通ったら自動でデプロイされる」——CI/CD(継続的インテグレーション/継続的デリバリー)の基本思想だ。これを一度味わうと、手動デプロイには戻れない。
CIの本質は「マージ前に問題を見つける」こと。コードをメインブランチにマージする前に、自動でビルドしてテストを走らせる。問題があればPRの段階で弾かれる。「動かないコードがメインに入る」リスクが消える。
Dockerを「軽量な仮想マシン」だと思ってる人、結構多い。でもこれは誤解で、Dockerの本質はプロセス分離だ。仮想マシンがハードウェアをエミュレートするのに対して、DockerはLinuxカーネルの機能(cgroup + namespace)を使ってプロセスを隔離してるだけ。
この違いがなぜ重要か。VMはOSごと起動するから起動に数十秒、数GBのメモリを食う。Dockerコンテナはプロセスを起動するだけだから、起動は1秒未満、メモリもほぼアプリ本体の分だけ。この軽さがコンテナ革命の本質だ。