如何使用aws sdk为ruby创建route53记录集?

时间:2013-06-26 14:42:27

标签: ruby amazon-web-services amazon-route53

EC2在停止然后重新启动时为实例提供新的IP地址,因此我需要能够自动管理route53记录集,以便我可以一致地访问事物。可悲的是,sdk的route53部分的文档并不像ec2那样强大(可以理解),所以我有点卡住了。从我到目前为止所看到的情况来看,似乎change_resource_record_setslink)是可行的方式,但我对于: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],
})

5 个答案:

答案 0 :(得分:9)

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

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

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'}])

我想更新现有记录,但没有托管的hosted_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中只有一个具有该名称的区域。

答案 1 :(得分:6)

zts发布的方法似乎是更新记录的更好方法。但是,如果您要更新别名记录,则必须使用DeleteRequest / CreateRequest,因为alias_target上的ResourceRecordSet实例属性似乎是只读的,即使文档不会这样列出来。

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

编辑:This has now moved到一个名为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)

答案 2 :(得分: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],
})

答案 3 :(得分:1)

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

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],
})

通过略微修改,故意从他的解决方案中复制。

答案 4 :(得分: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