예제 #1
0
 public DlgEditDnsRecord(ZAwsEc2Controller controller, ResourceRecordSet records)
 {
     InitializeComponent();
     MyController = controller;
     MyRecords    = records;
     comboBoxRecordType.SelectedIndex = 0;
 }
        public ChangeResourceRecordSetsResponse updateRRSet(
            string hostedZoneId, ResourceRecordSet oldRRset, ResourceRecordSet newRRset)
        {
            logger.Info("Calling ChangeResourceRecordSets");
            Change delete = new Change()
            {
                Action            = Action.DELETE.ToString(),
                ResourceRecordSet = oldRRset
            };
            Change create = new Change()
            {
                Action            = Action.CREATE.ToString(),
                ResourceRecordSet = newRRset
            };
            List <Change> changes = new List <Change>()
            {
                delete, create
            };

            ChangeBatch batch = new ChangeBatch()
            {
                Changes = changes
            };

            return(client.ChangeResourceRecordSets(new ChangeResourceRecordSetsRequest()
            {
                HostedZoneId = hostedZoneId,
                ChangeBatch = batch
            }));
        }
예제 #3
0
        private async Task <ChangeResourceRecordSetsResponse> createAws_A_ResourceRecords(string hostedZoneId, string hostName)
        {
            ChangeBatch changes     = new ChangeBatch();
            string      newHostName = hostName.Substring(0, hostName.Length - 1);

            logger.LogInformation($"Creating Alias Record for hosted zone { newHostName }...");

            ResourceRecordSet aliasRs = new ResourceRecordSet()
            {
                AliasTarget = new AliasTarget()
                {
                    HostedZoneId         = "Z3AQBSTGFYJSTF", //use zone id from here: https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
                    DNSName              = "s3-website-us-east-1.amazonaws.com",
                    EvaluateTargetHealth = false
                },
                Type = RRType.A,
                Name = newHostName
            };
            Change AliasRecord = new Change(ChangeAction.CREATE, aliasRs);

            changes.Changes.Add(AliasRecord);

            ChangeResourceRecordSetsRequest request = new ChangeResourceRecordSetsRequest()
            {
                ChangeBatch  = changes,
                HostedZoneId = hostedZoneId
            };

            ChangeResourceRecordSetsResponse response = await TheRoute53Client().ChangeResourceRecordSetsAsync(request);

            return(response);
        }
        private ResourceRecordSet cloneRRSetWithNewValue(ResourceRecordSet RRSet, string myIP)
        {
            ResourceRecordSet ret = new ResourceRecordSet()
            {
                AliasTarget   = RRSet.AliasTarget,
                Name          = RRSet.Name,
                SetIdentifier = RRSet.SetIdentifier,
                TTL           = RRSet.TTL,
                Type          = RRSet.Type
            };
            ResourceRecord rr = new ResourceRecord()
            {
                Value = myIP
            };

            ret.ResourceRecords = new List <ResourceRecord>()
            {
                rr
            };

            // Route53 doesn't accept zero weights, and if you set it to zero you'll get an error!
            if (RRSet.Weight != 0)
            {
                ret.Weight = RRSet.Weight;
            }
            return(ret);
        }
예제 #5
0
        public async Task <bool> UpdateIpAddressForSubdomain(string hostedZoneId, string fqdn, string newIpAddress)
        {
            using (AmazonRoute53Client route53Client = GetAmazonRoute53Client())
            {
                ListResourceRecordSetsResponse records = await route53Client.ListResourceRecordSetsAsync(new ListResourceRecordSetsRequest(hostedZoneId));

                // Look for an A record matching the FQDN that was passed in
                ResourceRecordSet matchingRecordSet = records?.ResourceRecordSets.FirstOrDefault(prop => prop.Name == fqdn && prop.Type == RRType.A);

                if (matchingRecordSet != null && matchingRecordSet.ResourceRecords.Any())
                {
                    if (matchingRecordSet.ResourceRecords.First().Value != newIpAddress)
                    {
                        matchingRecordSet.ResourceRecords.First().Value = newIpAddress;
                        ChangeBatch change = new ChangeBatch();
                        change.Changes.Add(new Change(ChangeAction.UPSERT, matchingRecordSet));

                        ChangeResourceRecordSetsResponse changeRequest = await route53Client.ChangeResourceRecordSetsAsync(new ChangeResourceRecordSetsRequest(hostedZoneId, change));

                        Log.Information("[Runtime = {StartTime}] Change request submitted to change subdomain {Subdomain} IP address to {IPAddress}.", Settings.StartTime, fqdn, newIpAddress);

                        return(changeRequest.HttpStatusCode == System.Net.HttpStatusCode.OK);
                    }
                    else
                    {
                        Log.Information("[Runtime = {StartTime}] Subdomain {Subdomain} found, but the IP address was already {IPAddress}.", Settings.StartTime, fqdn, newIpAddress);
                    }
                }

                return(false);
            }
        }
예제 #6
0
        private bool ApplyDnsChange(HostedZone zone, ResourceRecordSet recordSet, ChangeAction action)
        {
            // Prepare change as Batch
            Change changeDetails = new Change()
            {
                ResourceRecordSet = recordSet,
                Action            = action
            };

            ChangeBatch changeBatch = new ChangeBatch()
            {
                Changes = new List <Change> {
                    changeDetails
                }
            };

            // Prepare zone's resource record sets
            var recordsetRequest = new ChangeResourceRecordSetsRequest()
            {
                HostedZoneId = zone.Id,
                ChangeBatch  = changeBatch
            };

            logger.Debug($"Route53 :: ApplyDnsChange : ChangeResourceRecordSets: {recordsetRequest.ChangeBatch} ");

            var recordsetResponse = route53Client.ChangeResourceRecordSets(recordsetRequest);

            logger.Debug($"Route53 :: ApplyDnsChange : ChangeResourceRecordSets Response: {recordsetResponse} ");

            logger.Info("DNS change completed.");

            return(true);
        }
