---
AWSTemplateFormatVersion: '2010-09-09'
Description: Handel-created DynamoDB Table Autoscaling

Resources:

  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:
                  - "cloudwatch:PutMetricAlarm"
                  - "cloudwatch:DescribeAlarms"
                  - "cloudwatch:GetMetricStatistics"
                  - "cloudwatch:SetAlarmState"
                  - "cloudwatch:DeleteAlarms"
                Resource: "*"
              - Effect: "Allow"
                Action:
                  - "dynamodb:DescribeTable"
                  - "dynamodb:UpdateTable"
                Resource: !Sub "arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/{{tableName}}"

      {{#if permissionsBoundary}}
      PermissionsBoundary: {{permissionsBoundary}}
      {{/if}}
  {{#each targets}}
  {{logicalIdPrefix}}CapacityScalableTarget:
    Type: "AWS::ApplicationAutoScaling::ScalableTarget"
    Properties:
      MaxCapacity: {{max}}
      MinCapacity: {{min}}
      ResourceId: "{{resourceId}}"
      RoleARN: !GetAtt ScalingRole.Arn
      ScalableDimension: dynamodb:{{dimension}}
      ServiceNamespace: dynamodb

  {{logicalIdPrefix}}ScalingPolicy:
    Type: "AWS::ApplicationAutoScaling::ScalingPolicy"
    {{#if dependsOn}}
    DependsOn:
      - {{dependsOn}}ScalingPolicy
    {{/if}}
    Properties:
      PolicyName: {{logicalIdPrefix}}AutoScalingPolicy
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref {{logicalIdPrefix}}CapacityScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: {{target}}
        ScaleInCooldown: 60
        ScaleOutCooldown: 60
        PredefinedMetricSpecification:
          PredefinedMetricType: {{metric}}

  {{/each}}
