使用 AWS Secrets Manager 秘密 AWS Lambda 函數 - AWS Secrets Manager

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

使用 AWS Secrets Manager 秘密 AWS Lambda 函數

您可以使用 AWS 要擷取和快取的參數和密碼 Lambda 擴充功能 AWS Secrets Manager Lambda 函數中的秘密,而不使用SDK. 擷取快取的秘密比從 Secrets Manager 中擷取要快。由於呼叫 Secrets Manager 需要付費APIs,因此使用快取可以降低成本。延伸模組可以擷取 Secrets Manager 秘密和 Parameter Store 參數。如需參數存放區的相關資訊,請參閱參數存放區與 Lambda 擴充功能整合 AWS Systems Manager 使用者指南

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 具名的圖層 AWS 參數和秘密 Lambda 擴展到您的函數。如需指示,請參閱 Lambda 開發人員指南中的將圖層新增至函數。如果您使用 AWS CLI 要添加圖層,您需要ARN擴展名。如需的清單ARNs,請參閱 AWS 參數和秘密 Lambda 擴展 ARNs AWS Systems Manager 使用者指南

  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 函數中的密碼,請使用下列其中一個HTTPGET要求:

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

      GET: /secretsmanager/get?secretId=secretId
    • 若要透過暫存標籤擷取先前的密碼值或特定版本secretId,請使用密碼的ARN或名稱,以及用於versionStage,請使用暫存標籤。

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

      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

擴充功能用來向參數存放區或 Secrets Manager 發出要求的用HTTP戶端連線數目上限。這是每個用戶端的組態。預設值為 3。

SECRETS_MANAGER_TIMEOUT_MILLIS

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

SECRETS_MANAGER_TTL

TTL在幾秒鐘內緩存中的秘密。值為 0 表示不快取。最高為 300 秒。如果 PARAMETERS_SECRETS_EXTENSION_CACHE_SIZE 為 0,則忽略此變數。預設為 300 秒。

SSM_PARAMETER_STORE_TIMEOUT_MILLIS

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

SSM_PARAMETER_STORE_TTL

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