AWS CLIのprofileをRubyで使って複数アカウントのキー管理を楽にする
こんにちは。望月です。
私は業務でたくさんの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キーを調べる必要がなくなったため、大変楽になりました。ぜひ使ってみてください。