Все ресурсы (или, по крайней мере, для большинства известных мне) могут быть названы вручную.
Для AWS::EC2::SecurityGroup
это будет Properties -> GroupName
AWS::CloudWatch::Alarm
- Properties -> AlarmName
AWS::Lambda::Function
- Properties -> FunctionName
et c.
Но для некоторых из них это может привести к последствиям - вы не сможете обновить некоторые из них, потому что они могут нужен отдых (а имя уже занято). Так что в целом это не очень хорошая практика. И, очевидно, вы не сможете создать полный дубликат env, не изменяя какой-либо параметр для сгенерированного имени, например:
FunctionName: !Sub '${InstanceName}-your-resourse-constant-name-${Environment}'
Если вы не укажете имя, оно будет создайте имя наподобие этого:
${stackName}-${resourceNameInCF}-${someHashCode}
, но в вашем случае кажется, что у вас есть вложенные стеки, и оно становится довольно нечитаемым, особенно с длинными именами из-за объединения имен.