在 AWS Lambda 函數中使用 AWS Secrets Manager 密碼 - AWS Secrets Manager

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

在 AWS Lambda 函數中使用 AWS Secrets Manager 密碼

您可以使用 AWS 參數和機密 Lambda 擴充功能擷取和快取 Lambda 函數中的 AWS Secrets Manager 密碼,而無需使用 SDK。擷取快取的秘密比從 Secrets Manager 中擷取要快。由於呼叫 Secrets Manager API 需要花費成本,因此使用快取可以降低成本。延伸模組可以擷取 Secrets Manager 秘密和 Parameter Store 參數。如需 Parameter Store 的資訊,請參閱《AWS Systems Manager 使用者指南》中的 Parameter Store integration with Lambda extensions (Parameter Store 與 Lambda 延伸模組整合)。

Lambda 延伸模組是新增至 Lambda 函數功能的隨附程序。如需詳細資訊,請參閱《Lambda 開發人員指南》中的 Lambda 延伸模組。如需在容器映像中使用延伸模組的詳細資訊,請參閱《在容器映像中使用 Lambda 層和延伸模組》。Lambda 使用 Amazon CloudWatch 日誌記錄有關擴展程序的執行信息以及該函數。根據預設,擴充功能會將最少量的資訊記錄到 CloudWatch。若要記錄更多詳細資訊,請將環境變數 PARAMETERS_SECRETS_EXTENSION_LOG_LEVEL 設定為 debug

為了提供參數和秘密的記憶體快取,擴充功能會將本機 HTTP 端點 (本機主機連接埠 2773) 開放給 Lambda 環境。您可以設定環境變數 PARAMETERS_SECRETS_EXTENSION_HTTP_PORT 來設定連接埠。

Lambda 會將與函數所要求並行層級相符的另外執行個體具現化。每個執行個體都彼此隔離,並維護自己組態資料的本機快取。如需 Lambda 執行個體和並行的詳細資訊,請參閱《Lambda 開發人員指南》中的管理 Lambda 函數的並行

若要為 ARM 新增延伸模組,您必須為 Lambda 函數使用 arm64 架構。如需詳細資訊,請參閱《Lambda 開發人員指南》中的 Lambda 指令集架構。延伸模組在下列區域支援 ARM:亞太區域 (孟買)、美國東部 (俄亥俄)、歐洲 (愛爾蘭)、歐洲 (法蘭克福)、歐洲 (蘇黎世)、美國東部 (維吉尼亞北部)、歐洲 (倫敦)、歐洲 (西班牙)、亞太區域 (東京)、美國西部 (奧勒岡)、亞太區域 (新加坡)、亞太區域 (海德拉巴) 及亞太區域 (雪梨)。

擴充功能會使用用 AWS 戶端。如需有關設定 AWS 用戶端的資訊,請參閱 AWS SDK 和工具參考指南中的設定參考資料。如果您的 Lambda 函數在 VPC 中執行,則需要建立 VPC 端點,以便擴充功能可以呼叫 Secrets Manager。如需詳細資訊,請參閱 使用 AWS Secrets Manager VPC 端點

必要許可:

  • Lambda 執行角色必須具有密碼的secretsmanager:GetSecretValue權限。

  • 如果使用客戶受管金鑰而非使用客戶管理的金鑰加密密碼 AWS 受管金鑰 aws/secretsmanager,則執行角色也需要 KMS 金鑰的kms:Decrypt權限。

