これは
初老丸 Advent Calendar 2018 第 5 日目の記事になる予定です.
tl;dr
以前に以下のような記事を書きました.
AWS WAF の IPSet をコマンドラインで操作するツールを雑に作りはじめていて, その後, 放置気味だったのを改めて見直して gem 化してリリースしてみました.
wafoo | RubyGems.org | your community gem host
使い方自体は特に変わっておらず, export コマンドで指定した IPSets の IP アドレスリストを書き出して, 必要に応じて追加, 修正, 削除を行い apply コマンドで登録する流れです. 登録前に --dry-run で確認出来るので, 実際に運用する場合には --dry-run で確認してから apply という流れになると思います.
以前と変わったところ
IPSet 一覧表示
AWS SDK for Ruby のドキュメントを見ると, Aws::WAF と Aws::WAFRegional という 2 つのモジュールが提供されています. waf と waf regional の違いは, 前者が CloudFront に付与する WAF で, 後者が ELB に付与する WAF で別けられるようです. これらを一緒に一覧表示するようにしてみました.
$ bundle exec wafoo list +-------------+--------------------------------------+----------+ | Type | IPSets ID | Name | +-------------+--------------------------------------+----------+ | WAFRegional | xxxxxxxx-1234-5678-9000-xxxxxxxxxxxx | sample1 | | WAFRegional | xxxxxxxx-1234-5678-9000-yyyyyyyyyyyy | sample2 | | WAF | xxxxxxxx-1234-5678-9000-zzzzzzzzzzzz | sample3 | +-------------+--------------------------------------+----------+
とりあえず, こんな感じで.
オクテットではない CIDR boundary のサポート
従来の AWS WAF の IPSet では, IP アドレスの指定は /8, /16, /24, /32 での CIDR 指定しか出来ませんでした. その為, これらのオクテット以外の IP アドレス (例えば, /29 とか) を登録した場合には, /32に分割して登録するような処理をいれていましたが, 非オクテット CIDR boundary のサポートに伴い, この処理が不要となりました.
現在では, コメントアウトしていますが, 以下のような処理を行っていました.
...
# def split_cidr(ipset)
# addr = NetAddr::CIDR.create(ipset)
# addr.enumerate
# end
...
# unless %w(8 16 24 32).include?(ipset.split('/').last)
# ips = split_cidr(ipset)
# ipsets_array = []
# ips.each do |ip|
# ipsets_array << {
# action: 'INSERT',
# ip_set_descriptor: {
# type: 'IPV4',
# value: ip + '/32'
# }
# }
# end
# return ipsets_array
# end
...
汚いコードしか書けない自分にとっては, コードを減らせるというのはとても嬉しいです.
べた書きコードを少しずつ...
今後のメンテンスを考慮して, べた書きしていたコードを少しずつ機能毎に分割したり, テストを追加しています.
以上
wafoo の紹介でした. コマンド実行時のメッセージ出力や README の英語がアレな感じで恐縮ですが, 何卒, ご容赦ください.
よろしければ, ご利用いただきましてフィードバック等いただけると幸いです.