「機能修正、完了しました!」 …で、デプロイは?
入社して3か月、試用期間が終わりかけたころ、私は初めて実務の仕事を任された。とても簡単な機能修正だったが、それでも半分は緊張し、半分はわくわくしながら、自分の席のPC、つまり localhost 上でコードを直し、テストまで完璧に終えた。
「チーム長、ローカルでのテストは全部通りました!」
チーム長はうなずきながら、デプロイを指示した。 「お疲れさまです。では GitLab、つまり GitHub のようなソースコード保管庫にコミットして、本番サーバーにデプロイしてみてください」
デプロイ? 私は研修時にもらった引き継ぎ文書を慌てて探した。そこには意味の分からない用語が並んでいた。
とにかく言われた通りにコードを上げた。残る最後のステップは「本番サーバーへの接続」だけだった。私は本気で席を立ちかけた。ドラマで見たように、冷房がガンガン効いたサーバールーム(IDC)に自分で入り、サーバーにつながったキーボードを叩かないといけないと思っていたからだ。
その様子を見た先輩が笑いながら声をかけた。 「どこ行くの? そのまま座って SSH で接続すればいいですよ」
黒い画面との初対面
SSH(Secure Shell)というプログラムを開き、先輩に教わった IP アドレスとパスワードを打ち込んで Enter を押した。Windows なら華やかなデスクトップが迎えてくれただろう。でも私のモニターに現れたのは、真っ黒な背景に点滅するカーソルが一つだけだった。
ubuntu@ip-172-31-0-1:~$ _
マウスでクリックするアイコンもないし、右クリックして「新しいフォルダ」を作ることもできない。戸惑って適当にキーを押しているうちに、ls と打ってみたら、ファイル一覧がテキストでずらっと表示された。
「ああ、これが噂に聞いていた CLI(Command Line Interface) か」
でも本当の恐怖は、ファイルを実行しようとしたときにやってきた。マニュアルに書いてあった update スクリプトを実行したのだが、Windows ならダブルクリックで済むようなことが、ここでは赤いエラーメッセージになって返ってきた。
Permission denied(権限が拒否されました)
自分のサーバーなのに、自分が実行できないなんて。どうして Linux はこんなに不親切なんだろう?

デジタル物流センターの倉庫番
ここで「デジタル物流センター」という比喩に戻ろう。Windows が入った私のノートPCが「快適な個人オフィス」だとすれば、Linux サーバーは物流処理のためだけに建てられた「巨大な倉庫」だ。その倉庫には何万個もの箱、つまりファイルが積み上がっている。
もし倉庫番が箱を一つひとつ歩き回って確認し、GUI、鍵で一つずつ扉を開けていたら、クリック、作業はあまりにも遅くなる。だから Linux は「コマンド」という無線機を使う。
「1番エリアの箱を全部一覧表示して!」 (ls) 「3番の箱を5番エリアに移して!」 (mv) 「この箱を実行して!」 (./start.sh)
マウスがなくて不便なのではない。慣れてしまえば、マウスでは到底できない速さで、何千ものファイルを制御できるからこそ、意図的にグラフィックが省かれているのだ。

[Code Verification] 権限(Permission)という絶対法則
Linux 初心者をいちばん苦しめるのが、まさに「権限(Permission)」の問題だ。Windows なら「管理者として実行」を一回押せば大体のことは片付く。でも Linux は、ファイル一つひとつに対して「誰が、何をできるか」を厳格に見る。
ターミナルで ls -l を打ったときに出てくる宇宙語のような表示を読めないと、生き残れない。
$ ls -l myscript.sh
-rwxr-xr-- 1 owner group 1024 Jan 1 12:00 myscript.sh
分析: いちばん前の -rwxr-xr-- が核心だ。先頭の -(ファイル)を除いて、3文字ずつ区切って読まなければならない。
自分で書いたスクリプトが実行できない? 十中八九、実行権限の x がないのが原因だ。ここで初心者は、もどかしさのあまり禁断の呪文 chmod 777 を唱えがちだ。
# 絶対にやってはいけない行動
$ chmod 777 myscript.sh
777 とは、「自分も、あなたも、通りすがりの犬ですらこのファイルを変更して実行できるようにしろ」という意味だ。セキュリティの門を全開にする行為に等しい。実務では絶対にやってはいけない。必要な権限だけを最小限に与える、たとえば chmod +x のような習慣を身につけるべきだ。

chmod 777 は便利だが、攻撃者にとっても便利な道を開くことになる。実務アドバイス: ターミナル恐怖症を克服する
入社当初、先輩はサーバー接続ツールとして PuTTY を使えと言った。でも私はネットで調べて、もっと良いツールである MobaXterm を見つけた。このプログラムは SSH 接続するだけで、左側に自分のPCのエクスプローラーのようなファイル一覧、SFTP、を表示してくれたからだ。
おかげで私はターミナルコマンドを知らなくても、ファイルをダブルクリックして修正し、保存していた。でも、そんな「裏技」に頼っているだけでは、Linux とは絶対に仲良くなれない。緊急の障害対応では、GUI ツールが開くのを待っている時間などないからだ。
おわりに: 環境を支配する者
Windows という温室を出て、Linux という野生に適応するのは苦しい。だがその苦痛を越えた先には、マウスでは決して得られない強力な制御権が手に入る。
Linux はもう未知の領域ではない。でも、まだ根本的な問題が残っている。自分のノートPC、つまり開発環境には Java 17 が入っているのに、Linux サーバー、つまりデプロイ環境には Java 8 しか入っていないとしたら? あるいは Linux にはあるのに、自分の Windows にはないライブラリがあるとしたら?
「自分のPCでは動くんですが?」という言い訳は、OS の違いやライブラリのバージョン差から生まれる。この環境差を、そもそも無くすことはできないだろうか。自分のノートPCの環境をそのまま凍らせて、サーバーに持っていくことはできないだろうか。
この無茶な想像を現実にした技術がある。次回は、仮想化を越えてコンテナ革命を起こした Docker について話してみよう。