Don't assign names to CDK resources

avatar

Borislav Hadzhiev

Fri Apr 23 20213 min read

Updated on Fri Apr 23 2021

the Drawbacks of explicitly assigning Names in AWS CDK #

When we create a CDK resource and explicitly set its name we are unable to update properties on that resource, that require replacement.

If we attempt to update an immutable configuration property on a resource with an explicitly set name, our CDK Stack will be in a gridlocked state.

The only ways for us to continue development would be to delete the stack and re-create it or rename the resource.

For example, say we have the following Dynamodb table:

const table = new dynamodb.Table(this, 'todos-table', { // ๐Ÿ‘‡ explicitly setting tableName tableName: 'my-table', partitionKey: {name: 'date', type: dynamodb.AttributeType.STRING}, billingMode: dynamodb.BillingMode.PAY_PER_REQUEST, removalPolicy: cdk.RemovalPolicy.DESTROY, });

If we look at the CloudFormation stack we can see that the Physical ID (resource name) of the table is my-table:

explicit table name

Let's now update the table's partitionKey property:

const table = new dynamodb.Table(this, 'todos-table', { // ๐Ÿ‘‡ explicitly setting tableName tableName: 'my-table', // ๐Ÿ‘‡ updated the partition key partitionKey: {name: 'todoId', type: dynamodb.AttributeType.NUMBER}, billingMode: dynamodb.BillingMode.PAY_PER_REQUEST, removalPolicy: cdk.RemovalPolicy.DESTROY, });

If we run npx cdk diff we see that the change we've made requires resource replacement:

requires replacement

Let's now try to go through with the update and update our stack with:

npx cdk deploy

As expected our update failed with the message:

CloudFormation cannot update a stack when custom-named resource requires replacing. Rename resource-name and update the stack again.

update failed

At this point we have 2 options:

  • Change the name we've set for the resource so the stack can get unstuck
  • Delete our stack and re-deploy it

After updating the tableName property the stack is in an UPDATE_COMPLETE state again:

const table = new dynamodb.Table(this, 'todos-table', { // ๐Ÿ‘‡ updated the name to fix the stack tableName: 'my-table-2', partitionKey: {name: 'todoId', type: dynamodb.AttributeType.NUMBER}, billingMode: dynamodb.BillingMode.PAY_PER_REQUEST, removalPolicy: cdk.RemovalPolicy.DESTROY, });

updated name

If we have to constantly keep changing our resource names every time we have to change a property, that requires resource replacement, it's probably not a good idea to explicitly set resource names to begin with.

Letting CDK generate Names for us #

The solution is to let CDK generate a name for us, for example if we omit the tableName property:

const table = new dynamodb.Table(this, 'todos-table', { partitionKey: {name: 'todoId', type: dynamodb.AttributeType.NUMBER}, billingMode: dynamodb.BillingMode.PAY_PER_REQUEST, removalPolicy: cdk.RemovalPolicy.DESTROY, });

CDK will auto generate a unique Physical ID (Resource name) for us that won't cause issues on consecutive updates:

autogenerated name

The name consists of the stack name, in this case my-cdk-stack, the construct id - todos-table and a hash. If you want to learn more about Identifiers in CDK check out my other article - CDK Identifiers Tutorial.

The Exception #

When we need to refer to resources from another CDK stack we have to explicitly set resource names.

The resource name that we import in one stack has to match the name of the exported resource from the other stack.

Further Reading #

Add me on LinkedIn

I'm a Web Developer with TypeScript, React.js, Node.js and AWS experience.

Let's connect on LinkedIn

Join my newsletter

I'll send you 1 email a week with links to all of the articles I've written that week

Buy Me A Coffee