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
相关产品推荐
相关产品推荐

