动态更改 AWS 区域

问题描述 投票:0回答:1

我在数据库中注册了多个 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;
         });
c# .net amazon-cloudwatch
1个回答
0
投票

不可以,您无法在运行时动态更改同一个

AmazonCloudWatchLogsClient
实例的 AWS 区域。一旦使用特定区域实例化客户端,它就会锁定到该区域。 这就是为什么?
AmazonCloudWatchLogsClient
是特定于区域的,这意味着每个实例在创建时都绑定到单个 AWS 区域。 AWS SDK 客户端不支持在初始化后直接更改区域,因为这样可以确保 API 调用的一致性。

解决方案 要处理多个区域,您有几种选择:

  1. 在循环期间根据需要为每个区域创建一个新客户端(动态)。
  2. 使用瞬态客户端而不是单例——在每个区域的每个请求中创建一个新实例。

以下是调整代码的方法:

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 容器仅保存凭据,每次循环迭代都会为目标区域创建适当的客户端。

© www.soinside.com 2019 - 2024. All rights reserved.