Skip to content

Instantly share code, notes, and snippets.

@efenderbosch
Created September 4, 2017 12:39
Show Gist options
  • Save efenderbosch/3657cf3f3a98090669e8aca45b50b1b5 to your computer and use it in GitHub Desktop.
Save efenderbosch/3657cf3f3a98090669e8aca45b50b1b5 to your computer and use it in GitHub Desktop.
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.IDynamoDBMapper;
import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
import com.amazonaws.services.dynamodbv2.model.GlobalSecondaryIndex;
import com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
import java.util.Map;
import static com.google.common.base.CaseFormat.*;
import static java.lang.System.out;
import static java.util.function.Function.identity;
import static java.util.stream.Collectors.toMap;
public class CloudFormationTableYamlGenerator {
public static void main(String[] args) {
Class<?> clazz = YourAnnotatedEntity.class;
int minCapacity = 5;
int maxCapacity = 1000;
String targetCapacity = "70.0";
IDynamoDBMapper dbMapper = new DynamoDBMapper(null);
CreateTableRequest createTableRequest = dbMapper.generateCreateTableRequest(clazz);
String tableName = createTableRequest.getTableName();
String tableResourceName = LOWER_UNDERSCORE.to(LOWER_CAMEL, tableName);
Map<String, AttributeDefinition> attributeDefinintionsByName =
createTableRequest.getAttributeDefinitions().stream()
.collect(toMap(AttributeDefinition::getAttributeName, identity()));
// TODO replace w/ liquid template?
out.println(" " + tableResourceName + ":");
out.println(" Type: AWS::DynamoDB::Table");
out.println(" Properties:");
out.println(" TableName: ${self:custom.stage}_" + tableName);
out.println(" AttributeDefinitions:");
for (KeySchemaElement keySchemaElement : createTableRequest.getKeySchema()) {
String attributeName = keySchemaElement.getAttributeName();
out.println(" - AttributeName: " + attributeName);
out.println(
" AttributeType: " + attributeDefinintionsByName.get(attributeName).getAttributeType());
}
for (GlobalSecondaryIndex globalSecondaryIndex : createTableRequest.getGlobalSecondaryIndexes()) {
for (KeySchemaElement keySchemaElement : globalSecondaryIndex.getKeySchema()) {
String attributeName = keySchemaElement.getAttributeName();
out.println(" - AttributeName: " + attributeName);
out.println(" AttributeType: " +
attributeDefinintionsByName.get(attributeName).getAttributeType());
}
}
out.println(" KeySchema:");
for (KeySchemaElement keySchemaElement : createTableRequest.getKeySchema()) {
out.println(" - AttributeName: " + keySchemaElement.getAttributeName());
out.println(" KeyType: " + keySchemaElement.getKeyType());
}
out.println(" ProvisionedThroughput:");
out.println(" ReadCapacityUnits: " + minCapacity);
out.println(" WriteCapacityUnits: " + minCapacity);
if (!createTableRequest.getGlobalSecondaryIndexes().isEmpty()) {
out.println(" GlobalSecondaryIndexes:");
for (GlobalSecondaryIndex globalSecondaryIndex : createTableRequest.getGlobalSecondaryIndexes()) {
out.println(" - IndexName: " + globalSecondaryIndex.getIndexName());
out.println(" KeySchema:");
for (KeySchemaElement keySchemaElement : globalSecondaryIndex.getKeySchema()) {
out.println(" - AttributeName: " + keySchemaElement.getAttributeName());
out.println(" KeyType: " + keySchemaElement.getKeyType());
}
out.println(" Projection:");
out.println(" ProjectionType: ALL");
out.println(" ProvisionedThroughput:");
out.println(" ReadCapacityUnits: " + minCapacity);
out.println(" WriteCapacityUnits: " + minCapacity);
}
}
out.println();
out.println(" " + tableResourceName + "WriteCapacityScalableTarget:");
out.println(" Type: AWS::ApplicationAutoScaling::ScalableTarget");
out.println(" Properties:");
out.println(" MaxCapacity: " + maxCapacity);
out.println(" MinCapacity: " + minCapacity);
out.println(" ResourceId: ");
out.println(" Fn::Join: [ \"/\", [ \"table\", Ref: " + tableResourceName + " ]]");
out.println(" RoleARN: arn:aws:iam::youraccountid:role/service-role/DynamoDBAutoscaleRole");
out.println(" ScalableDimension: dynamodb:table:WriteCapacityUnits");
out.println(" ServiceNamespace: dynamodb");
out.println();
out.println(" " + tableResourceName + "ReadCapacityScalableTarget:");
out.println(" Type: AWS::ApplicationAutoScaling::ScalableTarget");
out.println(" Properties:");
out.println(" MaxCapacity: " + maxCapacity);
out.println(" MinCapacity: " + minCapacity);
out.println(" ResourceId: ");
out.println(" Fn::Join: [ \"/\", [ \"table\", Ref: " + tableResourceName + " ]]");
out.println(" RoleARN: arn:aws:iam::youraccountid:role/service-role/DynamoDBAutoscaleRole");
out.println(" ScalableDimension: dynamodb:table:ReadCapacityUnits");
out.println(" ServiceNamespace: dynamodb");
out.println();
out.println(" " + tableResourceName + "WriteScalingPolicy:");
out.println(" Type: AWS::ApplicationAutoScaling::ScalingPolicy");
out.println(" Properties:");
out.println(" PolicyName: WriteAutoScalingPolicy");
out.println(" PolicyType: TargetTrackingScaling");
out.println(" ScalingTargetId:");
out.println(" Ref: " + tableResourceName + "WriteCapacityScalableTarget");
out.println(" TargetTrackingScalingPolicyConfiguration:");
out.println(" TargetValue: " + targetCapacity);
out.println(" PredefinedMetricSpecification:");
out.println(" PredefinedMetricType: DynamoDBWriteCapacityUtilization");
out.println();
out.println(" " + tableResourceName + "ReadScalingPolicy:");
out.println(" Type: AWS::ApplicationAutoScaling::ScalingPolicy");
out.println(" Properties:");
out.println(" PolicyName: ReadAutoScalingPolicy");
out.println(" PolicyType: TargetTrackingScaling");
out.println(" ScalingTargetId:");
out.println(" Ref: " + tableResourceName + "ReadCapacityScalableTarget");
out.println(" TargetTrackingScalingPolicyConfiguration:");
out.println(" TargetValue: " + targetCapacity);
out.println(" PredefinedMetricSpecification:");
out.println(" PredefinedMetricType: DynamoDBReadCapacityUtilization");
for (GlobalSecondaryIndex globalSecondaryIndex : createTableRequest.getGlobalSecondaryIndexes()) {
String indexName = globalSecondaryIndex.getIndexName();
String indexResourceName =
tableResourceName + LOWER_UNDERSCORE.to(UPPER_CAMEL, indexName.replace('-', '_'));
out.println();
out.println(" " + indexResourceName + "WriteCapacityScalableTarget:");
out.println(" Type: AWS::ApplicationAutoScaling::ScalableTarget");
out.println(" Properties:");
out.println(" MaxCapacity: " + maxCapacity);
out.println(" MinCapacity: " + minCapacity);
out.println(" ResourceId:");
out.println(" Fn::Join: [ \"/\", [ \"table\", Ref: " + tableResourceName + ", \"index/" + indexName +
"\" ]]");
out.println(" RoleARN: arn:aws:iam::youraccountid:role/service-role/DynamoDBAutoscaleRole");
out.println(" ScalableDimension: dynamodb:index:WriteCapacityUnits");
out.println(" ServiceNamespace: dynamodb");
out.println();
out.println(" " + indexResourceName + "ReadCapacityScalableTarget:");
out.println(" Type: AWS::ApplicationAutoScaling::ScalableTarget");
out.println(" Properties:");
out.println(" MaxCapacity: " + maxCapacity);
out.println(" MinCapacity: " + minCapacity);
out.println(" ResourceId:");
out.println(" Fn::Join: [ \"/\", [ \"table\", Ref: " + tableResourceName + ", \"index/" + indexName +
"\" ]]");
out.println(" RoleARN: arn:aws:iam::youraccountid:role/service-role/DynamoDBAutoscaleRole");
out.println(" ScalableDimension: dynamodb:index:ReadCapacityUnits");
out.println(" ServiceNamespace: dynamodb");
out.println();
out.println(" " + indexResourceName + "WriteScalingPolicy:");
out.println(" Type: AWS::ApplicationAutoScaling::ScalingPolicy");
out.println(" Properties:");
out.println(" PolicyName: WriteAutoScalingPolicy");
out.println(" PolicyType: TargetTrackingScaling");
out.println(" ScalingTargetId:");
out.println(" Ref: " + indexResourceName + "WriteCapacityScalableTarget");
out.println(" TargetTrackingScalingPolicyConfiguration:");
out.println(" TargetValue: " + targetCapacity);
out.println(" PredefinedMetricSpecification:");
out.println(" PredefinedMetricType: DynamoDBWriteCapacityUtilization");
out.println();
out.println(" " + indexResourceName + "ReadScalingPolicy:");
out.println(" Type: AWS::ApplicationAutoScaling::ScalingPolicy");
out.println(" Properties:");
out.println(" PolicyName: ReadAutoScalingPolicy");
out.println(" PolicyType: TargetTrackingScaling");
out.println(" ScalingTargetId:");
out.println(" Ref: " + indexResourceName + "ReadCapacityScalableTarget");
out.println(" TargetTrackingScalingPolicyConfiguration:");
out.println(" TargetValue: " + targetCapacity);
out.println(" PredefinedMetricSpecification:");
out.println(" PredefinedMetricType: DynamoDBReadCapacityUtilization");
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment