2017-04-13 2 views
1

Weitere AWS-Fragen! Ok, also die Idee ist eine Mastervorlage, die alle verschachtelten Stacks aufruft. Mit Hilfe von hier habe ich herausgefunden, wie man Parameter vom Master an die verschachtelten Stacks weitergibt. Jetzt versuche ich herauszufinden, wie man Werte von verschachtelten Stapeln an verschachtelte Stapel übergibt. Ich glaube, dies sollte über Exporte und Importe geschehen, aber ich glaube nicht, dass ich das recht habe. Ich bin mir nicht sicher, ob meine Importe oder Exporte falsch sind.AWS CloudFormation: Übergeben von Werten zwischen verschachtelten Stacks

Der Fehler Ich erhalte ist:

No export named TestStack1-VpcStackID found. Rollback requested by user. 

Master:

{ 
    "AWSTemplateFormatVersion" : "2010-09-09", 
    "Description" : "Master template", 
    "Parameters" : { 
     "availabilityZone" : { 
      "Default" : "us-east-1d", 
      "Description" : "Enter AvailabilityZone.", 
      "Type" : "String" 
     }, 
     "VpcCidrBlock" : { 
      "Default" : "10.0.0.0/16", 
      "Description" : "VPC CIDR Block.", 
      "Type" : "String" 
     }, 
     "PublicSubnetCidrBlock" : { 
      "Default" : "10.0.0.0/24", 
      "Description" : "Public subnet CIDR block.", 
      "Type" : "String" 
     } 
    }, 
    "Resources" : { 
     "VpcStack" : { 
      "Type" : "AWS::CloudFormation::Stack", 
      "Properties" : { 
       "Parameters" : { 
        "VpcCidrBlock" : { 
         "Ref" : "VpcCidrBlock" 
        } 
       }, 
       "TemplateURL" : "https://s3.amazonaws.com/url/templates/vpcStack.json", 
       "TimeoutInMinutes" : "5" 
      } 
     }, 
     "PublicRouteStack" : { 
      "Type" : "AWS::CloudFormation::Stack", 
      "Properties" : { 
       "Parameters" : { 
        "PublicSubnetCidrBlock" : { 
         "Ref" : "PublicSubnetCidrBlock" 
        }, 
        "VpcStack" : { 
         "Fn::ImportValue" : { 
          "Fn::Sub" : "${AWS::StackName}-VpcStackID" 
         } 
        } 
       }, 
       "TemplateURL" : "https://s3.amazonaws.com/url/templates/publicRouteStack.json", 
       "TimeoutInMinutes" : "5" 
      } 
     } 
    } 
} 

VpcStack (Nested - Ich glaube nicht, Recht, das ich zur Ausgabe):

{ 
    "AWSTemplateFormatVersion" : "2010-09-09", 
    "Description" : "VPC template", 
    "Parameters" : { 
     "VpcCidrBlock" : { 
      "Description" : "Vpc CIDR Block.", 
      "Type" : "String" 
     } 
    }, 
    "Resources" : { 
     "VpcStack" : { 
      "Type" : "AWS::EC2::VPC", 
      "Properties" : { 
       "EnableDnsSupport" : "true", 
       "EnableDnsHostnames" : "true", 
       "CidrBlock" : { 
        "Ref" : "VpcCidrBlock" 
       }, 
       "Tags" : [ 
        { 
         "Key" : "Application", 
         "Value" : { 
          "Ref" : "AWS::StackName" 
         } 
        } 
       ] 
      } 
     } 
    }, 
    "Outputs" : { 
     "VpcStack" : { 
      "Description" : "VPC Stack ID.", 
      "Value" : { 
       "Ref" : "VpcStack" 
      }, 
      "Export" : { 
       "Name" : { 
        "Fn::Sub" : "${AWS::StackName}-VpcStackID" 
       } 
      } 
     } 
    } 
} 

PublicStubnetStack (ich glaube, das ist, wo es versagt):