예제 #7
0
        public static void SetRoutes(FargateResourceV2 resource,
                                     FargateResourceV2 resourceNew, ELBHelper elb, Route53Helper r53, CloudWatchHelper cw)
        {
            Console.WriteLine("Fetching DNS Private Record...");
            var newPrivateRecord = r53.GetCNameRecordSet(resourceNew.ZonePrivate, resourceNew.DNSCName, throwIfNotFound: true)
                                   .Result.PrintResponse();

            Console.WriteLine($"Upserting Health Check...");
            var healthCheck = r53.UpsertCloudWatchHealthCheckAsync(
                resource.HealthCheckName,
                alarmName: resourceNew.ELBHealthyMetricAlarmName,
                alarmRegion: resource.Region,
                throwIfNotFound: false,
                insufficientDataHealthStatus: Amazon.Route53.InsufficientDataHealthStatus.Healthy,
                inverted: false
                ).Result.PrintResponse();

            ResourceRecordSet newPublicRecord = null;

            Console.WriteLine("Updating Private Route53 Record Set (PRIMARY)...");
            var t1 = r53.UpsertCNameRecordAsync(resource.ZonePrivate, resource.DNSCName, newPrivateRecord.ResourceRecords.Single().Value, ttl: resourceNew.TTL,
                                                failover: "PRIMARY", setIdentifier: "PRIMARY-PRIVATE", healthCheckId: healthCheck.Id);

            Console.WriteLine("Updating Private Route53 Record Set (SECONDARY)...");
            var t2 = r53.UpsertCNameRecordAsync(resourceNew.ZonePrivate, resource.DNSCName, newPrivateRecord.ResourceRecords.Single().Value, ttl: resourceNew.TTL,
                                                failover: "SECONDARY", setIdentifier: "SECONDARY-PRIVATE");

            if (resourceNew.IsPublic)
            {
                Console.WriteLine("Fetching DNS Public Record...");
                newPublicRecord = r53.GetCNameRecordSet(resourceNew.ZonePublic, resourceNew.DNSCName, throwIfNotFound: resourceNew.IsPublic)
                                  .Result.PrintResponse();

                Console.WriteLine("Updating Public Route53 Record Set (PRIMARY)...");
                var t3 = r53.UpsertCNameRecordAsync(resource.ZonePublic, resource.DNSCName, newPublicRecord.ResourceRecords.Single().Value, ttl: resourceNew.TTL,
                                                    failover: "PRIMARY", setIdentifier: "PRIMARY-PUBLIC", healthCheckId: healthCheck.Id);

                Console.WriteLine("Updating Public Route53 Record Set (SECONDARY)...");
                var t4 = r53.UpsertCNameRecordAsync(resourceNew.ZonePublic, resource.DNSCName, newPublicRecord.ResourceRecords.Single().Value, ttl: resourceNew.TTL,
                                                    failover: "SECONDARY", setIdentifier: "SECONDARY-PUBLIC");

                Task.WhenAll(t1, t3);
                Task.WhenAll(t2, t4);
            }

            t1.Await();
            t2.Await();

            Console.WriteLine($"Awaiting {(resource.TTL + 1) * 2} [s] for DNS route update based on TTL...");
            Thread.Sleep((resource.TTL + 1) * 2 * 1000);

            Console.WriteLine($"Awaiting Health Check Healthy Status...");
            r53.WaitForHealthCheckAsync(name: healthCheck.Id, status: Route53Helper.HealthCheckStatus.Healthy, timeout_s: resource.HealthCheckTimeout).Result.PrintResponse();

            Console.WriteLine($"Ensuring DNS Route53 Resolution into new address after Health Check change...");
            AwaitDnsUpsert(resource, resourceNew, r53, resource.DnsResolveTimeout).PrintResponse();
        }
예제 #8
0
        private static async Task UpdateResourceRecordSet(ResourceRecordSet resourceRecordSet, Domain domain)
        {
            var change = new Change(ChangeAction.UPSERT, resourceRecordSet);

            var changeBatch = new ChangeBatch(new List <Change> {
                change
            });

            var request = new ChangeResourceRecordSetsRequest(domain.HostedZoneID, changeBatch);

            //var response = await client.ChangeResourceRecordSetsAsync(request);
        }
예제 #9
0
        /// <summary>
        /// Create or change a DNS record for a hosted zone.
        /// </summary>
        /// <param name="hostedZoneId">The ID of the hosted zone that contains the resource record sets that you want to change</param>
        /// <param name="name">The name of the DNS record set.</param>
        /// <param name="type">The type of the DNS record set.</param>
        /// <param name="value">The value of the record set.</param>
        /// <param name="ttl">The time to live of the record set.</param>
        /// <param name="settings">The <see cref="Route53Settings"/> required to upload to Amazon S3.</param>
        /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
        public async Task <string> CreateResourceRecordSet(string hostedZoneId, string name, RRType type, string value, long ttl, Route53Settings settings, CancellationToken cancellationToken = default(CancellationToken))
        {
            var recordSet = new ResourceRecordSet()
            {
                Name            = name,
                TTL             = ttl,
                Type            = type,
                ResourceRecords = new List <ResourceRecord>
                {
                    new ResourceRecord {
                        Value = value
                    }
                }
            };

            var change1 = new Change()
            {
                ResourceRecordSet = recordSet,
                Action            = ChangeAction.UPSERT
            };

            var changeBatch = new ChangeBatch()
            {
                Changes = new List <Change> {
                    change1
                }
            };

            var recordsetRequest = new ChangeResourceRecordSetsRequest()
            {
                HostedZoneId = hostedZoneId,
                ChangeBatch  = changeBatch
            };



            AmazonRoute53Client client = this.GetClient(settings);
            ChangeResourceRecordSetsResponse response = await client.ChangeResourceRecordSetsAsync(recordsetRequest);

            if (response.HttpStatusCode == HttpStatusCode.OK)
            {
                await this.WaitForChange(client, response.ChangeInfo.Id, 10000, 60);

                _Log.Verbose("Updated record set");
                return(response.ChangeInfo.Id);
            }
            else
            {
                _Log.Error("Could not change resource records");
                return("");
            }
        }
