Come posso risolvere l'errore "Nessuna esportazione denominata XYZ trovata" in CloudFormation?

5 minuti di lettura
0

Ricevo l'errore "Nessuna esportazione denominata XYZ trovata" in AWS CloudFormation quando utilizzo Fn::ImportValue nello stack.

Risoluzione

Prerequisiti:

  • Nello stack in cui stai esportando un valore, usa il flag Export: nella sezione Output del modello CloudFormation.
  • Usa Fn::ImportValue nello stack in cui fai riferimento al valore esportato.

Per risolvere i problemi con i riferimenti allo stack quando utilizzi valori di importazione ed esportazione, intraprendi le seguenti azioni.

Se usi stack annidati, usa DependsOn

Per impostazione predefinita, CloudFormation crea tutti gli stack annidati in parallelo. Quando CloudFormation crea stack secondari in parallelo e uno stack figlio importa un output da un altro, la creazione dello stack potrebbe fallire. Il valore di esportazione potrebbe non essere disponibile in tempo affinché lo stack figlio utilizzi Fn::ImportValue per importarlo.

Per risolvere questo problema, utilizza l'attributo DependsOn. Questo attributo crea una dipendenza esplicita tra lo stack che utilizza Fn::ImportValue e lo stack che utilizza l'attributo Export: per esportare un valore. In questo modo, CloudFormation crea lo stack che utilizza Fn::ImportValue solo dopo aver creato lo stack che esporta il valore.

Esempio: Nel seguente esempio di stack annidato, ChildStack01 esporta un valore nella sezione Output e ChildStack02 utilizza Fn::ImportValue per importare il valore da ChildStack01. Nel seguente modello YAML, ChildStack02 utilizza l'attributo 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'

Nota: Per i riferimenti tra stack, usa Fn::ImportValue per importare un valore da un altro modello. Per i riferimenti all'interno dello stesso stack, utilizza Fn::Ref e Fn::GetAtt per restituire il valore del parametro o della risorsa specificata.

Verifica il nome dell'esportazione nello stack di importazione

Per verificare che il valore di esportazione sia accurato, esegui le seguenti azioni:

  • Verifica che il nome per l'esportazione sia elencato nel tuo account AWS.
  • Quando importi un nome per l’esportazione da uno stack a un altro, verifica di utilizzare lo stesso nome per l’esportazione in entrambi gli stack.
  • Completa i passaggi nella sezione Verifica la configurazione dello stack di esportazione e importazione prima di creare lo stack con Fn::ImportValue.

Assicurati che il valore esportato si trovi nella stessa regione AWS o nello stesso account in cui stai importando il valore

I riferimenti tra stack si applicano solo all'interno di un singolo account e di una singola regione. Gli altri stack nello stesso account e nella stessa regione possono importare solo i valori esportati.

Per risolvere questo problema, completa i passaggi nella sezione Verifica la configurazione dello stack di esportazione e importazione prima di creare lo stack con Fn::ImportValue.

Il valore esportato non viene creato o pubblicato prima dell’importazione nello stack

Per gli stack non annidati, è necessario implementare lo stack che esporta un valore. Lo stack deve essere nello stato Create_Complete o Update_Complete.

Completa i passaggi nella sezione Verifica la configurazione dello stack di esportazione e importazione prima di creare lo stack con Fn::ImportValue.

Verifica la configurazione degli stack di esportazione e importazione

Per verificare che il valore di esportazione sia pronto per l'importazione, utilizza la console CloudFormation o l'interfaccia della linea di comando AWS (AWS CLI).

Nota: Gli stack di importazione ed esportazione devono trovarsi nella stessa regione e nello stesso account.

Per utilizzare la console CloudFormation, completa i seguenti passaggi:

  1. Apri la console CloudFormation.
  2. Nel riquadro di navigazione, scegli Esportazioni.
  3. Conferma che il valore di esportazione per lo stack sia elencato.

Nell'interfaccia della linea di comando di AWS, completa i seguenti passaggi:

  1. Per elencare le esportazioni disponibili, esegui il seguente comando list-exports:

    aws cloudformation list-exports --region us-east-1

    Nota: Sostituisci us-east-1 con la tua regione.

  2. Nell'output, verifica che il valore di Name nell'esportazione sia uguale al valore Fn::ImportValue.

    L'output è simile a questo esempio:

    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

Nota: se visualizzi dei messaggi di errore quando esegui i comandi dell'interfaccia della linea di comando AWS, consulta la sezione Risolvere gli errori AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Una volta che lo stack ha importato un valore di output, non è possibile eliminare lo stack che esporta il valore di output né modificare il valore di output esportato. Prima di poter eliminare lo stack di esportazione o modificare il valore di output, è necessario rimuovere tutte le importazioni. Per informazioni su come utilizzare una soluzione alternativa, consulta Come faccio a utilizzare i parametri nell'Archivio dei parametri AWS Systems Manager per condividere valori tra gli stack di CloudFormation? Il nome per l’esportazione deve essere univoco all'interno della regione.

L'istruzione di importazione nello stack che sta importando le informazioni è simile a questo esempio:

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'
AWS UFFICIALE
AWS UFFICIALEAggiornata 4 mesi fa