You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在同一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:43:13