API Gateway REST API 集成 S3 服务自定义 404 页面

需求分析

使用 API Gateway REST API 可以直接使用 S3 作为后端集成对外提供可以访问的 API. 而当访问的 URL 中存在无效的桶, 或者不存在的对象时, API Gateway 默认回向客户端返回 200 状态码. 而实际上这并不是正确的响应, 本文将介绍如何自定义返回 404 错误页面.

基本功能配置

基本功能的配置过程可以参考文档 https://docs.amazonaws.cn/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html

整理记录主要步骤:

  • 创建一个 REST API, 在 Resources 根路径 / 创建新的资源, 不要开启 Proxy resource 选项(后面创建的也都不开), 资源名称定义变量 {folder}

  • /{folder} 下面继续创建资源 {item}, 完成的结构:

    //{folder}/{item}
    
  • /{folder} 中创建 GET 方法, 完成相应配置. 需要注意 Action type 选择 Use path override, 并在 Path override 指定使用新的变量 {bucket}, 这个变量后面会和 URL 中的 {folder} 进行映射, 现在创建期间先不做配置. 另外所填入的 Execution role 也需要确认在信任关系中允许 API Gateway, 并且 Policy 中允许对目标 S3 存储桶和对象进行操作.

在这里插入图片描述

  • 切换到 “Integration request”, 点击右上角的 “Edit” 按钮, 参考下图配置 URL path parameters.
    在这里插入图片描述

其中 Name=bucket 对应的是我们在上面的 Path override 中定义的变量名称, Mapped from 中的表达式 method.request.path.folder 则表示会从请求信息中解析 Resource 定义 URL 地址中的 folder 变量

在这里插入图片描述

  • 完成配置后即可切换到 Test 标签页, 在 Path 下方的 folder 中填入 S3 桶名称进行测试, 确认可以在下方的输出面板中看到 XML 格式的返回结果.

  • 继续在 /{item} 中创建 GET 方法, 配置项和 /{folder} 基本一致, 只需要修改 Path override 内容为 {bucket}/{object}. 创建完成后再次编辑 Integration request settings 中的 URL path parameters, 分别添加两个参数, 其中新增的 object 参数和前面的 bucket 一样, 都将通过 method.request.path 进行映射.

NameMapped from
bucketmethod.request.path.folder
objectmethod.request.path.item

在这里插入图片描述

  • Deploy 到新创建的 Stage dev, 随后从浏览器测试访问 Stage 对应的 Invoke URL 后面带上参数确认工作正常, 注意访问地址中需要包含 Stage 名称 dev, 例如:
    https://abc12345.execute-api.cn-northwest-1.amazonaws.com.cn/dev/my-bucket/my-data.json

至此, 和文档一致的配置就完成了. 此时如果我们尝试访问不存在的 S3 对象, 浏览器会直接返回一个 200 状态码的 XML 格式字符串内容, 例如:

在这里插入图片描述

下面我们就来配置自定义的 404 页面.

定制 404 页面

首先梳理需求, 对于当前资源的结构来说, 我们希望在访问 API 根路径以及各个子路径的默认 URL 时, 还有对于访问不存在的 S3 对象时均返回自定义的 404 页面. 具体来说:

访问路径期望效果
/404 页面
/有效桶正常对象列表
/无效桶404 页面
/有效桶/有效对象正常对象
/有效桶/无效对象404 页面

根路径 /

当前配置如果直接访问 Stage URL 的根路径(包含 Stage 名称), 浏览器会返回 403 错误:

{“message”:“Missing Authentication Token”}

我们在 Resource / 位置直接创建 GET 方法, 类型选择 Mock, 直接完成创建.

在这里插入图片描述

Deploy 之后再次访问根路径, 观察浏览器返回了 200 状态的一个空白页面, Response header 中的 Content-Type 显示为 application/json

我们切换到 Integration response 标签页, 先删除默认的 Default - Response, 再切换到 Method responses 删除默认的 Response 200, 随后点击 Create response 创建状态码为 404 的响应, 点击 Add model 设置 Content type 为 text/html, Model 使用默认的 Empty.
在这里插入图片描述

再切回 Integration responses, Create response, 直接创建
在这里插入图片描述

完成后的 Integration response 中默认响应变成了 404 状态码
在这里插入图片描述

Deploy 后测试访问根路径, 可以看到浏览器显示报错, 观察开发者工具中的 Network 请求记录, 收到的 HTTP 响应状态码为 404.
在这里插入图片描述

状态码有了, 接下来就是我们要自定义 404 响应对应的 HTML 页面内容. 再次打开 Resource 根路径的 GET 方法 Integration responses 标签页, 编辑现在默认的 404 Response, 展开 Mapping templates > Add mapping template. 设置 Content type = text/html, 下方的 Template body 中填入我们要自定义的 HTML 代码.

在这里插入图片描述

保存后再次 Deploy, 浏览器 刷新访问 开个新的标签页访问. 实现效果:
在这里插入图片描述

