如何在同一AWS CDK管道中让特定资源部署于us-east-1,其余在其他区域?
解决方案:无需拆分管道,实现跨区域资源部署
完全可以做到不拆分现有管道,让WAF、ACM(用于CloudFront)、CloudFront这类有区域限制的资源部署在us-east-1,其余资源部署在us-west-2,核心是利用AWS CDK的Stack环境指定功能,具体实现步骤如下:
1. 为受限资源创建独立Stack并指定us-east-1环境
将必须部署在us-east-1的资源(如CloudFront关联的WAF、ACM证书)单独封装到Stack中,定义时显式指定部署区域:
from aws_cdk import Stack, Environment import aws_cdk.aws_wafv2 as wafv2 class CloudFrontWAFStack(Stack): def __init__(self, scope, id, ip_v4, **kwargs): # 强制指定该Stack部署在us-east-1 super().__init__(scope, id, env=Environment(region="us-east-1"), **kwargs) # 创建CloudFront范围的WAF IP集 ip_set_v4 = wafv2.CfnIPSet( self, "CLOUDFRONTIPSetv4", addresses=ip_v4, ip_address_version="IPV4", name="ipv4sets", scope="CLOUDFRONT", )
同理,用于CloudFront的ACM证书也需要放在us-east-1的Stack中:
from aws_cdk import aws_certificatemanager as acm class CloudFrontACMStack(Stack): def __init__(self, scope, id, domain_name, **kwargs): super().__init__(scope, id, env=Environment(region="us-east-1"), **kwargs) # 创建CloudFront用的证书(必须在us-east-1) self.certificate = acm.Certificate( self, "CloudFrontCert", domain_name=domain_name, validation=acm.CertificateValidation.from_dns() )
2. 保持其余资源Stack的默认区域(us-west-2)
原有业务资源所在的Stack无需改动,若管道默认区域为us-west-2,这些Stack会自动继承该环境;也可以显式指定区域确保一致性:
class BusinessServiceStack(Stack): def __init__(self, scope, id, **kwargs): # 指定部署在us-west-2 super().__init__(scope, id, env=Environment(region="us-west-2"), **kwargs) # 在这里定义EC2、S3、RDS等业务资源
3. 在管道中统一部署所有Stack
CDK Pipeline支持跨区域部署多个Stack,无需拆分管道,只需将所有Stack添加到管道的部署阶段即可。可以按区域分组到Stage中,提升可读性:
from aws_cdk import App, Stage from aws_cdk.pipelines import CodePipeline, CodePipelineSource, ShellStep app = App() # 定义us-west-2业务资源阶段 class BusinessServiceStage(Stage): def __init__(self, scope, id, **kwargs): super().__init__(scope, id, env=Environment(region="us-west-2"), **kwargs) BusinessServiceStack(self, "ServiceStack") # 定义us-east-1受限资源阶段 class GlobalResourcesStage(Stage): def __init__(self, scope, id, ip_v4, domain_name, **kwargs): super().__init__(scope, id, env=Environment(region="us-east-1"), **kwargs) CloudFrontWAFStack(self, "WAFStack", ip_v4=ip_v4) CloudFrontACMStack(self, "ACMStack", domain_name=domain_name) # 构建Pipeline pipeline = CodePipeline( app, "MyPipeline", synth=ShellStep( "Synth", input=CodePipelineSource.git_hub("my-org/my-repo", "main"), commands=["npm install -g aws-cdk", "pip install -r requirements.txt", "cdk synth"] ) ) # 添加业务资源部署阶段 pipeline.add_stage(BusinessServiceStage(app, "BusinessStage")) # 添加受限资源部署阶段 pipeline.add_stage(GlobalResourcesStage(app, "GlobalResourcesStage", ip_v4=["x.x.x.x/24"], domain_name="example.com")) app.synth()
关键注意事项
- CloudFront关联资源的硬性限制:CloudFront的WAF(Scope=CLOUDFRONT)、ACM证书必须部署在
us-east-1,这是AWS服务本身的限制,与CDK无关。 - CDK Bootstrap:确保
us-east-1和us-west-2都已完成CDK Bootstrap操作,否则跨区域部署会失败。 - 资源引用:如果不同区域的Stack之间需要引用资源(比如CloudFront引用ACM证书),CDK会自动处理跨区域的资源依赖,无需手动配置。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

