14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
# File 'lib/easy_eb/dns.rb', line 14
def self.create!(environment:, domain:, region: nil)
root_domain = /(?<root>\w+\.\w+)\.?$/.match(domain)&.then { |results| results[:root] }
raise "Must supply valid domain name." unless root_domain
region_flag = region && " --region #{region}"
puts hosted_zones = JSON.parse(`aws route53 list-hosted-zones`)
hosted_zone = hosted_zones.fetch("HostedZones").find { |zone| zone.fetch("Name").start_with?(root_domain) }
hosted_zone_id = hosted_zone["Id"]
puts environments = JSON.parse(`aws#{region_flag} elasticbeanstalk describe-environments --environment-names #{environment}`)
environment_cname = environments.dig("Environments", 0, "CNAME")
environment_region = /(?<region>[1-9a-z-]+).elasticbeanstalk.com$/.match(environment_cname)[:region]
change_batch = {
: "Point #{domain} to Elastic Beanstalk Environment #{environment}",
Changes: [
{
Action: :UPSERT,
ResourceRecordSet: {
Name: domain,
Type: :A,
AliasTarget: {
HostedZoneId: HOSTED_ZONES_BY_REGION[environment_region],
DNSName: environment_cname,
EvaluateTargetHealth: false
}
}
}
]
}
system(
"aws route53 change-resource-record-sets --hosted-zone-id #{hosted_zone_id} --change-batch '#{change_batch.to_json}'".tap do |command|
puts "Running… \"#{command}\""
end
)
end
|