Quando uso Fn::ImportValue na minha pilha do AWS CloudFormation, recebo o erro "No Export named XYZ found".
Resolução
Pré-requisitos:
- Use o sinalizador Export: na seção Saídas do seu modelo do CloudFormation para a pilha em que está exportando um valor.
- Use Fn::ImportValue na pilha em que você está fazendo referência ao valor exportado.
Para resolver problemas com referências de pilha quando você usa valores de importação e exportação, execute as seguintes ações.
Se você usar pilhas aninhadas, use DependsOn
Por padrão, o CloudFormation cria todas as pilhas aninhadas em paralelo. Quando o CloudFormation cria pilhas secundárias em paralelo e uma pilha secundária importa uma saída de outra, a criação da pilha pode falhar. O valor de exportação pode não estar disponível a tempo de a pilha secundária usar Fn::ImportValue para importá-lo.
Para resolver esse problema, use o atributo DependsOn. Esse atributo cria uma dependência explícita entre a pilha que usa Fn::ImportValue e a pilha que usa o atributo Export: para exportar um valor. Dessa forma, o CloudFormation cria a pilha que usa Fn::ImportValue somente depois de criar a pilha que exporta o valor.
Exemplo: Em uma pilha aninhada, ChildStack01 exporta um valor na seção Outputs e ChildStack02 usa Fn::ImportValue para importar o valor de ChildStack01. No modelo YAML a seguir, ChildStack02 usa o atributo DependsOn:
AWSTemplateFormatVersion: 2010-09-09Resources:
ChildStack01:
Type: 'AWS::CloudFormation::Stack'
Properties:
TemplateURL: 'https://s3.amazonaws.com/cloudformation-templates-us-east-1/VPC.template'
TimeoutInMinutes: '60'
ChildStack02:
Type: 'AWS::CloudFormation::Stack'
DependsOn: ChildStack01
Properties:
TemplateURL: 'https://s3.amazonaws.com/cloudformation-templates-us-east-1/Subnet.template'
TimeoutInMinutes: '60'
Observação: para referências entre pilhas, use Fn::ImportValue para importar um valor de outro modelo. Para referências dentro da mesma pilha, use Fn::Ref e Fn::GetAtt para retornar o valor do parâmetro ou recurso especificado.
Verificar o nome da exportação na pilha de importação
Para verificar se o valor de exportação está correto, execute as seguintes ações:
- Confirme se o nome da exportação está listado na sua conta do AWS.
- Quando você importar um nome de exportação de uma pilha para outra, confirme se está usando o mesmo nome de exportação em ambas as pilhas.
- Antes de criar a pilha com Fn::ImportValue, consulte a seção Verificar a configuração das pilhas de exportação e importação.
Certifique-se de que o valor exportado esteja na mesma região da AWS ou na mesma conta de onde você está importando o valor
Você pode usar referências entre pilhas somente em uma conta e região. No entanto, outras pilhas que estejam na mesma conta e região apenas podem importar os valores exportados.
Para resolver esse problema, antes de criar a pilha com Fn::ImportValue, consulte a seção Verificar a configuração das pilhas de exportação e importação.
Certifique-se de que o valor exportado seja criado ou publicado antes que a pilha o importe
Para pilhas não aninhadas, primeiro você deve implementar a pilha que está exportando um valor. A pilha deve estar no estado Create_Complete ou Update_Complete.
Antes de criar a pilha com Fn::ImportValue, consulte a seção Verificar a configuração das pilhas de exportação e importação.
Verificar a configuração das pilhas de exportação e importação
Para verificar se o valor de exportação está pronto para ser importado, use o console do CloudFormation ou a AWS Command Line Interface (AWS CLI).
Observação: as pilhas de importação e exportação devem estar na mesma região e conta.
Para usar o console do CloudFormation, conclua as etapas a seguir:
- Abra o console do CloudFormation.
- No painel de navegação, escolha Exportações.
- Confirme se o valor de exportação da pilha está listado.
Para usar a AWS CLI, conclua as etapas a seguir:
-
Para listar as exportações disponíveis, execute o seguinte comando list-exports:
aws cloudformation list-exports --region us-east-1
Observação: substitua us-east-1 pela sua região.
-
Na saída, verifique se o valor de Name na exportação é o mesmo que o valor de Fn::ImportValue.
O resultado é semelhante a este exemplo:
aws cloudformation list-exports --region us-east-1 --output yamlExports:
- ExportingStackId: arn:aws:cloudformation:us-east-1:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800
Name: private-vpc-subnet-a
Value: subnet-01a234bcdefghij56
Observação: se você receber erros ao executar comandos da AWS CLI, consulte Solucionar erros da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.
Depois que uma pilha importa um valor de saída, você não pode excluir a pilha que está exportando o valor de saída nem modificar o valor de saída exportado. Você deve remover todas as importações antes de excluir a pilha de exportação ou modificar o valor de saída. Para obter informações sobre como usar uma solução alternativa, consulte Como uso parâmetros no AWS Systems Manager Parameter Store para compartilhar valores entre pilhas do CloudFormation? Observe que o nome da exportação deve ser exclusivo na região.
A instrução de importação na pilha que está importando as informações é semelhante a este exemplo:
Resources:
WebServerInstance:
Type: 'AWS::EC2::Instance'
Properties:
InstanceType: t2.micro
ImageId: ami-a1b23456
NetworkInterfaces:
AssociatePublicIpAddress: 'true'
DeviceIndex: '0'
DeleteOnTermination: 'true'
SubnetId: Fn::ImportValue: 'private-vpc-subnet-a'