使用 API 网关的自定义域的 route53 返回禁止

Posted

技术标签:

【中文标题】使用 API 网关的自定义域的 route53 返回禁止【英文标题】:route53 returns forbidden for custom domain with API Gateway 【发布时间】:2021-10-28 06:44:17 【问题描述】:

我正在使用 AWS CDK 创建 APIGateway。我想将自定义域附加到我的 api,以便我可以使用 api.findtechjobs.io。在控制台中,我可以看到我附加了一个自定义域,但是在使用我的自定义域时我总是收到 403 响应。

下面是我用来创建我的 API 网关的以下 AWS CDK 堆栈,并附加了一个 lambda 函数。

AWS CDK 部署良好,但是,当我尝试向https://api.findtechjobs.io/search 发出 POST 请求时,AWS 返回 403 Forbidden 响应。我没有此端点的 VPC、WAF 或 API 密钥。

我非常不确定为什么我的自定义域会返回 403 响应。我一直在阅读大量文档,并使用其他问题的答案,但我仍然无法弄清楚我做错了什么。

如何使用 AWS CDK 将 api.findtechjobs.io 关联到我的 API Gateway?



export class HostingStack extends cdk.Stack 

    constructor(scope: cdk.Construct, id: string, props: cdk.StackProps) 
        super(scope, id, props)


        const zonefindtechjobsio = route53.HostedZone.fromLookup(this, 'findtechjobs.io', 
            domainName: 'findtechjobs.io'
        );
    
        const certificate = new acm.Certificate(this, 'APICertificate', 
            domainName: 'findtechjobs.io',
            subjectAlternativeNames: ['api.findtechjobs.io'],
            validation: acm.CertificateValidation.fromDns(zonefindtechjobsio),
        );

        const api = this.buildAPI(certificate)

        new route53.ARecord( this, "AliasRecord api.findtechjobs.io", 
            zone: zonefindtechjobsio,
            recordName:  `api`,
            target: route53.RecordTarget.fromAlias(new route53targets.ApiGateway(api)),
        );
    

    private buildAPI(certificate: acm.Certificate) 
                // API
        const api = new apigateway.RestApi(this, "techjobapi", 
            domainName: 
                domainName: 'findtechjobs.io',
                certificate: certificate
            ,
            
            defaultCorsPreflightOptions: 
                allowOrigins: apigateway.Cors.ALL_ORIGINS, // TODO limit this when you go to prod
            ,
            deploy: true,
            deployOptions: 
                stageName: 'dev',
            ,
            endpointTypes: [apigateway.EndpointType.REGIONAL]
        );    
        
        const searchResource = api.root.addResource("search", 
            defaultMethodOptions: 
                operationName: "Search",
            ,
        );

        searchResource.addMethod(
            "POST",
            new apigateway.LambdaIntegration(new lambda.Function(this, "SearchLambda", 
                runtime: lambda.Runtime.GO_1_X,
                handler: "main",
                code: lambda.Code.fromAsset(path.resolve("..", "search", "main.zip")),
                environment: 
                    DB_NAME: "...",
                    DB_CONNECTION:"...",
                ,
            )),
            
                operationName: "search",
            
        );

        return api;

    

    



【问题讨论】:

forbidden 通常意味着问题出在您的 api 网关设置上,而不仅仅是域。您是否验证过它是否适用于 aws 默认 api 域? 默认(API网关域名)也返回相同的Forbidden响应。但是,我的开发阶段(1xp9g8qbvj.execute-api.us-west-2.amazonaws.com/dev/search)工作正常。我觉得你是对的。我的 api 网关设置有些奇怪。我的“开发”环境和域之间存在问题。 @Marcin 和其他任何偶然发现这一点的人。如果您正在使用边缘优化的 API 网关,则您的证书必须位于 us-east-1 中。我在这里发现了这个问题:aws.amazon.com/premiumsupport/knowledge-center/… 我什至不知道您可以将不在 us-east-1 中的 ssl 证书与 api 网关相关联。所以你实际上能够关联来自不同区域的证书并且 api gateway 或 cdk 没有抱怨? CDK 从不抱怨。 AWS 控制台从未抱怨过。我正在将整个项目转移到 us-east-1。我将在此处发布更新,然后在完成后给出答案。 【参考方案1】:

同样的问题。经过一番挣扎。我发现问题可能出在DNS上。因为我的域名是从另一个注册商那里转移过来的。名称服务器未更改。在我将它们更改为 AWS dns 后,它起作用了。但我不能 100% 确定。 而且我发现默认的API网关域(d-lb4byzxxx.execute-api.ap-east-1.amazonaws.com)一直处于403禁止状态。

【讨论】:

以上是关于使用 API 网关的自定义域的 route53 返回禁止的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Cloudformation 中获取区域 AWS API 网关的自定义域的目标域名?

Kong API 网关中的自定义身份验证服务

使用 Shopify 商店设置时 Route53 DNS 无法解析

将 CloudFront 分配与 Route 53 域相关联时出现问题

SSL 不适用于 AWS 上的 Route 53 域

Amazon Web服务Route 53忽略域名