@Generated(value="jsii-pacmak/1.63.2 (build a8a8833)", date="2022-08-09T19:16:31.488Z") public class NestedStack extends Stack
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.
Example:
import software.amazon.awscdk.core.App; import software.amazon.awscdk.core.CfnOutput; import software.amazon.awscdk.core.NestedStack; import software.amazon.awscdk.core.NestedStackProps; import software.amazon.awscdk.core.Stack; import software.constructs.Construct; import software.amazon.awscdk.services.apigateway.Deployment; import software.amazon.awscdk.services.apigateway.Method; import software.amazon.awscdk.services.apigateway.MockIntegration; import software.amazon.awscdk.services.apigateway.PassthroughBehavior; import software.amazon.awscdk.services.apigateway.RestApi; import software.amazon.awscdk.services.apigateway.Stage; /** * 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 */ public class RootStack extends Stack { public RootStack(Construct scope) { super(scope, "integ-restapi-import-RootStack"); RestApi restApi = RestApi.Builder.create(this, "RestApi") .deploy(false) .build(); restApi.root.addMethod("ANY"); PetsStack petsStack = new PetsStack(this, new ResourceNestedStackProps() .restApiId(restApi.getRestApiId()) .rootResourceId(restApi.getRestApiRootResourceId()) ); BooksStack booksStack = new BooksStack(this, new ResourceNestedStackProps() .restApiId(restApi.getRestApiId()) .rootResourceId(restApi.getRestApiRootResourceId()) ); new DeployStack(this, new DeployStackProps() .restApiId(restApi.getRestApiId()) .methods(petsStack.methods.concat(booksStack.getMethods())) ); CfnOutput.Builder.create(this, "PetsURL") .value(String.format("https://%s.execute-api.%s.amazonaws.com/prod/pets", restApi.getRestApiId(), this.region)) .build(); CfnOutput.Builder.create(this, "BooksURL") .value(String.format("https://%s.execute-api.%s.amazonaws.com/prod/books", restApi.getRestApiId(), this.region)) .build(); } } public class ResourceNestedStackProps extends NestedStackProps { private String restApiId; public String getRestApiId() { return this.restApiId; } public ResourceNestedStackProps restApiId(String restApiId) { this.restApiId = restApiId; return this; } private String rootResourceId; public String getRootResourceId() { return this.rootResourceId; } public ResourceNestedStackProps rootResourceId(String rootResourceId) { this.rootResourceId = rootResourceId; return this; } } public class PetsStack extends NestedStack { public final Method[] methods; public PetsStack(Construct scope, ResourceNestedStackProps props) { super(scope, "integ-restapi-import-PetsStack", props); IRestApi api = RestApi.fromRestApiAttributes(this, "RestApi", RestApiAttributes.builder() .restApiId(props.getRestApiId()) .rootResourceId(props.getRootResourceId()) .build()); Method method = api.root.addResource("pets").addMethod("GET", MockIntegration.Builder.create() .integrationResponses(List.of(IntegrationResponse.builder() .statusCode("200") .build())) .passthroughBehavior(PassthroughBehavior.NEVER) .requestTemplates(Map.of( "application/json", "{ \"statusCode\": 200 }")) .build(), MethodOptions.builder() .methodResponses(List.of(MethodResponse.builder().statusCode("200").build())) .build()); this.methods.push(method); } } public class BooksStack extends NestedStack { public final Method[] methods; public BooksStack(Construct scope, ResourceNestedStackProps props) { super(scope, "integ-restapi-import-BooksStack", props); IRestApi api = RestApi.fromRestApiAttributes(this, "RestApi", RestApiAttributes.builder() .restApiId(props.getRestApiId()) .rootResourceId(props.getRootResourceId()) .build()); Method method = api.root.addResource("books").addMethod("GET", MockIntegration.Builder.create() .integrationResponses(List.of(IntegrationResponse.builder() .statusCode("200") .build())) .passthroughBehavior(PassthroughBehavior.NEVER) .requestTemplates(Map.of( "application/json", "{ \"statusCode\": 200 }")) .build(), MethodOptions.builder() .methodResponses(List.of(MethodResponse.builder().statusCode("200").build())) .build()); this.methods.push(method); } } public class DeployStackProps extends NestedStackProps { private String restApiId; public String getRestApiId() { return this.restApiId; } public DeployStackProps restApiId(String restApiId) { this.restApiId = restApiId; return this; } private Method[] methods; public Method[] getMethods() { return this.methods; } public DeployStackProps methods(Method[] methods) { this.methods = methods; return this; } } public class DeployStack extends NestedStack { public DeployStack(Construct scope, DeployStackProps props) { super(scope, "integ-restapi-import-DeployStack", props); Deployment deployment = Deployment.Builder.create(this, "Deployment") .api(RestApi.fromRestApiId(this, "RestApi", props.getRestApiId())) .build(); if (props.getMethods()) { for (Object method : props.getMethods()) { deployment.node.addDependency(method); } } Stage.Builder.create(this, "Stage").deployment(deployment).build(); } } new RootStack(new App());
Modifier and Type | Class and Description |
---|---|
static class |
NestedStack.Builder
A fluent builder for
NestedStack . |
ITaggable.Jsii$Default, ITaggable.Jsii$Proxy
IConstruct.Jsii$Default, IConstruct.Jsii$Proxy
Modifier | Constructor and Description |
---|---|
protected |
NestedStack(software.amazon.jsii.JsiiObject.InitializationMode initializationMode) |
protected |
NestedStack(software.amazon.jsii.JsiiObjectRef objRef) |
|
NestedStack(software.constructs.Construct scope,
java.lang.String id) |
|
NestedStack(software.constructs.Construct scope,
java.lang.String id,
NestedStackProps props) |
Modifier and Type | Method and Description |
---|---|
CfnResource |
getNestedStackResource()
If this is a nested stack, this represents its `AWS::CloudFormation::Stack` resource.
|
java.lang.String |
getStackId()
An attribute that represents the ID of the stack.
|
java.lang.String |
getStackName()
An attribute that represents the name of the nested stack.
|
java.lang.String |
getTemplateFile()
The name of the CloudFormation template file emitted to the output directory during synthesis.
|
static java.lang.Boolean |
isNestedStack(java.lang.Object x)
Checks if `x` is an object of type `NestedStack`.
|
void |
setParameter(java.lang.String name,
java.lang.String value)
Assign a value to one of the nested stack parameters.
|
addDependency, addDependency, addDockerImageAsset, addFileAsset, addTransform, allocateLogicalId, exportValue, exportValue, formatArn, getAccount, getArtifactId, getAvailabilityZones, getBundlingRequired, getDependencies, getEnvironment, getLogicalId, getNested, getNestedStackParent, getNotificationArns, getParentStack, getPartition, getRegion, getSynthesizer, getTags, getTemplateOptions, getTerminationProtection, getUrlSuffix, isStack, of, parseArn, parseArn, parseArn, prepareCrossReference, regionalFact, regionalFact, renameLogicalId, reportMissingContext, reportMissingContextKey, resolve, splitArn, toJsonString, toJsonString
getNode, isConstruct, onPrepare, onSynthesize, onValidate, prepare, synthesize, validate
protected NestedStack(software.amazon.jsii.JsiiObjectRef objRef)
protected NestedStack(software.amazon.jsii.JsiiObject.InitializationMode initializationMode)
public NestedStack(software.constructs.Construct scope, java.lang.String id, NestedStackProps props)
scope
- This parameter is required.id
- This parameter is required.props
- public NestedStack(software.constructs.Construct scope, java.lang.String id)
scope
- This parameter is required.id
- This parameter is required.public static java.lang.Boolean isNestedStack(java.lang.Object x)
x
- This parameter is required.public void setParameter(java.lang.String name, java.lang.String value)
name
- The parameter name (ID). This parameter is required.value
- The value to assign. This parameter is required.public java.lang.String getStackId()
This is a context aware attribute:
{ "Ref": "LogicalIdOfNestedStackResource" }
.{ "Ref": "AWS::StackId" }
Example value: arn:aws:cloudformation:us-east-2:123456789012:stack/mystack-mynestedstack-sggfrhxhum7w/f449b250-b969-11e0-a185-5081d0136786
getStackId
in class Stack
public java.lang.String getStackName()
This is a context aware attribute:
{ "Ref": "AWS::StackName" }
Example value: mystack-mynestedstack-sggfrhxhum7w
getStackName
in class Stack
public java.lang.String getTemplateFile()
Example value: MyStack.template.json
getTemplateFile
in class Stack
public CfnResource getNestedStackResource()
undefined
for top-level (non-nested) stacks.
getNestedStackResource
in class Stack