2019-05-09

ElastiCache のパラメータグループの差分をシュッと見たい

このエントリーをはてなブックマークに追加

RDS の場合だと GUI からパラメータグループの差分を見られて便利なのですが、ElastiCache にはそのような画面がない (ないよね?) ので、適当にスクリプトを書きました。

https://github.com/mozamimy/toolbox/blob/master/ruby/elasticache_param_diff/elasticache_param_diff.rb

require 'aws-sdk-elasticache'
require 'colorize'

Diff = Struct.new(:diff_type, :key, :before_value, :after_value) do
  COLORS_BY_DIFF_TYPE = {
    '+' => :green,
    '-' => :red,
    '~' => :yellow,
  }

  def to_s
    "#{diff_type} #{key}: #{before_value.inspect} => #{after_value.inspect}".colorize(COLORS_BY_DIFF_TYPE[diff_type])
  end
end

def describe_cache_parameters(pg)
  elasticache = Aws::ElastiCache::Client.new

  response = elasticache.describe_cache_parameters(
    cache_parameter_group_name: pg,
  )

  response.flat_map(&:parameters).group_by(&:parameter_name)
end

def compare(hx, hy, &block)
  diffs = []
  block ||= lambda { |v| v }

  keys_only_hx = hx.keys - hy.keys
  keys_only_hy = hy.keys - hx.keys
  keys_only_hx.each do |key|
    diffs << Diff.new(
      '-',
      key,
      block.call(hx[key]),
      nil,
    )
  end
  keys_only_hy.each do |key|
    diffs << Diff.new(
      '+',
      key,
      nil,
      block.call(hy[key]),
    )
  end

  common_keys = hx.keys & hy.keys
  common_keys.each do |key|
    before = block.call(hx[key])
    after = block.call(hy[key])
    if before != after
      diffs << Diff.new(
        '~',
        key,
        before,
        after,
      )
    end
  end

  diffs
end

source_pg = ARGV[0]
target_pg = ARGV[1]

source = describe_cache_parameters(source_pg)
target = describe_cache_parameters(target_pg)

puts compare(source, target) { |v| v[0].parameter_value }

実行すると、こんな感じで差分が出てきます。実際には色もついてきれいです。

[20:14:42]mozamimy@P1323-18P13U:elasticache_param_diff (master) (-'x'-).oO(
(ins)> ec ruby elasticache_param_diff.rb default.redis2.8 default.janai.redis2.8
~ list-max-ziplist-value: "64" => "128"
~ timeout: "0" => "86400"

みなさん一家に一台、似たようなスクリプトを書いてそうなのですが、どうしてるんでしょうね。わたし気になります。(スクリプトの内容というよりも、これを人々にたずねたかった)