昨年後半から スーツなお仕事などが入って忙しくなり、技術的なお遊びの時間が減ってたので、1年半ぶりの投稿です。
久しぶり(数年ぶり)にAWSをマジメに触ってみて、いろいろ進化してるなぁと感心してます。で、そんな中、CloudFormation を使ってみようと思ったのだけど、ちょっとした構成になると、巨大な JSONファイルになってしまって見るのがツライ…
世の中、やっぱりそう思う人は多いようで、JSONの重複キーを使ったトリッキーなコメント表現やYAML、JSON5 など、いろいろ苦労されているようです。
他にもいろんなDSLやツール類が出ていますが、進化の早いAWSでは公式のドキュメントを見ながら設定することが多いので、やっぱり公式ツールを使いつつ JSONに近い設定が出来る方が嬉しいです。
JSON拡張っぽいところで、JSON5, CSON, Jsonnet などいろいろ見てみたものの、yum くらいでさくっと入ってお手軽に使えるものがイマイチ見当たりません。自分1人で使うなら、まぁいいのですが、複数人でメンテしていくことを考えると、導入が面倒なのは避けたいところ。
はてさてどうしたものやら と思っていたんですが、単にコメントつけたいだけ っていうレベルであれば、正規表現でもそこそこ行けちゃうんじゃない? ってことで、もともと AWS SDK for Rubyを使おうかと思っていたので、Ruby で書いてみました。
require 'json'
module JSON_cfg
def self.load(file)
str = ""
file.each_line do |line|
str = str + strip_comments(line)
end
return JSON.parse(str)
end
def self.strip_comments(str)
return str.gsub(/\/\/[^'"]*$/, "\n")
end
end
いろんなケースのコメントを考えると正規表現とか面倒になるけど、これだけでもかなり幸せになりました。
もし、コメントの中で 「'」 や 「"」 を使いたいとか、「/* 〜 */」に対応したいなら、正規表現の工夫が必要です。
使い方は単純で、Ruby でJSONファイルを読み込む時に、
open(cfg_file) do |file|
result = JSON.load(file)
end
puts JSON.pretty_generate( result )
みたいにやるところを下記のように書き換えるだけ。
open(cfg_file) do |file|
result = JSON_cfg.load(file)
end
puts JSON.pretty_generate( result )
これで、例えば下記のようなコメント付きの JSONっぽいファイルを、コメントのない正しい JSONファイルに変換出来ます。
{
"name": "json_cfg", // comments..
"version": "0.0.1",
// from top..
"description": "JSON for config.",
"check": "// 消えない? "
}
{
"name": "json_cfg",
"version": "0.0.1",
"description": "JSON for config.",
"check": "// 消えない? "
}
AWS SDK for Ruby を使うなら、共通のライブラリっぽくして読み込んでおいて、load のところだけ書き換えればOKです。他にも便利系メソッド、いろいろ増やせそうですね。
Ruby なので、テンプレートっぽいもので記述をDRYにする とかも出来ると思いますが、このレベルの工夫だけでも、少し幸せになれました。ほんとにシンプルな正規表現による置換だけなので、cli の人でも ワンライナーで工夫すれば ちょっと幸せになれるんじゃないかな :-)