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
进行映射.
Name | Mapped from |
---|---|
bucket | method.request.path.folder |
object | method.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 子路径, 由于实际上并不存在对应的配置, 会导致响应结果与预期不符.
相关文章:

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

关于systemverilog中在task中使用force语句的注意事项
先看下面的代码 module top(data);logic clk; inout data; logic temp; logic sampale_data; logic [7:0] data_rec;task send_data(input [7:0] da);begin(posedge clk);#1;force datada[7];$display(data);(posedge clk);#1;force datada[6]; $display(data); (posed…...

Python Day26 学习
继续NumPy的学习 数组的索引 一维数组的索引 创建及输出 arr1d np.arange(10) # 数组: [0 1 2 3 4 5 6 7 8 9] arr1d array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 取出数组的第一个元素,最后一个元素 代码实现 arr1d[0] arr1d[-1] 取出数组中索引为3&#x…...

解决:npm install报错,reason: certificate has expired
目录 1. 问题分析2. 问题解决2.1 查看配置的镜像2.2 修改镜像源 种一棵树最好的时间是10年前,其次就是现在,加油! --by蜡笔小柯南 1. 问题分析 启动前…...
卸载云枢(MacOS 版)
删除 APP 和相关文件 sudo chflags -R noschg /Applications/Yunshu.app 2>/dev/null sudo rm -rf /Applications/Yunshu.app sudo rm -rf /Library/Application\ Support/EagleCloud sudo rm -rf /Library/LaunchAgents/com.eagleyun.endpoint.agent.plist sudo rm -rf /L…...

