Skip to main content

Client Configuration

This guide covers how to configure DynamoDB clients for different environments and scenarios, including development setups, custom timeouts, multi-region deployments, and proxy settings.

Overview

Client configuration is typically applied when creating your table instance. The configuration determines how your application connects to DynamoDB and handles network operations.

// Create a configured client
var config = new AmazonDynamoDBConfig
{
RegionEndpoint = RegionEndpoint.USEast1,
Timeout = TimeSpan.FromSeconds(30)
};

var client = new AmazonDynamoDBClient(config);
var table = new MyTable(client);

Development Environments

DynamoDB Local

DynamoDB Local is Amazon's downloadable version of DynamoDB for local development and testing.

public class LocalDevelopmentSetup
{
public IAmazonDynamoDB CreateLocalClient()
{
var config = new AmazonDynamoDBConfig
{
ServiceURL = "http://localhost:8000",
AuthenticationRegion = "us-east-1"
};

return new AmazonDynamoDBClient(config);
}
}

Docker Setup:

docker run -p 8000:8000 amazon/dynamodb-local

Usage with Table:

var localClient = CreateLocalClient();
var table = new MyTable(localClient);

// All operations now target DynamoDB Local
var user = await table.Users.Get(userId).GetItemAsync();

LocalStack

LocalStack provides a fully functional local AWS cloud stack for development.

public class LocalStackSetup
{
public IAmazonDynamoDB CreateLocalStackClient()
{
var config = new AmazonDynamoDBConfig
{
ServiceURL = "http://localhost:4566",
AuthenticationRegion = "us-east-1"
};

// LocalStack accepts any credentials
var credentials = new BasicAWSCredentials("test", "test");

return new AmazonDynamoDBClient(credentials, config);
}
}

Docker Setup:

docker run -p 4566:4566 localstack/localstack

Environment-Based Configuration

Configure clients based on environment:

public class DynamoDbClientFactory
{
private readonly IConfiguration _configuration;

public DynamoDbClientFactory(IConfiguration configuration)
{
_configuration = configuration;
}

public IAmazonDynamoDB CreateClient()
{
var environment = _configuration["Environment"];

return environment switch
{
"Local" => CreateLocalClient(),
"Development" => CreateDevelopmentClient(),
"Production" => CreateProductionClient(),
_ => new AmazonDynamoDBClient()
};
}

private IAmazonDynamoDB CreateLocalClient()
{
var config = new AmazonDynamoDBConfig
{
ServiceURL = _configuration["DynamoDB:LocalEndpoint"] ?? "http://localhost:8000",
AuthenticationRegion = "us-east-1"
};
return new AmazonDynamoDBClient(config);
}

private IAmazonDynamoDB CreateDevelopmentClient()
{
var config = new AmazonDynamoDBConfig
{
RegionEndpoint = RegionEndpoint.USEast1,
MaxErrorRetry = 3
};
return new AmazonDynamoDBClient(config);
}

private IAmazonDynamoDB CreateProductionClient()
{
var config = new AmazonDynamoDBConfig
{
RegionEndpoint = RegionEndpoint.GetBySystemName(
_configuration["AWS:Region"] ?? "us-east-1"),
MaxErrorRetry = 5,
RetryMode = RequestRetryMode.Adaptive
};
return new AmazonDynamoDBClient(config);
}
}

Custom Client Settings

Timeout Configuration

Configure timeouts for different operation types:

var config = new AmazonDynamoDBConfig
{
// Overall request timeout
Timeout = TimeSpan.FromSeconds(30),

// Read/write timeout for data transfer
ReadWriteTimeout = TimeSpan.FromSeconds(300)
};

var client = new AmazonDynamoDBClient(config);

Recommended Settings:

ScenarioTimeoutReadWriteTimeout
Standard operations30s300s
Batch operations60s300s
Large scans120s600s

Retry Configuration

Configure retry behavior for transient failures:

var config = new AmazonDynamoDBConfig
{
// Maximum retry attempts
MaxErrorRetry = 5,

// Retry mode
RetryMode = RequestRetryMode.Adaptive,

// Enable throttle retries
ThrottleRetries = true
};

var client = new AmazonDynamoDBClient(config);

Retry Modes:

  • RequestRetryMode.Legacy - Fixed delay between retries
  • RequestRetryMode.Standard - Exponential backoff with jitter
  • RequestRetryMode.Adaptive - Adjusts based on error rates (recommended)

Connection Pooling

DynamoDB clients use HTTP connection pooling automatically:

