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

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

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

您可以使用 AWS Parameters and Secrets Lambda Extension 來擷取和快取 Lambda 函數中的 AWS Secrets Manager 秘密,而無需使用 SDK。擷取快取的秘密比從 Secrets Manager 中擷取要快。由於呼叫 Secrets Manager 需要成本APIs,因此使用快取可以降低成本。延伸模組可以擷取 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 Logs 記錄有關延伸項目的執行資訊以及 函數。根據預設,延伸模組會將最少量的資訊記錄到 CloudWatch。若要記錄更多詳細資訊,請將環境變數 PARAMETERS_SECRETS_EXTENSION_LOG_LEVEL 設定為 debug

為了提供參數和秘密的記憶體內快取,延伸模組會向 Lambda 環境公開本機HTTP端點 localhost 連接埠 2773。您可以設定環境變數 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 Parameters and Secrets Lambda ExtensionAWS 層新增至您的函數。如需指示,請參閱 Lambda 開發人員指南 中的將層新增至函數。如果您使用 AWS CLI 來新增 層,則需要延伸ARN模組的 。如需 的清單ARNs,請參閱 AWS Systems Manager 使用者指南 中的AWS 參數和秘密 Lambda 延伸ARNs模組。

  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或 名稱,在 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_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 秒。