S3 托管 + Api 网关

rub*_*hak 8 redirect amazon-s3 aws-lambda aws-api-gateway

我正在尝试在 S3 中托管一个静态站点,能够使用 Lambda/Api 网关处理一些动态内容。似乎无法做到这一点。我希望 URL 看起来像这样:

example.com/index.html
example.com/images/*
example.com/css/*
example.com/api/* -> API Gateway 
Run Code Online (Sandbox Code Playgroud)

另外,在重定向时,我想将 example.com 保留为根域。我在 S3 中尝试了 RoutingRules,但从客户端重定向。我需要这对用户透明,例如代理请求。

Imr*_*ran 14

虽然 Bob 的回答对于公共网站来说非常简洁而且很简单,但如果您正在寻找其他适用于内部网站或不想使用 CDN 的替代方案,您可以尝试以下选项。

选项1 -

这是人们更喜欢的最常见的选择。您只需为静态 vs api 配置 2 个不同的 DNS 主机。(假设您为 *.example.com 启用了正确的 CORS)

example.com(S3) --> S3 静态内容

api.example.com(APIGateway) --> Lambda

选项 2 -

Example.com(APIGateway) --> /apigLambda -->Lambda

Example.com(APIGateway) --> /* --> S3 Bucket/S3 文件。

API 网关配置 -

在此处输入图片说明

API 网关 S3 后端代理 -

在此处输入图片说明

示例 API 网址 -

https://xxx.execute-api.us-east-1.amazonaws.com/dev/apigLambda

https://xxx.execute-api.us-east-1.amazonaws.com/dev/myfilename.css

参考 -

https://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html

注意 - 在上面的参考 Url 中,Url 路径中接受了存储桶名称,但我的示例隐藏了存储桶名称,因此用户在看到 API Gateway Url 时不知道 S3 存储桶名称。

选项 3 -

根据您的评论,只需使用 {proxy+} 作为代理 S3 的资源以支持子文件夹调用,但正如您所建议的,仅使用传递代理并没有提供太多选项来转换 HTTP 响应主体,我认为这仍然可以,因为您知道您的网站内容文件。

  • @MihailMalostanidis 最有可能的选项 #2 将与(高得多)的成本相关,因为通过 APIGW 的流量是成本的一​​部分 (4认同)

Bob*_*ney 6

您可以通过将 CloudFront 分配放在 API Gateway API 和静态内容的 S3 存储桶前面来进行配置。这也将允许您利用 CloudFront 的边缘缓存。

  • 这是一个很好的示例 CFN 模板演练:https://apimeister.com/2017/05/09/hosting-a-cloudfront-site-with-s3-and-api-gateway.html (2认同)