CDK中EdgeFunction资源能否部署到跨区域的其他Stack中?
1. 为什么cloudfront.experimental.EdgeFunction不遵守NestedStack的边界限制?
Lambda@Edge的强制要求是必须部署在us-east-1区域才能关联CloudFront分发,而CDK的EdgeFunction构造内部做了封装:只要检测到当前栈的区域不是us-east-1,就会自动创建一个独立的us-east-1区域的栈来存放Edge Lambda资源,这个逻辑优先级高于嵌套栈的归属限制。另外嵌套栈本身要求必须和父栈属于同一区域、同一账户,跨区域的资源本身就无法嵌入当前区域的嵌套栈中,所以才会出现单独生成edge-lambda栈的情况。
2. 能否创建部署在us-east-1区域的Stack,并将其中的lambda跨区域引用到eu-west-1的主栈中?
可以,你之前报错是因为没有显式给两个栈都声明完整的env配置(账户+区域都显式指定,不能用CDK默认的环境推断),正确操作步骤如下:
- 先在App实例下显式声明一个
us-east-1区域的独立栈,用于存放Edge Lambda,同时给这个栈配置和主栈一致的account参数 - 在
us-east-1栈中把Edge Lambda的ARN作为栈输出暴露 - 在
eu-west-1的主栈中通过lambda.Function.fromFunctionArn()方法,传入上述ARN导入Lambda资源,就可以正常关联到CloudFront配置上
注意这种方式需要两个栈属于同一个AWS账户,跨账户的话还需要额外配置资源权限。
3. 能否实现删除primary主栈时,自动同步删除对应的lambda栈?
可以实现,提供两种常用方案:
- 方案一:自定义资源绑定生命周期:在主栈中新增一个CloudFormation自定义资源,给自动生成的Edge Lambda栈打上和主栈唯一关联的标签,自定义资源的删除逻辑调用CloudFormation DeleteStack API删除对应标签的Edge栈,这样主栈删除时会自动触发自定义资源的删除逻辑,同步清理Edge栈。
- 方案二:显式管理Edge栈+部署脚本封装:自己显式创建
us-east-1的Edge栈,在CDK App中设置主栈依赖Edge栈,然后把部署/删除操作封装成脚本,删除时先删主栈再删对应的Edge栈,适合多环境批量管理的场景。
内容的提问来源于stack exchange,提问作者Erik Živković
相关产品推荐
相关产品推荐

