Amazon web services 在jinja模板中获取CloudFormation内在函数的值

Amazon web services 在jinja模板中获取CloudFormation内在函数的值,amazon-web-services,jinja2,amazon-cloudformation,Amazon Web Services,Jinja2,Amazon Cloudformation,我使用jinja和CloudFormation YAML模板的组合来定义我的基础架构堆栈。我正在尝试为DynamoDB全局表创建CloudWatch警报。正在复制的度量名称ReplicationLatency。我在看这个维基作为参考开始- 现在,在查看了CloudWatch控制台中的度量之后,我意识到接收区域总是所有其他区域,除了源区域本身。i、 例如,如果您在us-east-2(俄亥俄州)打开CW控制台,则除us-east-2外,其他每个地区都会显示ReplicationLatency度量。我

我使用jinja和CloudFormation YAML模板的组合来定义我的基础架构堆栈。我正在尝试为DynamoDB全局表创建CloudWatch警报。正在复制的度量名称ReplicationLatency。我在看这个维基作为参考开始-

现在,在查看了CloudWatch控制台中的度量之后,我意识到接收区域总是所有其他区域,除了源区域本身。i、 例如,如果您在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 %}
但是这里出现的问题是,我没有办法用当前的_region变量正确地调用这个宏。例如,我认为无论如何都没有必要做以下事情:

set my_variable_region = Ref 'AWS::Region'

我想知道是否还有其他方法可以替代?有人遇到过这个问题吗

您可以为每个区域定义一个条件,如果它是当前区域,则该条件仅为false。区域名称可以在条件名称中。然后,您可以在适当的资源中使用这些条件中的每一个。这样,将定义当前区域的资源,但由于该条件而禁用

比如:

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

您可以为每个区域定义一个条件,如果它是当前区域,则该条件仅为false。区域名称可以在条件名称中。然后,您可以在适当的资源中使用这些条件中的每一个。这样,将定义当前区域的资源,但由于该条件而禁用

比如:

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