2017-08-21 46 views
3

我正在使用適用於nodejs的AWS SDK並從代碼創建一個dynamodb表。它一切正常,但我需要自動擴展以啓用預置的讀取和寫入容量。這是我努力如何在Java腳本中爲DynamoDB中的預置讀取容量啓用Auto Scaling

var params = { 
    TableName : "MyTable", 
    KeySchema: [  
     { AttributeName: "Name", KeyType: "HASH"}, //Partition key 
     { AttributeName: "time", KeyType: "RANGE" } //Sort key 
    ], 
    AttributeDefinitions: [  

     { AttributeName: "Name", AttributeType: "S" }, 
     { AttributeName: "time", AttributeType: "N" } 
    ], 
    ProvisionedThroughput: {  
     ReadCapacityUnits: 5, 
     WriteCapacityUnits: 5 
    }   
    ] 
}; 

dynamodb.createTable(params, function(err, data) { 
    if (err) { 
     console.error("Unable to create table. Error JSON:", JSON.stringify(err, null, 2)); 
    } else { 
     console.log("Created table. Table description JSON:", JSON.stringify(data, null, 2)); 
    } 
}); 

這將創建具有讀寫能力的表5,但會禁用自動縮放的代碼。我看到一個Java示例,其中自動縮放正在從代碼處理,但沒有爲Java腳本。關於如何從NodeJS啓用自動縮放的任何建議將非常有幫助。 謝謝

+0

您可以配置自動縮放在數據庫表進行處理來自AWS管理控制檯本身。 – notionquest

+0

是的,我意識到這一點,但那不是我正在尋找的。它必須從代碼級完成,因爲我們正在向客戶端公開一些API,並且他們不能訪問控制檯。 – Avijeet

回答

3

您可以通過單獨的ApplicationAutoScaling調用啓用自動縮放。

這裏如何啓用自動縮放寫單位LAMBDA代碼示例:

const AWS = require("aws-sdk"); 
var applicationautoscaling = new AWS.ApplicationAutoScaling({ 
    apiVersion: '2016-02-06' 
}); 

exports.handler = (event, context, callback) => { 
    var params = { 
     MaxCapacity: 10, 
     MinCapacity: 2, 
     ResourceId: "table/MyTable", 
     RoleARN: "arn:aws:iam::111111111:role/lambda_s3_exec_role", 
     ScalableDimension: "dynamodb:table:WriteCapacityUnits", 
     ServiceNamespace: "dynamodb" 
    }; 
    applicationautoscaling.registerScalableTarget(params, function(err, data) { 
     if (err) console.log(err, err.stack); // an error occurred 
     else console.log(data); // successful response 
     callback(null, 'write capacity adjusted'); 
    }); 
}; 
+0

謝謝,我今天會試一試。順便說一句,如果我提到readcapacityUnits以及在scalableDimension中寫入,那麼讀和寫都可以設置爲可擴展的權利? – Avijeet

+0

是的,兩者都可以設置,但據我瞭解API,他們必須設置兩個獨立的電話。 –

+0

嗯,我試過了,我得到一個錯誤「未找到」。但是dynamodb中存在表。 – Avijeet

0

我跟着延斯·沃爾特斯的解決方案和dynamodb的UI顯得沮喪 - 從概述它說比例已啓用,但是當我查看了它沒有顯示的容量標籤。這是因爲該解決方案缺少第二個半縮放策略。

的解決方案是一個兩個步驟:

  1. 註冊升級目標
  2. 把縮放政策在地方上的目標

下面的代碼:

var tableName = "your-table-name" 

var autoscalingParams = { 
    MaxCapacity: 15, 
    MinCapacity: 1, 
    ResourceId: "table/" + tableName, 
    RoleARN: "arn:aws:iam::" + accountId + ":role/current-lambdaRole", 
    ScalableDimension: "dynamodb:table:WriteCapacityUnits", 
    ServiceNamespace: "dynamodb" 
}; 

autoscaling.registerScalableTarget(autoscalingParams, function(err, data) { 
    if(err) { 
     console.log('error'); 
     console.log(JSON.stringify(err)); 
    } else { 
     console.log(data); 
    } 

    var scalingPolicy = { 
     ServiceNamespace: "dynamodb", 
     ResourceId: "table/" + tableName, 
     ScalableDimension: "dynamodb:table:WriteCapacityUnits", 
     PolicyName: tableName + "-scaling-policy", 
     PolicyType: "TargetTrackingScaling", 
     TargetTrackingScalingPolicyConfiguration: { 
      PredefinedMetricSpecification: { 
       PredefinedMetricType: "DynamoDBWriteCapacityUtilization" 
      }, 
      ScaleOutCooldown: 60, 
      ScaleInCooldown: 60, 
      TargetValue: 70.0 
     } 
    }; 

    autoscaling.putScalingPolicy(scalingPolicy, function(err, data) { 
     if(err) { 
      console.log('error'); 
      console.log(JSON.stringify(err)); 
     } else { 
      console.log('success!'); 
      console.log(data); 
     } 
     cb(err); 
    }); 
}); 

然後你的角色將需要權限的東西:

{ 
    "IamPolicyLambdaManageScalingDynamoDbTables": { 
    "Type": "AWS::IAM::Policy", 
    "Properties": { 
     "PolicyName": "someName", 
     "PolicyDocument": { 
     "Version": "2012-10-17", 
     "Statement": [ 
      { 
      "Effect": "Allow", 
      "Action": [ 
       "application-autoscaling:RegisterScalableTarget", 
       "application-autoscaling:PutScalingPolicy", 
       "iam:CreateServiceLinkedRole", 
       "iam:PassRole" 
      ], 
      "Resource": "*" 
      } 
     ] 
     }, 
     "Roles": [ 
     { 
      "Ref": "IamRoleLambdaExecution" 
     } 
     ] 
    } 
    } 
} 

注意:您可能不應該使用的角色資源通配符,但我還沒有確定下來的應該是,究竟

相關問題