中科固源Wisdom平台发现NASA核心飞行控制系统(cFS)通信协议健壮性缺陷!
中科固源Wisdom平台发现NASA核心飞行控制系统(cFS)通信协议健壮性缺陷,接下来内容将进行核心要点概述,分别从地位、重要性和应用场景三方面进行简明阐述: cFS(core Flight System)是NASA戈达德太空飞行中心(…...
Linux内核深入学习(4)——内核常见的数据结构2——红黑树
Linux内核深入学习(3)——内核常见的数据结构2红黑树 红黑树 红黑树是一个非常经典也是非常难懂的数据结构,它的数据结构定义在include/linux/rbtree_types.h上,同时,操作则是在include/linux/rbtree.h 啥是红黑…...
从单体架构到微服务:架构演进之路
引言:当“大货车”遇上“集装箱运输” 在软件开发领域,单体架构曾像一辆载满货物的大货车,将所有功能打包在一个应用中。但随着业务复杂度飙升,这辆“大货车”逐渐陷入泥潭:启动慢如蜗牛、故障波及全局、升级如履薄冰……...

嵌入式学习笔记DAY23(树,哈希表)
一、树 1.树的概念 之前我们一直在谈的是一对一的线性结构,现实中,还存在很多一对多的情况需要处理,一对多的线性结构——树。 树的结点包括一个数据元素及若干指向其子树的分支,结点拥有的子树数称为结点的度。度为0的结点称为叶…...
leetcode239 滑动窗口最大值deque方式
这段文字描述的是使用单调队列(Monotonic Queue) 解决滑动窗口最大值问题的优化算法。我来简单解释一下: 核心思路 问题分析:在滑动窗口中,若存在两个下标 i < j 且 nums[i] ≤ nums[j],则 nums[i] 永远…...

仓颉开发语言入门教程:搭建开发环境
仓颉开发语言作为华为为鸿蒙系统自研的开发语言,虽然才发布不久,但是它承担着极其重要的历史使命。作为鸿蒙开发者,掌握仓颉开发语言将成为不可或缺的技能,今天我们从零开始,为大家分享仓颉语言的开发教程,…...

Axure中继器高保真交互原型的核心元件
Axure作为一款强大的原型设计工具,中继器无疑是打造高保真交互原型的核心利器。今天,就让我们深入探讨一下Axure中继器的核心地位、操作难点,以及如何借助优秀案例来提升我们的中继器使用技能。 一、核心地位 中继器在Axure中的地位举足轻重…...

【SpringBoot】✈️整合飞书群机器人发送消息
💥💥✈️✈️欢迎阅读本文章❤️❤️💥💥 🏆本篇文章阅读大约耗时3分钟。 ⛳️motto:不积跬步、无以千里 📋📋📋本文目录如下:🎁🎁&am…...

第 1 章:数字 I/O 与串口通信(GPIO UART)
本章目标: 掌握 GPIO 的硬件原理、寄存器配置与典型驱动框架 深入理解 UART/USART 的帧格式、波特率配置、中断与 DMA 驱动 通过实战案例,将 GPIO 与 UART 结合,实现 AT 命令式外设控制 章节结构 GPIO 概述与硬件原理 GPIO 驱动实现:寄存器、中断与去抖 UART/USART 原理与帧…...

【图像生成大模型】Wan2.1:下一代开源大规模视频生成模型
Wan2.1:下一代开源大规模视频生成模型 引言Wan2.1 项目概述核心技术1. 3D 变分自编码器(Wan-VAE)2. 视频扩散 Transformer(Video Diffusion DiT)3. 数据处理与清洗 项目运行方式与执行步骤1. 环境准备2. 安装依赖3. 模…...
java配置webSocket、前端使用uniapp连接
一、这个管理系统是基于若依框架,配置webSocKet的maven依赖 <!--websocket--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency> 二、配…...

interface接口和defer场景分析
接口 接口这里主要两点: 设计业务结构时采用依赖倒转:业务层向下依赖抽象层,实现层向上依赖抽象层。 相比于之前: 之后: 注意struct中嵌套interface和不嵌套interface的区别: type Myinterface interfac…...
02、基础入门-Spring生态圈
02、基础入门-Spring生态圈 # Spring生态圈概述 **Spring生态圈**是基于Spring框架的一系列开源项目和工具的集合,涵盖了各种领域,包括Web开发、数据访问、集成、测试、安全等。 ## 主要组成部分 1. **Spring Framework**:是整个生态圈的核心…...
前后端交互中的绝对路径和相对路径
前端 <form action"hello" method"post"> 1. 不加斜杠 (相对路径,如 action"hello") 解析规则:基于当前页面的 URL 路径部分 进行拼接。 假设当前页面 URL 是 http://域名:端口/应用上下文…...
从零开始学习three.js(18):一文详解three.js中的着色器Shader
在WebGL和Three.js的3D图形渲染中,着色器(Shader) 是实现复杂视觉效果的核心工具。通过编写自定义的着色器代码,开发者可以直接操作GPU,实现从基础颜色渲染到动态光照、粒子效果等高级图形技术。本文将深入解析Three.j…...

调用百度云API机器翻译
新建Python文件,叫 text_translator.py 输入 import requests import jsonAPI_KEY "glYiYVF2dSc7EQ8n78VDRCpa" # 替换为自己的API Key SECRET_KEY "kUlhze8OQZ7xbVRp" # 替换为自己的Secret Keydef main():# 选择翻译方向while True:di…...
大模型训练计算显存占用
在大模型训练过程中,GPU显存中需要存储多种类型的数据,这些数据的合理管理直接影响训练效率和模型规模。需要放入GPU的关键数据类型如下: 注意: 在计算大模型训练占用的显存时,一般只计算 模型参数、梯度、优化器 的显…...

uni-app学习笔记六-vue3响应式基础
一.使用ref定义响应式变量 在组合式 API 中,推荐使用 ref() 函数来声明响应式状态,ref() 接收参数,并将其包裹在一个带有 .value 属性的 ref 对象中返回 示例代码: <template> <view>{{ num1 }}</view><vi…...
亚远景-ASPICE与ISO 21434在汽车电子系统开发中的应用案例
在汽车电子系统开发中,ASPICE(Automotive Software Process Improvement and Capacity Determination)与ISO 21434(Road vehicles — Cybersecurity engineering)是两个关键标准,分别从软件开发流程和网络安…...

『已解决』Python virtualenv_ error_ unrecognized arguments_--wheel-bundle
📣读完这篇文章里你能收获到 🐍 了解 virtualenv 参数错误的原因及解决方案📦 学习如何正确配置 Python 虚拟环境文章目录 前言一、问题描述1.1 错误现象1.2 影响范围二、问题分析2.1 根本原因三、解决方案3.1 兼容处理3.2 完整解决方案四、总结前言 本文详细介绍了在 D…...
详细介绍一下Python连接MySQL数据库的完整步骤
以下是 Python 连接 MySQL 数据库的完整步骤,包含环境准备、连接建立、数据操作、错误处理和性能优化等内容: 一、环境准备 安装 MySQL 服务器 Windows/macOS:下载安装包 MySQL Installer Linux: bash Ubuntu/Debian sudo apt-…...

【Unity 2023 新版InputSystem系统】新版InputSystem 如何进行人物移动(包括配置、代码详细实现过程)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、InputSystem配置二、GameInput 游戏输入脚本1.实现思路2.完整代码三、Player 游戏人物移动脚本1.实现思路2.完整代码四、场景脚本设置1.组件设置五、问题解决1.人物一直下落2.人物跳跃时,…...

单片机-STM32部分:13-1、编码器
飞书文档https://x509p6c8to.feishu.cn/wiki/BpEywhaX9iqbiLkdqdAcmDnwnab EC旋转编码器 在产品开发过程中,需要位置闭环的的产品,类似电机类产品来说,编码器至关重要,它不仅可以使我们对带年纪进行精确的速度闭环,位…...
机器学习第十二讲:特征选择 → 选最重要的考试科目做录取判断
机器学习第十二讲:特征选择 → 选最重要的考试科目做录取判断 资料取自《零基础学机器学习》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章:DeepSeek R1本地与线上满血版部署:超详细手把手指南 一、学…...

关于我在使用stream().toList()遇到的问题
关于我在使用stream().toList()遇到的问题 问题描述 在测试以上程序的时候抛出了空指针异常 于是我以为是我数据库中存在null字段,但查看后发现并不存在为null的数据 问题排查 起初我以为问题出现在sort排序方法这,事实也确实是,当我把s…...