使用 Lambda 環境變數 - AWS Lambda

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

使用 Lambda 環境變數

您可以使用環境變數來調整函數的行為,而無需更新程式碼。環境變數是存放在函數特定版本組態中的一對字串。Lambda 執行時間可讓程式碼使用環境變數,並設定其他環境變數,這些變數包含函數和調用請求的相關資訊。

注意

若要提高資料庫安全性,建議您使用來儲存資料庫認證, AWS Secrets Manager 而不要使用環境變數。如需詳細資訊,請參閱 AWS Lambda 與 Amazon RDS 一起使用

在函數調用之前,不會評估環境變數。您定義的任何值都會視為文字字串,而且不會展開。在函數程式碼中執行變數評估。

配置環境變量(控制台)

您可以在函數的未發佈版本上定義環境變數。當您發佈版本時,會鎖定該版本的環境變數以及其他版本特定組態設定

您可以透過定義索引鍵和值,為函數建立環境變數。函數使用索引鍵的名稱來擷取環境變數的值。

在 Lambda 主控台中設定環境變數
  1. 開啟 Lambda 主控台中的 函數頁面

  2. 選擇一個函數。

  3. 選擇 Configuration (組態),然後選擇 Environment variables (環境變數)。

  4. Environment variables (環境變數) 下,選擇 Edit (編輯)。

  5. 選擇 Add environment variable (新增環境變數)。

  6. 輸入索引鍵和值。

    請求
    • 索引鍵需以英文字母為開頭,且至少有兩個字元。

    • 索引鍵僅包含字母、數字和底線字元 (_)。

    • 索引鍵不是由 Lambda 預留

    • 所有環境變數的大小總計不超過 4 KB。

  7. 選擇 Save (儲存)。

在主控台程式碼編輯器中產生環境變數清單

可在 Lambda 程式碼編輯器中產生環境變數清單。這是在編碼時參考環境變數的快速方法。

  1. 選擇 程式碼 標籤。

  2. 選擇環境變數索引標籤。

  3. 選擇工具顯示環境變數

在主控台程式碼編輯器中列出環境變數時,會保持加密狀態。如果在傳輸過程中啟用加密協助程式進行加密,則這些設定會維持不變。如需詳細資訊,請參閱 保護環境變數

環境變數清單為唯讀狀態,且只能在 Lambda 主控台中使用。下載函數的 .zip 封存檔時,不會包含此檔案,且您無法透過上傳此檔案來新增環境變數。

設定環境變數 (API)

若要使用 AWS CLI 或 AWS SDK 管理環境變數,請使用下列 API 作業。

配置環境變量(AWS CLI)

下列範例會在名為 my-function 的函數上設定兩個環境變數。

aws lambda update-function-configuration \ --function-name my-function \ --environment "Variables={BUCKET=my-bucket,KEY=file.txt}"

當您使用 update-function-configuration 命令套用環境變數時,會取代 Variables 結構的整個內容。若要在新增環境變數時保留現有的環境變數,請在請求中包含所有現有值。

若要取得目前的組態,請使用 get-function-configuration 命令。

aws lambda get-function-configuration \ --function-name my-function

您應該會看到下列輸出:

{ "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-east-2:111122223333:function:my-function", "Runtime": "nodejs20.x", "Role": "arn:aws:iam::111122223333:role/lambda-role", "Environment": { "Variables": { "BUCKET": "my-bucket", "KEY": "file.txt" } }, "RevisionId": "0894d3c1-2a3d-4d48-bf7f-abade99f3c15", ... }

可以從 get-function-configuration 的輸出中將修訂 ID 作為參數傳遞給 update-function-configuration。這樣可確保在讀取組態和更新組態期間,值不會變更。

若要設定函數的加密金鑰,請設定 KMSKeyARN 選項。

aws lambda update-function-configuration \ --function-name my-function \ --kms-key-arn arn:aws:kms:us-east-2:111122223333:key/055efbb4-xmpl-4336-ba9c-538c7d31f599

配置環境變量(AWS SAM)

您可以使用AWS Serverless Application Model來設定函數的環境變數。更新文template.yaml件中的環境變量屬性,然後運行 sam 部署

