Amazon web services 如何使用映射块中的条件?

Amazon web services 如何使用映射块中的条件?,amazon-web-services,amazon-cloudformation,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

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

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签名到不同的区域。但是,似乎无法在模板的映射块中使用条件语句。我应该如何/在哪里检查
IsChinaSite
条件?

I图像您可以混合使用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]

最终不得不在每个环境下将这些区域分割成它们自己的映射。以此结束:

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个维度,因此我不认为我会接受我自己的答案,但我想分享我的问题解决方案。

我也想过这样做,但它要求我对每个环境都有一个“env”和“CNenv”条目。如果我开始添加欧洲、非洲或亚洲地区,条目将成倍增加。在这种情况下,参数值
SiteType
基本上决定了区域。所以,也许这种抽象并没有增加价值?也许你只需要进入你想要的区域。或者,您是否每次都要进入所需的区域?您可以随时使用
!参考AWS::Region
不,是的,如果是这样的话,我会使用AWS::Region。有时“中国”站点部署在中国地区,但并不总是如此。