Sha256: 97ac6e0a9a6c9d59e37b1dd078013b74793c2b6e72d4fef812bec3e96d338827

Contents?: true

Size: 1.64 KB

Versions: 3

Compression:

Stored size: 1.64 KB

Contents

require 'aws-sdk'
require 'contracts'

module Audit53
  module Route53
    include Contracts

    Contract Maybe[({ region: String })] => Aws::Route53::Client
    def self.client(region: 'us-west-1')
      @client ||= Aws::Route53::Client.new region: region
    end

    Contract ({ domain: String }) => String
    def self.zone_id(domain:)
      domain += '.' unless domain.end_with? '.'
      @zone_id ||= client.list_hosted_zones
                   .hosted_zones
                   .select { |z| z.name == domain }
                   .map { |z| z.id.split('/').last }
                   .reduce
    end

    Contract ({ zone_id: String }) => ArrayOf[Aws::Route53::Types::ResourceRecordSet]
    def self.records(zone_id:)
      @records ||= client.list_resource_record_sets(hosted_zone_id: zone_id)
                   .each_page
                   .flat_map(&:resource_record_sets)
                   .reject(&:alias_target)
    end

    Contract ({ zone_id: String, type: String }) => Hash
    def self.records_subset(zone_id:, type:)
      records(zone_id: zone_id)
        .select { |r| r.type == type }
        .map { |r| { r.resource_records.first.value => r.name } }
        .reduce({}, :update)
    end

    Contract ({ zone_id: String }) => Hash
    def self.cname_ips(zone_id:)
      records_subset(zone_id: zone_id, type: 'CNAME')
        .select { |k, _| k.start_with? 'ec2' }
        .map { |k, v| { k.split('.').first.split('-').last(4).join('.') => v } }
        .reduce({}, :update)
    end

    Contract ({ zone_id: String }) => Hash
    def self.ips(zone_id:)
      records_subset(zone_id: zone_id, type: 'A"').merge cname_ips(zone_id: zone_id)
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
audit53-0.8.10 lib/audit53/route53.rb
audit53-0.8.9 lib/audit53/route53.rb
audit53-0.8.0 lib/audit53/route53.rb