예제 #10
0
        internal void DeleteRecord(ResourceRecordSet s)
        {
            ChangeResourceRecordSetsResponse resp =
                myController.route53.ChangeResourceRecordSets(new ChangeResourceRecordSetsRequest()
                                                              .WithHostedZoneId(this.ResponseData.Id)
                                                              .WithChangeBatch(new ChangeBatch()
                                                                               .WithChanges(
                                                                                   new Change()
                                                                                   .WithAction("DELETE")
                                                                                   .WithResourceRecordSet(s))));

            Thread.Sleep(2000);
            UpdateInfo();
        }
예제 #11
0
        public ChangeResourceRecordSetsResponse updateRRSet(string hostedZoneId, ResourceRecordSet oldRRset, ResourceRecordSet newRRset)
        {
            logger.Info("Calling ChangeResourceRecordSets");
            List <Change> changes = new List <Change>()
            {
                new Change().WithAction(Action.DELETE.ToString()).WithResourceRecordSet(oldRRset),
                new Change().WithAction(Action.CREATE.ToString()).WithResourceRecordSet(newRRset)
            };

            ChangeBatch batch = new ChangeBatch().WithChanges(changes.ToArray());

            return(client.ChangeResourceRecordSets(new ChangeResourceRecordSetsRequest()
                                                   .WithHostedZoneId(hostedZoneId)
                                                   .WithChangeBatch(batch)));
        }
예제 #12
0
 public void Apply(ResourceRecordSet rrset)
 {
     rrset.SetIdentifier = SetIdentifier;
     if (MultiValue.HasValue)
     {
         rrset.MultiValueAnswer = MultiValue.Value;
     }
     if (Weight.HasValue)
     {
         rrset.Weight = Weight.Value;
     }
     rrset.Failover    = Failover;
     rrset.Region      = LatencyRegion;
     rrset.GeoLocation = GeoLocation;
 }
        protected override void ProcessRecord()
        {
            base.ProcessRecord();

            ResourceRecordSet rrset = new ResourceRecordSet
            {
                Kind    = "dns#resourceRecordSet",
                Name    = Name,
                Rrdatas = Rrdata,
                Ttl     = Ttl,
                Type    = Type
            };

            WriteObject(rrset);
        }
예제 #14
0
        private static void CreateHostedZone(IAmazonRoute53 r53Client, string domainName)
        {
            var zoneRequest = new CreateHostedZoneRequest
            {
                Name            = domainName,
                CallerReference = "testingss"
            };

            var zoneResponse = r53Client.CreateHostedZone(zoneRequest);
            var recordSet    = new ResourceRecordSet
            {
                Name            = domainName,
                TTL             = 60,
                Type            = RRType.A,
                ResourceRecords = new List <ResourceRecord> {
                    new ResourceRecord {
                        Value = IpAddress
                    }
                }
            };

            var change1 = new Change
            {
                ResourceRecordSet = recordSet,
                Action            = ChangeAction.CREATE
            };

            var changeBatch = new ChangeBatch
            {
                Changes = new List <Change> {
                    change1
                }
            };

            var recordsetRequest = new ChangeResourceRecordSetsRequest
            {
                HostedZoneId = zoneResponse.HostedZone.Id,
                ChangeBatch  = changeBatch
            };

            var recordsetResponse = r53Client.ChangeResourceRecordSets(recordsetRequest);
            var changeRequest     = new GetChangeRequest
            {
                Id = recordsetResponse.ChangeInfo.Id
            };

            Console.WriteLine(changeRequest);
        }
예제 #15
0
        private ResourceRecordSet cloneRRSetWithNewValue(ResourceRecordSet RRSet, string myIP)
        {
            ResourceRecordSet ret = new ResourceRecordSet()
                                    .WithAliasTarget(RRSet.AliasTarget)
                                    .WithName(RRSet.Name)
                                    .WithSetIdentifier(RRSet.SetIdentifier)
                                    .WithTTL(RRSet.TTL)
                                    .WithType(RRSet.Type)
                                    .WithResourceRecords(new List <ResourceRecord>()
            {
                new ResourceRecord().WithValue(myIP)
            });

            // Route53 doesn't accept zero weights, and if you set it to zero you'll get an error!
            return(RRSet.Weight != 0 ? ret.WithWeight(RRSet.Weight) : ret);
        }
예제 #16
0
        private async Task <bool> ApplyDnsChange(HostedZone zone, ResourceRecordSet recordSet, ChangeAction action)
        {
            // prepare change
            var changeDetails = new Change()
            {
                ResourceRecordSet = recordSet,
                Action            = action
            };

            var changeBatch = new ChangeBatch()
            {
                Changes = new List <Change> {
                    changeDetails
                }
            };

            // Update the zone's resource record sets
            var recordsetRequest = new ChangeResourceRecordSetsRequest()
            {
                HostedZoneId = zone.Id,
                ChangeBatch  = changeBatch
            };

            _log?.Debug($"Route53 :: ApplyDnsChange : ChangeResourceRecordSetsAsync: {JsonConvert.SerializeObject(recordsetRequest.ChangeBatch)} ");

            var recordsetResponse = await _route53Client.ChangeResourceRecordSetsAsync(recordsetRequest);

            _log?.Debug($"Route53 :: ApplyDnsChange : ChangeResourceRecordSetsAsync Response: {JsonConvert.SerializeObject(recordsetResponse)} ");

            // Monitor the change status
            var changeRequest = new GetChangeRequest()
            {
                Id = recordsetResponse.ChangeInfo.Id
            };

            while (ChangeStatus.PENDING == (await _route53Client.GetChangeAsync(changeRequest)).ChangeInfo.Status)
            {
                System.Diagnostics.Debug.WriteLine("DNS change is pending.");
                await Task.Delay(1500);
            }

            _log?.Information("DNS change completed.");

            return(true);
        }
