如何使用 Amazon S3 托管使用 API Gateway 作为代理的静态网站?

3 分钟阅读
0

我想使用 Amazon API Gateway 作为使用 Amazon Simple Storage Service(Amazon S3)托管的静态网站的代理。

解决方法

您可以使用 Amazon S3 托管静态网站。您也可以使用 HTTP 代理集成或 AWS 服务集成将 API Gateway 配置为 Amazon S3 静态网站的代理。

HTTP 代理集成

如果您的 Amazon S3 静态网站可公开访问,请使用 HTTP 集成并为 API Gateway 提供 S3 静态网站 URL。

如果您尚未这样做,请按照教程在 Amazon S3 上配置静态网站

创建 REST API

  1. 打开 API Gateway 控制台
  2. 对于 REST API,选择构建
  3. 对于 API 名称,输入您的 REST API 的名称。
  4. 选择终端节点类型下拉列表,选择您的终端节点类型,然后选择创建 API
  5. 在导航窗格中,在您的 API 名称下方选择资源
  6. 选择操作下拉列表,然后选择创建资源
  7. 对于资源名称,输入名称。例如 key
  8. 对于资源路径,输入路径参数。例如 {key}
  9. 选择创建资源

为根资源创建方法

  1. 选择资源名称 {key},选择操作下拉列表,然后选择创建方法
  2. {key} 下拉列表中选择 GET,然后选择对勾标记图标。
  3. 对于集成类型,选择 HTTP,选择使用 HTTP 代理集成,然后将 HTTP 方法保留为 GET
  4. 对于终端节点 URL,输入 http://BUCKET_NAME.s3-website.REGION.amazonaws.com/{key},然后选择保存

部署 REST API

  1. 操作下拉列表中,选择部署 API
  2. 部署阶段下拉列表中选择 [New Stage]
  3. 对于阶段名称,输入名称。例如 Dev
  4. 选择部署。从 Dev 阶段编辑器中,记下调用 URL。稍后需要用它来测试您的 API。
  5. 使用类似于以下内容的 curl 命令来测试您的 Amazon S3 网站的 API 代理:
curl -X GET https://API_ID.execute-api.REGION.amazonaws.com/index.html

AWS 服务集成

配置 Amazon S3 静态网站