範例 template.yaml
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: An AWS Serverless Application Model template describing your function. Resources: my-function: Type: AWS::Serverless::Function Properties: CodeUri: . Description: '' MemorySize: 128 Timeout: 120 Handler: index.handler Runtime: nodejs18.x Architectures: - x86_64 EphemeralStorage: Size: 10240 Environment: Variables: BUCKET: my-bucket KEY: file.txt # Other function properties...

環境變數的範例案例

您可以使用環境變數,自訂測試環境和生產環境中的函數行為。例如,您可以建立兩個具備相同程式碼,但不同組態的函數。一個函數連接到測試資料庫,另一個函數連接到生產資料庫。在此情況下,可以使用環境變數將資料庫的主機名稱和其他連線詳細資訊傳遞給函數。

以下範例顯示如何將資料庫主機和資料庫名稱定義為環境變數。


        Lambda 主控台中的環境變數

如果您希望測試環境產生比實際執行環境更多的偵錯資訊,您可以設定環境變數,以將測試環境設定為使用更詳細的記錄或更詳細的追蹤。

擷取環境變數

若要在函數程式碼中擷取環境變數,請使用程式設計語言的標準方法。

Node.js
let region = process.env.AWS_REGION
Python
import os region = os.environ['AWS_REGION']
注意

在某些情況下,您可能需要使用下列格式:

region = os.environ.get('AWS_REGION')
Ruby
region = ENV["AWS_REGION"]
Java
String region = System.getenv("AWS_REGION");
Go
var region = os.Getenv("AWS_REGION")
C#
string region = Environment.GetEnvironmentVariable("AWS_REGION");
PowerShell
$region = $env:AWS_REGION

Lambda 透過靜態加密環境變數來安全地存放它們。您可以將 Lambda 設定為使用不同的加密金鑰、在用戶端加密環境變數值,或使用設定 AWS CloudFormation 範本中的環境變數 AWS Secrets Manager。

定義執行時間環境變數

Lambda 執行時間會在初始化期間設定數個環境變數。大多數的環境變數都會提供函數或執行時間的資訊。這些環境變數的索引鍵都已進行預留,無法在您的函數組態中設定。

預留環境變數
  • _HANDLER - 在函數中設定的處理常式位置。

  • _X_AMZN_TRACE_ID - X-Ray 追蹤標頭。此環境變數會隨著每次調用而變更。

    • 未針對僅限作業系統的執行期 (provided 執行期系列) 定義此環境變數。您可以使用 下次調用 中的 Lambda-Runtime-Trace-Id 回應標頭為自訂執行階段設定 _X_AMZN_TRACE_ID

    • 對於 Java 執行期版本 17 及更高版本,不使用此環境變數。相反地,Lambda 會將追蹤資訊儲存在 com.amazonaws.xray.traceHeader 系統屬性中。

  • AWS_DEFAULT_REGION— 執行 Lambda 函數的預設值 AWS 區域 。

  • AWS_REGION— 執行 Lambda 函數的 AWS 區域 位置。若已完成定義,此值便會覆寫 AWS_DEFAULT_REGION

    • 如需有關將 AWS 區域 環境變數與 AWS SDK 搭配使用的詳細資訊,請參閱 AWS SDK 和工具參考指南中的AWS 區域

  • AWS_EXECUTION_ENV執行時間識別符,字首為 AWS_Lambda_ (例如,AWS_Lambda_java8)。未針對僅限作業系統的執行期 (provided 執行期系列) 定義此環境變數。

  • AWS_LAMBDA_FUNCTION_NAME - 函數的名稱。

  • AWS_LAMBDA_FUNCTION_MEMORY_SIZE - 可供函數使用的記憶體量 (MB)。

  • AWS_LAMBDA_FUNCTION_VERSION - 正在執行的函數版本。

  • AWS_LAMBDA_INITIALIZATION_TYPE - 函數的初始化類型,即 on-demandprovisioned-concurrencysnap-start。如需資訊,請參閱設定佈建並行使用 Lambda 改善啟動效能 SnapStart

  • AWS_LAMBDA_LOG_GROUP_NAMEAWS_LAMBDA_LOG_STREAM_NAME — 功能的 Amazon CloudWatch 日誌群組和資料流的名稱。AWS_LAMBDA_LOG_GROUP_NAMEAWS_LAMBDA_LOG_STREAM_NAME環境變數在 Lambda SnapStart 函數中不可用。

  • AWS_ACCESS_KEYAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN - 從函數的執行角色中取得的存取金鑰。

  • AWS_LAMBDA_RUNTIME_API - (自訂執行時間) 執行時間 API 的主機和連接埠。

  • LAMBDA_TASK_ROOT - 指向您 Lambda 函數程式碼的路徑。

  • LAMBDA_RUNTIME_DIR - 指向執行時間程式庫的路徑。

