Class: Fog::DNS::AWS::Real

Inherits:
Object
  • Object
show all
Includes:
AWS::CredentialFetcher::ConnectionMethods
Defined in:
lib/fog/aws/dns.rb,
lib/fog/aws/requests/dns/get_change.rb,
lib/fog/aws/requests/dns/get_hosted_zone.rb,
lib/fog/aws/requests/dns/get_health_check.rb,
lib/fog/aws/requests/dns/list_hosted_zones.rb,
lib/fog/aws/requests/dns/create_hosted_zone.rb,
lib/fog/aws/requests/dns/delete_hosted_zone.rb,
lib/fog/aws/requests/dns/list_health_checks.rb,
lib/fog/aws/requests/dns/create_health_check.rb,
lib/fog/aws/requests/dns/delete_health_check.rb,
lib/fog/aws/requests/dns/list_resource_record_sets.rb,
lib/fog/aws/requests/dns/change_resource_record_sets.rb

Instance Method Summary collapse

Methods included from AWS::CredentialFetcher::ConnectionMethods

#refresh_credentials_if_expired

Constructor Details

#initialize(options = {}) ⇒ Real

Initialize connection to Route 53 DNS service

Notes

options parameter must include values for :aws_access_key_id and :aws_secret_access_key in order to create a connection

Examples

dns = Fog::AWS::DNS.new(
  :aws_access_key_id => your_aws_access_key_id,
  :aws_secret_access_key => your_aws_secret_access_key
)

Parameters

  • options<~Hash> - config arguments for connection. Defaults to {}.

Returns

  • dns object with connection to aws.



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/fog/aws/dns.rb', line 92

def initialize(options={})

  @use_iam_profile = options[:use_iam_profile]
  setup_credentials(options)
  @instrumentor       = options[:instrumentor]
  @instrumentor_name  = options[:instrumentor_name] || 'fog.aws.dns'
  @connection_options     = options[:connection_options] || {}
  @host       = options[:host]        || 'route53.amazonaws.com'
  @path       = options[:path]        || '/'
  @persistent = options.fetch(:persistent, true)
  @port       = options[:port]        || 443
  @scheme     = options[:scheme]      || 'https'
  @version    = options[:version]     || '2013-04-01'

  @connection = Fog::XML::Connection.new("#{@scheme}://#{@host}:#{@port}#{@path}", @persistent, @connection_options)
end

Instance Method Details

#change_resource_record_sets(zone_id, change_batch, options = {}) ⇒ Object

Use this action to create or change your authoritative DNS information for a zone docs.amazonwebservices.com/Route53/latest/DeveloperGuide/RRSchanges.html#RRSchanges_API

Parameters

  • zone_id<~String> - ID of the zone these changes apply to

  • options<~Hash>

    • comment<~String> - Any comments you want to include about the change.

  • change_batch<~Array> - The information for a change request

    • changes<~Hash> -

      • action<~String> - ‘CREATE’ or ‘DELETE’

      • name<~String> - This must be a fully-specified name, ending with a final period

      • type<~String> - A | AAAA | CNAME | MX | NS | PTR | SOA | SPF | SRV | TXT

      • ttl<~Integer> - Time-to-live value - omit if using an alias record

      • weight<~Integer> - Time-to-live value - omit if using an alias record

      • set_identifier<~String> - An identifier that differentiates among multiple resource record sets that have the same combination of DNS name and type.

      • region<~String> - The Amazon EC2 region where the resource that is specified in this resource record set resides. (Latency only)

      • failover<~String> - To configure failover, you add the Failover element to two resource record sets. For one resource record set, you specify PRIMARY as the value for Failover; for the other resource record set, you specify SECONDARY.

      • geo_location<~String XML> - A complex type currently requiring XML that lets you control how Amazon Route 53 responds to DNS queries based on the geographic origin of the query.

      • health_check_id<~String> - If you want Amazon Route 53 to return this resource record set in response to a DNS query only when a health check is passing, include the HealthCheckId element and specify the ID of the applicable health check.

      • resource_records<~Array> - Omit if using an alias record

      • alias_target<~Hash> - Information about the domain to which you are redirecting traffic (Alias record sets only)

        • dns_name<~String> - The Elastic Load Balancing domain to which you want to reroute traffic

        • hosted_zone_id<~String> - The ID of the hosted zone that contains the Elastic Load Balancing domain to which you want to reroute traffic

        • evaluate_target_health<~Boolean> - Applies only to alias, weighted alias, latency alias, and failover alias resource record sets: If you set the value of EvaluateTargetHealth to true, the alias resource record sets inherit the health of the referenced resource record sets.

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • ‘ChangeInfo’<~Hash>

        • ‘Id’<~String> - The ID of the request

        • ‘Status’<~String> - status of the request - PENDING | INSYNC

        • ‘SubmittedAt’<~String> - The date and time the change was made

    • status<~Integer> - 200 when successful