/{folder} 路径

需要留意, 因为 S3 API 在访问不存在的桶时后端返回的响应状态码是 301 而不是 404, 所以这里我们需要匹配的目标状态码也得是 301. 具体步骤:

选中 /{folder} 资源下的 GET 方法, 切到 Method response 标签页, 点击 Create response, 创建状态码为 404 (这是我们要最终返回给浏览器的状态码), Content type = text/html 的响应

在这里插入图片描述

再切到 Integration response > Create response, 注意这里在 HTTP status regex 表达式中填入 301, 对应的 Method response status code 默认选择 404, Create.

在这里插入图片描述

创建完成后, 在当前页面翻动到底部编辑 404 - Response, Add mapping template, 和前面一样, Content type = text/html, Template body 填入自定义的 HTML 内容.

在这里插入图片描述

保存后 Deploy, 在浏览器中再访问一个不存在的桶, 符合预期.

https://abc12345.execute-api.cn-northwest-1.amazonaws.com.cn/dev/invalid-bucket

在这里插入图片描述

而继续测试正常存在的桶, 正常访问, 未受影响.

/{folder}/{item} 路径

和上面配置的无效桶的情况不一样的是, 当 S3 对象不存在, S3 后端会返回 404 状态码响应, 所以我们在配置 /{folder}/{item} 路径下 GET 方法时需要注意将 HTTP status regex 表达式中填入 404, 其余步骤均一样:

  • Method response 创建响应, 状态码 404, Response body > Content type = text/html
  • Integration response 创建响应, HTTP status regex = 404, Method response status code 默认 404
  • Integration response 编辑 404 - Response > Add mapping template, Content type = text/html, Template body 粘贴相同 HTML 代码
  • Deploy 后测试有效桶+无效对象 URL 访问, 正常得到自定义 404 页面内容.

后记

使用 API Gateway 时, 每次修改配置后务必记得 Deploy 才可生效. 另外, 上面的示例实现的是对 S3 存储桶中直接存放目标文件的访问, 如果桶中还有 “文件夹” (实质上是 Prefix), 需要访问位于文件夹内部的对象, 则需要在前面第一步配置 Resource 时将 {item} 资源的路径定义为 {item+}, 即贪婪模式, 这样才会将请求访问包含文件夹的目标对象完整信息(例如 folder/object.json) 传递给后端的 S3. 否则当 URL 参数中包含 / 符号时, 会被判定为要访问对应的 Resource 子路径, 由于实际上并不存在对应的配置, 会导致响应结果与预期不符.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/81559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【达梦数据库】过程、函数、包头和包体详解零基础

目录 背景参考链接解释包头包体 背景 最近遇到关于包头和包体的问题,学习并记录 参考链接 参考链接: oracle的过程、函数、包头和包体详解零基础 解释 包头主要用于定义接口,包体主要用以实现包体中声明的存储过程、函数等。 包头 包体

C++字符串处理:`std::string`和`std::string_view`的区别与使用

在 C中,std::string和std::string_view都用于处理字符串,但它们的用途和性能特点有很大不同。本教程将通过代码示例和流程图,帮助你快速掌握它们的使用方法。 1.什么是std::string和std::string_view? 1.1std::string std::str…

Pod 节点数量

动态调整 在 Kubernetes 中,如果为量化交易系统的 Pod 设置了可伸缩(HPA / VPA / 自定义控制器),并且默认副本数是 5,那么节点数量(副本数)是否变化,主要取决于以下几个因素。 ✅ …

基于OpenCV中的图像拼接方法详解

文章目录 引言一、图像拼接的基本流程二、代码实现详解1. 准备工作2. 特征检测与描述detectAndDescribe 函数详解(1)函数功能(2)代码解析(3)为什么需要这个函数?(4)输出数…

Java-List集合类全面解析

Java-List集合类全面解析 前言一、List接口概述与核心特性1.1 List在集合框架中的位置1.2 List的核心特性1.3 常见实现类对比 二、ArrayList源码剖析与应用场景2.1 内部结构与初始化2.2 动态扩容机制2.3 性能特点与最佳实践 三、LinkedList 源码剖析与应用场景3.1 内部结构与节…

Flink 并行度的设置

在 Apache Flink 中,并行度(Parallelism) 是控制任务并发执行的核心参数之一。Flink 提供了 多个层级设置并行度的方式,优先级从高到低如下: 🧩 一、Flink 并行度的四个设置层级 层级描述设置方式Operator…

OpenCV 笔记(39):频域中的拉普拉斯算子

1. 拉普拉斯算子 在该系列的第八篇文章中,我们曾经介绍过在二维空间拉普拉斯算子的定义为: 这是对函数 的二阶偏导数之和。 2. 拉普拉斯算子的傅里叶变换及其推导 在该系列的第三十二篇文章中,我们曾给介绍过下面的公式 二维连续傅里叶变换&…