若要使用 AWS 參數和秘密 Lambda 擴充
  1. 將名為AWS 參數和秘密 Lambda 擴充功能的AWS 層新增至您的函數。如需指示,請參閱 Lambda 開發人員指南中的將圖層新增至函數。如果您使用 AWS CLI 來加入圖層,則需要延伸的 ARN。如需 ARN 的清單,請參閱《AWS Systems Manager 使用者指南》中的AWS 參數和秘密 Lambda 延伸 ARN

  2. 將許可授予 Lambda 執行角色,以便能夠存取秘密:

  3. 使用 Lambda 環境變數設定快取。

  4. 若要從延伸模組快取擷取秘密,您必須先將 X-AWS-Parameters-Secrets-Token 新增至請求標頭。將字符設定為 AWS_SESSION_TOKEN,這會由 Lambda 針對所有運行中的函數提供。使用此標頭表示呼叫者位於 Lambda 環境中。

    以下 Python 範例說明如何新增標頭。

    import os headers = {"X-Aws-Parameters-Secrets-Token": os.environ.get('AWS_SESSION_TOKEN')}
  5. 若要擷取 Lambda 函數中的秘密,請使用下列任一 HTTP GET 請求:

    • 若要擷取機密,對於 secretId,請使用機密的 ARN 或名稱。

      GET: /secretsmanager/get?secretId=secretId
    • 若要透過預備標籤擷取先前的機密值或特定版本,對於 secretId,請使用機密的 ARN 或名稱;對於 versionStage,請使用預備標籤。

      GET: /secretsmanager/get?secretId=secretId&versionStage=AWSPREVIOUS
    • 若要依 ID 擷取特定機密版本,對於 secretId,請使用機密的 ARN 或名稱;對於 versionId,請使用版本 ID。

      GET: /secretsmanager/get?secretId=secretId&versionId=versionId
    範例 擷取機密 (Python)

    以下 Python 範例說明如何擷取秘密,並使用 json.loads 剖析結果。

    secrets_extension_endpoint = "http://localhost:" + \ secrets_extension_http_port + \ "/secretsmanager/get?secretId=" + \ <secret_name> r = requests.get(secrets_extension_endpoint, headers=headers) secret = json.loads(r.text)["SecretString"] # load the Secrets Manager response into a Python dictionary, access the secret

AWS 參數和秘密 Lambda 擴充環境變數

您可以使用下列環境變數設定延伸模組。

如需如何使用環境變數的相關資訊,請參閱《Lambda 開發人員指南》中的使用 Lambda 環境變數

PARAMETERS_SECRETS_EXTENSION_CACHE_ENABLED

設定為 true 以快取參數和秘密。設定為 false 則不快取。預設為 true。

PARAMETERS_SECRETS_EXTENSION_CACHE_SIZE

要快取的秘密和參數數量上限。該值必須介於 0 到 1000 之間。值為 0 表示不快取。如果 SSM_PARAMETER_STORE_TTLSECRETS_MANAGER_TTL 都是 0,則忽略此變數。預設值為 1000。

PARAMETERS_SECRETS_EXTENSION_HTTP_PORT

本機 HTTP 伺服器的連接埠。預設值為 2773。

PARAMETERS_SECRETS_EXTENSION_LOG_LEVEL

延伸模組提供的記錄層級:debuginfowarnerrornone。設定為 debug 以查看快取組態。預設值為 info

PARAMETERS_SECRETS_EXTENSION_MAX_CONNECTIONS

延伸模組用來向 Parameter Store 或 Secrets Manager 提出請求的 HTTP 用戶端連線數量上限。這是每個用戶端的組態。預設值為 3。

SECRETS_MANAGER_TIMEOUT_MILLIS

對 Secrets Manager 的請求逾時 (以毫秒為單位)。值為 0 表示沒有逾時。預設值為 0。

SECRETS_MANAGER_TTL

快取中秘密的 TTL (以秒為單位)。值為 0 表示不快取。最高為 300 秒。如果 PARAMETERS_SECRETS_CACHE_SIZE 為 0,則忽略此變數。預設為 300 秒。

SSM_PARAMETER_STORE_TIMEOUT_MILLIS

對 Parameter Store 的請求逾時 (以毫秒為單位)。值為 0 表示沒有逾時。預設值為 0。

SSM_PARAMETER_STORE_TTL

快取中參數的 TTL (以秒為單位)。值為 0 表示不快取。最高為 300 秒。如果 PARAMETERS_SECRETS_CACHE_SIZE 為 0,則忽略此變數。預設為 300 秒。