在Jinja模板中获取CloudFormation内部函数的值

时间:2019-04-02 22:34:24

标签: amazon-web-services jinja2 amazon-cloudformation

我结合使用Jinja和CloudFormation YAML模板来定义我的基础架构堆栈。我正在尝试为DynamoDB全局表创建CloudWatch警报。度量标准名称为ReplicationLatency。我一直在看这个维基,以供参考-https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables_monitoring.html

现在,在查看CloudWatch控制台中的指标之后,我意识到,ReceivingRegion始终是所有其他区域,除了源区域本身。也就是说,例如,如果您在us-east-2(俄亥俄州)中打开CW控制台,则除了us-east-2之外,每个其他区域都会显示ReplicationLatency指标。我通过在多个区域中查看相同的指标来验证了这一假设。

现在,为了在us-east-2中为DDB表创建警报,我需要列出存在全局表的所有其他区域的列表。我试图了解如何在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 :(得分:0)

您可以为每个仅在当前区域为假的区域定义条件。区域名称可以在条件名称中。然后,您可以在适当的资源中使用所有这些条件。这样,将定义当前区域的资源,但由于条件而将其禁用。

类似的东西:

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 %}