我想运行一组Dynamo表的每日更新。我已经编写了一个控制台应用程序来执行此操作,但我希望能够以编程方式在更新过程开始时禁用容量自动缩放,然后在最后重新启用它。
我已设法使用UpdateTableAsync方法增加表及其全局二级索引的预配置吞吐量,但这没有任何处理自动扩展的选项,我找不到任何其他功能让我这样做。
它甚至存在吗?
编辑:我在这里找到了所需的CLI命令:https://docs.aws.amazon.com/cli/latest/reference/application-autoscaling/delete-scaling-policy.html。我现在的问题是,它存在于.NET SDK中的任何地方吗?
答案 0 :(得分:2)
经过大量的AWS文档挖掘(似乎没有任何教程或示例,尤其是.NET),我发现这个功能确实存在,但它不在Dynamo级别。它是一个AWS范围的程序包,可处理所有AWS资源的自动扩展。
有一个名为AWSSDK.ApplicationAutoScaling
的nuget包。您需要自己创建AmazonApplicationAutoScalingClient
的实例(在下面的代码中,这由autoScaling
表示)。
在AWS DynamoDB控制台中设置自动缩放时,会创建两件事;缩放的描述(最小容量,最大容量等)和我相信将自动缩放与CloudWatch链接的策略,以便可以引发alrms。需要管理这两个对象。
要解决我禁用自动缩放的问题,然后在更新我的表后重新启用它,我必须遵循以下过程:
在运行更新之前保存策略和扩展描述(称为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管理自动扩展的人都有帮助。