Infelizmente minhas experiências são de concordar com sua conclusão Graeme. Eu tenho lutado com isso há algum tempo, mas não encontrei uma maneira de calcular um String via Fn :: Join e mantê-lo para mais tarde no template.
Posso compartilhar com você um exemplo típico?
Como em 2014-09-18, a maneira mais sofisticada de armazenar um valor de string para reutilização na seção Recursos seria por meio de um Mapeamento (de segundo nível). Melhor ainda, posso pré-computar uma Condição e determinar se devo usar a string ou não. Mas infelizmente o armazenamento de uma string simplesmente não funciona.
Aqui está um exemplo de uma estrofe de tal Mapeamento…
"LoadBalancerBucketMap": {
"BucketName": {
"string": {
"Fn::Join": [
"-",
[
"mylb",
{
"Ref": "Environment"
},
"logs"
]
]
}
}
},
E aqui está uma expressão de acesso a ele em um recurso
"S3BucketName": {
"Fn::FindInMap": [
"LoadBalancerBucketMap",
"BucketName",
"string"
}
Neste exemplo, Environment é um parâmetro literal de string com um padrão conveniente. Então, esse é um exemplo muito claro de criação e reutilização de uma string. Mas aqui está o que o processador CloudFormation diz…
Erro de validação do modelo: Erro no formato do modelo: todo atributo Mappings deve ser uma String ou uma lista.
Então, eu compartilho sua frustração de que não parece haver uma maneira em um modelo para fornecer o efeito de uma variável de string temporária.
… Até onde eu posso ver. Mas a resposta que você recebeu originalmente disse o contrário disso (embora sem um exemplo).
Então, se alguém tiver um exemplo de solução alternativa, eles poderão compartilhar?