Получение значений встроенных функций CloudFormation в шаблоне jinja - PullRequest
1 голос
/ 03 апреля 2019

Я использую комбинацию шаблонов YAML jinja и CloudFormation для определения моего стека инфраструктуры.Я пытаюсь создать CloudWatch для глобальных таблиц DynamoDB.Имя метрики: ReplicationLatency.Я искал в этой вики ссылку для начала - https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables_monitoring.html

Теперь, просмотрев метрики в консоли CloudWatch, я понял, что ReceivingRegion - это всегда все остальные регионы, кроме самого исходного региона.например, если вы откроете консоль CW в us-east-2 (штат Огайо), показатели ReplicationLatency появятся для каждого другого региона, кроме us-east-2.Я подтвердил это предположение, посмотрев на одну и ту же метрику в нескольких регионах.

Теперь, чтобы создать сигнал тревоги для таблицы DDB в us-east-2, мне потребуется список всех других регионов, где существует глобальная таблица.Я пытаюсь понять, как я смогу получить эту часть в шаблоне CF / jinja.

Первоначально я думал, что у меня будет макрос jinja, подобный следующему:

{% macro cw_alarms(current_region) %}
  {% set global_table_all_regions = ['us-east-1', 'us-east-2', 'us-west-1', 'us-west-2', 'eu-west-1', 'eu-west-2', 'eu-central-1', 'ap-northeast-1', 'ap-northeast-2', 'ap-southeast-1', 'ap-southeast-2']

  {% set alarm_region_suffix_list = ddb_global_table_regions | reject(current_region %}
  {% for alarm_region_suffix in alarm_region_suffix_list %}
SomeAlarmName:
  Type: AWS::CloudWatch::Alarm
  Properties:
    Namespace: "AWS/DynamoDB"
    MetricName: "ReplicationLatency"
    Dimensions:
    - Name: TableName
      Value: Ref TableName
    - Name: Receiving-Region
      Value: alarm_region
    Statistic: p90
    Period: '300'
    EvaluationPeriods: '1'
    Threshold: 5000
    ComparisonOperator: GreaterThanThreshold
   {% endmacro %}

Но здесь возникает проблема, что сейчас у меня есть возможность вызывать этот макрос с набором переменных current_regionдолжным образом.Например, я не думаю, что в любом случае можно сделать что-то вроде:

set my_variable_region = Ref 'AWS::Region'

Я пытаюсь понять, есть ли другая альтернатива для этого?Кто-нибудь сталкивался с этой проблемой?

1 Ответ

0 голосов
/ 03 апреля 2019

Вы можете определить условие для каждого региона, которое будет ложным, только если это текущий регион.Имя региона может быть в имени условия.Затем вы можете использовать каждое из этих условий в соответствующем ресурсе.Таким образом, ресурс для текущего региона будет определен, но отключен из-за условия.

Что-то вроде:

Conditions:
{% for region in global_table_all_regions %}
  IsNot{{ region }}: !Not [!Equals [ !Ref AWS::Region, {{ region }} ]]
{% endfor %}
Resources:
{% for region in global_table_all_regions %}
  Alaram{{ region }}:
    Type: AWS::CloudWatch::Alarm
    Condition: IsNot{{ region }}
    Properties:
      Namespace: "AWS/DynamoDB"
      MetricName: "ReplicationLatency"
      # ... insert props here
{% endfor %}
...