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

既存のレコードを更新したかったのですが、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 つしかないことを前提としていることに注意してください。

于 2013-11-15T14:33:41.157 に答える
6

zts が投稿した方法は、レコードを更新するためのはるかに優れた方法のようです。ただし、エイリアス レコードを更新する場合は、DeleteRequest/を使用する必要があります。これは、ドキュメントにそのように記載されていなくてもCreateRequestalias_targetインスタンス属性ResourceRecordSetが読み取り専用のように見えるためです。

これを行う1つの方法を次に示します。エイリアス ターゲット (region以下のコード内) のホスト ゾーン ID は個人用ゾーン ID ではないことに注意してください。実際には暗号化されたリージョン ID です。これはどこにも文書化されていないようで、私が見つけたこれらの ID の唯一の参照は、霧の宝石のソースにありました

編集:これは現在、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 に答える