Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon s3 S3托管的网站Cloudfront分发和API网关自定义域指向同一子域_Amazon S3_Amazon Cloudfront_Amazon Route53_Cname - Fatal编程技术网

Amazon s3 S3托管的网站Cloudfront分发和API网关自定义域指向同一子域

Amazon s3 S3托管的网站Cloudfront分发和API网关自定义域指向同一子域,amazon-s3,amazon-cloudfront,amazon-route53,cname,Amazon S3,Amazon Cloudfront,Amazon Route53,Cname,我的网站有一个子域,名为api.example.com,我希望实现以下目标: 为映射到api.example.com的S3静态网站提供1个CloudFront发行版 将API网关自定义域名映射到同一子域API.example.com 为实现此设置,我执行了以下步骤: 创建一个API网关自定义域API.example.com,并为我要公开为v1的API设置基本映射(目前为版本1) 在Route 53中,我创建了一个CNAME记录api.example.com,指向步骤1中api网关的边缘优化目

我的网站有一个子域,名为api.example.com,我希望实现以下目标:

  • 为映射到api.example.com的S3静态网站提供1个CloudFront发行版

  • 将API网关自定义域名映射到同一子域API.example.com

为实现此设置,我执行了以下步骤:

  • 创建一个API网关自定义域API.example.com,并为我要公开为v1的API设置基本映射(目前为版本1)

  • 在Route 53中,我创建了一个CNAME记录api.example.com,指向步骤1中api网关的边缘优化目标域名

  • 注意:在这一点上,正如预期的那样,我得到了来自

  • 我创建了一个S3存储桶,并将其设置为静态网站托管。已成功上载所有文件并正在运行

  • 我在S3 bucket中创建了一个新的Cloudfront发行版。此时,对于这个Cloudfront发行版,我无法将CNAME记录设置为api.example.com,因为它已经被api网关中设置的第一个自定义域名使用,AWS提供了CNAMEAlreadyExistsException,所以我将此字段留空。访问S3存储桶的CloudFront分发版的工作与预期一样

  • 在为S3 bucket生成的CloudFront发行版下,我添加了另一个来源(API网关自定义域名),并创建Bevahior规则来将v1/*调用路由到API网关自定义域名

  • 在这一点上,事情不再那么顺利了: -访问时,我从API网关分发版获得{“message”:“Fobidden”}。但是,URL仍然返回预期结果

    问题:是否有我没有设置的内容,以便URL返回S3静态网站的内容


    注意:此外,我在S3 bucket cloudfront发行版上有一个空的CNAME字段,而我在Route53中使用相同的cloudfront发行版定义了一个CNAME,这一事实提示我一条警告消息,指出这种情况可能会使我暴露于漏洞。

    对于您提到的用例,您只需要一个Cloudfront发行版(映射到api.example.com),它应该能够使用不同的行为配置将流量转发到S3和api网关(两者都作为源添加到同一发行版)。您可以通过将/v1/*流量路由到API网关,将其他流量路由到S3的方式来配置这些行为

    设置起源和行为时,您需要遵循的配置很少

    • 确保S3和API网关行为都将HTTP重定向到HTTPS
    • 添加API网关源时,仅将其设置为转发HTTPS流量
    • 在API网关行为中,将accept-*的头、授权、来源、引用列为白名单,并确保不将“主机”头列为白名单
    • 在这两个源中,不要添加任何路径
    • 对于API网关行为,将TTL配置为0并允许所有方法(GET、POST等)

    我没有两个发行版-我只有一个用于S3的发行版。为API网关自定义域名设置了第二个来源。我重新进行了配置,但这次我将API网关自定义域名设置为abc.example.com,因为我无法将其设置为pi.example.com,因为S3发行版采用了CNAME。当访问S3网站时,返回的API URL现在返回{“消息”:“禁止”}。API网关部署根本不需要自定义域名。CloudFront发行版可以设置一个原点,指向api的通用
    executeAPI
    hostname。(此外,API应该是区域性的,而不是边缘优化的。这两种方式都可以,但是当在您自己的CloudFront发行版后面使用时,不应该使用边缘优化的,因为它会有更高的延迟,并且一些头可能不会像预期的那样通过,因为请求会遍历AWS边缘网络两次而不是一次。)迈克尔的评论很有效。。因此,创建另一个指向api网关的通用执行api主机名的源将起作用-根本不需要创建自定义域名。我需要自定义域是出于不同的原因(将多个API合并到一个URL下),但这也可以通过使用指向API网关执行API URL的CloudFront分发源来实现。谢谢你,迈克尔!你能列举出要转发的头吗?@Tyrsius我记得,你可以转发除“主机”头以外的头。