예제 #17
0
        public void copyNsRecordsFromSubDomainToParentDomain(string fullSubDomainName, string parentName)
        {
            Task <ListHostedZonesResponse> ListOfHostedZones = listAwsHostedZonesAsync();

            ListOfHostedZones.Wait();

            HostedZone subZone    = ListOfHostedZones.Result.HostedZones.Find(h => h.Name == $"{ fullSubDomainName }.");
            HostedZone parentZone = ListOfHostedZones.Result.HostedZones.Find(h => h.Name == $"{ parentName }.");

            Task <ListResourceRecordSetsResponse> getResourceRecords = getAwsResourceRecordsAsync(subZone.Id);

            getResourceRecords.Wait();
            ResourceRecordSet rrs = getResourceRecords.Result.ResourceRecordSets.Find(r => r.Name == $"{ fullSubDomainName }." && r.Type == RRType.NS);


            Task <ChangeResourceRecordSetsResponse> ResourceResponse = createAws_NS_ResourceRecords(parentZone.Id, fullSubDomainName, rrs);

            ResourceResponse.Wait();
        }
예제 #18
0
        public async Task HandleInitR53(Instance inst, Dictionary <string, string> tags)
        {
            _logger.LogInformation("Handling CREATING R53 records");

            var r53Spec    = ResolveR53Spec(inst, tags);
            var r53Routing = ResolveR53RoutingSpec(inst, tags);

            var rrset = new ResourceRecordSet
            {
                Name            = r53Spec.Name,
                Type            = RRType.FindValue(r53Spec.Type),
                TTL             = r53Spec.TTL,
                ResourceRecords = new List <ResourceRecord>
                {
                    new ResourceRecord(r53Spec.Value),
                },
            };

            // Optional routing policy configuration
            r53Routing?.Apply(rrset);

            var changeRequ = new ChangeResourceRecordSetsRequest
            {
                HostedZoneId = r53Spec.Zone,
                ChangeBatch  = new ChangeBatch
                {
                    Changes = new List <Change>
                    {
                        new Change
                        {
                            Action            = ChangeAction.UPSERT,
                            ResourceRecordSet = rrset,
                        }
                    }
                }
            };

            var changeResp = await _r53.ChangeResourceRecordSetsAsync(changeRequ);

            _logger.LogInformation("UPSERT request completed, response:");
            _logger.LogInformation(JsonSerializer.Serialize(changeResp));
        }
        internal void Update(string hostname, IPAddress ipAddress)
        {
            var lhzTask = route53Client.ListHostedZonesAsync();

            ResourceRecord    resourceRecord    = new ResourceRecord(ipAddress.ToString());
            ResourceRecordSet resourceRecordSet = new ResourceRecordSet
            {
                Name            = hostname,
                TTL             = 30,
                Type            = RRType.A,
                ResourceRecords = new List <ResourceRecord> {
                    resourceRecord
                }
            };
            Change change = new Change
            {
                Action            = ChangeAction.UPSERT,
                ResourceRecordSet = resourceRecordSet
            };
            ChangeBatch changeBatch = new ChangeBatch
            {
                Changes = new List <Change> {
                    change
                },
                Comment = DateTime.UtcNow.ToString("s", System.Globalization.CultureInfo.InvariantCulture)
            };

            // This is wrong and does The Wrong Thing, I'm fairly certain
            string domain       = DomainName.Parse(hostname).Domain;
            var    zones        = lhzTask.Result.HostedZones;
            string hostedZoneId = zones.Single(z => z.Name.StartsWith(domain)).Id;

            ChangeResourceRecordSetsRequest request = new ChangeResourceRecordSetsRequest
            {
                ChangeBatch  = changeBatch,
                HostedZoneId = hostedZoneId
            };

            var crrsTask = route53Client.ChangeResourceRecordSetsAsync(request);
            var response = crrsTask.Result;
        }
예제 #20
0
        private async static Task <bool> UpdateIpAddressForSubdomain(string hostedZoneId, string fqdn, string newIpAddress)
        {
            AmazonRoute53Config config = new AmazonRoute53Config()
            {
                RegionEndpoint = RegionEndpoint.GetBySystemName(Settings.AWSRegion) // TODO: inject
            };

            using (AmazonRoute53Client route53Client = new AmazonRoute53Client(Settings.AWSAccessKeyId, Settings.AWSAccessKeySecret, config))
            {
                ListResourceRecordSetsResponse records = await route53Client.ListResourceRecordSetsAsync(new ListResourceRecordSetsRequest(hostedZoneId));

                ResourceRecordSet matchingRecordSet = records?.ResourceRecordSets.FirstOrDefault(prop => prop.Name == fqdn && prop.Type == RRType.A);

                if (matchingRecordSet != null && matchingRecordSet.ResourceRecords.FirstOrDefault() != null)
                {
                    if (matchingRecordSet.ResourceRecords.FirstOrDefault().Value != newIpAddress)
                    {
                        matchingRecordSet.ResourceRecords.FirstOrDefault().Value = newIpAddress;
                        ChangeBatch change = new ChangeBatch();
                        change.Changes.Add(new Change(ChangeAction.UPSERT, matchingRecordSet));

                        ChangeResourceRecordSetsResponse changeRequest = await route53Client.ChangeResourceRecordSetsAsync(new ChangeResourceRecordSetsRequest(hostedZoneId, change));

                        Log.Information("[Runtime = {StartTime}] Change request submitted to change subdomain {Subdomain} IP address to {IPAddress}.", startTime, fqdn, newIpAddress);

                        return(changeRequest.HttpStatusCode == System.Net.HttpStatusCode.OK);
                    }
                    else
                    {
                        Log.Information("[Runtime = {StartTime}] Subdomain {Subdomain} found, but the IP address was already {IPAddress}.", startTime, fqdn, newIpAddress);
                    }
                }
                else
                {
                    // New subdomain
                    Log.Information("[Runtime = {StartTime}] Subdomain {Subdomain} record not found.", startTime, fqdn);
                }

                return(false);
            }
        }
