AWSTemplateFormatVersion: '2010-09-09'
Description: 'stack: {{stackName}} | deployed by Kes'

Resources:
  #################################################
  # DynamoDB config BEGIN
  #################################################
{{#each dynamos}}
  {{@key}}DynamoDB:
    Type: AWS::DynamoDB::Table
    DeletionPolicy: Retain
    Properties:
      AttributeDefinitions:
    {{#each this.attributes}}
      - AttributeName: {{name}}
        AttributeType: {{type}}
    {{/each}}
      KeySchema:
    {{#if this.KeySchema}}
      {{#each this.KeySchema}}
      - AttributeName: {{this.AttributeName}}
        KeyType: {{this.KeyType}}
      {{/each}}
    {{else}}
      {{#each this.attributes}}
      - AttributeName: {{name}}
        KeyType: {{schema}}
      {{/each}}
    {{/if}}
      ProvisionedThroughput:
        ReadCapacityUnits: {{this.read}}
        WriteCapacityUnits: {{this.write}}
      TableName: {{../prefix}}-{{@key}}
      StreamSpecification:
        StreamViewType: "NEW_AND_OLD_IMAGES"
    {{#if this.GlobalSecondaryIndexes}}
      GlobalSecondaryIndexes:
      {{#each this.GlobalSecondaryIndexes}}
      - IndexName: {{IndexName}}
        KeySchema:
        {{#each this.KeySchema}}
        - AttributeName: {{this.AttributeName}}
          KeyType: {{this.KeyType}}
        {{/each}}
        {{#if this.Projection}}
        Projection:
        {{#each this.Projection}}
          {{@key}}: {{this}}
        {{/each}}
        {{/if}}
        ProvisionedThroughput:
          ReadCapacityUnits: {{../read}}
          WriteCapacityUnits: {{../write}}
      {{/each}}
    {{/if}}

{{/each}}

  #################################################
  # DynamoDB config END
  #################################################

  #################################################
  # Cumulus DynamoDB Auto Scaling START
  #################################################

{{# each dynamos}}
  {{#if this.enableAutoScaling}}
  ### Read scaling policy
  {{@key}}ReadCapacityScalableTarget:
    Type: "AWS::ApplicationAutoScaling::ScalableTarget"
    Properties:
    {{#if this.ReadMinCapacity}}
      MinCapacity: {{ this.ReadMinCapacity }}
    {{else}}
      MinCapacity: 5
    {{/if}}
    {{#if this.ReadMaxCapacity}}
      MaxCapacity: {{ this.ReadMaxCapacity }}
    {{else}}
      MaxCapacity: 10
    {{/if}}
      ResourceId:
        Fn::Sub: table/{{../../prefix}}-{{@key}}
      RoleARN: {{../../iams.scalingRoleArn}}
      ScalableDimension: "dynamodb:table:ReadCapacityUnits"
      ServiceNamespace: dynamodb
  {{@key}}TableReadScalingPolicy:
    Type: "AWS::ApplicationAutoScaling::ScalingPolicy"
    Properties:
      PolicyName: ReadAutoScalingPolicy
      PolicyType: TargetTrackingScaling
      ScalingTargetId:
        Ref: {{@key}}ReadCapacityScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: {{ ../../AutoScalingPolicyConfiguration.targetValue }}
        ScaleInCooldown: {{ ../../AutoScalingPolicyConfiguration.scaleInCooldown }}
        ScaleOutCooldown: {{ ../../AutoScalingPolicyConfiguration.scaleOutCooldown }}
        PredefinedMetricSpecification:
          PredefinedMetricType: DynamoDBReadCapacityUtilization

  ### Write scaling policy
  {{@key}}WriteCapacityScalableTarget:
    Type: "AWS::ApplicationAutoScaling::ScalableTarget"
    Properties:
    {{#if this.WriteMinCapacity}}
      MinCapacity: {{ this.WriteMinCapacity }}
    {{else}}
      MinCapacity: 1
    {{/if}}
    {{#if this.WriteMaxCapacity}}
      MaxCapacity: {{ this.WriteMaxCapacity }}
    {{else}}
      MaxCapacity: 2
    {{/if}}
      ResourceId:
        Fn::Sub: table/{{../../prefix}}-{{@key}}
      RoleARN: {{../../iams.scalingRoleArn}}
      ScalableDimension: "dynamodb:table:WriteCapacityUnits"
      ServiceNamespace: dynamodb
  {{@key}}TableWriteScalingPolicy:
    Type: "AWS::ApplicationAutoScaling::ScalingPolicy"
    Properties:
      PolicyName: WriteAutoScalingPolicy
      PolicyType: TargetTrackingScaling
      ScalingTargetId:
        Ref: {{@key}}WriteCapacityScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: {{ ../../AutoScalingPolicyConfiguration.targetValue }}
        ScaleInCooldown: {{ ../../AutoScalingPolicyConfiguration.scaleInCooldown }}
        ScaleOutCooldown: {{ ../../AutoScalingPolicyConfiguration.scaleOutCooldown }}
        PredefinedMetricSpecification:
          PredefinedMetricType: DynamoDBWriteCapacityUtilization
  {{/if}}
{{/each}}

  #################################################
  # Cumulus DynamoDB Auto Scaling END
  #################################################

{{# if es.name}}
  #################################################
  # ElasticSearch config BEGIN
  #################################################
  {{es.name}}Domain:
    Type: "AWS::Elasticsearch::Domain"
    DeletionPolicy: Retain
    Properties:
      DomainName: {{prefix}}-{{es.name}}
      ElasticsearchVersion: {{# if es.version}}{{es.version}}{{ else }}'5.3'{{/if}}
      ElasticsearchClusterConfig:
        InstanceCount: {{# if es.instanceCount}}{{es.instanceCount}}{{ else }}1{{/if}}
        InstanceType: {{# if es.instanceType}}{{es.instanceType}}{{ else }}"t2.small.elasticsearch"{{/if}}
      SnapshotOptions:
        AutomatedSnapshotStartHour: 0
      EBSOptions:
        EBSEnabled: true
        VolumeType: gp2
        VolumeSize: {{es.volumeSize}}
      AdvancedOptions:
        rest.action.multi.allow_explicit_index: "true"
      AccessPolicies:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Principal:
              AWS: {{iams.lambdaProcessingRoleArn}}
            Action: "es:*"
            Resource:
              - Fn::Sub: "arn:aws:es:${AWS::Region}:${AWS::AccountId}:domain/{{prefix}}-{{es.name}}/*"
          - Effect: "Allow"
            Principal:
              AWS: {{iams.lambdaApiGatewayRoleArn}}
            Action: "es:*"
            Resource:
              - Fn::Sub: "arn:aws:es:${AWS::Region}:${AWS::AccountId}:domain/{{prefix}}-{{es.name}}/*"
    {{# if vpc }}
      VPCOptions:
        SecurityGroupIds:
          - {{vpc.securityGroup}}
        SubnetIds:
        {{#each vpc.subnets}}
          - {{this}}
        {{/each}}
    {{/if}}

  {{#if es.alarms}}
  {{# each es.alarms}}
  {{../es.name}}{{@key}}Alarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
    {{#if alarm_description}}
      AlarmDescription: {{ alarm_description }}
    {{/if}}
      AlarmName: {{../prefix}}-{{../es.name}}-{{@key}}Alarm
      ComparisonOperator: {{ comparison_operator }}
      EvaluationPeriods: {{#if evaluation_periods }}{{ evaluation_periods }}{{ else }}5{{/if}}
      MetricName: {{ metric }}
      Statistic: {{#if statistic }}{{ statistic }}{{ else }}Average{{/if}}
      Threshold: {{ threshold }}
      Period: {{#if period }}{{ period }}{{ else }}60{{/if}}
      Namespace: AWS/ES
      Dimensions:
        - Name: ClientId
          Value:
            Fn::Sub: ${AWS::AccountId}
        - Name: DomainName
          Value:
            Ref: {{../es.name}}Domain
  {{/each}}
  {{/if}}

  #################################################
  # ElasticSearch config END
  #################################################
{{/if}}


Outputs:
{{#each dynamos}}
  {{@key}}DynamoDBStreamArn:
    Value:
      Fn::GetAtt:
        - {{@key}}DynamoDB
        - StreamArn
{{/each}}

{{#if es.name}}
  {{es.name}}DomainEndpoint:
    Value:
      Fn::GetAtt:
        - {{es.name}}Domain
        - DomainEndpoint
{{/if}}
