AWS CDK Python使用DomainNameOptions时如何为LambdaRestApi创建ApiMapping
解决方案
错误根因
你的报错来自两个类型不匹配问题:
DomainNameOptions是仅用于传递配置的结构体,不是实际部署生成的域名资源实例,_apigatewayv2.ApiMapping要求传入的domain_name参数必须是已创建的域名资源引用- 你使用的是APIGW v1版本的REST API,直接将v1资源传递给v2的
ApiMapping会无法识别,需要做一层属性转换 - LambdaRestApi的
domain_name参数本身支持传入DomainName实例,不需要强制使用DomainNameOptions,你之前的理解存在偏差
修正后的完整代码
首先显式创建APIGW v1的自定义域名资源,替换原来的DomainNameOptions配置:
# 显式创建APIGW v1自定义域名资源 domain_name = _apigateway.DomainName( self, "ApiCustomDomain", certificate=certificate, domain_name=custom_domain_name, mtls={ "bucket": _s3.Bucket.from_bucket_arn(self, 'BucketByArn', mtls_bucket_arn), "key": mtls_bucket_key }, security_policy=_apigateway.SecurityPolicy("TLS_1_2") ) # 创建LambdaRestApi时直接传入已创建的domain_name实例 api_01 = _apigateway.LambdaRestApi( self, api_id, rest_api_name=rest_api_name, domain_name=domain_name, handler=measurements_fn, deploy_options=_apigateway.StageOptions(stage_name=stage), proxy=False ) api_01.node.default_child.add_property_override( "DisableExecuteApiEndpoint", "true" ) # 将v1的域名转换为v2可识别的域名实例 v2_domain = _apigatewayv2.DomainName.from_domain_name_attributes( self, "V2ApiDomain", domain_name=domain_name.domain_name, regional_domain_name=domain_name.regional_domain_name, regional_hosted_zone_id=domain_name.regional_hosted_zone_id ) # 将v1的REST API转换为v2可识别的API实例 v2_api = _apigatewayv2.Api.from_api_attributes( self, "V2RestApi", api_id=api_01.rest_api_id, api_endpoint=api_01.url_for_path() ) # 创建API Mapping _apigatewayv2.ApiMapping( self, id='someId', api=v2_api, api_mapping_key='api/1.0', domain_name=v2_domain, stage=api_01.deployment_stage )
注意事项
- 确保你已经安装了
aws-cdk.aws-apigatewayv2相关依赖包 - 如果你的域名是边缘优化类型,需要将
regional_*参数替换为边缘优化对应的属性值 - API Mapping创建完成后,需要确保域名的DNS解析已经正确配置到APIGW的端点
内容的提问来源于stack exchange,提问作者GeorgeGeorgitsis
相关产品推荐
相关产品推荐