예제 #21
0
        public static void UpdateRoute53Record(string hostname, IPAddress newIp)
        {
            var route53Client = new AmazonRoute53Client(
                Settings.AwsAccessKeyId,
                Settings.AwsSecretAccessKey,
                Amazon.RegionEndpoint.USEast1);

            var recordSet = new ResourceRecordSet
            {
                Name            = hostname,
                TTL             = 60,
                Type            = RRType.A,
                ResourceRecords = new List <ResourceRecord>
                {
                    new ResourceRecord {
                        Value = newIp.ToString()
                    }
                }
            };

            var changeBatch = new ChangeBatch
            {
                Changes = new List <Change>
                {
                    new Change
                    {
                        ResourceRecordSet = recordSet,
                        Action            = ChangeAction.UPSERT
                    }
                }
            };

            var recordsetRequest = new ChangeResourceRecordSetsRequest
            {
                HostedZoneId = Settings.HostedZoneId,
                ChangeBatch  = changeBatch
            };

            route53Client.ChangeResourceRecordSets(recordsetRequest);
        }
예제 #22
0
        private ChangeResourceRecordSetsRequest GetChangeResourceRecordSetsRequest(string hostname, string ipAddress, string action, List <HostedZone> zones)
        {
            string domain       = DomainName.Parse(hostname).Domain;
            string hostedZoneId = zones.Single(z => z.Name.StartsWith(domain)).Id;

            var record = new ResourceRecord()
            {
                Value = ipAddress
            };

            var recordSet = new ResourceRecordSet()
            {
                Name            = hostname,
                TTL             = 300,                             //5 min.
                Type            = DnsRecordType.A,
                ResourceRecords = new List <ResourceRecord> {
                    record
                }
            };

            var change = new Change()
            {
                Action = action, ResourceRecordSet = recordSet
            };

            var request = new ChangeResourceRecordSetsRequest()
            {
                ChangeBatch = new ChangeBatch()
                {
                    Changes = new List <Change> {
                        change
                    },
                    Comment = string.Format("Automatically updated by {0}", this.ToString())
                },
                HostedZoneId = hostedZoneId
            };

            return(request);
        }
예제 #23
0
 internal bool AddRecord(ResourceRecordSet s)
 {
     try
     {
         ChangeResourceRecordSetsResponse resp =
             myController.route53.ChangeResourceRecordSets(new ChangeResourceRecordSetsRequest()
                                                           .WithHostedZoneId(this.ResponseData.Id)
                                                           .WithChangeBatch(new ChangeBatch()
                                                                            .WithChanges(
                                                                                new Change()
                                                                                .WithAction("CREATE")
                                                                                .WithResourceRecordSet(s))));
         Thread.Sleep(2000);
         UpdateInfo();
         return(true);
     }
     catch (Exception ex)
     {
         Program.TraceLine("Failed adding a recordset, reason: ", ex);
         return(false);
     }
 }
예제 #24
0
        public async Task <ResourceRecordSet> CreateTxtRecord(string projectId, ManagedZone zone, string name, string value)
        {
            if (!name.EndsWith("."))
            {
                name += ".";
            }

            var body = new ResourceRecordSet();

            body.Kind    = "dns#resourceRecordSet";
            body.Name    = name;
            body.Type    = "TXT";
            body.Ttl     = 0;
            body.Rrdatas = new List <string>()
            {
                "\"" + value + "\""
            };

            var request = _client.Projects.ManagedZones.Rrsets.Create(body, projectId, zone.Name);

            return(await request.ExecuteAsync());
        }
예제 #25
0
        public async Task ProcessRecord(string zoneId, ResourceRecordSet record, Amazon.EC2.Model.Instance instance,
                                        bool enabled,
                                        string name,
                                        long ttl,
                                        string address)
        {
            if (!enabled)
            {
                if (record == null)
                {
                    Log($"No need to destroy, record '{name}' does not exists for zone '{zoneId}'. Tags Origin: EC2 Instance {instance.InstanceId} ({instance.GetTagValueOrDefault("Name")})");
                    return; //no need to update, record does not exist
                }
                else
                {
                    Log($"Destroying record {record.Name} linked to EC2 Instance {instance.InstanceId} ({instance.GetTagValueOrDefault("Name")})...");
                    await _R53.DestroyRecord(zoneId, record.Name, record.Type);
                }

                return;
            }

            if (record?.Type == RRType.A &&
                record?.ResourceRecords.Any(r => r.Value == address) == true &&
                record?.TTL == ttl)
            {
                Log($"Correct record already exists for EC2 Instance {instance.InstanceId} ({instance.GetTagValueOrDefault("Name")})");
                return; //no need to update, correct record already exists
            }

            Log($"Updating record of EC2 Instance {instance.InstanceId} ({instance.GetTagValueOrDefault("Name")}), Old Record Name: '{record?.Name}'...");
            await _R53.UpsertRecordAsync(
                zoneId : zoneId,
                Name : name,
                Value : address,
                Type : RRType.A,
                TTL : ttl);
        }
