AWS cloudformation如何在映射块中使用条件?

时间:2019-12-05 17:24:26

标签: amazon-web-services amazon-cloudformation

嗨,我有以下映射,我想在其中使用条件语句:

Conditions:
  IsChinaSite:
    !Equals [!Ref SiteType, 'ChinaSite']


Mappings:
  Environment2Env:
    Develop:
      ENV: Dev
      ApiRegion: us-east-1  # There is no test CN data so we are going to keep using test US data in test envs
    Test:
      ENV: Qual
      ApiRegion: us-east-1
    Staging:
      ENV: Test
      ApiRegion: us-east-1
    Production:
      ENV: Prod
      FleetApiRegion: !If[IsChinaSite, ap-northeast-1, us-east-1]

如您所见,我正在尝试根据我网站的prod版本中输入参数的值来将sigv4符号签名到另一个区域。但是after reading the docs似乎不能在模板的Mappings块中使用条件语句。我应该如何/在何处检查IsChinaSite条件?

2 个答案:

答案 0 :(得分:0)

我为您成像,可以将If和FindInMap混合使用以获得所需的结果

Conditions:
  IsChinaSite:
    !Equals [!Ref SiteType, 'ChinaSite']


Mappings:
  Environment2Env:
    Develop:
      ENV: Dev
      ApiRegion: us-east-1
    Test:
      ENV: Qual
      ApiRegion: us-east-1
    Staging:
      ENV: Test
      ApiRegion: us-east-1
    USProduction:
      Env: Prod
      ApiRegion: us-east-1
    ChinaProduction:
      ENV: Prod
      ApiRegion: ap-northeast-1

Resources:
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      AvailabilityZone:
        !If
          - IsChainSite
          - !FindInMap [Environment2Env, ChinaProduction, ApiRegion]
          - !FindInMap [Environment2Env, USProduction, ApiRegion]

答案 1 :(得分:0)

最终不得不在每个env下将区域分成各自的映射。对此感到震惊:

Mappings:
  Environment2Env:
    Develop:
      ENV: Dev
    Test:
      ENV: Qual
    Staging:
      ENV: Test
    USProduction:
      Env: Prod
    ChinaProduction:
      ENV: Prod

  Develop:
    ROW: us-east-1
    ChinaSite: us-east-1
  Test:
    ROW: us-east-1
    ChinaSite: us-east-1
  Staging:
    ROW: us-east-1
    ChinaSite: us-east-1
  Production:
    ROW: us-east-1
    ChinaSite: ap-northeast-1

这个解决方案对我有用,因为值得庆幸的是,我仅使用2维(进行cloudformation映射所需的最大/最小维)进行参数设置,但这有点愚蠢。如果我处于需要在具有多个类型的站点的多个环境中进行部署的情况,并且每种类型的站点都具有某种子类型,那么我会被SCR-D。我仍然认为这里的正确答案是可以支持x ^ n个维数的东西,因此我认为我不会接受自己的答案,但我想分享我对问题的解决方案。