如果 Amazon S3 静态网站被禁止公开访问,请配置该网站,使其只能通过 API 代理进行访问。

  1. 如果您尚未这样做,请按照教程在 Amazon S3 上配置静态网站
    注意:跳过本教程的第 3 步,保持默认的阻止所有公开访问设置处于启用状态。

  2. 修改教程第 4 步中的桶策略,仅允许 API 代理访问 Amazon S3 桶,类似于以下示例:

    {
      "Version": "2012-10-17",
      "Statement": [{
          "Sid": "APIProxyBucketPolicy",
          "Effect": "Allow",
          "Principal": {
            "Service": "apigateway.amazonaws.com"
          },
          "Action": "s3:GetObject",
          "Resource": "arn:aws:s3:::BUCKET_NAME/*",
          "Condition": {
            "ArnLike": {
              "aws:SourceArn": "arn:aws:execute-api:REGION:ACCOUNT:API_ID/*/GET/"
            }
          }
      }]
    }
  3. 创建 AWS Identity and Access Management(IAM)策略,允许 GetObject API 访问 Amazon S3 桶。

    {
      "Version": "2012-10-17",
      "Statement": [{
        "Effect": "Allow",
        "Action": ["s3:GetObject"],
        "Resource": "*"
      }]
    }
  4. 创建 IAM 角色,并将上一步中创建的 IAM policy 附加到这个新角色。

  5. 复制 IAM 角色 ARN。您在以后的步骤中将需要它。
    IAM 角色必须包含以下信任策略,API Gateway 才能代入该角色:

    {
      "Version": "2012-10-17",
      "Statement": [{
        "Sid": "",
        "Effect": "Allow",
        "Principal": {
            "Service": "apigateway.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
      }]
    }

为 Amazon S3 服务创建 REST API 代理

  1. 打开 API Gateway 控制台
  2. 选择创建 API
  3. 选择 REST API,然后选择构建
  4. 对于 API 名称,输入您的 REST API 的名称。
  5. 对于终端节点类型,根据大多数客户端流量的来源选择终端节点类型
    **注意:**最佳做法是将边缘优化的端点用于可从互联网访问的公开服务。区域端点主要用于在同一 AWS 区域内访问的 API。
  6. 选择创建 API

为根资源创建 GET 方法

根方法是为向 Amazon S3 静态网站发出的代理请求配置的。

  1. 选择根资源 "/" 后,选择操作下拉列表,然后选择创建方法
  2. 从下拉列表中选择 GET,然后选择对勾标记图标。
  3. 对于集成类型,选择 AWS 服务
  4. 选择 AWS 区域下拉列表,然后选择您的 AWS 区域。
  5. 选择 AWS 服务下拉列表,然后选择 Simple Storage Service(S3)
  6. 对于 AWS 子域,请将此字段留空。
  7. 对于 HTTP 方法,请选择 GET
  8. 对于操作类型,选择使用路径覆盖
  9. 对于路径覆盖,请输入类似于 BUCKET_NAME/index.html 的 Amazon S3 桶路径。
  10. 对于执行角色,粘贴之前创建的 IAM 角色 ARN。
  11. 选择保存

此设置将前端 API 请求 GET https://your-api-host/stage/ 集成到 S3 后端 GET https://your-s3-host/index.html

创建 API 资源对象

要从 S3 桶访问特定对象,请创建名为 {object} 的资源,该资源映射前端 API 请求中的对象路径。例如,GET https://your-api-host/stage/home.html 到 S3 后端 GET https://your-s3-host/home.html

  1. 资源中,选择操作下拉列表,然后选择创建资源
  2. 对于资源名称,输入名称。例如 {object}
  3. 对于资源路径,输入路径。例如 {object}
  4. 选择创建资源

为资源配置 GET 方法

  1. 选择 {object} 资源后,选择操作下拉列表,然后选择创建方法
  2. 从下拉列表中选择 GET,然后选择对勾标记图标。
  3. 对于集成类型,选择 AWS 服务
  4. 选择 AWS 区域下拉列表,然后选择您的 AWS 区域。
  5. 选择 AWS 服务下拉列表,然后选择 Simple Storage Service(S3)
  6. 对于 AWS 子域,请将此字段留空。
  7. 对于 HTTP 方法,选择 GET
  8. 对于操作类型,选择使用路径覆盖
  9. 对于路径覆盖,请输入类似于 BUCKET_NAME/{object} 的 Amazon S3 桶路径。
  10. 对于执行角色,粘贴之前创建的 IAM 角色 ARN。
  11. 选择保存
  12. 资源名称 {object} 选择 GET,然后选择集成请求
  13. 展开 URL 路径参数,输入名称值对象从值 method.request.path.object 映射,选中要保存的复选框。

为 GET 方法设置响应标头映射

将后端内容类型标头参数值映射到前端对应项。这可以确保浏览器成功处理内容类型的响应。

  1. 选择 GET,在资源 / 下选择方法响应
  2. 展开 HTTP 状态 200 旁边的箭头,在 200 响应标头下方选择添加标头
  3. 选择标头 Name 作为 Content-Type,然后选中要保存的复选框。
  4. 选择方法执行
  5. 选择集成响应,展开 HTTP 状态正则表达式旁边的箭头。
  6. 展开标头映射,对于 Content-Type,将映射值输入为 integration.response.header.Content-Type
  7. 资源 /{object} 下的 GET 方法重复步骤 1-6
  8. 重复部署 REST API 部分中的步骤。

测试 API 代理

您可以使用浏览器或 curl 命令来测试 Amazon S3 静态网站的 API 代理:

根(/)资源

curl -X GET https://API_ID.execute-api.REGION.amazonaws.com/STAGE_NAME/

{Object} 资源

curl -X GET https://API_ID.execute-api.REGION.amazonaws.com/STAGE_NAME/home.html

相关信息

教程: 在 API Gateway 中创建 REST API 作为 Amazon S3 代理

使用 Amazon S3 托管静态网站

在 Amazon API Gateway 中创建 REST API

从 API Gateway 控制台部署 REST API

AWS 官方
AWS 官方已更新 9 个月前