Шаблон Cloudformation RDS не может разрешить идентификатор группы безопасности

#mysql #templates #amazon-cloudformation #amazon-rds #aws-security-group

#mysql #шаблоны #amazon-cloudformation #amazon-rds #aws-security-group

Вопрос:

У меня есть CF, который развертывает базу данных MySQL и некоторые ресурсы для AWS. Я хочу, чтобы сценарий был общим и мог использовать его для разных сред. Для одного из этих ресурсов (master db) у меня другая конфигурация группы безопасности, зависящая от среды. Я создаю группы безопасности для каждой условной среды и называю их VaultSecurityGroupInEnv1, VaultSecurityGroupInEnv2 и т.д. Существует карта, которая сохраняет имена групп безопасности для каждой среды. вот мои конфигурации:

 Mappings:
  RegionMap:
    environment1:
      VaultSG: VaultSecurityGroupInEnv1
    environment2:
      VaultSG: VaultSecurityGroupInEnv2

Resources:
  VaultSecurityGroupInEnv1:
    Condition: IsEnv1Environment

  VaultSecurityGroupInEnv2:
    Condition: IsEnv2Environment

  MasterDB:
    Type: AWS::RDS::DBInstance
    Properties:
      VPCSecurityGroups:
        - !ImportValue DbSgId
        - !Sub
          - '${vGroup}'
          - vGroup: !FindInMap
            - RegionMap
            - !Ref Environment
            - VaultSG
 

для чего я получаю следующую ошибку:

 Invalid security group , groupId= vaultsecuritygroupinF.groupid, groupName=. (Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterValue;
 

Вывод из!Sub извлекается и разрешается как строка имени, а не как ресурс. Использование!Ссылка vaultsecuritygroupinF.groupId работает нормально. есть идеи, как правильно использовать map и sub?

Спасибо

Комментарии:

1. Что VaultSG такое? Это имя или идентификатор группы SG?

2. Это имя SG

3. Можете ли вы предоставить более полный пример того, что вы делаете. Это сбивает с толку то, чего вы пытаетесь достичь.

4. Я думаю, было бы лучше, если бы вы отредактировали свой вопрос с помощью правильно отформатированного и полного примера кода.

5. да, отредактирует вопрос

Ответ №1:

Вы не можете использовать FindInMap то, что пытаетесь. Он просто преобразуется в литеральные строки VaultSecurityGroupInEnv1 или VaultSecurityGroupInEnv2 . Он не будет разрешен для фактических ресурсов с тем же именем.

Вместо этого я думаю, что должно быть возможно следующее:

 MasterDB:
  Type: AWS::RDS::DBInstance
  Properties:
    VPCSecurityGroups:
      - !ImportValue DbSgId
      - !If
        - IsEnv1Environment
        - !Ref VaultSecurityGroupInEnv1
        - !Ref "AWS::NoValue"
      - !If
        - IsEnv2Environment
        - !Ref VaultSecurityGroupInEnv2
        - !Ref "AWS::NoValue"
 

Комментарии:

1. спасибо, это решило мою проблему, я уже пробовал это, но я пропустил! Ссылка для «AWS::NoValue».