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.pswp.cn/pingmian/81559.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81559.shtml
英文地址,請注明出處:http://en.pswp.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…