如何使用 Lambda 處理 AWS Cognito User 首次登入被系統要求強制變更密碼

情境描述 上圖顯示的是我剛在 Cognito User Pool 中新增了一個 user,可以注意到箭頭處顯示 Force change password。 當這個 user 嘗試首次登入時,他們會遇到這樣的情況: { "message": "New password required", "challengeName": "NEW_PASSWORD_REQUIRED", "session": "AYABeAsYJsR3yEr0iJssKPPUPEgAHQABAAdTZXJ2aWNlABBDb2duaXRvVXNlclBvb2xzAAEAB2F3cy1rbXMAS2Fybjphd3M6a21zOnVzLXdlc3QtMjowMTU3MzY3MjcxOTg6a2V5LzI5OTFhNGE5LTM5YTAtNDQ0Mi04MWU4LWRkYjY4NTllMTg2MQC4AQIBAHhPj7k9zU4nGXUQUvM0Ccwk42DS-fm3vKmH75ktTrktNQG1gnjl6HkUVUYN1J_HPow6AAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMulTha32s34j2CmQWAgEQgDtog8CDFh2e-4YyjM2kB_MXheMgmrdY_IF3aN9TImZXddMBj7djEAPPduLZnG3ddBLYQa8x3T3WPKUkvwIAAAAADAAAEAAAAAAAAAAAAAAAAADCbdmpLPo0E4QkWLlyH8ov_____wAAAAEAAAAAAAAAAAAAAAEAAAC1oMtgshmuUU4fk36WHKBzPgJEoE1MmL0PFyhR9lRcimImOIObhhxvC1fwiYylgbYx0Gu0i1cp5Le8AvrAnUGEJjZp54TMPP4N-JCT3qSrHeq_Kat_2CuECVSQqkc1qH4z9FVOTvAnos4FrDSn2W6KvFfLo8YQh2LJxM1h3GdIeyYqj7Ipfk6PZKGYmV5P741rRMNcuYBtvE8Hq9gVqMbEPG-c5MppY_q9JoG9TyQRN7rVGlZf62_WtTqST2F3-DZPoXTMTyY", "challengeParameters": { "USER_ID_FOR_SRP": "shiun", "requiredAttributes": "[]", "userAttributes": "{\"email\":\"xxxxx@gmail.com\"}" } } Cognito 回傳了一個 NEW_PASSWORD_REQUIRED 的 challenge,同時給了我們一個 session token。這就是我們需要處理的 case。 解決方案 要解決這個問題,我們需要提供一個 change-password 的 API endpoint,讓 user 可以順利更改密碼。整個 flow 大致如下: User 首次登入 Cognito 回傳 NEW_PASSWORD_REQUIRED challenge 和 session token 前端帶著 session token 呼叫我們的 change-password API 密碼更改成功,user 順利登入系統 以下是一個處理這種情況的 Lambda function 範例:...

July 19, 2024 · 2 min

深度解析 AWS API Gateway 的 Lambda Proxy Integration 功能

在 AWS API Gateway 創建 method 時,我們可以指定他要把請求傳到哪個 AWS 服務或是其他 HTTP Endpoint…等等,而如果你選擇 Lambda,你會看到有一個選項是 Lambda Proxy Integration,那我把它勾選起來會怎樣呢? TL;DR 如果有打開 Lambda Proxy Integration,接著我們到那個 Resource 的 Method 頁面看一下,會看到下圖的提示 Proxy integration For proxy integrations, API Gateway automatically passes the backend output to the caller as the complete payload. 但也許沒有很好理解,所以我們後面會實際打 Code 來示範,但我這邊先稍微解釋一下打開這個功能的影響: 完整的 HTTP 請求資訊:啟用 Lambda Proxy Integration 後,API Gateway 會將整個 HTTP 請求打包成單一的 event object,並傳遞給 Lambda Function 簡化的處理流程:Lambda Function 接收到的是一個包含了所有請求資訊的 event object,因此不需要再通過模板或轉換就可以直接處理請求。這樣簡化了函數的輸入處理,因為 Lambda Function 已經包含了所有必要的請求資訊 控制 HTTP Response:Lambda Function 需要返回一個特定格式的物件,這個物件包括 Status Code、Response Headers 和 Response Body。由於 Response 是直接由 Lambda Function 生成的,所以開發者可以完全控制 Response 的格式和內容 效能和成本效益:由於請求處理的過程更加直接,減少了中間的處理和轉換步驟,可以提高處理效率,可能也會在某種程度上降低成本 總之,選擇 Lambda Proxy Integration 可以使得與 AWS Lambda 的整合更加緊密、直接和高效。這適合需要精細控制 HTTP 響應的場景,或者希望簡化 API 與 Lambda 之間交互的架構設計...

