使用 AWS Lambda 擴充功能快取秘密 - AWS Prescriptive Guidance

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 AWS Lambda 擴充功能快取秘密

創建由哈里歐姆普拉薩斯拉賈戈帕爾(AWS)

環境:PoC 或試驗

技能:現代化;原生雲端;無伺服器;軟體開發與測試

工作負載:開放原始碼

AWS 服務:AWS Lambda;AWS Secrets Manager

Summary

此模式示範如何裝載 HTTP 伺服器,以快取 AWS Lambda 函數所需的秘密。Lambda 擴充功能會執行下列動作:

  • 裝載本機 HTTP 伺服器,由 Lambda 函數叫用以擷取密碼,而不是直接從 AWS Secrets Manager 擷取密碼。

  • 使用 Lambda 函數內的 config.yaml 檔案來取得必須快取在記憶體中的秘密清單。

  • 根據環境變數中設定的值 (以分鐘為單位) 重新整理秘密快取CACHE_TIMEOUT。如果未指定值,則預設為 10。

此延伸套件在下列使用案例中很有幫助:

  • 如果 Lambda 函數需要存取 Secrets Manager 來讀取秘密,則秘密可以在擴充功能啟動時快取,而不是作為 Lambda 的第一個要求的一部分擷取。這有助於避免冷啟動。 

  • Lambda 函式會指定使用組態檔 (config.yaml),這是部署套件的一部分。

  • Lambda 函數允許記憶體內快取的到期,可將其設定為 Lambda 環境變數。

  • 企業可以在記憶體中維護快取層,而不是使用 /tmp 儲存裝置來讀取和寫入 Secrets Manager 中的值。

先決條件和限制

先決條件

  • 作用中的 AWS 帳戶

  • AWS Command Line Interface (AWS CLI) 1.7 版或更新版本,已安裝及設定於 macOS、Linux 或 Windows

  • 安裝在本機系統中的 Zip 公用程式

  • 該代碼是在附件區段 

Architecture

架構

下圖提供所有組件的高階檢視。

  1. 秘密會根據config.yaml檔案,並根據環境變數重新整理快取。

  2. 基於內部指定的鍵config.yaml,則會從 Secrets Manager 讀取和快取記憶體中的秘密。

  3. Lambda 函式會讀取秘密,藉由對擴充功能進行 HTTP GET 呼叫,而擴充功能則會從記憶體內快取傳回值。

初始化擴展並從緩存中讀取秘密

下列順序圖顯示 Lambda 擴充功能的初始化,以及 Lambda 函數如何使用裝載於擴充功能內的 HTTP 伺服器來讀取快取秘密。

Lambda 函數和擴充功能內的事件序列包括下列項目。

  1. 初始化擴展的一部分讀取config.yaml文件從默認路徑下的 Lambda 函數(/var/task)並獲取需要緩存的秘密列表。

  2. 當擴展包含需要獲取的密鑰列表時,它會調用 Secrets Manager 來獲取所有密鑰(在config.yaml)並將它們存儲在內存中。

  3. 擴充功能會啟動本機 HTTP 伺服器。

  4. 為了獲取秘密值,Lambda 函數使一個 HTTP GET:/緩存/<secretname> 調用擴展。 

  5. 擴充功能會將快取的值傳回至 Lambda 函式根據secretname路徑參數。

技術

  • AWS Lambda

  • AWS Secrets Manager

Tools

工具

  • AWS CLI— AWS Command Line Interface (AWS CLI) 是管理 AWS 服務的統一工具。

  • AWS Lambda— AWS Lambda 支援執行程式碼,無需佈建或管理伺服器。

  • AWS Secrets Manager— AWS Secrets Manager 可讓您透過 API 呼叫 Secrets Manager 來擷取秘密,以取代硬式編碼登入資料 (包括密碼)。由於 Secrets Manager 可以根據排程自動旋轉秘密,因此您可以將長期秘密取代為短期秘密,降低洩漏風險。

  • Git 用戶端— Git 提供 GUI 工具,或者您可以使用命令列或桌面工具從 GitHub 檢出所需的成品。

  • Node.js— Node.js 是一個事件導向的 JavaScript 執行階段環境,專為建置可擴充的網路應用程式而設計。所以此Node.js 執行時間應該安裝在本機系統上。

