まだLinuxコマンドについてよく知らなかった頃の話。
静的ページのキャンペーンページの運用
静的なWebサイトで定期的にキャンペーンページを作っていました。
キャンペーンごとにディレクトリを切って、そこにHTMLやらCSSやら画像やら全リソースを詰め込んでいました。
キャンペーンが終わるとテンプレートのキャンペーン終了ページに置き換えていました。
このキャンペーン終了作業を手動で行っていたのですが
- テンプレートキャンペーン終了ページリソースで上書き更新
- 容量節約のため不要なリソースを
ls
コマンドで確認しながら一つずつ削除。
という作業を手作業で行っていたのですが、月に数回あるので結構面倒でした。
シェルプログラミングに挑戦!
ということで、覚えたてのシェルプログラミング知識で、この作業を一発でできるようにしました。
キャンペーンページのフォルダ名を渡せば、一発で終了ページにしてくれる寸法です。
end.sh
#!/bin/bash
# 引数でディレクトリ名を渡す
dir="/var/www/html/$1"
# ディレクトリ内を全削除する
rm -rf $dir/*
# /var/www/endのすべての中身をディレクトリにコピーする
cp -r /var/www/end/* $dir/.
全消し
「よーし、試しに実行してみるか〜」
「"bash end.sh" っと・・・。あ、フォルダ名引数に入れるの忘れた」
「・・・」
「・・・」
「・・・えっ?」
懸命な皆様ならもうわかると思いますが、"/var/www/html"の中身が全て消えました。
つまりWebページ全消ししちゃいました。
引数は渡さなければ空文字
という簡単なことに全く気づいていなく、引数を渡さないとどうなるかの想定を全くしていませんでした。
"/var/www/html/${空文字}" は "/var/www/html/"の中身を全消し という簡単な事実に気づいていませんでした。
幸い、subversionのリソースから復元はできました。
教訓
- 引数のチェック、サニタイズは大事。特にシェルは。
- 何渡されても大丈夫なようにしておく
- テストディレクトリで事前に動作確認する
- 一発本番環境で動かさない
- 今思うと終了ページ用のディレクトリ作っておいて、そこにリンク貼ればいいだけじゃね?
この世のインフラ障害、何気にこのパターン多い気がするので、インフラエンジニアの皆さん気をつけましょう。