예제 #26
0
        public static async Task Create(this HostedZone zone, Credentials credentials)
        {
            var client = credentials.CreateClient();

            //[3] Create a resource record set change batch
            var recordSet = new ResourceRecordSet {
                Name            = zone.Name,
                TTL             = 60,
                Type            = RRType.A,
                ResourceRecords = new List <ResourceRecord> {
                    new ResourceRecord {
                        Value = "192.0.2.235"
                    }
                }
            };

            var change1 = new Change {
                ResourceRecordSet = recordSet,
                Action            = ChangeAction.CREATE
            };

            var changeBatch = new ChangeBatch {
                Changes = new List <Change> {
                    change1
                }
            };

            //[4] Update the zone's resource record sets
            var recordsetRequest = new ChangeResourceRecordSetsRequest {
                HostedZoneId = zone.Id,
                ChangeBatch  = changeBatch
            };

            var recordsetResponse = client.ChangeResourceRecordSets(recordsetRequest);

            var status = await recordsetResponse.ChangeInfo.WaitForStatusAync(credentials);
        }
예제 #27
0
        private static void CreateRecordSet(IAmazonRoute53 r53Client)
        {
            var objRecord = new ResourceRecord {
                Value = "Your IP Address"
            };

            var objRecordSet = new ResourceRecordSet
            {
                Name = Fqdn,
                Type = "A",
                TTL  = 300
            };

            objRecordSet.ResourceRecords.Add(objRecord);

            var objChange = new Change
            {
                Action            = ChangeAction.UPSERT,
                ResourceRecordSet = objRecordSet
            };

            var objChangeList = new List <Change> {
                objChange
            };

            var objChangeBatch = new ChangeBatch {
                Changes = objChangeList
            };

            var objRequest = new ChangeResourceRecordSetsRequest
            {
                HostedZoneId = Zoneid,
                ChangeBatch  = objChangeBatch
            };

            r53Client.ChangeResourceRecordSets(objRequest);
        }
예제 #28
0
        public async Task <ActionResult> CreateRecord(DnsRecord request)
        {
            // https://docs.aws.amazon.com/sdk-for-net/v2/developer-guide/route53-apis-intro.html
            // find zone
            var zone = await ResolveMatchingZone(request);

            if (zone != null)
            {
                // get existing record set for current TXT records with this name
                var response = await _route53Client.ListResourceRecordSetsAsync(
                    new ListResourceRecordSetsRequest
                {
                    StartRecordName = request.RecordName,
                    StartRecordType = "TXT",
                    MaxItems        = "1",
                    HostedZoneId    = zone.Id
                }
                    );

                var targetRecordSet = response.ResourceRecordSets.FirstOrDefault(r => (r.Name == request.RecordName || r.Name == request.RecordName + ".") && r.Type.Value == "TXT");

                if (targetRecordSet != null)
                {
                    targetRecordSet.ResourceRecords.Add(
                        new ResourceRecord {
                        Value = "\"" + request.RecordValue + "\""
                    }
                        );
                }
                else
                {
                    targetRecordSet = new ResourceRecordSet()
                    {
                        Name            = request.RecordName,
                        TTL             = 5,
                        Type            = RRType.TXT,
                        ResourceRecords = new List <ResourceRecord>
                        {
                            new ResourceRecord {
                                Value = "\"" + request.RecordValue + "\""
                            }
                        }
                    };
                }

                try
                {
                    // requests for *.domain.com + domain.com use the same TXT record name, so we
                    // need to allow multiple entires rather than doing Upsert
                    var result = await ApplyDnsChange(zone, targetRecordSet, ChangeAction.UPSERT);

                    return(new ActionResult {
                        IsSuccess = true, Message = $"Dns Record Created/Updated: {request.RecordName}"
                    });
                }
                catch (AmazonRoute53Exception exp)
                {
                    return(new ActionResult {
                        IsSuccess = false, Message = $"Dns Record Create/Update: {request.RecordName} - {exp.Message}"
                    });
                }
            }
            else
            {
                return(new ActionResult {
                    IsSuccess = false, Message = "DNS Zone match could not be determined."
                });
            }
        }
