AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 839197
Accepted
Costa Michailidis
Costa Michailidis
Asked: 2017-03-19 20:20:58 +0800 CST2017-03-19 20:20:58 +0800 CST 2017-03-19 20:20:58 +0800 CST

如何将 AWS CloudFront 和 API Gateway 并排用于同一个域?

  • 772

我将我网站的静态资产放在 S3 上,并设置 CloudFront 来分发它们。这些基本上包含用户在我的站点上的任何 GET 请求所需的内容,以及现有路径,即包含错误的全部内容。

我还有一些需要处理的 POST 请求。表单提交、发送电子邮件、通知、与数据库交互。

如何为同一域设置 Lambda(或 API Gateway)和 CloudFront,以便 CloudFront 处理 GET 请求,而 API Gateway 处理带有正文或 POST 请求的请求。或者我可以通过个人网址以某种方式做到这一点吗?

amazon-web-services
  • 4 4 个回答
  • 15321 Views

4 个回答

  • Voted
  1. Grodriguez
    2017-04-24T06:20:12+08:002017-04-24T06:20:12+08:00

    您可以创建一个 lambda 函数,设置 API 网关,然后配置 CloudFront 以将某些路径(例如 /rest/*)转发到 API 网关,并从 S3 存储桶提供其他所有内容。

    这是一个完整的演示如何执行此操作:https ://www.codeengine.com/articles/process-form-aws-api-gateway-lambda/

    • 6
  2. Osterjour
    2017-03-21T01:39:19+08:002017-03-21T01:39:19+08:00

    从连接的角度来看,“某事”需要回答您的请求(GET、POST、PUT、一切)。首先,您有一个 TCP 连接,并且“某事”需要确保它理解第 7 层并理解客户端发送的字节。只有在这一点上,才能以不同于 POST 请求或一个 URL 而不是另一个 URL 的方式处理 GET 请求。所以最终你需要一个能够理解和路由 HTTP 的服务。以下服务能够执行此操作: CloudFront ELB/ALB API 网关(稍后会有限制)

    API Gateway 在内部使用 CloudFront(没有让您有机会在 CloudFront 级别上实际配置任何内容) - 这意味着无法同时运行 CloudFront 和 API Gateway,因为最终这意味着您将 CloudFront 与 CloudFront 一起运行并排。

    CloudFront 让您有机会根据模式选择不同的来源 - 但您只能选择 S3 或 ELB/ALB 作为来源 - 而不是 Lambda 函数(除了 Lambda@Edge 功能)。

    ALB/ELB 只能使用 EC2 实例作为后端——这里没有 Lambda 或 S3。

    我能想到的唯一方法可能会做你想做的事情是这些:

    • 您使用 API Gateway 并将特定的“资产”路径路由到 Lambda 函数,该函数对 S3 执行某种反向代理(因此通过 lambda 管道传输静态资产) - 请注意此处的 Lambda 成本!
    • 您可以做同样的事情,但不是通过 Lambda 管道资产,只需在 Lambda 中生成一个签名 URL,然后直接重定向到 S3 以进行服务(可能更具成本效益)
    • 与应用程序的其余部分相比,为您的资产使用不同的子域 - 这是一种非常常见的模式,因为您可以轻松地在 DNS 级别上拆分并为不同的用例使用不同的服务(CloudFront 用于资产,API Gateway 用于非静态部分)

    所以我的电话将是最后一个选择 - 但这意味着您需要将客户端/浏览器指向所有静态资产(或所有 POST 请求)的单独子域。

    听起来你想看看像 AngularJS 或 React 这样的技术来在浏览器中构建一个真正的 API 驱动的应用程序。使用这种方法,您正在运行一个真正的 API,它使用 API 网关处理所有“动态”请求,并将应用程序本身作为静态资产从 S3 交付。也许看看那些可能会帮助你找到自己的方式——即使你不使用它们,关于如何构建这样的东西的架构模式就是你所要求的恕我直言。

    • 2
  3. Prathan Thananart
    2017-10-19T08:31:27+08:002017-10-19T08:31:27+08:00

    我有同样的设置。S3 上的静态资产,通过 API 网关提供的 Lambda 函数,它们共享相同的域名。

    我使用已经使用 CloudFront 并公开其一些功能(例如缓存)的 API 网关。然后我配置映射到静态资产的 URI。在 API Gateway 中,资源可以是 Lambda 函数、AWS 函数、模拟或其他 URL。我让他们指向我的 S3 URL。

    URI 也可以设置为全局子路径,例如/assets/*.

    • 2
  4. Best Answer
    Noah Zoschke
    2018-03-31T07:54:06+08:002018-03-31T07:54:06+08:00

    我完全按照您提出的设计运行了多个 Web 应用程序,并提取了 gofaas(一个教育性的 Go 和 Lambda 应用程序)来分享这些技术。

    您需要两个单独的域,例如www.gofaas.netS3 + CloudFront 和api.gofaas.netAPI Gateway + Lambda。

    然后,您可以让您的静态站点通过 API Gateway CORS 配置和一些 JavaScript 与 API 交互:

    fetch(`https://api.gofaas.net/work`, {
        method: "POST",
        mode: "cors",
        headers: {
            "Accept": "application/json",
            ...
        },
        body: JSON.stringify(...)
    })
        .then(function(response) {
            return response.json();
        })
        .then(function (json) {
            // use response
        })
        .catch(function (err) {
            console.log("fetch error", err);
        });
    

    以下是设置所有这些的一些指南:

    使用 S3、CloudFront 和 ACM 的静态网站

    使用 Lambda、API 网关、CORS 和 JWT 实现 API 安全性

    • 2

相关问题

  • 与 AWS 中的其他系统相比,CentOS 报告的总内存较低

  • 如何在 Amazon Linux 服务器上升级到 Java 1.8?

  • 了解 Amazon AWS 使用数据

  • 亚马逊提供的负载均衡服务体验如何?

  • ELB 中现有节点的 AWS 自动缩放问题

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve