32
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

まだ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のリソースから復元はできました。

教訓

  • 引数のチェック、サニタイズは大事。特にシェルは。
    • 何渡されても大丈夫なようにしておく
  • テストディレクトリで事前に動作確認する
    • 一発本番環境で動かさない
  • 今思うと終了ページ用のディレクトリ作っておいて、そこにリンク貼ればいいだけじゃね?

この世のインフラ障害、何気にこのパターン多い気がするので、インフラエンジニアの皆さん気をつけましょう。

32
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?