5

EC2 在实例停止然后重新启动时会为其提供一个新的 IP 地址,因此我需要能够自动管理 route53 记录集,以便我可以一致地访问事物。遗憾的是,sdk 的 route53 部分的文档并不像 ec2 的那么健壮(可以理解),所以我有点卡住了。从到目前为止我所看到的情况来看,似乎change_resource_record_sets( link ) 是要走的路,但我对需要进入的内容感到困惑,:chages因为它提到了一个Change对象,但未能提供对所述对象的描述的链接。

这是我的代码当前的创建内容:

r53.client.change_resource_record_sets(:hosted_zone_id => 'MY_ID', :change_batch => {
    :changes => 'I DONT KNOW WHAT GOES HERE',
    :action => 'CREATE',
    :resource_record_set => {
        :name => @instance.instance_name,
        :type => 'CNAME',
        :ttl => 330,
        :value => @instance.ip_address
}})

编辑:好的,因为我在这里或在官方论坛上都没有得到任何帮助,所以我自己一直在搞砸。所以事实证明,文档简直太糟糕了。所有的值都存储在一个Change对象中,而不是在那里给出。所以它实际上看起来更像这样:

some_change = AWS::Route53::CreateRequest.new(@instance.instance_name,
                                             'CNAME',
                                             :ttl => 330,
                                             :resource_records => [
                                                 {:value => @instance.ip_address}
                                             ])

r53.client.change_resource_record_sets(:hosted_zone_id => 'MY_ZONE', :change_batch => {
    :changes => [some_change],
})
4

5 回答 5

9

文档很差,尽管它确实包含一些示例。我最初的印象是,有必要根据您的解决方案创建请求(并使用客户端对象),但还有其他选择。

可以在ResourceRecordSetCollection 参考中找到创建记录的示例,但它只比您的答案简洁一点:

rrsets = AWS::Route53::HostedZone.new(hosted_zone_id).rrsets
rrset = rrsets.create('foo.example.com.', 'A', :ttl => 300, :resource_records => [{:value => '127.0.0.1'}])

我想更新现有记录,但手头没有 hosts_zone_id。弄清楚如何最好地做到这一点花了太长时间,所以我提供以下示例,希望它可以节省其他人一些时间:

r53    = AWS::Route53.new
domain = "example.com."
fqdn   = "host." + domain
zone   = r53.hosted_zones.select { |z| z.name == domain }.first
rrset  = zone.rrsets[fqdn, 'A']
rrset.resource_records = [ { :value => "1.2.3.4" } ]
rrset.update

请注意,这假设您在 Route53 中只有一个具有该名称的区域。

于 2013-11-15T14:33:41.157 回答
6

zts 发布的方法似乎是更新记录的更好方法。但是,如果您正在更新别名记录,那么您必须使用DeleteRequest/CreateRequest作为alias_target实例属性 onResourceRecordSet似乎是只读的,即使文档没有这样列出它。

这是一种方法。请注意,别名目标的托管区域 ID(region在下面的代码中)不应是个人区域 ID,它实际上是加密的区域 ID。这似乎没有在任何地方记录,我能找到的这些 ID 的唯一参考是在雾 gem 的来源中

编辑:这现在已经转移到一个名为fog-aws的单独模块并且是最新的。

{
  "ap-northeast-1" => "Z2YN17T5R711GT",
  "ap-southeast-1" => "Z1WI8VXHPB1R38",
  "ap-southeast-2" => "Z2999QAZ9SRTIC",
  "eu-west-1"      => "Z3NF1Z3NOM5OY2",
  "eu-central-1"   => "Z215JYRZR1TBD5",
  "sa-east-1"      => "Z2ES78Y61JGQKS",
  "us-east-1"      => "Z3DZXE0Q79N41H",
  "us-west-1"      => "Z1M58G0W56PQJA",
  "us-west-2"      => "Z33MTJ483KN6FU",
}

和代码:

change_request = {
  hosted_zone_id: zone.id,
  change_batch: { changes: [] }
}

alias_target = {
  hosted_zone_id: region,
  evaluate_target_health: false
}

# Delete the record if it already exists
if rrset.exists?
  alias_target[:dns_name] = rrset.alias_target[:dns_name]
  delete_request = AWS::Route53::DeleteRequest.new(fqdn, 'A', alias_target: alias_target)

  change_request[:change_batch][:changes][0] = delete_request
  r53.client.change_resource_record_sets(change_request)
end

# Create the new record
alias_target[:dns_name] = new_alias
create_request = AWS::Route53::CreateRequest.new(fqdn, 'A', alias_target: alias_target)

change_request[:change_batch][:changes][0] = create_request
r53.client.change_resource_record_sets(change_request)
于 2014-04-03T18:03:42.063 回答
4

我破解了它,直到它起作用,这是我的结果:

除了方法/对象/属性名称之外,不要查看 ruby​​ route53 文档。这是误导,如果不是完全错误的话。相反,请查看其余文档,因为无论如何客户端只是构建了一个标准的 xml 请求。我创建简单记录的示例如下:

some_change = AWS::Route53::CreateRequest.new("foo.bar.com",
                                         'CNAME', # the type of the resource record set
                                         :ttl => 330, # The cache time to live for the current resource record set
                                         :resource_records => [
                                             {:value => "0.0.0.0"} # dependent on type
                                         ])

r53.client.change_resource_record_sets(:hosted_zone_id => 'MY_ZONE', :change_batch => {
    :changes => [some_change],
})
于 2013-06-26T21:06:50.703 回答
2

我最初使用@slippery John 所做的工作,但事实证明,这对于经常回收某些 dns 名称的现场实例来说是有问题的。我找到了一个我认为更好的解决方案,几乎和他的一样:

some_change = AWS::Route53::ChangeRequest.new("UPSERT","foo.bar.com",
                                         'CNAME', # the type of the resource record set
                                         :ttl => 330, # The cache time to live for the current resource record set
                                         :resource_records => [
                                             {:value => "0.0.0.0"} # dependent on type
                                         ])

r53.client.change_resource_record_sets(:hosted_zone_id => 'MY_ZONE', :change_batch => {
    :changes => [some_change],
})

它是故意从他的解决方案中复制的,并稍作修改。

于 2015-01-29T13:19:03.590 回答
0

对于 aws-sdk v2,它是这样的:

[72] pry(main)> r53 = Aws::Route53::Client.new
[73] pry(main)> change
=> {:action=>"UPSERT",
 :resource_record_set=>
  {:name=>"myhost.example.com",
   :resource_records=>[{:value=>"192.0.2.44"}],
   :ttl=>60,
   :type=>"A"}}
[44] pry(main)> res = r53.change_resource_record_sets(hosted_zone_id: my_zone_id, change_batch: {changes: [change]})
=> #<struct Aws::Route53::Types::ChangeResourceRecordSetsResponse
 change_info=
  #<struct Aws::Route53::Types::ChangeInfo
   id="/change/C02195391TWJO1GT9KVRV",
   status="PENDING",
   submitted_at=2020-11-03 21:39:09.41 UTC,
   comment=nil>>

有关更多信息,请参阅https://docs.aws.amazon.com/sdk-for-ruby/v2/api/Aws/Route53/Client.html#change_resource_record_sets-instance_method

于 2020-11-03T22:17:29.703 回答