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