После долгих поисков в документации AWS (кажется, что нет никаких учебных пособий или примеров, особенно для .NET), я обнаружил, что эта функциональность существует, но ее нет на уровне Dynamo.Это пакет шириной AWS, который выполняет автоматическое масштабирование для всех ресурсов AWS.
Существует пакет nuget с именем AWSSDK.ApplicationAutoScaling
.Вам нужно будет создать экземпляр AmazonApplicationAutoScalingClient
(в приведенном ниже коде он представлен autoScaling
).
При настройке автоматического масштабирования в консоли AWS DynamoDB создаются две вещи;описание масштабирования (минимальная емкость, максимальная емкость и т. д.) и политика, которая, как я полагаю, связывает автоматическое масштабирование с CloudWatch, чтобы можно было поднять аварийные сигналы.Оба эти объекта должны быть управляемыми.
Чтобы решить мою проблему с отключением автоматического масштабирования и последующим повторным включением его после обновления моих таблиц, мне пришлось выполнить следующий процесс:
Сохранить политикии масштабирование описаний (называемое ScalableTargets
) перед запуском обновления.
this.preUpdatePolicies = (await autoScaling.DescribeScalingPoliciesAsync(new DescribeScalingPoliciesRequest
{
ResourceId = $"table/{this.tableName}",
ServiceNamespace = ServiceNamespace.Dynamodb,
ScalableDimension = ScalableDimension.DynamodbTableWriteCapacityUnits
})).ScalingPolicies;
this.preUpdateScaling = (await autoScaling.DescribeScalableTargetsAsync(new DescribeScalableTargetsRequest
{
ResourceIds = new List<string>() { $"table/{this.tableName}" },
ServiceNamespace = ServiceNamespace.Dynamodb,
ScalableDimension = ScalableDimension.DynamodbTableWriteCapacityUnits
})).ScalableTargets;
Затем я отменяю регистрацию описаний масштабирования, которые также удаляют любые связанные политики.
foreach (var scaling in this.preUpdateScaling)
{
await autoScaling.DeregisterScalableTargetAsync(new DeregisterScalableTargetRequest
{
ResourceId = scaling.ResourceId,
ServiceNamespace = ServiceNamespace.Dynamodb,
ScalableDimension = ScalableDimension.DynamodbTableWriteCapacityUnits
});
}
После запуска моегоОбновление Затем я заново регистрирую описания / масштабируемые цели и помещаю политики обратно на основе значений, которые я сохранил до запуска обновления.
foreach (var scaling in this.preUpdateScaling)
{
await autoScaling.RegisterScalableTargetAsync(new RegisterScalableTargetRequest
{
ResourceId = scaling.ResourceId,
ServiceNamespace = scaling.ServiceNamespace,
ScalableDimension = scaling.ScalableDimension,
RoleARN = scaling.RoleARN,
MinCapacity = scaling.MinCapacity,
MaxCapacity = scaling.MaxCapacity
});
}
foreach (var policy in this.preUpdatePolicies)
{
await autoScaling.PutScalingPolicyAsync(new PutScalingPolicyRequest
{
ServiceNamespace = policy.ServiceNamespace,
ResourceId = policy.ResourceId,
ScalableDimension = policy.ScalableDimension,
PolicyName = policy.PolicyName,
PolicyType = policy.PolicyType,
TargetTrackingScalingPolicyConfiguration = policy.TargetTrackingScalingPolicyConfiguration
});
}
Надеюсь, это будет полезно для всех, кто хотел бы использовать .NET для управленияавтоматическое масштабирование.