no-variable-construct-id
✅ Using recommended in an ESLint configuration enables this rule.
This rule enforces that variables are not used in Construct IDs.
Using variables for Construct IDs is not appropriate because it may cause the following problems. (This rule does not apply to loop processing such as for, while, forEach, map, etc.)
- Unnecessary duplication
- Resource recreation when parameters change
- Overemphasis on ID uniqueness can lead to mixing in unnecessary strings, making IDs complex and hard to read
(This rule applies only to classes that extends from Construct
.)
🔧 How to use
js
// eslint.config.mjs
export default [
{
// ... some configs
rules: {
"cdk/no-variable-construct-id": "error",
},
},
];
✅ Correct Example
ts
import { Construct } from "constructs";
import { Bucket } from "aws-cdk-lib/aws-s3";
export interface MyConstructProps {
environments: Record<string, string>;
}
class MyConstruct extends Construct {
constructor(scope: Construct, id: string, props: MyConstructProps) {
super(scope, id);
// ✅ String literals can be used
new Bucket(this, "Bucket");
// ✅ Variables can be used for Construct IDs within loop variables
for (const [key, value] of Object.entries(props.environments)) {
new Bucket(this, `${key}Bucket`);
}
}
}
❌ Incorrect Example
ts
import { Construct } from "constructs";
import { Bucket } from "aws-cdk-lib/aws-s3";
export interface MyConstructProps {
stage: string;
}
class MyConstruct extends Construct {
constructor(scope: Construct, id: string, props: MyConstructProps) {
super(scope, id);
// ❌ The constructor's `id` property cannot be specified directly for the Construct ID
new Bucket(this, id);
// ❌ Variables (from props, outside of loops) cannot be used for Construct IDs (using template strings)
new Bucket(this, `${props.stage}Bucket`);
}
}