如何克隆CDK资源



假设我使用的是带有TypeScript的AWS CDK。有没有一种方法可以定义一个以资源为参数并使用调整后的参数创建克隆的函数?

或者,CDK构造是否允许提取它们的所有属性,以便我可以在新的构造函数中使用它们?

也许有一个TypeScript技巧可以实现这一点?我对语言不太熟悉。


更具体地说,我想对IAM角色执行此操作。

(以下是非常伪代码-y(

const role = new iam.Role(this, 'CloudWatchLogsLoggingRole', {
...
});
makeRoleVariant(role)
makeRoleVariant(role: iam.Role) {
// newAttributes = <attributes from role, but edited>
new iam.Role(
...newAttributes
);
}

这里推荐的方法是使用面向对象编程中的简单extends

例如,如果你想有一个可重复使用的IAM角色,并进行一些调整,你想将其传递给其他需要IRole对象的构造,你可以这样做:

export class RoleWithSNSPermissions extends iam.Role{
construct(scope: Construct, id:string){
super(scope, id);
this.addToRolePolicy(new PolicyStatement({
actions: ['sns:*'], resources: ['*'],
}));
}
}

然后你可以开始使用它:

const role = new RoleWithSNSPermissions(this, 'Role');
new lambda.Function(this, 'fn', {
...
role,

或者,由于MOST内置CDK构造是强类型的以接受接口,而不是具体实现(例如,lambda.Function()构造需要IRole对象而不是Role对象(,因此您也可以自由创建符合IRole接口的完全自定义类。

class MyCustomRole implements IRole{
// Implement all methods of IRole here
}

这种方法的缺点是,您需要重新实现在父接口中定义的所有方法,因此选择最适合您的用例的选项。

一般经验法则是:

  • 如果只想应用一些小的更改,比如应用有意义的默认值或在后台调用方法,那么就扩展基类
  • 如果您想要一个完全自定义的行为和灵活性来覆盖代码流,请实现接口
  • 对于某些用例,还有一个组合选项

最新更新