/// <summary> /// Get or Create Region. /// </summary> /// <param name="region">Region name.</param> /// <returns>Instance of <see cref="FailoverRegion{RegionEndpoint}"/></returns> private FailoverRegion <RegionEndpoint> GetOrCreateRegion(string region) { // If exists if (_failoverRegions.TryGetValue(region, out var failoverRegion)) { return(failoverRegion); } // If does not exists, create and store failoverRegion = new FailoverRegion <RegionEndpoint>(RegionEndpoint.GetBySystemName(region), _regionResetWindowInMillis); _failoverRegions.Add(region, failoverRegion); return(failoverRegion); }
/// <summary> /// Setup region and create client. /// </summary> /// <param name="credentials">Instance of <see cref="AWSCredentials"/> class.</param> /// <param name="regionEndpoint">Instance of <see cref="RegionEndpoint"/> class.</param> /// <param name="failover">Fail over to the new region.</param> /// <param name="freeCurrentRegion">Mark current region as free.</param> /// <returns>Instance of <see cref="AmazonServiceClient"/> class</returns> protected virtual TAWSClient GetOrCreateRegionClient(AWSCredentials credentials, RegionEndpoint regionEndpoint, bool failover = true, bool freeCurrentRegion = false) { var failoverRegion = GetOrCreateRegion(regionEndpoint); _logger.LogDebug("Creating client for AWS region: {0}", regionEndpoint.SystemName); // Check Failover Region is available if (failoverRegion.Available()) { if (failover) { // Mark in use failoverRegion.MarkInUse(); // Mark current region free if (freeCurrentRegion && _currentRegion is not null) { _currentRegion.Reset(); } // Mark current region as down else if (_currentRegion is not null) { _currentRegion.MarkIsDown(); } // Store as current region _currentRegion = failoverRegion; } _logger.LogInformation("Successfully created client for AWS region: {0}.", regionEndpoint.SystemName); return(_createClient(_context, credentials, failoverRegion.Region)); } else { _logger.LogDebug("Skipped creating client for AWS region: {0}, currently in use or region is down.", regionEndpoint.SystemName); } return(null); }