【问题标题】:route53 returns forbidden for custom domain with API Gateway使用 API 网关的自定义域的 route53 返回禁止
【发布时间】: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。我将在此处发布更新,然后在完成后给出答案。

标签: amazon-web-services amazon-route53 aws-cdk amazon-api-gateway


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-07-27
    • 1970-01-01
    • 2022-10-05
    • 2020-05-01
    • 2017-11-05
    • 2018-06-26
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    相关资源
    最近更新 更多