예제 #29
0
        public void TestRoute53()
        {
            var geoLocations = Client.ListGeoLocations(new ListGeoLocationsRequest()).GeoLocationDetailsList;

            Assert.IsNotNull(geoLocations);
            Assert.AreNotEqual(0, geoLocations.Count);

            CreateHostedZoneRequest createRequest = new CreateHostedZoneRequest
            {
                Name             = ZONE_NAME,
                CallerReference  = CALLER_REFERENCE,
                HostedZoneConfig = new HostedZoneConfig {
                    Comment = COMMENT
                }
            };
            // Create Hosted Zone
            var response = Client.CreateHostedZone(createRequest);

            createdZoneId       = response.HostedZone.Id;
            createdZoneChangeId = response.ChangeInfo.Id;

            assertValidCreatedHostedZone(response.HostedZone);
            assertValidDelegationSet(response.DelegationSet);
            assertValidChangeInfo(response.ChangeInfo);
            Assert.IsNotNull(response.Location);


            // Get Hosted Zone
            GetHostedZoneRequest getRequest = new GetHostedZoneRequest {
                Id = createdZoneId
            };
            var getHostedZoneResponse = Client.GetHostedZone(getRequest);

            assertValidDelegationSet(getHostedZoneResponse.DelegationSet);
            assertValidCreatedHostedZone(getHostedZoneResponse.HostedZone);


            // List Hosted Zones
            List <HostedZone> hostedZones = Client.ListHostedZones().HostedZones;

            Assert.IsTrue(hostedZones.Count > 0);
            foreach (HostedZone hostedZone in hostedZones)
            {
                Assert.IsNotNull(hostedZone.CallerReference);
                Assert.IsNotNull(hostedZone.Id);
                Assert.IsNotNull(hostedZone.Name);
            }


            // List Resource Record Sets
            ListResourceRecordSetsRequest listRequest = new ListResourceRecordSetsRequest {
                HostedZoneId = createdZoneId, MaxItems = "10"
            };
            List <ResourceRecordSet> resourceRecordSets = Client.ListResourceRecordSets(listRequest).ResourceRecordSets;

            Assert.IsTrue(resourceRecordSets.Count > 0);
            ResourceRecordSet existingResourceRecordSet = resourceRecordSets[0];

            foreach (ResourceRecordSet rrset in resourceRecordSets)
            {
                Assert.IsNotNull(rrset.Name);
                Assert.IsNotNull(rrset.Type);
                Assert.IsNotNull(rrset.TTL);
                Assert.IsTrue(rrset.ResourceRecords.Count > 0);
            }


            // Get Change
            ChangeInfo changeInfo = Client.GetChange(new GetChangeRequest {
                Id = createdZoneChangeId
            }).ChangeInfo;

            Assert.IsTrue(changeInfo.Id.EndsWith(createdZoneChangeId));
            assertValidChangeInfo(changeInfo);


            // Change Resource Record Sets
            ResourceRecordSet newResourceRecordSet = new ResourceRecordSet
            {
                Name            = ZONE_NAME,
                ResourceRecords = existingResourceRecordSet.ResourceRecords,
                TTL             = existingResourceRecordSet.TTL + 100,
                Type            = existingResourceRecordSet.Type,
                HealthCheckId   = null
            };

            changeInfo = Client.ChangeResourceRecordSets(new ChangeResourceRecordSetsRequest
            {
                HostedZoneId = createdZoneId,
                ChangeBatch  = new ChangeBatch
                {
                    Comment = COMMENT,
                    Changes = new List <Change>
                    {
                        new Change {
                            Action = "DELETE", ResourceRecordSet = existingResourceRecordSet
                        },
                        new Change {
                            Action = "CREATE", ResourceRecordSet = newResourceRecordSet
                        }
                    }
                }
            }).ChangeInfo;

            assertValidChangeInfo(changeInfo);

            // Delete Hosted Zone
            DeleteHostedZoneResult deleteHostedZoneResult = Client.DeleteHostedZone(new DeleteHostedZoneRequest {
                Id = createdZoneId
            });

            assertValidChangeInfo(deleteHostedZoneResult.ChangeInfo);
        }
        public IRequest Marshall(ChangeResourceRecordSetsRequest changeResourceRecordSetsRequest)
        {
            IRequest request = new DefaultRequest(changeResourceRecordSetsRequest, "AmazonRoute53");



            request.HttpMethod = "POST";

            string uriResourcePath = "/2012-12-12/hostedzone/{Id}/rrset/";

            uriResourcePath = uriResourcePath.Replace("{Id}", changeResourceRecordSetsRequest.HostedZoneId ?? "");

            if (uriResourcePath.Contains("?"))
            {
                string queryString = uriResourcePath.Substring(uriResourcePath.IndexOf("?") + 1);
                uriResourcePath = uriResourcePath.Substring(0, uriResourcePath.IndexOf("?"));

                foreach (string s in queryString.Split('&', ';'))
                {
                    string[] nameValuePair = s.Split('=');
                    if (nameValuePair.Length == 2 && nameValuePair[1].Length > 0)
                    {
                        request.Parameters.Add(nameValuePair[0], nameValuePair[1]);
                    }
                    else
                    {
                        request.Parameters.Add(nameValuePair[0], null);
                    }
                }
            }

            request.ResourcePath = uriResourcePath;


            StringWriter  stringWriter = new StringWriter();
            XmlTextWriter xmlWriter    = new XmlTextWriter(stringWriter);

            xmlWriter.Namespaces = true;


            xmlWriter.WriteStartElement("ChangeResourceRecordSetsRequest", "https://route53.amazonaws.com/doc/2012-12-12/");
            if (changeResourceRecordSetsRequest != null)
            {
                ChangeBatch changeBatchChangeBatch = changeResourceRecordSetsRequest.ChangeBatch;
                if (changeBatchChangeBatch != null)
                {
                    xmlWriter.WriteStartElement("ChangeBatch", "https://route53.amazonaws.com/doc/2012-12-12/");
                    if (changeBatchChangeBatch.IsSetComment())
                    {
                        xmlWriter.WriteElementString("Comment", "https://route53.amazonaws.com/doc/2012-12-12/", changeBatchChangeBatch.Comment.ToString());
                    }

                    if (changeBatchChangeBatch != null)
                    {
                        List <Change> changeBatchChangeBatchchangesList = changeBatchChangeBatch.Changes;
                        if (changeBatchChangeBatchchangesList != null && changeBatchChangeBatchchangesList.Count > 0)
                        {
                            int changeBatchChangeBatchchangesListIndex = 1;
                            xmlWriter.WriteStartElement("Changes", "https://route53.amazonaws.com/doc/2012-12-12/");
                            foreach (Change changeBatchChangeBatchchangesListValue in changeBatchChangeBatchchangesList)
                            {
                                xmlWriter.WriteStartElement("Change", "https://route53.amazonaws.com/doc/2012-12-12/");
                                if (changeBatchChangeBatchchangesListValue.IsSetAction())
                                {
                                    xmlWriter.WriteElementString("Action", "https://route53.amazonaws.com/doc/2012-12-12/", changeBatchChangeBatchchangesListValue.Action.ToString());
                                }
                                if (changeBatchChangeBatchchangesListValue != null)
                                {
                                    ResourceRecordSet resourceRecordSetResourceRecordSet = changeBatchChangeBatchchangesListValue.ResourceRecordSet;
                                    if (resourceRecordSetResourceRecordSet != null)
                                    {
                                        xmlWriter.WriteStartElement("ResourceRecordSet", "https://route53.amazonaws.com/doc/2012-12-12/");
                                        if (resourceRecordSetResourceRecordSet.IsSetName())
                                        {
                                            xmlWriter.WriteElementString("Name", "https://route53.amazonaws.com/doc/2012-12-12/", resourceRecordSetResourceRecordSet.Name.ToString());
                                        }
                                        if (resourceRecordSetResourceRecordSet.IsSetType())
                                        {
                                            xmlWriter.WriteElementString("Type", "https://route53.amazonaws.com/doc/2012-12-12/", resourceRecordSetResourceRecordSet.Type.ToString());
                                        }
                                        if (resourceRecordSetResourceRecordSet.IsSetSetIdentifier())
                                        {
                                            xmlWriter.WriteElementString("SetIdentifier", "https://route53.amazonaws.com/doc/2012-12-12/", resourceRecordSetResourceRecordSet.SetIdentifier.ToString());
                                        }
                                        if (resourceRecordSetResourceRecordSet.IsSetWeight())
                                        {
                                            xmlWriter.WriteElementString("Weight", "https://route53.amazonaws.com/doc/2012-12-12/", resourceRecordSetResourceRecordSet.Weight.ToString());
                                        }
                                        if (resourceRecordSetResourceRecordSet.IsSetRegion())
                                        {
                                            xmlWriter.WriteElementString("Region", "https://route53.amazonaws.com/doc/2012-12-12/", resourceRecordSetResourceRecordSet.Region.ToString());
                                        }
                                        if (resourceRecordSetResourceRecordSet.IsSetFailover())
                                        {
                                            xmlWriter.WriteElementString("Failover", "https://route53.amazonaws.com/doc/2012-12-12/", resourceRecordSetResourceRecordSet.Failover.ToString());
                                        }
                                        if (resourceRecordSetResourceRecordSet.IsSetTTL())
                                        {
                                            xmlWriter.WriteElementString("TTL", "https://route53.amazonaws.com/doc/2012-12-12/", resourceRecordSetResourceRecordSet.TTL.ToString());
                                        }

                                        if (resourceRecordSetResourceRecordSet != null)
                                        {
                                            List <ResourceRecord> resourceRecordSetResourceRecordSetresourceRecordsList = resourceRecordSetResourceRecordSet.ResourceRecords;
                                            if (resourceRecordSetResourceRecordSetresourceRecordsList != null && resourceRecordSetResourceRecordSetresourceRecordsList.Count > 0)
                                            {
                                                int resourceRecordSetResourceRecordSetresourceRecordsListIndex = 1;
                                                xmlWriter.WriteStartElement("ResourceRecords", "https://route53.amazonaws.com/doc/2012-12-12/");
                                                foreach (ResourceRecord resourceRecordSetResourceRecordSetresourceRecordsListValue in resourceRecordSetResourceRecordSetresourceRecordsList)
                                                {
                                                    xmlWriter.WriteStartElement("ResourceRecord", "https://route53.amazonaws.com/doc/2012-12-12/");
                                                    if (resourceRecordSetResourceRecordSetresourceRecordsListValue.IsSetValue())
                                                    {
                                                        xmlWriter.WriteElementString("Value", "https://route53.amazonaws.com/doc/2012-12-12/", resourceRecordSetResourceRecordSetresourceRecordsListValue.Value.ToString());
                                                    }
                                                    xmlWriter.WriteEndElement();


                                                    resourceRecordSetResourceRecordSetresourceRecordsListIndex++;
                                                }
                                                xmlWriter.WriteEndElement();
                                            }
                                        }
                                        if (resourceRecordSetResourceRecordSet != null)
                                        {
                                            AliasTarget aliasTargetAliasTarget = resourceRecordSetResourceRecordSet.AliasTarget;
                                            if (aliasTargetAliasTarget != null)
                                            {
                                                xmlWriter.WriteStartElement("AliasTarget", "https://route53.amazonaws.com/doc/2012-12-12/");
                                                if (aliasTargetAliasTarget.IsSetHostedZoneId())
                                                {
                                                    xmlWriter.WriteElementString("HostedZoneId", "https://route53.amazonaws.com/doc/2012-12-12/", aliasTargetAliasTarget.HostedZoneId.ToString());
                                                }
                                                if (aliasTargetAliasTarget.IsSetDNSName())
                                                {
                                                    xmlWriter.WriteElementString("DNSName", "https://route53.amazonaws.com/doc/2012-12-12/", aliasTargetAliasTarget.DNSName.ToString());
                                                }
                                                if (aliasTargetAliasTarget.IsSetEvaluateTargetHealth())
                                                {
                                                    xmlWriter.WriteElementString("EvaluateTargetHealth", "https://route53.amazonaws.com/doc/2012-12-12/", aliasTargetAliasTarget.EvaluateTargetHealth.ToString().ToLower());
                                                }
                                                xmlWriter.WriteEndElement();
                                            }
                                        }
                                        if (resourceRecordSetResourceRecordSet.IsSetHealthCheckId())
                                        {
                                            xmlWriter.WriteElementString("HealthCheckId", "https://route53.amazonaws.com/doc/2012-12-12/", resourceRecordSetResourceRecordSet.HealthCheckId.ToString());
                                        }
                                        xmlWriter.WriteEndElement();
                                    }
                                }
                                xmlWriter.WriteEndElement();


                                changeBatchChangeBatchchangesListIndex++;
                            }
                            xmlWriter.WriteEndElement();
                        }
                    }
                    xmlWriter.WriteEndElement();
                }
            }

            xmlWriter.WriteEndElement();


            try
            {
                request.Content = System.Text.Encoding.UTF8.GetBytes(stringWriter.ToString());
                request.Headers.Add("Content-Type", "application/xml");
            }
            catch (EncoderFallbackException e)
            {
                throw new AmazonServiceException("Unable to marshall request to XML", e);
            }


            return(request);
        }
        protected override void ProcessRecord()
        {
            base.ProcessRecord();

            ResourceRecordSet rrset = new ResourceRecordSet
            {
                Kind = "dns#resourceRecordSet",
                Name = Name,
                Rrdatas = Rrdata,
                Ttl = Ttl,
                Type = Type
            };

            WriteObject(rrset);
        }