Table of Contents

Class NestedStack

Namespace
Amazon.CDK
Assembly
Amazon.CDK.dll

A CloudFormation nested stack.

public class NestedStack : Stack, IConstruct, IConstruct, IDependable, ITaggable
Inheritance
NestedStack
Implements
IConstruct
Inherited Members

Examples

using Amazon.CDK;
             using Constructs;
             using Amazon.CDK.AWS.APIGateway;

             /**
              * This file showcases how to split up a RestApi's Resources and Methods across nested stacks.
              *
              * The root stack 'RootStack' first defines a RestApi.
              * Two nested stacks BooksStack and PetsStack, create corresponding Resources '/books' and '/pets'.
              * They are then deployed to a 'prod' Stage via a third nested stack - DeployStack.
              *
              * To verify this worked, go to the APIGateway
              */

             class RootStack : Stack
             {
                 public RootStack(Construct scope) : base(scope, "integ-restapi-import-RootStack")
                 {

                     var restApi = new RestApi(this, "RestApi", new RestApiProps {
                         Deploy = false
                     });
                     restApi.Root.AddMethod("ANY");

                     var petsStack = new PetsStack(this, new ResourceNestedStackProps {
                         RestApiId = restApi.RestApiId,
                         RootResourceId = restApi.RestApiRootResourceId
                     });
                     var booksStack = new BooksStack(this, new ResourceNestedStackProps {
                         RestApiId = restApi.RestApiId,
                         RootResourceId = restApi.RestApiRootResourceId
                     });
                     new DeployStack(this, new DeployStackProps {
                         RestApiId = restApi.RestApiId,
                         Methods = petsStack.Methods.Concat(booksStack.Methods)
                     });

                     new CfnOutput(this, "PetsURL", new CfnOutputProps {
                         Value = $"https://{restApi.restApiId}.execute-api.{this.region}.amazonaws.com/prod/pets"
                     });

                     new CfnOutput(this, "BooksURL", new CfnOutputProps {
                         Value = $"https://{restApi.restApiId}.execute-api.{this.region}.amazonaws.com/prod/books"
                     });
                 }
             }

             class ResourceNestedStackProps : NestedStackProps
             {
                 public string RestApiId { get; set; }

                 public string RootResourceId { get; set; }
             }

             class PetsStack : NestedStack
             {
                 public readonly Method[] Methods = new [] {  };

                 public PetsStack(Construct scope, ResourceNestedStackProps props) : base(scope, "integ-restapi-import-PetsStack", props)
                 {

                     var api = RestApi.FromRestApiAttributes(this, "RestApi", new RestApiAttributes {
                         RestApiId = props.RestApiId,
                         RootResourceId = props.RootResourceId
                     });

                     var method = api.Root.AddResource("pets").AddMethod("GET", new MockIntegration(new IntegrationOptions {
                         IntegrationResponses = new [] { new IntegrationResponse {
                             StatusCode = "200"
                         } },
                         PassthroughBehavior = PassthroughBehavior.NEVER,
                         RequestTemplates = new Dictionary<string, string> {
                             { "application/json", "{ \"statusCode\": 200 }" }
                         }
                     }), new MethodOptions {
                         MethodResponses = new [] { new MethodResponse { StatusCode = "200" } }
                     });

                     Methods.Push(method);
                 }
             }

             class BooksStack : NestedStack
             {
                 public readonly Method[] Methods = new [] {  };

                 public BooksStack(Construct scope, ResourceNestedStackProps props) : base(scope, "integ-restapi-import-BooksStack", props)
                 {

                     var api = RestApi.FromRestApiAttributes(this, "RestApi", new RestApiAttributes {
                         RestApiId = props.RestApiId,
                         RootResourceId = props.RootResourceId
                     });

                     var method = api.Root.AddResource("books").AddMethod("GET", new MockIntegration(new IntegrationOptions {
                         IntegrationResponses = new [] { new IntegrationResponse {
                             StatusCode = "200"
                         } },
                         PassthroughBehavior = PassthroughBehavior.NEVER,
                         RequestTemplates = new Dictionary<string, string> {
                             { "application/json", "{ \"statusCode\": 200 }" }
                         }
                     }), new MethodOptions {
                         MethodResponses = new [] { new MethodResponse { StatusCode = "200" } }
                     });

                     Methods.Push(method);
                 }
             }

             class DeployStackProps : NestedStackProps
             {
                 public string RestApiId { get; set; }

                 public Method[]? Methods { get; set; }
             }

             class DeployStack : NestedStack
             {
                 public DeployStack(Construct scope, DeployStackProps props) : base(scope, "integ-restapi-import-DeployStack", props)
                 {

                     var deployment = new Deployment(this, "Deployment", new DeploymentProps {
                         Api = RestApi.FromRestApiId(this, "RestApi", props.RestApiId)
                     });
                     if (props.Methods)
                     {
                         for (var method in props.Methods)
                         {
                             deployment.Node.AddDependency(method);
                         }
                     }
                     new Stage(this, "Stage", new StageProps { Deployment = deployment });
                 }
             }

             new RootStack(new App());

Remarks

When you apply template changes to update a top-level stack, CloudFormation updates the top-level stack and initiates an update to its nested stacks. CloudFormation updates the resources of modified nested stacks, but does not update the resources of unmodified nested stacks.

Furthermore, this stack will not be treated as an independent deployment artifact (won't be listed in "cdk list" or deployable through "cdk deploy"), but rather only synthesized as a template and uploaded as an asset to S3.

Cross references of resource attributes between the parent stack and the nested stack will automatically be translated to stack parameters and outputs.

ExampleMetadata: lit=test/integ.restapi-import.lit.ts infused

Constructors

NestedStack(Construct, string, INestedStackProps?)

public NestedStack(Construct scope, string id, INestedStackProps? props = null)

Parameters

scope Construct
id string
props INestedStackProps

Properties

NestedStackResource

If this is a nested stack, this represents its AWS::CloudFormation::Stack resource.

public override CfnResource? NestedStackResource { get; }

Property Value

CfnResource

Remarks

undefined for top-level (non-nested) stacks.

StackId

An attribute that represents the ID of the stack.

public override string StackId { get; }

Property Value

string

Remarks

This is a context aware attribute:

    Example value: arn:aws:cloudformation:us-east-2:123456789012:stack/mystack-mynestedstack-sggfrhxhum7w/f449b250-b969-11e0-a185-5081d0136786

    Attribute: true

    StackName

    An attribute that represents the name of the nested stack.

    public override string StackName { get; }

    Property Value

    string

    Remarks

    This is a context aware attribute:

      Example value: mystack-mynestedstack-sggfrhxhum7w

      Attribute: true

      TemplateFile

      The name of the CloudFormation template file emitted to the output directory during synthesis.

      public override string TemplateFile { get; }

      Property Value

      string

      Remarks

      Example value: MyStack.template.json

      Methods

      IsNestedStack(object)

      Checks if x is an object of type NestedStack.

      public static bool IsNestedStack(object x)

      Parameters

      x object

      Returns

      bool

      SetParameter(string, string)

      Assign a value to one of the nested stack parameters.

      public virtual void SetParameter(string name, string value)

      Parameters

      name string

      The parameter name (ID).

      value string

      The value to assign.