Examples

Example changing a CNAME record:

change_batch_options = [
  {
    :action => "DELETE",
    :name => "foo.example.com.",
    :type => "CNAME",
    :ttl => 3600,
    :resource_records => [ "baz.example.com." ]
  },
  {
    :action => "CREATE",
    :name => "foo.example.com.",
    :type => "CNAME",
    :ttl => 3600,
    :resource_records => [ "bar.example.com." ]
  }
]

change_resource_record_sets("ABCDEFGHIJKLMN", change_batch_options)


63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/fog/aws/requests/dns/change_resource_record_sets.rb', line 63

def change_resource_record_sets(zone_id, change_batch, options = {})
  # AWS methods return zone_ids that looks like '/hostedzone/id'.  Let the caller either use
  # that form or just the actual id (which is what this request needs)
  zone_id = zone_id.sub('/hostedzone/', '')

  optional_tags = ''
  options.each do |option, value|
    case option
    when :comment
      optional_tags += "<Comment>#{value}</Comment>"
    end
  end

  #build XML
  if change_batch.count > 0

    changes = "<ChangeBatch>#{optional_tags}<Changes>"

    change_batch.each do |change_item|
      action_tag = %Q{<Action>#{change_item[:action]}</Action>}
      name_tag   = %Q{<Name>#{change_item[:name]}</Name>}
      type_tag   = %Q{<Type>#{change_item[:type]}</Type>}

      # TTL must be omitted if using an alias record
      ttl_tag = ''
      ttl_tag += %Q{<TTL>#{change_item[:ttl]}</TTL>} unless change_item[:alias_target]

      weight_tag = ''
      set_identifier_tag = ''
      region_tag = ''
      if change_item[:set_identifier]
        set_identifier_tag += %Q{<SetIdentifier>#{change_item[:set_identifier]}</SetIdentifier>}
        if change_item[:weight] # Weighted Record
          weight_tag += %Q{<Weight>#{change_item[:weight]}</Weight>}
        elsif change_item[:region] # Latency record
          region_tag += %Q{<Region>#{change_item[:region]}</Region>}
        end
      end

      failover_tag = if change_item[:failover]
        %Q{<Failover>#{change_item[:failover]}</Failover>}
      end

      geolocation_tag = if change_item[:geo_location]
        %Q{<GeoLocation>#{change_item[:geo_location]}</GeoLocation>}
      end

      resource_records = change_item[:resource_records] || []
      resource_record_tags = ''
      resource_records.each do |record|
        resource_record_tags += %Q{<ResourceRecord><Value>#{record}</Value></ResourceRecord>}
      end

      # ResourceRecords must be omitted if using an alias record
      resource_tag = ''
      resource_tag += %Q{<ResourceRecords>#{resource_record_tags}</ResourceRecords>} if resource_records.any?

      alias_target_tag = ''
      if change_item[:alias_target]
        # Accept either underscore or camel case for hash keys.
        dns_name = change_item[:alias_target][:dns_name] || change_item[:alias_target][:DNSName]
        hosted_zone_id = change_item[:alias_target][:hosted_zone_id] || change_item[:alias_target][:HostedZoneId] || AWS.hosted_zone_for_alias_target(dns_name)
        evaluate_target_health = change_item[:alias_target][:evaluate_target_health] || change_item[:alias_target][:EvaluateTargetHealth] || false
        evaluate_target_health_xml = !evaluate_target_health.nil? ? %Q{<EvaluateTargetHealth>#{evaluate_target_health}</EvaluateTargetHealth>} : ''
        alias_target_tag += %Q{<AliasTarget><HostedZoneId>#{hosted_zone_id}</HostedZoneId><DNSName>#{dns_name}</DNSName>#{evaluate_target_health_xml}</AliasTarget>}
      end

      health_check_id_tag = if change_item[:health_check_id]
        %Q{<HealthCheckId>#{change_item[:health_check_id]}</HealthCheckId>}
      end

      change_tags = %Q{<Change>#{action_tag}<ResourceRecordSet>#{name_tag}#{type_tag}#{set_identifier_tag}#{weight_tag}#{region_tag}#{failover_tag}#{geolocation_tag}#{ttl_tag}#{resource_tag}#{alias_target_tag}#{health_check_id_tag}</ResourceRecordSet></Change>}
      changes += change_tags
    end

    changes += '</Changes></ChangeBatch>'
  end

  body = %Q{<?xml version="1.0" encoding="UTF-8"?><ChangeResourceRecordSetsRequest xmlns="https://route53.amazonaws.com/doc/#{@version}/">#{changes}</ChangeResourceRecordSetsRequest>}
  request({
    :body       => body,
    :parser     => Fog::Parsers::DNS::AWS::ChangeResourceRecordSets.new,
    :expects    => 200,
    :method     => 'POST',
    :path       => "hostedzone/#{zone_id}/rrset"
  })
end

#create_health_check(ip_address, port, type, options = {}) ⇒ Object

This action creates a new health check. docs.aws.amazon.com/Route53/latest/APIReference/API_CreateHealthCheck.html

Parameters (options as symbols Hash)

  • ip_address<~String> - (optional if fqdn) The IPv4 IP address of the endpoint on which you want Amazon Route 53 to perform health checks

  • port<~Integer> - The port on the endpoint on which you want Amazon Route 53 to perform health checks

  • type<~String> - HTTP | HTTPS | HTTP_STR_MATCH | HTTPS_STR_MATCH | TCP

  • resource_path<~Stringy> - (required for all types except TCP) The path that you want Amazon Route 53 to request when performing health checks. The path can be any value for which your endpoint will return an HTTP status code of 2xx or 3xx when the endpoint is healthy

  • fqdn<~String> - (optional if ip_address) The value that you want Amazon Route 53 to pass in the Host header in all health checks except TCP health checks

  • search_string<~String> - If the value of Type is HTTP_STR_MATCH or HTTP_STR_MATCH, the string that you want Amazon Route 53 to search for in the response body from the specified resource

  • request_interval<~String> - 10 | 30 (optional) The number of seconds between the time that Amazon Route 53 gets a response from your endpoint and the time that it sends the next health-check request

  • failure_threshold<~Integer> - 1-10 (optional) The number of consecutive health checks that an endpoint must pass or fail for Amazon Route 53 to change the current status of the endpoint from unhealthy to healthy or vice versa

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • ‘HealthCheck’<~Hash>

        • ‘Id’<~String> - The ID of the request

        • ‘CallerReference’<~String> - A unique string that identifies the request and that allows failed CreateHealthCheck requests to be retried without the risk of executing the operation twice.

        • ‘HealthCheckConfig’<~Hash>

          • ‘IPAddress’

          • ‘Port’

          • ‘Type’

          • ‘ResourcePath’

          • ‘FullyQualifiedDomainName’

          • ‘RequestInterval’

          • ‘FailureThreshold’

    • status<~Integer> - 201 when successful



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/fog/aws/requests/dns/create_health_check.rb', line 35

def create_health_check(ip_address, port, type, options = {})
  version = @version
  builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do
    CreateHealthCheckRequest(:xmlns => "https://route53.amazonaws.com/doc/#{version}/") do
      CallerReference options[:caller_reference] || "#{Time.now.to_i.to_s}-#{SecureRandom.hex(6)}"
      HealthCheckConfig do
        IPAddress ip_address unless ip_address.nil?
        Port port
        Type type
        ResourcePath options[:resource_path] if options.has_key?(:resource_path)
        FullyQualifiedDomainName options[:fqdn] if options.has_key?(:fqdn)
        SearchString options[:search_string] if options.has_key?(:search_string)
        RequestInterval options[:request_interval] if options.has_key?(:request_interval)
        FailureThreshold options[:failure_threshold] if options.has_key?(:failure_threshold)
      end
    end
  end

  request({
    :body    => builder.to_xml.to_s,
    :expects => 201,
    :method  => 'POST',
    :path    => 'healthcheck',
    :parser  => Fog::Parsers::DNS::AWS::HealthCheck.new
  })
end

#create_hosted_zone(name, options = {}) ⇒ Object

Creates a new hosted zone

Parameters

  • name<~String> - The name of the domain. Must be a fully-specified domain that ends with a period

  • options<~Hash>

    • caller_ref<~String> - unique string that identifies the request & allows failed

      calls to be retried without the risk of executing the operation twice
      
    • comment<~String> -

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • ‘HostedZone’<~Hash>:

        • ‘Id’<~String> -

        • ‘Name’<~String> -

        • ‘CallerReference’<~String>

        • ‘Comment’<~String> -

      • ‘ChangeInfo’<~Hash> -

        • ‘Id’<~String>

        • ‘Status’<~String>

        • ‘SubmittedAt’<~String>

      • ‘NameServers’<~Array>

        • ‘NameServer’<~String>

    • status<~Integer> - 201 when successful



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/fog/aws/requests/dns/create_hosted_zone.rb', line 31

def create_hosted_zone(name, options = {})
  optional_tags = ''
  if options[:caller_ref]
    optional_tags += "<CallerReference>#{options[:caller_ref]}</CallerReference>"
  else
    #make sure we have a unique call reference
    caller_ref = "ref-#{rand(1000000).to_s}"
    optional_tags += "<CallerReference>#{caller_ref}</CallerReference>"
  end
  if options[:comment]
    optional_tags += "<HostedZoneConfig><Comment>#{options[:comment]}</Comment></HostedZoneConfig>"
  end

  request({
    :body    => %Q{<?xml version="1.0" encoding="UTF-8"?><CreateHostedZoneRequest xmlns="https://route53.amazonaws.com/doc/#{@version}/"><Name>#{name}</Name>#{optional_tags}</CreateHostedZoneRequest>},
    :parser  => Fog::Parsers::DNS::AWS::CreateHostedZone.new,
    :expects => 201,
    :method  => 'POST',
    :path    => "hostedzone"
  })
end

#delete_health_check(id) ⇒ Object

This action deletes a health check. docs.aws.amazon.com/Route53/latest/APIReference/API_DeleteHealthCheck.html

Parameters

  • id<~String> - Health check ID

Returns

  • response<~Excon::Response>:

    • status<~Integer> - 200 when successful



14
15
16
17
18
19
20
# File 'lib/fog/aws/requests/dns/delete_health_check.rb', line 14

def delete_health_check(id)
  request({
    :expects => 200,
    :method  => 'DELETE',
    :path    => "healthcheck/#{id}"
  })
end

#delete_hosted_zone(zone_id) ⇒ Object

Delete a hosted zone

Parameters

  • zone_id<~String> -

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • ‘ChangeInfo’<~Hash> -

        • ‘Id’<~String> The ID of the request

        • ‘Status’<~String> The current state of the hosted zone

        • ‘SubmittedAt’<~String> The date and time the change was made

    • status<~Integer> - 200 when successful



20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/fog/aws/requests/dns/delete_hosted_zone.rb', line 20

def delete_hosted_zone(zone_id)
  # AWS methods return zone_ids that looks like '/hostedzone/id'.  Let the caller either use
  # that form or just the actual id (which is what this request needs)
  zone_id = zone_id.sub('/hostedzone/', '')

  request({
    :expects => 200,
    :parser  => Fog::Parsers::DNS::AWS::DeleteHostedZone.new,
    :method  => 'DELETE',
    :path    => "hostedzone/#{zone_id}"
  })
end

#get_change(change_id) ⇒ Object

returns the current state of a change request

Parameters

  • change_id<~String>

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • ‘Id’<~String>

      • ‘Status’<~String>

      • ‘SubmittedAt’<~String>

    • status<~Integer> - 200 when successful



19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/fog/aws/requests/dns/get_change.rb', line 19

def get_change(change_id)
  # AWS methods return change_ids that looks like '/change/id'.  Let the caller either use
  # that form or just the actual id (which is what this request needs)
  change_id = change_id.sub('/change/', '')

  request({
    :expects => 200,
    :parser  => Fog::Parsers::DNS::AWS::GetChange.new,
    :method  => 'GET',
    :path    => "change/#{change_id}"
  })
end

#get_health_check(id) ⇒ Object

This action gets information about a specified health check. docs.aws.amazon.com/Route53/latest/APIReference/API_GetHealthCheck.html

Parameters

  • id<~String> - The ID of the health check

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • ‘HealthCheck’<~Hash>:

        • ‘Id’<~String> -

        • ‘CallerReference’<~String>

        • ‘HealthCheckConfig’<~Hash>:

          • ‘IPAddress’<~String> -

          • ‘Port’<~String> -

          • ‘Type’<~String> -

          • ‘ResourcePath’<~String> -

          • ‘FullyQualifiedDomainName’<~String> -

          • ‘SearchString’<~String> -

          • ‘RequestInterval’<~Integer> -

          • ‘FailureThreshold’<~String> -

        • ‘HealthCheckVersion’<~Integer> -

    • status<~Integer> - 200 when successful



30
31
32
33
34
35
36
37
# File 'lib/fog/aws/requests/dns/get_health_check.rb', line 30

def get_health_check(id)
  request({
    :expects => 200,
    :parser  => Fog::Parsers::DNS::AWS::HealthCheck.new,
    :method  => 'GET',
    :path    => "healthcheck/#{id}"
  })
end

#get_hosted_zone(zone_id) ⇒ Object

retrieve information about a hosted zone

Parameters

  • zone_id<~String> - The ID of the hosted zone

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • ‘HostedZone’<~Hash>:

        • ‘Id’<~String> -

        • ‘Name’<~String> -

        • ‘CallerReference’<~String>

        • ‘Comment’<~String> -

      • ‘NameServers’<~Array>

        • ‘NameServer’<~String>

    • status<~Integer> - 200 when successful



23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/fog/aws/requests/dns/get_hosted_zone.rb', line 23

def get_hosted_zone(zone_id)
  # AWS methods return zone_ids that looks like '/hostedzone/id'.  Let the caller either use
  # that form or just the actual id (which is what this request needs)
  zone_id = zone_id.sub('/hostedzone/', '')

  request({
    :expects => 200,
    :parser  => Fog::Parsers::DNS::AWS::GetHostedZone.new,
    :method  => 'GET',
    :path    => "hostedzone/#{zone_id}"
  })
end

#list_health_checksObject

This action gets a list of the health checks that are associated with the current AWS account. docs.aws.amazon.com/Route53/latest/APIReference/API_ListHealthChecks.html

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • ‘HealthChecks’<~Array>:

        • ‘HealthCheck’<~Hash>:

          • ‘Id’<~String> -

          • ‘CallerReference’<~String>

          • ‘HealthCheckVersion’<~Integer> -

      • ‘Marker’<~String> -

      • ‘MaxItems’<~Integer> -

      • ‘IsTruncated’<~String> -

      • ‘NextMarker’<~String>

    • status<~Integer> - 200 when successful



24
25
26
27
28
29
30
31
# File 'lib/fog/aws/requests/dns/list_health_checks.rb', line 24

def list_health_checks
  request({
    :expects => 200,
    :method  => 'GET',
    :path    => "healthcheck",
    :parser  => Fog::Parsers::DNS::AWS::ListHealthChecks.new
  })
end

#list_hosted_zones(options = {}) ⇒ Object

Describe all or specified instances

Parameters

  • options<~Hash>

    • marker<~String> - Indicates where to begin in your list of hosted zones.

    • max_items<~Integer> - The maximum number of hosted zones to be included in the response body

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • ‘HostedZones’<~Array>:

        • ‘HostedZone’<~Hash>:

          • ‘Id’<~String> -

          • ‘Name’<~String> -

          • ‘CallerReference’<~String>

          • ‘Comment’<~String> -

      • ‘Marker’<~String> -

      • ‘MaxItems’<~Integer> -

      • ‘IsTruncated’<~String> -

      • ‘NextMarker’<~String>

    • status<~Integer> - 200 when successful



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/fog/aws/requests/dns/list_hosted_zones.rb', line 28

def list_hosted_zones(options = {})
  parameters = {}
  options.each do |option, value|
    case option
    when :marker
      parameters[option] = value
    when :max_items
      parameters[:maxitems] = value
    end
  end

  request({
    :query   => parameters,
    :parser  => Fog::Parsers::DNS::AWS::ListHostedZones.new,
    :expects => 200,
    :method  => 'GET',
    :path    => "hostedzone"
  })
end

#list_resource_record_sets(zone_id, options = {}) ⇒ Object

list your resource record sets

Parameters

  • zone_id<~String> -

  • options<~Hash>

    • type<~String> -

    • name<~String> -

    • identifier<~String> -

    • max_items<~Integer> -

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • ‘ResourceRecordSet’<~Array>:

        • ‘Name’<~String> -

        • ‘Type’<~String> -

        • ‘TTL’<~Integer> -

        • ‘AliasTarget’<~Hash> -

          • ‘HostedZoneId’<~String> -

          • ‘DNSName’<~String> -

        • ‘ResourceRecords’<~Array>

          • ‘Value’<~String> -

      • ‘IsTruncated’<~String> -

      • ‘MaxItems’<~String> -

      • ‘NextRecordName’<~String>

      • ‘NextRecordType’<~String>

      • ‘NextRecordIdentifier’<~String>

    • status<~Integer> - 201 when successful



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/fog/aws/requests/dns/list_resource_record_sets.rb', line 35

def list_resource_record_sets(zone_id, options = {})
  # AWS methods return zone_ids that looks like '/hostedzone/id'.  Let the caller either use
  # that form or just the actual id (which is what this request needs)
  zone_id = zone_id.sub('/hostedzone/', '')

  parameters = {}
  options.each do |option, value|
    case option
    when :type, :name, :identifier
      parameters[option] = "#{value}"
    when :max_items
      parameters['maxitems'] = "#{value}"
    end
  end

  request({
    :query   => parameters,
    :parser  => Fog::Parsers::DNS::AWS::ListResourceRecordSets.new,
    :expects => 200,
    :method  => 'GET',
    :path    => "hostedzone/#{zone_id}/rrset"
  })
end

#reloadObject



109
110
111
# File 'lib/fog/aws/dns.rb', line 109

def reload
  @connection.reset
end