下列其他環境變數並未進行預留,可以在您的函數組態中進行擴充。

未預留的環境變數
  • LANG – 執行時間的地區設定 (en_US.UTF-8)。

  • PATH – 執行路徑 (/usr/local/bin:/usr/bin/:/bin:/opt/bin)。

  • LD_LIBRARY_PATH – 系統程式庫路徑 (/var/lang/lib:/lib64:/usr/lib64:$LAMBDA_RUNTIME_DIR:$LAMBDA_RUNTIME_DIR/lib:$LAMBDA_TASK_ROOT:$LAMBDA_TASK_ROOT/lib:/opt/lib)。

  • NODE_PATH - (Node.js) Node.js 程式庫路徑 (/opt/nodejs/node12/node_modules/:/opt/nodejs/node_modules:$LAMBDA_RUNTIME_DIR/node_modules)。

  • PYTHONPATH - (Python 2.7、3.6、3.8) Python 程式庫路徑 ($LAMBDA_RUNTIME_DIR)。

  • GEM_PATH - (Ruby) Ruby 程式庫路徑 ($LAMBDA_TASK_ROOT/vendor/bundle/ruby/2.5.0:/opt/ruby/gems/2.5.0)。

  • AWS_XRAY_CONTEXT_MISSING - 對於 X-Ray 追蹤,Lambda 將它設定為 LOG_ERROR,以避免從 X-Ray 開發套件中擲回執行時間錯誤。

  • AWS_XRAY_DAEMON_ADDRESS - 對於 X-Ray 追蹤,為 X-Ray 常駐程式的 IP 地址和連接埠。

  • AWS_LAMBDA_DOTNET_PREJIT - 若是 .NET 6 和 .NET 7 執行期,請將此變數設為啟用或停用 .NET 特定執行期最佳化。值包含 alwaysneverprovisioned-concurrency。如需詳細資訊,請參閱 設定佈建並行

  • TZ – 環境的時區 (UTC)。執行環境使用 NTP 來同步系統時鐘。

顯示的範例值會反映最新的執行時間。特定變數或其值是否存在,可能會因先前的執行時間而有所不同。

保護環境變數

若要保護您的環境變數,可以使用伺服器端加密來保護您的靜態資料,並使用用戶端加密來保護傳輸中的資料。

注意

若要提高資料庫安全性,建議您使用來儲存資料庫認證, AWS Secrets Manager 而不要使用環境變數。如需詳細資訊,請參閱 AWS Lambda 與 Amazon RDS 一起使用

靜態安全

Lambda 永遠使用 AWS KMS key提供靜態伺服器端加密。預設情況下,Lambda 使用 AWS 受管金鑰。如果此預設行為符合您的工作流程,您便不需要設定其他項目。Lambda 會 AWS 受管金鑰 在您的帳戶中建立,並為您管理該帳戶的許可。 AWS 不會向您收取使用此密鑰的費用。

如果您願意,您可以改為提供 AWS KMS 客戶管理的金鑰。您可以這樣做以控制 KMS 金鑰的輪換或滿足您的組織對管理 KMS 金鑰的請求。當您使用客戶受管的金鑰時,只有您帳戶中具有 KMS 金鑰存取權的使用者才能檢視或管理函數上的環境變數。

客戶受管金鑰會產生標準 AWS KMS 費用。如需詳細資訊,請參閱 AWS Key Management Service 定價

傳輸中安全

為了提高額外的安全性,您可以為傳輸中的加密啟用協助程式,這可以確保您的環境變數在傳輸過程中在用戶端得到加密保護。