{ 
    "AWSTemplateFormatVersion" : "2010-09-09", 
    "Description" : "Public Subnet Stack", 
    "Parameters" : { 
     "PublicSubnetCidrBlock" : { 
      "Default" : "10.0.0.0/24", 
      "Description" : "Public subnet CIDR block.", 
      "Type" : "String" 
     }, 
     "VpcStack" : { 
      "Description" : "VPC Stack.", 
      "Type" : "String" 
     } 
    }, 
    "Resources" : { 
     "PublicSubnet" : { 
      "Type" : "AWS::EC2::Subnet", 
      "Properties" : { 
       "VpcId" : { 
        "Ref" : "VpcStack" 
       }, 
       "CidrBlock" : { 
        "Ref" : "PublicSubnetCidrBlock" 
       }, 
       "Tags" : [ 
        { 
         "Key" : "Application", 
         "Value" : { 
          "Ref" : "AWS::StackName" 
         } 
        }, 
        { 
         " Key" : "Network", 
         "Value" : "Public" 
        } 
       ] 
      } 
     } 
    }, 
    "Outputs" : { 
     "PublicSubnet" : { 
      "Description" : "Public Subnet ID.", 
      "Value" : { 
       "Ref" : "PublicSubnet" 
      }, 
      "Export" : { 
       "Name" : { 
        "Fn::Sub" : "${AWS::StackName}-PublicSubnetID" 
       } 
      } 
     } 
    } 
} 

Leider so viele sein Posting, ich bin sehr neu auf AWS, und ich versuche, es schnell zu holen.

Antwort

3

Das Problem

Ihr Problem ist, dass Sie den Wert als

"Export" : { 
    "Name" : { 
    "Fn::Sub" : "${AWS::StackName}-VpcStackID" 
    } 
} 

exportieren Sie verwenden die ${AWS::StackName} Variable, die den aktuellen Stack Namen in Ihrer Exportvariablennamen ersetzen wird. Beachten Sie, dass dies der Stapelname Ihres verschachtelten Stapels ist.

Während in Ihrem Wrapper-Vorlage, versuchen Sie den Wert zu importieren:

"Fn::ImportValue" : { 
    "Fn::Sub" : "${AWS::StackName}-VpcStackID" 
} 

Auch Sie sind die variable ${AWS::StackName} für den aktuellen Stack ersetzt, die in diesem Fall Ihre Wrapper Stapel.

Beachten Sie, wenn Sie verschachtelte Stapel verwenden, werden Sie einen neuen Stapel tatsächlich zu schaffen, so dass die Stapel Namen ändern, je nachdem auf welche Vorlage Sie sind in.

Die Resolution

nicht importieren Verwenden Sie/Export für Ihre Variablen.

In Ihren verschachtelten Vorlagen löschen Sie das Export Element aus Ihren Ausgaben. Du brauchst sie nicht. Verwenden Sie einfach Stapelparameter, um Werte von Ihrem Wrapper-Stapel an verschachtelte Stapel zu übergeben, und verwenden Sie Stapelausgaben, um Werte von verschachtelten Stapeln an Wrapper-Stapel zu übergeben.

In Ihrem Wrapper-Stack verwenden, um die Ausgabe von VpcStack wie folgt aus:

"PublicRouteStack" : { 
     "Type" : "AWS::CloudFormation::Stack", 
     "Properties" : { 
      "Parameters" : { 
       "PublicSubnetCidrBlock" : { 
        "Ref" : "PublicSubnetCidrBlock" 
       }, 
       "VpcStack" : { 
        "Fn::GetAtt" : [ "VpcStack", "Outputs.VpcStack" ] 
       } 
      }, 
      "TemplateURL" : "https://s3.amazonaws.com/url/templates/publicRouteStack.json", 
      "TimeoutInMinutes" : "5" 
     } 
    } 

Beachten Sie, dass in diesem Fall ich die Ausgang bin mit namens VpcStack von Ihrem VpcStack verschachtelten Stapel über die Fn::GetAtt Funktion.

PS. Sie sollten einige Ihrer Namen einfach aus Gründen der Klarheit ändern. Versuchen Sie zu vermeiden, den gleichen Namen überall zu verwenden. Es hilft, Dinge klarzustellen.

Verwandte Themen