DynamoDB以编程方式禁用自动缩放

时间:2018-06-05 10:13:37

标签: c# .net amazon-web-services amazon-dynamodb aws-sdk

我想运行一组Dynamo表的每日更新。我已经编写了一个控制台应用程序来执行此操作,但我希望能够以编程方式在更新过程开始时禁用容量自动缩放,然后在最后重新启用它。

我已设法使用UpdateTableAsync方法增加表及其全局二级索引的预配置吞吐量,但这没有任何处理自动扩展的选项,我找不到任何其他功能让我这样做。

它甚至存在吗?

编辑:我在这里找到了所需的CLI命令:https://docs.aws.amazon.com/cli/latest/reference/application-autoscaling/delete-scaling-policy.html。我现在的问题是,它存在于.NET SDK中的任何地方吗?

1 个答案:

答案 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管理自动扩展的人都有帮助。