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

AWS CDK中replace处理api_endpoint值未按预期工作报错

问题根因

该问题本质是AWS CDK的Token机制特性导致的字符串替换时机错误:

  • CDK中未确定的部署期值(比如自动生成的API Gateway端点)会以${Token[TOKEN.xxx]}形式的占位符存在于代码执行阶段,直到CloudFormation部署时才会被替换为真实值
  • 直接在Python代码中对Token调用.replace('https://', '')时,操作执行在CDK合成模板阶段,此时拿到的只有占位字符串,根本不存在https://前缀可供替换,等部署期Token解析为真实的https://<secret>.execute-api.us-east-1.amazonaws.com值时,https://前缀和其中的冒号会被完整传给CloudFront源配置,直接触发参数校验报错
  • 额外添加Token.as_string()仅会将Token对象转为字符串类型的占位符,不会改变字符串替换的执行时机,因此无法修复问题
解决方案

不要在CDK合成阶段用Python原生字符串方法处理Token值,改用CloudFormation原生内置函数让字符串处理逻辑在部署期、Token解析为真实值后执行,代码如下:

from aws_cdk import Fn

# 按/分割完整端点字符串,取第3段(索引为2)即为纯域名,无https前缀和冒号
api_origin_domain = Fn.select(2, Fn.split("/", api_endpoint))

distribution = Distribution(
    self,
    self.config.get_resource_name("api distribution"),
    default_behavior=BehaviorOptions(
        origin= HttpOrigin(domain_name='origin-source-code.com')),
    additional_behaviors={
        f"{self.config.SUB_DOMAIN}/*": BehaviorOptions(
            origin=HttpOrigin(domain_name=api_origin_domain),
            allowed_methods=AllowedMethods.ALLOW_ALL,
            # 其余原有配置保持不变
        )
    }
)

如果你的api_endpoint是来自CDK L2级别RestApi/HttpApi构造的输出属性,可以直接使用构造自带的域名属性,无需手动截取:

  • 对于RestApi实例,直接取rest_api.domain_name即为纯域名值
  • 对于HttpApi实例,直接取http_api.api_endpoint配合上述Fn.split+Fn.select处理即可,避免手动拼接出错

内容的提问来源于stack exchange,提问作者SteveJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 17:01:28