AWS CLIのprofileをRubyで使って複数アカウントのキー管理を楽にする

2014.05.02

こんにちは。望月です。
私は業務でたくさんのAWSアカウントを扱います。そのため、--profileオプションで簡単にアクセスキーの切替ができるPython版AWS CLIは大変重宝しています。

とはいえ、少し複雑な処理になるとシェルスクリプトでは書くのが大変なことも多いため、何かしらの言語でスクリプトを書くことになることも多いと思います。私はPythonがあまり書けないため主にRubyを使うのですが、AWS CLIのprofileオプションは当然使えないので、毎回各AWSアカウントのAPIアクセスキーやシークレットキーを調べる必要があり、かなり面倒でした。

というわけで、RubyからAWS CLIのprofileを使うコードを書いてみました。以下のような形で使うことを想定しています。

$ ruby script.rb --profile default

実装

下がスクリプトを読み込む部分のRubyスクリプトです。このコードをprofile_parser.rbとして保存して下さい。AWS CLIの公式ドキュメントによると、profileで読み込むためのファイルは$AWS_CONFIG_FILE環境変数で指定する必要があるので、そのファイルの内容を取得して利用するようにします。

require 'strscan'

class ProfileParser

  # returns hash of AWS credentials
  def self.get(profile='default')
    file = ENV['AWS_CONFIG_FILE']
    raise 'Config File does not exist' unless File.exists?(file)

    result = parse(file)

    raise 'The profile is not specified in the config file' unless result.has_key?(profile)

    result[profile]
  end

  def self.parse(file)
    section = { "" => {} }
    current = section[""]
    s = StringScanner.new(File.read(file))

    while !s.eos?
      case
      when s.scan(/\s+/)
        # nothing
      when s.scan(/\[(profile\s+)?(.+?)\]/)
        # strip 'profile' from each profile key and set as section key
        section[s[2]] = current = {}
      when s.scan(/(\w+)\s*=\s*([^\n]+)/)
        # strip 'aws_' from each key
        current[s[1].sub(/^aws_/, '').to_sym] = s[2]
      else
        raise "Parse Error. I guess config file syntax is something wrong."
      end
    end

    section
  end
end

実際に利用するスクリプト側(上記の例だとscript.rb)は以下のようなコードになります。

#/usr/bin/env ruby

require './profile_parser'

ARGV.options do |opt|
    profile = "default"

    opt.on('--profile PROFILE') { |v| profile = v }

    opt.parse!
    option = ProfileParser.get(profile)
    AWS.config(option)
end

# 処理を記述...

試しに、先日のエントリで紹介したS3の容量計算スクリプトを少し改造して、--profileに対応させてみました。実行した結果が以下の通りです。

mochizukimasao $ ruby count.rb --profile default
Bucket[xxxxxxxx] :  1.01 MB
Bucket[yyyyyyyyyy] : 183.2 KB
.....

問題なく実行できていることが確認できました。

まとめ

これでコマンドライン引数からprofileを指定して実行することが可能になりました!これのおかげで逐一APIキーを調べる必要がなくなったため、大変楽になりました。ぜひ使ってみてください。