使用 AWS Lambda 環境變數 - AWS Lambda

使用 AWS Lambda 環境變數

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

注意

若要提高資料庫安全性,建議您使用 AWS Secrets Manager 而非環境變數來存放資料庫憑證。如需詳細資訊,請參閱設定 Lambda 函數的資料庫存取權

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

設定環境變數

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

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

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

  2. 選擇一個函數。

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

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

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

  6. 輸入索引鍵和值。

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

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

    • 索引鍵不是由 Lambda 預留

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

  7. 選擇 Save (儲存)。

使用 API 設定環境變數

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

下列範例會在名為 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:123456789012:function:my-function", "Runtime": "nodejs18.x", "Role": "arn:aws:iam::123456789012: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:123456789012:key/055efbb4-xmpl-4336-ba9c-538c7d31f599

環境變數的範例案例

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

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


        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 Secrets Manager 在 AWS CloudFormation 範本中設定環境變數。

定義執行時間環境變數

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

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

  • _X_AMZN_TRACE_ID - X-Ray 追蹤標頭。此環境變數並非針對自訂執行時間定義 (例如,使用 providedprovided.al2 識別符的執行時間)。您可以使用 下次叫用 中的 Lambda-Runtime-Trace-Id 回應標頭為自訂執行階段設定 _X_AMZN_TRACE_ID

  • AWS_REGION - 執行 Lambda 函數的 AWS 區域。

  • AWS_EXECUTION_ENV執行時間識別符,字首為 AWS_Lambda_ (例如,AWS_Lambda_java8)。此環境變數並非針對自訂執行時間定義 (例如,使用 providedprovided.al2 識別符的執行時間)。

  • 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 Logs 群組和函數串流的名稱。

  • 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 – 系統程式庫路徑 (/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 3.1 執行時間,請將此變數設定為啟用或停用 .NET 3.1 特定執行時間最佳化。值包含 alwaysneverprovisioned-concurrency。如需資訊,請參閱設定佈建並行

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

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

保護環境變數

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

注意

若要提高資料庫安全性,建議您使用 AWS Secrets Manager 而非環境變數來存放資料庫憑證。如需詳細資訊,請參閱設定 Lambda 函數的資料庫存取權

靜態安全

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 主控台中的 Functions (函數) 頁面

    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. 向函數中新增解密環境變數的程式碼。選擇 Decrypt secrets snippet (解密秘密程式碼片段) 來查看範例。

  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 帳戶 或是從金鑰的資源型許可政策取得這些許可。ListAliases 是由 Lambda 的受管政策提供。金鑰政策會將其餘許可授予 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:123456789012: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 RDS 資料庫執行個體,包含存放在 Secrets Manager 中的密碼。在應用程式範本中,從 VPC 堆疊匯入資料庫詳細資訊,從 Secrets Manager 讀取密碼,並將所有連線組態傳遞至環境變數中的函數。