若要為環境變數配置加密
  1. 使用 AWS Key Management Service (AWS KMS) 為 Lambda 建立任何客戶受管金鑰,以用於伺服器端和用戶端加密。如需詳細資訊,請參閱AWS Key Management Service 開發人員指南中的建立金鑰

  2. 使用 Lambda 主控台,導覽至 Edit environment variables (編輯環境變數) 頁面。

    1. 開啟 Lambda 主控台中的 函數頁面

    2. 選擇一個函數。

    3. 選擇 Configuration (組態),然後從左側導覽列選擇 Environment variables (環境變數)。

    4. Environment variables (環境變數) 區段中,選擇 Edit (編輯)。

    5. 展開 Encryption configuration (加密組態)。

  3. (選用) 啟用主控台加密協助程式,以使用用戶端加密來保護傳輸中的資料。

    1. Encryption in transit (傳輸中加密)下,選擇 Enable helpers for encryption in transit (啟用傳輸中加密的協助程式)。

    2. 對於要為其啟用主控台加密協助程式的每個環境變數,請選擇環境變數旁邊的 Encrypt (加密)。

    3. 在傳輸過程中加密下 AWS KMS key ,選擇您在此程序開始時建立的客戶管理金鑰。

    4. 選擇 Execution role policy (執行角色政策),然後複製政策。此政策授予函數的執行角色解密環境變數的許可。

      儲存此政策,以便在此程序的最後一個步驟中使用。

    5. 向函數中新增解密環境變數的程式碼。若要查看範例,請選擇解密秘密程式碼片段

  4. (選用) 指定用於靜態加密的客戶受管金鑰。

    1. 選擇 Use a customer master key (使用客戶主金鑰)。

    2. 選擇在此程序開始時建立的客戶受管金鑰。

  5. 選擇 Save (儲存)。

  6. 設定許可。

    如果搭配使用客戶受管金鑰和伺服器端加密,請向您希望其能檢視或管理該函數環境變數的任何使用者或角色授予許可。如需詳細資訊,請參閱 管理伺服器端加密 KMS 金鑰的許可

    如果您要啟用用戶端加密來增強傳輸中安全,您的函數需要許可來呼叫 kms:Decrypt API 操作。將您先前在此程序中儲存的政策新增至函數的執行角色

管理伺服器端加密 KMS 金鑰的許可

您的使用者或函數的執行角色不需要任何 AWS KMS 權限即可使用預設加密金鑰。若要使用客戶受管金鑰,您需要使用金鑰的許可。Lambda 會使用您的許可,在金鑰上建立授權。這麼做可讓 Lambda 使用它來進行加密。

  • kms:ListAliases – 在 Lambda 主控台中檢視金鑰。

  • kms:CreateGrantkms:Encrypt - 在函數上設定客戶受管金鑰。

  • kms:Decrypt - 檢視及管理使用客戶受管金鑰加密的環境變數。

您可以從您的 AWS 帳戶 或從金鑰的資源型權限原則取得這些權限。 ListAliasesLambda 的受管政策提供。金鑰政策會將其餘許可授予 Key users (金鑰使用者) 群組中的使用者。

沒有 Decrypt 許可的使用者仍然可以管理函數,但是無法在 Lambda 主控台中檢視或管理環境變數。如要防止使用者檢視環境變數,請將拒絕存取預設金鑰、客戶受管金鑰,或是所有金鑰的陳述式新增到使用者的許可。

範例 IAM 政策 - 透過金鑰 ARN 拒絕存取
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Deny", "Action": [ "kms:Decrypt" ], "Resource": "arn:aws:kms:us-east-2:111122223333:key/3be10e2d-xmpl-4be4-bc9d-0405a71945cc" } ] }

          在 Lambda 主控台中沒有解密許可的使用者錯誤訊息。

如需有關管理金鑰許可的詳細資訊,請參閱《AWS Key Management Service 開發人員指南》中的 AWS KMS中的金鑰政策

範例程式碼和範本

本指南 GitHub 儲存庫中的範例應用程式示範如何在函數程式碼和 AWS CloudFormation 範本中使用環境變數。

範例應用程式
  • 空白函數 — 建立顯示記錄、環境變數、 AWS X-Ray 追蹤、圖層、單元測試和 AWS SDK 使用的基本函數。

  • RDS MySQL - 在單一範本中建立 VPC 與 Amazon Relational Database Service (Amazon RDS) 資料庫執行個體,包含存放在 Secrets Manager 中的密碼。在應用程式範本中,從 VPC 堆疊匯入資料庫詳細資訊,從 Secrets Manager 讀取密碼,並將所有連線組態傳遞至環境變數中的函數。