我在数据库中注册了多个 AWS LogGroup,每个日志组位于不同的 AWS 区域。在创建如下行所示的对象后,我可以在运行时在 C# 中更改 AWS 区域吗?
var client = new AmazonCloudWatchLogsClient(AwsCredentials, _RegionEndPoint);
这背后的原因是,我在 DI 容器中注册了一个 Singleton 对象,用于为我的 WorkerService 之一构建,以获取每 5 分钟运行一次的所有 LogGroup 流的所有新日志事件。因此,我不需要多个 AWS CloudWatch 实例来循环所有日志组并通过仅更改区域值来观察新插入的事件。 这里是单例对象:
services.AddSingleton(sp =>
{
BasicAWSCredentials AwsCredentials;
RegionEndpoint _RegionEndPoint;
AmazonCloudWatchLogsClient _cloudWatchClient = new();
_RegionEndPoint = RegionEndpoint.GetBySystemName("us-east-1");
AwsCredentials = new BasicAWSCredentials("AWSAccessKey","AWSSecretAccessKey");
_cloudWatchClient = new AmazonCloudWatchLogsClient(AwsCredentials, _RegionEndPoint);
return _cloudWatchClient;
});
不可以,您无法在运行时动态更改同一个
AmazonCloudWatchLogsClient
实例的 AWS 区域。一旦使用特定区域实例化客户端,它就会锁定到该区域。
这就是为什么?
AmazonCloudWatchLogsClient
是特定于区域的,这意味着每个实例在创建时都绑定到单个 AWS 区域。 AWS SDK 客户端不支持在初始化后直接更改区域,因为这样可以确保 API 调用的一致性。
解决方案 要处理多个区域,您有几种选择:
以下是调整代码的方法:
services.AddSingleton(sp =>
{
BasicAWSCredentials awsCredentials = new("AWSAccessKey", "AWSSecretAccessKey");
return awsCredentials;
});
public async Task MonitorLogGroups(IEnumerable<string> regions)
{
var awsCredentials = _serviceProvider.GetRequiredService<BasicAWSCredentials>();
foreach (var region in regions)
{
var regionEndpoint = RegionEndpoint.GetBySystemName(region);
using var cloudWatchClient = new AmazonCloudWatchLogsClient(awsCredentials, regionEndpoint);
// Fetch new log events from this region...
await GetNewLogEvents(cloudWatchClient);
}
}
通过这种方法,您只需在需要时(在循环内)为每个区域实例化一个客户端,从而确保效率和简单性。 DI 容器仅保存凭据,每次循环迭代都会为目标区域创建适当的客户端。