Skip to main content

App

caution

This is the SST v1.x Constructs doc. SST v2 is now released. If you are using v2, see the v2 Constructs doc. If you are looking to upgrade to v2, check out the upgrade steps.

The App construct extends cdk.App and is used internally by SST to:

  • Automatically prefix stack names with the stage and app name
  • Deploy the entire app using the same AWS profile and region

It is made available as the app in the stacks/index.js of your SST app.

export default function main(app) {
new MySampleStack(app, "sample");
}

Since it is initialized internally, the props that are passed to App cannot be changed.

Examples

Accessing app properties

The properties of the app can be accessed in the stacks/index.js as:

export default function main(app) {
app.name;
app.stage;
app.region;
app.account;
}

Specifying default function props

You can also use addDefaultFunctionPermissions, addDefaultFunctionEnv, and addDefaultFunctionLayers to progressively add more permissions, environment variables, and layers to the defaults. These can be called multiple times and from anywhere.

stacks/index.js
export default function main(app) {
app.setDefaultFunctionProps({
timeout: 20,
memorySize: 512,
runtime: "go1.x",
environment: { TABLE_NAME: "NOTES_TABLE" },
});

// Start adding stacks
}

Or if you need to access the Stack scope, you can pass in a callback.

stacks/index.js
import { StringParameter } from "aws-cdk-lib/aws-ssm";

export default function main(app) {
app.setDefaultFunctionProps((stack) => ({
timeout: 20,
memorySize: 512,
runtime: "go1.x",
environment: {
API_KEY: StringParameter.valueFromLookup(stack, "my_api_key"),
},
}));

// Start adding stacks
}

Updating default function props

You can also use addDefaultFunctionPermissions, addDefaultFunctionEnv, and addDefaultFunctionLayers to progressively add more permissions, environment variables, and layers to the defaults. These can be called multiple times and from anywhere.

However, they only affect the functions that are created after the call.

stacks/index.js
export default function main(app) {
app.stack(StackA)

app.addDefaultFunctionEnv({
TABLE_NAME: "NOTES_TABLE"
});

app.addDefaultFunctionPermissions(["s3"]);

app.addDefaultFunctionLayers([mylayer]);

app.stack(StackB)

// Add more stacks
}

So in the above example, the addDefaultFunctionPermissions and addDefaultFunctionEnv calls will only impact the functions in StackB.

You can also use the Stack's setDefaultFunctionProps to update these for a specific stack.

Setting a default removal policy

You can set a removal policy to apply to all the resources in the app. This is useful for ephemeral environments that need to clean up all their resources on removal.

stacks/index.js
export default function main(app) {
// Remove all resources when the dev stage is removed
if (app.stage === "dev") {
app.setDefaultRemovalPolicy("destroy");
}

// Add stacks
}

Note that, the setDefaultRemovalPolicy method isn't meant to be used for production environments.

Properties

An instance of App has the following properties.

account

Type : string

The AWS account the app is being deployed to. This comes from the IAM credentials being used to run the SST CLI.

defaultRemovalPolicy

Type : undefined | "destroy" | "retain" | "snapshot"

local

Type : boolean

Whether or not the app is running locally under sst start

name

Type : string

The name of your app, comes from the name in your sst.json

region

Type : string

The region the app is being deployed to. If this is not specified as the --region option in the SST CLI, it'll default to the region in your sst.json.

stage

Type : string

The stage the app is being deployed to. If this is not specified as the --stage option, it'll default to the stage configured during the initial run of the SST CLI.

Methods

An instance of App has the following methods.

addDefaultFunctionBinding

addDefaultFunctionBinding(bind)

Parameters

  • bind Array<SSTConstruct>

Binds additional default resources to be applied to all Lambda functions in the app.

app.addDefaultFunctionBinding([STRIPE_KEY, bucket]);

addDefaultFunctionConfig

caution

This function signature has been deprecated.

addDefaultFunctionConfig(config)

Adds additional default config to be applied to all Lambda functions in the app.

// Change
app.addDefaultFunctionConfig([STRIPE_KEY]);

// To
app.addDefaultFunctionBinding([STRIPE_KEY]);

The "addDefaultFunctionConfig" method will be removed in SST v2. Pass Parameters and Secrets in through the "addDefaultFunctionBinding" function. Read more about how to upgrade here — https://docs.sst.dev/upgrade-guide#upgrade-to-v116

addDefaultFunctionEnv

addDefaultFunctionEnv(environment)

Parameters

  • environment Record<string, string>

Adds additional default environment variables to be applied to all Lambda functions in the app.

app.addDefaultFunctionPermissions({
"MY_ENV_VAR": "my-value"
})

addDefaultFunctionLayers

addDefaultFunctionLayers(layers)

Parameters

Adds additional default layers to be applied to all Lambda functions in the stack.

addDefaultFunctionPermissions

addDefaultFunctionPermissions(permissions)

Parameters

Adds additional default Permissions to be applied to all Lambda functions in the app.

app.addDefaultFunctionPermissions(["s3"])

logicalPrefixedName

logicalPrefixedName(logicalName)

Parameters

  • logicalName string

Use this method to prefix resource names in your stacks to make sure they don't thrash when deployed to different stages in the same AWS account. This method will prefix a given resource name with the stage and app name. Using the format ${stage}-${name}-${logicalName}.

console.log(app.logicalPrefixedName("myTopic"));

// dev-my-app-myTopic

runDeferredBuilds

runDeferredBuilds()

setDefaultFunctionProps

setDefaultFunctionProps(props)

Parameters

The default function props to be applied to all the Lambda functions in the app. These default values will be overridden if a Function sets its own props. This needs to be called before a stack with any functions have been added to the app.

app.setDefaultFunctionProps({
runtime: "nodejs12.x",
timeout: 30
})

setDefaultRemovalPolicy

setDefaultRemovalPolicy(policy)

Parameters

  • policy "destroy" | "retain" | "snapshot"

The default removal policy that'll be applied to all the resources in the app. This can be useful to set ephemeral (dev or feature branch) environments to remove all the resources on deletion.

danger

Make sure to not set the default removal policy to DESTROY for production environments.

app.setDefaultRemovalPolicy(app.local ? "destroy" : "retain")