0

我们的团队非常高兴地看到针对AWS DynamoDB宣布的自动缩放功能,并且在通过在Web界面中添加配置尝试它时,我们发现这很适合我们的应用程序'需要。通过CloudFormation为已有表添加自动缩放比例

但是,尝试通过CF添加相同的配置已被证明有点复杂。以下示例在本文中提供 - http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-examples-application-autoscaling - 下面是结果,它不起作用。堆栈细节:

17:02:25 UTC+0300 UPDATE_ROLLBACK_IN_PROGRESS AWS::CloudFormation::Stack my-stack The following resource(s) failed to create: [WriteCapacityScalableTarget]. 17:02:24 UTC+0300 CREATE_FAILED AWS::ApplicationAutoScaling::ScalableTarget WriteCapacityScalableTarget table/TableName|dynamodb:table:WriteCapacityUnits|dynamodb already exists 17:02:18 UTC+0300 CREATE_IN_PROGRESS AWS::ApplicationAutoScaling::ScalableTarget WriteCapacityScalableTarget
17:02:15 UTC+0300 CREATE_COMPLETE AWS::IAM::Role ScalingRole
17:01:42 UTC+0300 CREATE_IN_PROGRESS AWS::IAM::Role ScalingRole Resource creation Initiated 17:01:42 UTC+0300 CREATE_IN_PROGRESS AWS::IAM::Role ScalingRole
17:01:37 UTC+0300 UPDATE_IN_PROGRESS AWS::CloudFormation::Stack my-stack User Initiated

我的CF脚本如下:

{ 
    "Resources": { 
    "MyCustomTableName": { 
     "Type": "AWS::DynamoDB::Table", 
     "Properties": { 
     "TableName": "TableName", 
     "AttributeDefinitions": [ 
      { 
      "AttributeName": "someAttribute1:someAttribute2", 
      "AttributeType": "S" 
      } 
     ], 
     "KeySchema": [ 
      { 
      "AttributeName": "someAttribute1:someAttribute2", 
      "KeyType": "HASH" 
      } 
     ], 
     "ProvisionedThroughput": { 
      "ReadCapacityUnits": 1, 
      "WriteCapacityUnits": 1 
     }, 
     "StreamSpecification": { 
      "StreamViewType": "NEW_AND_OLD_IMAGES" 
     } 
     } 
    }, 
    "WriteCapacityScalableTarget": { 
     "Type": "AWS::ApplicationAutoScaling::ScalableTarget", 
     "Properties": { 
     "MaxCapacity": 30, 
     "MinCapacity": 1, 
     "ResourceId": { 
      "Fn::Join": [ 
      "/", 
      [ 
       "table", 
       { 
       "Ref": "MyCustomTableName" 
       } 
      ] 
      ] 
     }, 
     "RoleARN": { 
      "Fn::GetAtt": [ 
      "ScalingRole", 
      "Arn" 
      ] 
     }, 
     "ScalableDimension": "dynamodb:table:WriteCapacityUnits", 
     "ServiceNamespace": "dynamodb" 
     } 
    }, 
    "ScalingRole": { 
     "Type": "AWS::IAM::Role", 
     "Properties": { 
     "AssumeRolePolicyDocument": { 
      "Version": "2012-10-17", 
      "Statement": [ 
      { 
       "Effect": "Allow", 
       "Principal": { 
       "Service": [ 
        "application-autoscaling.amazonaws.com" 
       ] 
       }, 
       "Action": [ 
       "sts:AssumeRole" 
       ] 
      } 
      ] 
     }, 
     "Path": "/", 
     "Policies": [ 
      { 
      "PolicyName": "root", 
      "PolicyDocument": { 
       "Version": "2012-10-17", 
       "Statement": [ 
       { 
        "Effect": "Allow", 
        "Action": [ 
        "dynamodb:DescribeTable", 
        "dynamodb:UpdateTable", 
        "cloudwatch:PutMetricAlarm", 
        "cloudwatch:DescribeAlarms", 
        "cloudwatch:GetMetricStatistics", 
        "cloudwatch:SetAlarmState", 
        "cloudwatch:DeleteAlarms" 
        ], 
        "Resource": "*" 
       } 
       ] 
      } 
      } 
     ] 
     } 
    }, 
    "WriteScalingPolicy": { 
     "Type": "AWS::ApplicationAutoScaling::ScalingPolicy", 
     "Properties": { 
     "PolicyName": "WriteAutoScalingPolicy", 
     "PolicyType": "TargetTrackingScaling", 
     "ScalingTargetId": { 
      "Ref": "WriteCapacityScalableTarget" 
     }, 
     "TargetTrackingScalingPolicyConfiguration": { 
      "TargetValue": 70.0, 
      "ScaleInCooldown": 60, 
      "ScaleOutCooldown": 60, 
      "PredefinedMetricSpecification": { 
      "PredefinedMetricType": "DynamoDBWriteCapacityUtilization" 
      } 
     } 
     } 
    } 
    } 
} 

如果任何人都可以提供一些线索,为什么发生这种情况,我会非常感激:)

+0

奇怪的是,似乎只有一个特定的表存在问题 - 并且通过控制台添加或删除自动缩放无助于 - 脚本仍然因提到的错误而失败。解决此问题的唯一方法是通过CF更新预配置容量(不可扩展),然后才能通过相同的CF脚本添加自动缩放。 –

回答

3

去通过该错误消息

CREATE_FAILED AWS::ApplicationAutoScaling::ScalableTarget WriteCapacityScalableTarget table/TableName|dynamodb:table:WriteCapacityUnits|dynamodb already exists

您正在创建名为"TableName": "TableName"的DynamoDB资源。在一个区域内不能有两个名字相同的dynamoDB表。

转到DynamoDB控制台并检查是否有任何此类表并将其删除。发布模板应该可以正常工作。选项2:如果要继续使用现有表,则可以从CF模板中删除AWS :: DynamoDB :: Table资源。

+0

谢谢。我从错误消息中得到的印象是,该表的WriteCapacityUnits已经创建 - 因为它们已经是,因此表已经存在。但是不删除表资源本身意味着表被删除?它有数据,我不愿意为此丢失(或迁移)数据。因此,为了清楚起见,table资源很早以前就已经创建,我只想添加自动调节功能 - 通过将WriteCapacityScalableTarget,ScalingRole和WriteScalingPolicy引入到CF模板中。 –

+0

我尝试模拟相同的内容。首先使用CF模板创建DynamoDB表,然后将WritingCapacityScalableTarget,ScalingRole和WriteScalingPolicy添加到CF模板并执行更新堆栈。进展顺利。那么,是否有可能通过控制台测试了一些东西,并忘记清除它? – krisnik