首页 > 解决方案 > 带有 DomainNameOptions 的 AWS CDK api 映射

问题描述

我在 python 中有以下 cdk 用于构建我的 API

         domain_name = _apigateway.DomainNameOptions(
            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")
        )
        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"
        )
        

有 2 个端点连接到 api,我想创建一个 API 映射。根据文档,我看到我应该使用 _apigatewayv2.ApiMapping

         _apigatewayv2.ApiMapping(
            self,
            id='someId',
            api=api_01,
            api_mapping_key='api/1.0',
            domain_name=domain_name
        )

但是 domain_name 选项由于以下原因而失败

预期的对象引用,得到 {"$jsii.struct":{"fqn":"@aws-cdk/aws-apigateway.DomainNameOptions"

情况是我需要 DomainNameOptions 因为我正在使用基于文档的 LambdaRestApi需要这样的对象。

关于如何为我的案例实施 API 映射的任何想法?

标签: pythonamazon-web-servicesaws-cdk

解决方案


如果您查看 domain_name 对象的文档和文档,aws_apigatewayv2.ApiMapping您会发现它需要一个iDomainName对象 - 因此您必须找到一个具有相同接口挂钩的合适对象。但是,如果您在文档中单击它,它会将您带到此处- apigateway v2 iDomainName 界面,而不是 DomainNameOptions 原始版本。(在 apigateway 模块而不是 apigatewayv2 模块中)

所有这一切都是说......您的交叉库并不总是像预期的那样工作,最重要的是 apigatewayv2 是实验性的,容易出现一些集成问题,明天可能会改变。

当您尝试使用连接到 Lambda 的 Rest API 时,apigateway(不是 v2)模块就足够了。(apigatewayv2 更适用于实验性 HTTP api 到 lambda)

仅使用aws_apigateway模块,您可以通过以下方式完成此操作:

my_domain = _apigateway.DomainName(
    self, "MyDomain",
    domain_name=my_domain_name)

my_domain.add_base_path_mapping(
    target_api= my_api, # a aws_apigateway.RestApi() object
    )

然后,您需要确保您的 route53 ARecord 也已更新,否则 dns 将不适用于您的自定义域。(这是使用 `aws_route53 和 aws_route53_targets 模块)

_route53.ARecord(
    self, "MyDomainAliasRecord",
    zone=my_route53_zone, # a aws_route53.HostedZone() Object
    target=my_route_53_target # a aws_route53.RecordTarget() object),
    record_name=my_domain_name
)

推荐阅读