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); }
private async Task WaitChangesPropagation(ChangeInfo changeInfo) { if (changeInfo.Status == ChangeStatus.INSYNC) { return; } _log.Information("Waiting for DNS changes propagation"); var changeRequest = new GetChangeRequest(changeInfo.Id); while ((await _route53Client.GetChangeAsync(changeRequest)).ChangeInfo.Status == ChangeStatus.PENDING) { await Task.Delay(2000); } }
private void WaitChangesPropagation(ChangeInfo changeInfo) { if (changeInfo.Status == ChangeStatus.INSYNC) { return; } _log.Information("Waiting for DNS changes propagation"); var changeRequest = new GetChangeRequest(changeInfo.Id); while (_route53Client.GetChange(changeRequest).ChangeInfo.Status == ChangeStatus.PENDING) { Thread.Sleep(TimeSpan.FromSeconds(5d)); } }
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); }
public static async Task <ChangeStatus> WaitForStatusAync(this ChangeInfo info, Credentials credentials) { var client = credentials.CreateClient(); var changeRequest = new GetChangeRequest { Id = info.Id }; ChangeStatus currentStatus; while ((currentStatus = (await client.GetChangeAsync(changeRequest)).ChangeInfo.Status) == ChangeStatus.PENDING) { Console.WriteLine("Change is pending."); await Task.Delay(500); } return(currentStatus); }
//https://docs.aws.amazon.com/sdk-for-net/v2/developer-guide/route53-apis-intro.html public static void UpdateRecord() { //TODO: Better exception handling overall in the method SimpleLogging.WriteToLog("Time to check for update to public IP", true); SimpleLogging.WriteToLog("Last public IP was " + lastIP, true); string publicIP = GetPublicIP(ServiceConfig.GetPublicIPTries); SimpleLogging.WriteToLog("Current public IP is " + publicIP, true); if (publicIP == "") { SimpleLogging.WriteToLog("Failed to check for new public IP"); return; } if (publicIP == lastIP) { if (ServiceConfig.WriteLogsOnlyIfIPChanged) { SimpleLogging.WipePendingLogData(); } else { SimpleLogging.WriteToLog("Public IP address has not changed" + Environment.NewLine); } return; } SimpleLogging.WriteToLog("Contacting AWS to update public IP"); lastIP = publicIP; //TODO: Better exception handling when these values aren't working //TODO: Confirm all users can use the APSoutheast2 endpoint var route53Client = new AmazonRoute53Client(ServiceConfig.AwsAccessKeyId, ServiceConfig.AwsSecretAccessKey, RegionEndpoint.APSoutheast2); SimpleLogging.WriteToLog("Successfully authenticated to AWS"); var recordSet = new ResourceRecordSet() { Name = ServiceConfig.DomainName, TTL = 60, Type = RRType.A, //TODO: Update so can do IPv6 records also where required ResourceRecords = new List <ResourceRecord> { new ResourceRecord { Value = publicIP } } }; var changeBatch = new ChangeBatch() { Changes = new List <Change> { new Change() { ResourceRecordSet = recordSet, Action = ChangeAction.UPSERT } } }; var recordsetRequest = new ChangeResourceRecordSetsRequest() { HostedZoneId = ServiceConfig.HostedZoneId, ChangeBatch = changeBatch }; var recordsetResponse = route53Client.ChangeResourceRecordSets(recordsetRequest); SimpleLogging.WriteToLog("Succesfully submitted update request to AWS"); var changeRequest = new GetChangeRequest() { Id = recordsetResponse.ChangeInfo.Id }; while (ChangeStatus.PENDING == route53Client.GetChange(changeRequest).ChangeInfo.Status) { SimpleLogging.WriteToLog("Waiting for change to be INSYNC"); Thread.Sleep(ServiceConfig.AWSGetChangeSleepTime); } SimpleLogging.WriteToLog("Succesfully updated IP address to " + publicIP + Environment.NewLine); }
static void Main(string[] args) { const string awsId = "AKIAJBEJGQLMJAGQV6YQ"; const string awsKey = "lzM+9nJXLTNauQgz15SIyQD1QzWe/4+UcPzOEEPw"; const string domainName = "www.example.org"; //[1] Create an Amazon Route 53 client object var route53Client = AWSClientFactory.CreateAmazonRoute53Client(awsId, awsKey); //[2] Create a hosted zone var zoneRequest = new CreateHostedZoneRequest { Name = domainName, CallerReference = "my_change_request" }; var zoneResponse = route53Client.CreateHostedZone(zoneRequest); //[3] Create a resource record set change batch var recordSet = new ResourceRecordSet { Name = domainName, 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 = zoneResponse.HostedZone.Id, ChangeBatch = changeBatch }; var recordsetResponse = route53Client.ChangeResourceRecordSets(recordsetRequest); //[5] Monitor the change status var changeRequest = new GetChangeRequest { Id = recordsetResponse.ChangeInfo.Id }; while (route53Client.GetChange(changeRequest).ChangeInfo.Status == ChangeStatus.PENDING) { Console.WriteLine("Change is pending."); Thread.Sleep(15000); } Console.WriteLine("Change is complete."); Console.ReadKey(); }
protected override async Task DeleteAsync(string recordName, string recordType, string recordValue) { _logger.LogDebug("Starting deletion of {RecordType} {RecordName} with value {RecordValue}", recordType, recordName, recordValue); var zone = await FindHostedZoneAsync(recordName); if (zone == null) { _logger.LogDebug("No zone was found"); return; } if (recordType == TxtRecordType) { recordValue = NormalizeTxtValue(recordValue); } var recordSets = await FindRecordSetsAsync(zone, recordName, recordType); var changeBatch = new ChangeBatch(); if (!recordSets.Any()) { _logger.LogInformation("No DNS records matching {RecordType} {RecordName} were found to delete in zone {Zone}", recordType, recordName, zone.Name); return; } foreach (var recordSet in recordSets) { if (!recordSet.ResourceRecords.Any(x => x.Value != recordValue)) { _logger.LogDebug("Will delete record {RecordType} {RecordName}", recordType, recordName); changeBatch.Changes.Add(new Change() { Action = ChangeAction.DELETE, ResourceRecordSet = recordSet }); } else { recordSet.ResourceRecords.RemoveAll(x => x.Value == recordValue); _logger.LogDebug("Will retain remaining answers for {RecordType} {RecordName}", recordType, recordName); changeBatch.Changes.Add(new Change() { Action = ChangeAction.UPSERT, ResourceRecordSet = recordSet }); } } _logger.LogInformation("Deleting or modifying {Count} DNS records matching {RecordType} {RecordName} with value {RecordValue} in zone {Zone}", changeBatch.Changes.Count, recordType, recordName, recordValue, zone.Name); var deleteResponse = await _route53Client.ChangeResourceRecordSetsAsync( new ChangeResourceRecordSetsRequest() { ChangeBatch = changeBatch, HostedZoneId = zone.Id }); var changeRequest = new GetChangeRequest { Id = deleteResponse.ChangeInfo.Id }; while ((await _route53Client.GetChangeAsync(changeRequest)).ChangeInfo.Status == ChangeStatus.PENDING) { _logger.LogDebug("Deletion or modification of {RecordType} {RecordName} is pending. Checking for status update in {StatusPollIntervalSeconds} seconds.", recordType, recordName, StatusPollIntervalSeconds); Thread.Sleep(TimeSpan.FromSeconds(StatusPollIntervalSeconds)); } }
private async Task <bool> IsChangePendingAsync(GetChangeRequest changeRequest) { var changeReponse = await _route53Client.GetChangeAsync(changeRequest); return(changeReponse.ChangeInfo.Status == ChangeStatus.PENDING); }
protected override async Task PersistAsync(string recordName, string recordType, string recordValue) { _logger.LogDebug("Starting creation or update of {RecordType} {RecordName} with value {RecordValue}", recordType, recordName, recordValue); var zone = await FindHostedZoneAsync(recordName); if (zone == null) { _logger.LogDebug("No zone was found"); return; } if (recordType == TxtRecordType) { recordValue = NormalizeTxtValue(recordValue); } var existingRecordSets = await FindRecordSetsAsync(zone, recordName, recordType); var existingRecordSet = existingRecordSets.FirstOrDefault(); var recordSet = existingRecordSet ?? new ResourceRecordSet { Name = recordName, TTL = 60, Type = RRType.FindValue(recordType), ResourceRecords = new List <ResourceRecord>() }; if (recordSet.ResourceRecords.Any(x => x.Value == recordValue)) { _logger.LogDebug("Record {RecordType} {RecordName} with value {RecordValue} already exists", recordType, recordName, recordValue); return; } recordSet.ResourceRecords.Add(new ResourceRecord { Value = recordValue }); var change1 = new Change { ResourceRecordSet = recordSet, Action = ChangeAction.UPSERT }; var changeBatch = new ChangeBatch { Changes = new List <Change> { change1 } }; var recordsetRequest = new ChangeResourceRecordSetsRequest { HostedZoneId = zone.Id, ChangeBatch = changeBatch }; _logger.LogInformation("Creating or updating DNS record {RecordType} {RecordName}", recordType, recordName); var upsertResponse = await _route53Client.ChangeResourceRecordSetsAsync( new ChangeResourceRecordSetsRequest() { ChangeBatch = changeBatch, HostedZoneId = zone.Id }); var changeRequest = new GetChangeRequest { Id = upsertResponse.ChangeInfo.Id }; while (await IsChangePendingAsync(changeRequest)) { _logger.LogDebug("Creation/update of {RecordType} {RecordName} with value {RecordValue} is pending. Checking for status update in {StatusPollIntervalSeconds} seconds.", recordType, recordName, recordValue, StatusPollIntervalSeconds); Thread.Sleep(TimeSpan.FromSeconds(StatusPollIntervalSeconds)); } }
public void SaveClients() { //Output Output($"MCS: Starting Save Clients"); string dataText = ""; //Validate if (Clients == null || !Clients.Any()) { //Output Output($"MCS: Had no Clients."); //Will update with an empty string - no clients } else { //Output Output($"MCS: Found {Clients.Count} Clients."); //1) Serialize to JSON text dataText = JsonConvert.SerializeObject(Clients); //2) Prepare the string (encrypt, compress) //Encrypt and Compress dataText = dataText.CompressThenEncrypt(Config.MultiClientSettings.Route53.EncryptionPassword); } //Add quotation marks dataText = "\"" + dataText + "\""; //3) Update to R53 //New the Route 53 Client AmazonRoute53Client r53Client = new AmazonRoute53Client( Config.BaseSettings.AWSAccessKeyID, Config.BaseSettings.AWSSecretAccessKey, new AmazonRoute53Config { RegionEndpoint = RegionEndpoint }); //New the Change Record to push Change change = new Change { Action = ChangeAction.UPSERT, //Insert or Update ResourceRecordSet = new ResourceRecordSet { Name = Config.MultiClientSettings.Route53.Name, TTL = 300, Type = RRType.TXT, ResourceRecords = new List <ResourceRecord> { new ResourceRecord(dataText) } } }; //New the Change Request ChangeResourceRecordSetsRequest recordSetsRequest = new ChangeResourceRecordSetsRequest { HostedZoneId = Config.MultiClientSettings.Route53.R53ZoneId, ChangeBatch = new ChangeBatch(new List <Change> { change }) }; //Submitting the Change Request to the API and receiving back the ID ChangeResourceRecordSetsResponse recordSetResponse = r53Client .ChangeResourceRecordSetsAsync(recordSetsRequest) .GetAwaiter() .GetResult(); //The ID of the response string changeId = recordSetResponse.ChangeInfo.Id; //Output Output($"MCS-R53: Change ID \"{changeId}\": ChangeRequest was submitted."); //Enquire with R53 the status of the change (R53 updates can be VERY slow business) GetChangeRequest changeRequest = new GetChangeRequest { Id = changeId }; while (r53Client.GetChangeAsync(changeRequest).GetAwaiter().GetResult().ChangeInfo.Status == ChangeStatus.PENDING) { //Output Output($"MCS-R53: Change ID \"{changeId}\": Change is still pending. (Can take a while.)"); //Wait Thread.Sleep(10 * 1000); //Wait ten seconds } //Output DONE Output($"MCS-R53: Change ID \"{changeId}\": Change IN SYNC. Done."); Output($"MCS: Completed Save of {Clients.Count} Clients"); }
/// <summary> /// Run a single item /// </summary> /// <param name="item">The item to run</param> public void RunItem(Route53Host item) { //Output Output($"R53: Starting item: {item}, new IP address: {IpState.NewIP}"); //New the Route 53 Client AmazonRoute53Client r53Client = new AmazonRoute53Client( Config.BaseSettings.AWSAccessKeyID, Config.BaseSettings.AWSSecretAccessKey, new AmazonRoute53Config { RegionEndpoint = RegionEndpoint }); //New the Change Record to push Change change = new Change { Action = ChangeAction.UPSERT, //Insert or Update ResourceRecordSet = new ResourceRecordSet { Name = item.Name, TTL = item.TTL, Type = RRType.A, ResourceRecords = new List <ResourceRecord> { new ResourceRecord(IpState.NewIP) } } }; //New the Change Request ChangeResourceRecordSetsRequest recordSetsRequest = new ChangeResourceRecordSetsRequest { HostedZoneId = item.ZoneId, ChangeBatch = new ChangeBatch(new List <Change> { change }) }; //Submitting the Change Request to the API and receiving back the ID ChangeResourceRecordSetsResponse recordSetResponse = r53Client.ChangeResourceRecordSetsAsync(recordSetsRequest).GetAwaiter().GetResult(); //The ID of the response string changeId = recordSetResponse.ChangeInfo.Id; //Output Output($"R53: Change ID \"{changeId}\": ChangeRequest was submitted."); //Enquire with R53 the status of the change (R53 updates can be VERY slow business) GetChangeRequest changeRequest = new GetChangeRequest { Id = changeId }; while (r53Client.GetChangeAsync(changeRequest).GetAwaiter().GetResult().ChangeInfo.Status == ChangeStatus.PENDING) { //Output Output($"R53: Change ID \"{changeId}\": Change is still pending. (Can take a while.)"); //Wait Thread.Sleep(10 * 1000); //Wait ten seconds } //Output DONE Output($"R53: Change ID \"{changeId}\": Change IN SYNC. Done."); }
public virtual Task <GetChangeResponse> GetChangeAsync(GetChangeRequest request, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); }
public static void Route53CreateAdd(string[] args) { #region Route53CreateAdd string domainName = "www.example.org"; IAmazonRoute53 route53Client = new AmazonRoute53Client(); CreateHostedZoneRequest zoneRequest = new CreateHostedZoneRequest { Name = domainName, CallerReference = "my_change_request" }; CreateHostedZoneResponse zoneResponse = route53Client.CreateHostedZone(zoneRequest); ResourceRecordSet recordSet = new ResourceRecordSet { Name = domainName, TTL = 60, Type = RRType.A, ResourceRecords = new List <ResourceRecord> { new ResourceRecord { Value = "192.0.2.235" } } }; Change change1 = new Change { ResourceRecordSet = recordSet, Action = ChangeAction.CREATE }; ChangeBatch changeBatch = new ChangeBatch { Changes = new List <Change> { change1 } }; ChangeResourceRecordSetsRequest recordsetRequest = new ChangeResourceRecordSetsRequest { HostedZoneId = zoneResponse.HostedZone.Id, ChangeBatch = changeBatch }; ChangeResourceRecordSetsResponse recordsetResponse = route53Client.ChangeResourceRecordSets(recordsetRequest); GetChangeRequest changeRequest = new GetChangeRequest { Id = recordsetResponse.ChangeInfo.Id }; while (route53Client.GetChange(changeRequest).ChangeInfo.Status == ChangeStatus.PENDING) { Console.WriteLine("Change is pending."); Thread.Sleep(TimeSpan.FromSeconds(15)); } #endregion Console.WriteLine("Change is complete."); Console.ReadKey(); }