Epics

任務描述所需技能
在秘密管理器中建立秘密。

執行中的命令其他資訊區段。此命令假設您已建立您的秘密,例如此範例 JavaScript 物件表示法 (JSON) 文字結構{"username":"janedoe","password":" aBC1D2*!3EE"},在名為的檔案mycreds.json

開發人員,AWS 系統管理員
任務描述所需技能
建立新的 Lambda 函數。

在 AWS 管理主控台上,選擇Lambda,然後選擇建立函數。創建一個新的 Node.js 運行時Secrets-Extension-Lambda-Test。將 Lambda 的記憶體增加到 1200 MB,Timeout (逾時)設為 30 秒。

開發人員,AWS 系統管理員
將原則指派給 Lambda IAM 角色。

選擇 Permission (許可) 標籤。UNDER執行角色下,選擇Role name (角色名稱)連結並附加SecretsManagerReadWrite政策新增至 AWS Identity and Access Management (IAM) 角色。請注意:最佳做法是建立具有需要快取之秘密唯讀權限的 IAM 政策,並將其指派給 IAM 角色。

開發人員,AWS 系統管理員
更新處理常式程式碼。

選擇組態索引標籤,並使用其他資訊區段。程式碼會叫用裝載在 Lambda 擴充功能內的本機伺服器來讀取密碼的值,而不是直接前往 Secrets Manager。

開發人員,AWS 系統管理員
建立秘密快取組態檔。

在根目錄下創建一個名為 config.yaml 的新文件,其中指定的內容其他資訊區段。此值secret_now是您在上個步驟建立的秘密名稱,並將由副檔名快取秘密。如果你想緩存更多的秘密,你可以繼續在這裡添加它們。選擇部署按鈕。

開發人員,AWS 系統管理員
建立快取、重建逾時,並更新 Lambda 執行階段。

建立新的環境變數 CACHE_TULT,並以分鐘為單位設定值。將根據此值重新整理快取。請注意:如果找不到環境值,快取會每 10 分鐘重新整理一次。

開發人員,AWS 系統管理員
任務描述所需技能
部署 Lambda 延伸模組。

若要部署延伸模組,並將層與 Lambda 函式產生關聯,請執行其他資訊區段。

開發人員,AWS 系統管理員
任務描述所需技能
叫用 Lambda 函數。

若要叫用 Lambda 函式,請使用其他資訊區段。函數應該傳回StatusCode:200

開發人員,AWS 系統管理員
任務描述所需技能
驗證 Lambda 延伸呼叫。

在 Amazon CloudWatch 主控台上,請導覽至日誌日誌群組。選取 /aws/lambda/Secrets-Extension-Lambda-Test 日誌群組。查看日誌流以查看運行時日誌Response from cache後面跟著user name和密碼儲存在mycred.json

開發人員,AWS 系統管理員

其他資訊

建立私密

下列命令假設您已建立您的秘密,例如此範例 JSON 文字結構{"username":"janedoe","password":" aBC1D2*!3EE"},在一個名為mycreds.json

aws secretsmanager create-secret --name secret_now --secret-string file://mycreds.json

更新處理常式程式碼

具有以下代碼的示例位於example-function/index.js在提供的壓縮文件中附件區段。

exports.handler = function(event, context, callback) {     const https = require('http')     const options = {         hostname: 'localhost',         port: 8080,         path: '/cache/secret_now',         method: 'GET'     }     const req = https.request(options, res => {         res.on('data', d => {             console.log("Response from cache: "+d);             return d;         })     })     req.on('error', error => {         console.error(error)     })     req.end() };

建立秘密快取組態檔

下列程式碼的範例位於example-function/config.yaml檔案中的附件區段。在此範例中,secret_now是在上個步驟建立的秘密名稱,將由副檔名快取。若要快取其他秘密,請將它們新增至此檔案。

SecretManagers:  – secrets:     – secret_now

部署 Lambda 延伸功能

> chmod +x deploy.sh > ./deploy.sh

叫用 Lambda 函數

aws lambda invoke \  --function-name "Secrets-Extension-Lambda-Test" \  --payload '{"payload": "hello"}' /tmp/invoke-result \  --cli-binary-format raw-in-base64-out \  --log-type Tail

函數應該傳回"StatusCode": 200

Attachments

attachment.zip