能否仅为AWS CDK自定义构造创建的资源添加标签?
解决CDK中仅为自定义资源打标签的问题
当你在Stack级别添加标签时,CDK自动生成的附属资源(比如启用logRetention时出现的日志管理Lambda)也会被打上相同标签。要只给自己定义的资源打标签,有几种实用方法:
方法1:直接给自定义资源单独打标签
别在Stack全局加标签,而是给你自己写的Lambda单独加标签,这样最直接:
export class MainStack extends Stack { constructor(scope: Construct, id:string, props:StackProps) { super(scope, id, props); const func = new Function(this, 'function', { functionName: 'cdk-function', code: Code.fromInline('print(event)'), handler: 'lambda.handler', runtime: Runtime.PYTHON_3_8, logRetention: RetentionDays.ONE_DAY }); // 只给这个自定义Lambda打标签 Tags.of(func).add('createdBy','cdk'); } }
这样只有你显式定义的cdk-function会被打上标签,CDK自动生成的日志管理Lambda不会沾到标签。
方法2:全局加标签但排除自动资源
如果必须在Stack全局加标签,又要排除自动生成的资源,可以用两种方式过滤:
方式A:按资源类型过滤(适合批量排除)
如果Stack里只有你自定义的一个Lambda,也可以先全局加标签,再排除所有Lambda类型,然后单独给自定义的Lambda补加标签:
export class MainStack extends Stack { constructor(scope: Construct, id:string, props:StackProps) { super(scope, id, props); // 全局加标签,但排除所有Lambda资源 Tags.of(this).add('createdBy','cdk', { excludeResourceTypes: ['AWS::Lambda::Function'] }); const func = new Function(this, 'function', { functionName: 'cdk-function', code: Code.fromInline('print(event)'), handler: 'lambda.handler', runtime: Runtime.PYTHON_3_8, logRetention: RetentionDays.ONE_DAY }); // 单独给自定义Lambda补加标签 Tags.of(func).add('createdBy','cdk'); } }
方式B:按构造ID过滤(精准排除)
CDK自动生成的日志留存Lambda,构造ID通常带LogRetention后缀,你可以遍历Stack内的资源,只给自己定义的资源打标签:
export class MainStack extends Stack { constructor(scope: Construct, id:string, props:StackProps) { super(scope, id, props); const func = new Function(this, 'function', { functionName: 'cdk-function', code: Code.fromInline('print(event)'), handler: 'lambda.handler', runtime: Runtime.PYTHON_3_8, logRetention: RetentionDays.ONE_DAY }); // 遍历Stack下的所有资源,只给ID匹配的自定义资源打标签 this.node.children.forEach(child => { if (child.id === 'function') { Tags.of(child).add('createdBy','cdk'); } }); } }
推荐方案
优先选方法1,逻辑简单清晰,不会因为CDK版本更新导致自动资源的ID或类型变化而失效,维护起来最省心。
内容的提问来源于stack exchange,提问作者Levi
相关产品推荐
相关产品推荐

