#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».