class AwsUtils::Ec2LatestImage

Public Instance Methods

releases() click to toggle source
# File lib/awsutils/ec2latestimage.rb, line 8
def releases
  @releases ||= begin
    parsed_releases =
      if opts[:ownedbyme]
        raise 'AWS_OWNER_ID not defined' unless ENV['AWS_OWNER_ID']

        require 'aws-sdk-ec2'

        ubuntu_images =
          connection.describe_images(owners: [ENV['AWS_OWNER_ID']]).images.select do |image|
            image.name =~ %r{^ubuntu\/}
          end

        ubuntu_images.map do |image|
          {
            ami: image.image_id,
            distro_version: image.name.split('/')[3].split('-')[2],
            release: image.name.split('/')[3].split('-')[5..-1].join('-'),
            type: image.name.split('/')[2] + ':' + image.root_device_type,
            arch: image.architecture,
            region: opts[:region] # overriding this because images API doesn't list a region
          }
        end
      else
        resp = JSON.parse(
          Net::HTTP.get(
            URI("http://cloud-images.ubuntu.com/locator/ec2/releasesTable?_=#{(Time.now.to_f * 1000).to_i}")
          ).sub(/\],\n\]/, "]\n]")
        )
        parse_releases_array(resp['aaData'])
      end

    parsed_releases.select do |rel|
      rel[:region] == opts[:region] &&
        rel[:distro_version] == opts[:release].to_s &&
        %w[amd64 x86_64].include?(rel[:arch])
    end
  end
end
run() click to toggle source
# File lib/awsutils/ec2latestimage.rb, line 48
def run
  print_releases
end

Private Instance Methods

connection() click to toggle source
# File lib/awsutils/ec2latestimage.rb, line 103
def connection
  @connection ||= Aws::EC2::Client.new
end
opts() click to toggle source
# File lib/awsutils/ec2latestimage.rb, line 107
def opts
  @opts ||= Optimist.options do
    opt :release, 'Ubuntu release', short: 'r', default: '16.04 LTS'
    opt :ownedbyme, 'Images owned by $AWS_OWNER_ID', short: 'o', default: false
    opt :region, 'Image region', short: 'R', default: 'us-east-1'
  end
end
parse_releases_array(releases) click to toggle source
  images_details.each_with_object({}) { |ami, m| m[ami.image_id] = ami }
end

end

# File lib/awsutils/ec2latestimage.rb, line 84
def parse_releases_array(releases)
  releases.map do |rel|
    {
      region: rel[0],
      distro_name: rel[1],
      distro_version: rel[2],
      arch: rel[3],
      type: rel[4],
      release: rel[5],
      ami: parse_ami_link(rel[6]),
      aki: rel[7]
    }
  end
end
print_releases() click to toggle source