June 14, 2024 · 4 min

AWS SAM 101 - 文長圖多!從安裝到部署你的 AWS Lambda

前幾天寫了一篇 Serverless Framework 101,今天就來寫寫 AWS SAM 的教學,這兩個都是用來部署及管理 Serverless 應用的框架,兩者可以說是競爭對手關係!待之後有空再來寫一篇這兩個產品的比較 Prerequisites 註冊 AWS 帳戶 建立 Admin IAM User 建立 access key ID and secret access key 安裝 AWS CLI 配置 AWS credentials 以上詳細內容請查看官方文檔: prerequisites 安裝 AWS SAM CLI Mac 的用戶要注意一下,從 2023/9 開始,AWS 不會在維護 AWS SAM CLI 的 Homebrew Installer 由於我現在是使用 Windows 作業系統的電腦,今天示範如何在 Windows 安裝 AWS SAM CLI Windows 安裝 Windows 安裝相當簡單,只要去官方文檔裡面下載 MSI File,接著無腦的 Next 按按按就裝好了 XD 下載好之後,輸入指令 sam --version 檢查是否安裝成功...

April 29, 2024 · 9 min

Serverless Framework 101 - 輕鬆開發並快速部署你的 AWS Lambda

Serverless Framework 簡介 Serverless Framework 是一個開源的無服務器應用框架,它允許開發者快速建立、部署和管理在 AWS Lambda、Google Cloud Functions、Azure Functions 等雲平台上運行的無服務器應用。這個框架使用一個簡潔的配置文件(通常是 serverless.yml),在其中定義了應用的所有資源和設定,讓開發者可以專注於編寫業務邏輯而非管理基礎設施。 安裝 Serverless Framework Prerequisites: 需要有 npm,若你的電腦沒有 npm,請去下載 NodeJS $ npm install -g serverless 創建一個 Service $ serverless ? What do you want to make? AWS - Node.js - Starter AWS - Node.js - HTTP API AWS - Node.js - Scheduled Task AWS - Node.js - SQS Worker AWS - Node.js - Express API AWS - Node.js - Express API with DynamoDB AWS - Python - Starter > AWS - Python - HTTP API AWS - Python - Scheduled Task AWS - Python - SQS Worker AWS - Python - Flask API AWS - Python - Flask API with DynamoDB Other 輸入指令後透過方向鍵選取你要的 Template,本文將已 AWS - Python HTTP API 示範...

April 28, 2024 · 3 min

如何使用 AWS EventBridge Scheduler 及 Lambda 自動排程調整 AWS Aurora Serverless V2 ACU

EventBridge 簡介 EventBridge Scheduler 是 AWS 在 2022/11 推出的新服務,相較於傳統事件驅動的 EventBridge,新推出的 Scheduler 是時間驅動的一個服務,你可以很輕易的在上面設置一些排程任務去調用 AWS 的其他服務,截至 2024/04/06,官方文件是顯示可以調用 AWS 超過 270 種服務,就我目前使用下來的心得,真的是相當易用! 常見的使用場景: 自動調整服務容量: 如 Amazon ECS 任務的數量或今天要介紹的 Aurora Serverless V2 ACU (今天要示範的) 自動化維護任務: 定時啟動或停止 EC2 Instance,以節省成本或進行系統維護。 SasS 訂閱即將到期通知: 蠻多 SaaS 系統可能會需要在用戶快到期時發送信件通知客戶續訂 架構說明 關於本文,我會預設讀者們對於 AWS 有基本的操作能力和認識,對於一些較瑣碎的動作會省略不講解 本文要教學的是排程每天固定時間,會透過 EventBridge Scheduler 調用 Lambda Function 然後將 Aurora Serverless V2 的 ACU 降低。 關於這個動作,我們其實要拆解成兩個部分: 用 Lambda 去調整 Aurora Serverless v2 ACU 用 EventBridge 去 Trigger Lambda 下圖是從 AWS 官方 Blog 下載下來的架構圖,純示意圖大概讓各位認識 EventBridge 和 Lambda 的配合 整體的步驟大概會是...

April 6, 2024 · 2 min