Один из способов - присвоить блокам S3 явные имена, чтобы позже вместо использования Ref: bucketname
вы могли просто использовать имя бочки. Это очевидно проблематично, если вам нужны автоматически сгенерированные имена сегментов, и в этих случаях целесообразно генерировать имя сегмента из некоторого префикса плюс (уникальное) имя стека, например:
InputBucket: !Join ["-", ['rawuploads', Ref: 'AWS::StackName']]
Другой вариант - использовать один шаблон CloudFormation, но в 2 этапа - на 1-м этапе создаются базовые ресурсы (и любые ссылки не круглые), а затем вы добавляете оставшиеся ссылки в шаблон и выполняете обновление стека. Очевидно, что это не идеал, поэтому я бы предпочел первый подход.
Вы также можете использовать первый метод в тех случаях, когда вам нужна ссылка на ARN, например:
!Join ['/', ['arn:aws:s3:::logsbucket', 'AWSLogs', Ref: 'AWS:AccountId', '*']]
При использовании этого метода вы можете также рассмотреть возможность использования DependsOn , поскольку вы удалили неявную зависимость, которая иногда может вызывать проблемы.