var config = new AmazonDynamoDBConfig
{
// Maximum connections per server
MaxConnectionsPerServer = 50, // Default: 50

// Connection timeout
ConnectionTimeout = TimeSpan.FromSeconds(10)
};

var client = new AmazonDynamoDBClient(config);

Best Practices:

  • Reuse clients across requests (singleton pattern)
  • Don't dispose clients after each use
  • Monitor connection pool metrics in production

Multi-Region Deployments

Static Region Routing

Route requests to specific regions based on configuration:

public class MultiRegionClientFactory
{
private readonly Dictionary<string, IAmazonDynamoDB> _regionalClients;

public MultiRegionClientFactory()
{
_regionalClients = new Dictionary<string, IAmazonDynamoDB>
{
["us-east-1"] = CreateRegionalClient(RegionEndpoint.USEast1),
["eu-west-1"] = CreateRegionalClient(RegionEndpoint.EUWest1),
["ap-southeast-1"] = CreateRegionalClient(RegionEndpoint.APSoutheast1)
};
}

private IAmazonDynamoDB CreateRegionalClient(RegionEndpoint region)
{
var config = new AmazonDynamoDBConfig
{
RegionEndpoint = region,
MaxErrorRetry = 5,
RetryMode = RequestRetryMode.Adaptive
};
return new AmazonDynamoDBClient(config);
}

public IAmazonDynamoDB GetClient(string region)
{
if (!_regionalClients.TryGetValue(region, out var client))
{
throw new ArgumentException($"Unknown region: {region}");
}
return client;
}
}

Region-Based Table Access

public class RegionalProductService
{
private readonly MultiRegionClientFactory _clientFactory;

public RegionalProductService(MultiRegionClientFactory clientFactory)
{
_clientFactory = clientFactory;
}

public async Task<Product?> GetProductAsync(string productId, string region)
{
var client = _clientFactory.GetClient(region);
var table = new ProductTable(client);

var response = await table.Products.Get(productId).GetItemAsync();
return response.Item;
}
}

Dependency Injection Setup

// Program.cs
services.AddSingleton<MultiRegionClientFactory>();

// Or register individual regional clients
services.AddKeyedSingleton<IAmazonDynamoDB>("us-east-1", (sp, key) =>
{
var config = new AmazonDynamoDBConfig { RegionEndpoint = RegionEndpoint.USEast1 };
return new AmazonDynamoDBClient(config);
});

services.AddKeyedSingleton<IAmazonDynamoDB>("eu-west-1", (sp, key) =>
{
var config = new AmazonDynamoDBConfig { RegionEndpoint = RegionEndpoint.EUWest1 };
return new AmazonDynamoDBClient(config);
});

Proxy Configuration

HTTP Proxy

Configure proxy settings for corporate environments:

var config = new AmazonDynamoDBConfig
{
RegionEndpoint = RegionEndpoint.USEast1,

// Proxy settings
ProxyHost = "proxy.example.com",
ProxyPort = 8080
};

var client = new AmazonDynamoDBClient(config);

Authenticated Proxy

var config = new AmazonDynamoDBConfig
{
RegionEndpoint = RegionEndpoint.USEast1,

// Proxy settings
ProxyHost = "proxy.example.com",
ProxyPort = 8080,

// Proxy credentials
ProxyCredentials = new NetworkCredential("username", "password")
};

var client = new AmazonDynamoDBClient(config);

Proxy Bypass

Configure hosts that should bypass the proxy:

var config = new AmazonDynamoDBConfig
{
RegionEndpoint = RegionEndpoint.USEast1,
ProxyHost = "proxy.example.com",
ProxyPort = 8080,

// Bypass proxy for local addresses
ProxyBypassOnLocal = true
};

var client = new AmazonDynamoDBClient(config);

Troubleshooting

Connection Timeouts

Cause: Network latency or firewall blocking connections

Solution:

var config = new AmazonDynamoDBConfig
{
Timeout = TimeSpan.FromSeconds(60),
ConnectionTimeout = TimeSpan.FromSeconds(30)
};

Unable to Connect to Endpoint

Cause: Incorrect ServiceURL or endpoint not reachable

Solution: Verify the endpoint URL and network connectivity:

// For DynamoDB Local
config.ServiceURL = "http://localhost:8000";

// For LocalStack
config.ServiceURL = "http://localhost:4566";

Proxy Authentication Failures

Cause: Invalid proxy credentials or proxy configuration

Solution: Verify proxy settings and credentials:

config.ProxyCredentials = new NetworkCredential(
Environment.GetEnvironmentVariable("PROXY_USER"),
Environment.GetEnvironmentVariable("PROXY_PASSWORD"));