入职软件开发与实施工程师了后........

时隔几个月没有创作的我又回来了,这几个月很忙,我一直在找工作,在自考(顺便还处理了一下分手的事),到处奔波,心力交瘁。可能我骨子里比较傲吧。我不愿意着急谋生,做我不愿意做的普通…

多卡跑ollama run deepseek-r1

# 设置环境变量并启动模型 export CUDA_VISIBLE_DEVICES0,1,2,3 export OLLAMA_SCHED_SPREAD1 # 启用多卡负载均衡 ollama run deepseek-r1:32b 若 deepseek-r1:32b 的显存需求未超过单卡容量(如单卡 24GB),Ollama 不会自动启用多卡 在run…

09、底层注解-@Import导入组件

09、底层注解-Import导入组件 Import是Spring框架中的一个注解,用于将组件导入到Spring的应用上下文中。以下是Import注解的详细介绍: #### 基本用法 - **导入配置类** java Configuration public class MainConfig { // 配置内容 } Configuration Impo…

题解:P12207 [蓝桥杯 2023 国 Python B] 划分

链接 题目描述 给定 40 个数,请将其任意划分成两组,每组至少一个元素。每组的权值为组内所有元素的和。划分的权值为两组权值的乘积。请问对于以下 40 个数,划分的权值最大为多少。 5160 9191 6410 4657 7492 1531 8854 1253 4520 9231126…

配置ssh服务-ubuntu到Windows拷贝文件方法

背景: 在工作中,需要频繁从ubuntu到Windows拷贝文件,但有时间总是无法拷出,每次重启虚拟机又比较麻烦并且效率较低。可以使用scp服务进行拷贝,不仅稳定而且高效,现将配置过程进行梳理,以供大家参…

线程池模式与C#中用法

一、线程池模式解析 1. 核心概念 线程池是一种 管理线程生命周期的技术,主要解决以下问题: 减少线程创建/销毁开销:复用已存在的线程 控制并发度:避免无限制创建线程导致资源耗尽 任务队列:有序处理异步请求 2. …

设置IDEA打开新项目使用JDK17

由于最近在学习Spring-AI&#xff0c;所以JDK8已经不适用了&#xff0c;但是每次创建新项目都还是JDK8&#xff0c;每次调来调去很麻烦 把Projects和SDKs都调整为JDK17即可 同时&#xff0c;Maven也要做些更改&#xff0c;主要是添加build标签 <build><plugins>&…

初识MySQL · 索引

目录 前言&#xff1a; 重温磁盘 认识索引 为什么这么做&#xff0c;怎么做 重谈page 聚簇索引VS非聚簇索引 回表查询 索引分类 前言&#xff1a; 前文我们主要是介绍了MySQL的一些基本操作&#xff0c;增删查改一类的操作都介绍了&#xff0c;并且因为大多数情况下&am…

MySQL——7、复合查询和表的内外连接

复合查询和表的内外连接 1、基本查询回顾2、多表查询3、自连接4、子查询4.1、单行子查询4.2、多行子查询4.3、多列子查询4.4、在from子句中使用子查询4.5、合并查询 5、表的内连和外连5.1、内连接5.2、外连接5.2.1、左外连接5.2.2、右外连接 1、基本查询回顾 1.1、查询工资高于…

MYSQL故障排查和环境优化

一、MySQL故障排查 1. 单实例常见故障 &#xff08;1&#xff09;连接失败类问题 ERROR 2002 (HY000): Cant connect to MySQL server 原因&#xff1a;MySQL未启动或端口被防火墙拦截。 解决&#xff1a;启动MySQL服务&#xff08;systemctl start mysqld&#xff09;或开放…

7GB显存如何部署bf16精度的DeepSeek-R1 70B大模型?

构建RAG混合开发---PythonAIJavaEEVue.js前端的实践-CSDN博客 服务容错治理框架resilience4j&sentinel基础应用---微服务的限流/熔断/降级解决方案-CSDN博客 conda管理python环境-CSDN博客 快速搭建对象存储服务 - Minio&#xff0c;并解决临时地址暴露ip、短链接请求改…

数字图像处理——图像压缩

背景 图像压缩是一种减少图像文件大小的技术&#xff0c;旨在在保持视觉质量的同时降低存储和传输成本。随着数字图像的广泛应用&#xff0c;图像压缩在多个领域如互联网、移动通信、医学影像和卫星图像处理中变得至关重要。 技术总览 当下图像压缩JPEG几乎一统天下&#xff…

抖音视频怎么去掉抖音号水印

你是不是经常遇到这样的烦恼&#xff1f;看到喜欢的抖音视频&#xff0c;想保存下来分享给朋友或二次创作&#xff0c;却被抖音号水印挡住了画面&#xff1f;别着急&#xff0c;今天教你几种超简单的方法&#xff0c;轻松去除水印&#xff0c;高清无水印视频一键保存&#xff0…