diff --git a/src/CapacityCalculator.js b/src/CapacityCalculator.js index 3aed489..a2494e8 100644 --- a/src/CapacityCalculator.js +++ b/src/CapacityCalculator.js @@ -9,7 +9,7 @@ export default class CapacityCalculator extends CapacityCalculatorBase { // Get the region getCloudWatchRegion() { - return Region; + return process.env.DDB_AUTOSCALE_REGION || Region; } getStatisticSettings(): StatisticSettings { diff --git a/src/Provisioner.js b/src/Provisioner.js index e214b0d..1a58c28 100644 --- a/src/Provisioner.js +++ b/src/Provisioner.js @@ -13,19 +13,23 @@ export default class Provisioner extends ProvisionerConfigurableBase { // Get the region getDynamoDBRegion(): string { - return Region; + return process.env.DDB_AUTOSCALE_REGION || Region; } // Gets the list of tables which we want to autoscale async getTableNamesAsync(): Promise { + // Option 1 - Tables defined by an environment variable if defined + if ('DDB_AUTOSCALE_TABLES' in process.env && typeof process.env.DDB_AUTOSCALE_TABLES === 'string') { + return process.env.DDB_AUTOSCALE_TABLES.split(','); + } - // Option 1 - All tables (Default) + // Option 2 - All tables (Default) return await this.db.listAllTableNamesAsync(); - // Option 2 - Hardcoded list of tables + // Option 3 - Hardcoded list of tables // return ['Table1', 'Table2', 'Table3']; - // Option 3 - DynamoDB / S3 configured list of tables + // Option 4 - DynamoDB / S3 configured list of tables // return await ...; } diff --git a/src/provisioning/ProvisionerConfigurableBase.js b/src/provisioning/ProvisionerConfigurableBase.js index c128d25..5be656e 100644 --- a/src/provisioning/ProvisionerConfigurableBase.js +++ b/src/provisioning/ProvisionerConfigurableBase.js @@ -13,7 +13,22 @@ import type { TableConsumedCapacityDescription, } from '../flow/FlowTypes'; +import { SNS } from 'aws-sdk'; +import { log } from '../Global'; + export default class ProvisionerConfigurableBase extends ProvisionerBase { + logSnsMessage(arn: ?string, subject: string, message: string) { + if (arn) { + const sns = new SNS(); + const params = { + Message: message, + Subject: subject, + TopicArn: arn + }; + + sns.publish(params, (...args) => { log('Sent through an SNS message', args, params); }); + } + } // eslint-disable-next-line no-unused-vars isReadCapacityIncrementRequired(data: TableProvisionedAndConsumedThroughput): boolean { @@ -128,9 +143,19 @@ export default class ProvisionerConfigurableBase extends ProvisionerBase { newProvisionedThroughput.ReadCapacityUnits = this .calculateIncrementedReadCapacityValue(params); + const subject = `Increasing RCU for ${params.TableName}`; + const message = `Increasing read capacity units from ${params.ProvisionedThroughput.ReadCapacityUnits} to ${newProvisionedThroughput.ReadCapacityUnits}`; + + this.logSnsMessage(process.env.DDB_AUTOSCALE_SNS_ARN, subject, message); + } else if (this.isReadCapacityDecrementRequired(params)) { newProvisionedThroughput.ReadCapacityUnits = this .calculateDecrementedReadCapacityValue(params); + + const subject = `Decreasing RCU for ${params.TableName}`; + const message = `Decreasing read capacity units from ${params.ProvisionedThroughput.ReadCapacityUnits} to ${newProvisionedThroughput.ReadCapacityUnits}`; + + this.logSnsMessage(process.env.DDB_AUTOSCALE_SNS_ARN, subject, message); } // Adjust write capacity @@ -138,9 +163,18 @@ export default class ProvisionerConfigurableBase extends ProvisionerBase { newProvisionedThroughput.WriteCapacityUnits = this .calculateIncrementedWriteCapacityValue(params); + const subject = `Increasing WCU for ${params.TableName}`; + const message = `Increasing write capacity units from ${params.ProvisionedThroughput.WriteCapacityUnits} to ${newProvisionedThroughput.WriteCapacityUnits}`; + + this.logSnsMessage(process.env.DDB_AUTOSCALE_SNS_ARN, subject, message); } else if (this.isWriteCapacityDecrementRequired(params)) { newProvisionedThroughput.WriteCapacityUnits = this .calculateDecrementedWriteCapacityValue(params); + + const subject = `Decreasing WCU for ${params.TableName}`; + const message = `Decreasing write capacity units from ${params.ProvisionedThroughput.WriteCapacityUnits} to ${newProvisionedThroughput.WriteCapacityUnits}`; + + this.logSnsMessage(process.env.DDB_AUTOSCALE_SNS_ARN, subject, message); } if (newProvisionedThroughput.ReadCapacityUnits ===