はじめに:

時刻や日付によって特別な処理をiRuleでどうやって実施するか?という質問をよくいただきます。 この質問にお答えするために、今月はclock secondsとclock formatに注目してみましょう。

clock secondsは以前のDNS Flood対策(http://devcentral.f5.com/Default.aspx?tabid=120&articleType=ArticleView&articleId=63)のサンプルで紹介しましたが、このコマンドはiRulesの制限によってUnix Time形式で時刻を返すものです。 さらに、clock secondsの結果をclock formatのコマンドに連携することによって、理解しやすいHHMMなどのフォーマットに変更することができます

今月は、clock formatを使って、特定の期間内に受信したリクエストに対して通常と異なる処理を実施するiRuleを紹介します。

詳細はこちらでもご確認いただけます。 https://devcentral.f5.com/Default.aspx?tabid=53&forumid=1&postid=13201&view=topic


タイトル:
ある期間内で特定の処理を実施するiRule

メリット:
メインテナンス時間に受信したものをSorry Serverに振り分けるかBIG-IPが生成したSorry画面を返す、ピーク時間にサーバを増やす、あるいはオフピーク時間にサーバを減らすなどの時間や日付に合わせた、処理を簡単に実行し、システムの効率化や運用管理の手間削減を実現する。

機能解説:
iRule実行中に現在時刻を取得するコマンドはclock secondsのみで、UNIX Time(秒数)という値になります。
clock formatのコマンドにclock secondsを渡せば、曜日や時間などに変換できます: 

clock format [clock seconds] -format {%u %H %M}

 

上記のコマンドでは%uが数字で表す曜日、%Hが24hrフォーマットの時間、%Mが分を表します。 たとえばアウトプットが「0 02 00」の場合、日曜日の午前2時という意味をします。

iRule中で管理者が設定した時刻と比較するために、次にこの文字列をTCLリストに変換します。コマンドはsplitというものを利用します:

[split [clock format [clock seconds] -format {%u %H %M}] " "] 

 

splitは最後に指定したパラメータを利用して、周りの文字をTCLリストに変換するコマンドです。 たとえば上記は" "(空白)の文字の周りの0, 02, 00をリスト化して、アウトプットが次のようになります:{ 0 02 00}

リストに変換後、lindexコマンドでリストのインデックス番号によって部分的に利用できるようになります。

まず、インデックス 0 が曜日なので、管理者が設定した曜日に比較:

if { ([lindex $l 0] eq $::Day) 

 

次にconcatコマンドで統合したインデックス1と2を開始と終了時間に比較:

set comptime "[lindex $l 1][lindex $l 2]" ・・・ ($comptime >= $::StartTime) && ($comptime <= $::StopTime)} { 

 

上記の条件を満たせば、「期間中」と判断ができるので、特別処理を実行できます。 たとえばこのサンプルでは、メインテナンス用のプールに振り分けるか、HTTP::respondで直接メンテナンスページを返すなどが実施できます。

設定概要:
RULE_INIT中のグローバル変数をそれぞれ設定:
例えば日曜日、午前2時から午前3時までであれば、下記のように設定します:

set ::Day 0
set ::StartTime 0200
set ::StopTime 0300

 

【iRule定義】



when RULE_INIT {

#曜日は数字で指定:
#
# 0 - 日曜日
# 1 - 月曜日
# 2 - 火曜日
# 3 - 水曜日
# 4 - 木曜日
# 5 - 金曜日
# 6 - 土曜日

set ::Day 0

#時間は24hrフォーマットで指定:

set ::StartTime 0200set ::StopTime 0300

#たとえばメインテンス期間中に異なるプールを利用する場合:

set ::PoolID maintenance_pool
}

when HTTP_REQUEST {
set l [split [clock format [clock seconds] -format {%u %H %M}] " "]
set comptime "[lindex $l 1][lindex $l 2]"
if { ([lindex $l 0] eq $::Day) &&
($comptime >= $::StartTime) &&
($comptime <= $::StopTime)
} {

# 期間中のロジックをif構文に入れる

pool $::PoolID

# HTTP_RESPOND 200 "Maintenance中"

}
}
}

※F5ネットワークスジャパンでは、サンプルコードについて検証を実施していますが、

お客様の使用環境における動作を保証するものではありません。

実際の使用にあたっては、必ず事前にテストを実施することを推奨します。