您可以使用環境變量,在不修改代碼的前提下靈活調整FC函數的行為。環境變量作為函數配置的一部分,以字符串鍵值對的方式存儲,不同函數擁有獨立的環境變量。本文介紹環境變量的基本信息、配置方式以及如何在代碼中使用環境變量等。
安全性
創建或者更新環境變量時,函數計算會對您的環境變量使用AES256(Advanced Encryption Standard 256)標準加密存儲,在初始化函數實例時,會將環境變量解密后注入到函數實例環境中。
使用限制
字符集規則
Key的字符集:必須以大小寫字母開頭,只能包含大小寫字母、數字。
大小限制
所有環境變量的大小總和不能超過4 KB。
系統預留環境變量
為避免系統混淆,設置環境變量時,您不能使用系統預留的環境變量FC_*、accessKeyID、accessKeySecret、securityToken和topic。
您可以使用以下系統環境變量:
FC_FUNC_CODE_PATH:代碼部署目錄。
ALIBABA_CLOUD_ACCESS_KEY_ID:用戶角色密鑰ID。
ALIBABA_CLOUD_ACCESS_KEY_SECRET:用戶角色密鑰。
ALIBABA_CLOUD_SECURITY_TOKEN:用戶角色臨時Token。
FC_ACCOUNT_ID:用戶ID。
FC_FUNCTION_HANDLER:用戶請求處理程序。
FC_FUNCTION_MEMORY_SIZE:函數配置的內存大小,單位為MB。
FC_FUNCTION_NAME:函數名稱。
FC_REGION:函數所屬地域。
FC_SERVICE_NAME:函數所屬服務名稱。
FC_CUSTOM_LISTEN_PORT:函數自定義監聽端口。
FC_INSTANCE_ID:函數實例ID。
FC_QUALIFIER:函數所屬服務的別名,默認為LATEST。
重要系統環境變量accessKeyID、accessKeySecret、securityToken、ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET和ALIBABA_CLOUD_SECURITY_TOKEN為臨時密鑰敏感信息,請勿透露給第三方。
使用場景
跨平臺或跨服務共享代碼
同一份代碼,在測試環境和生產環境運行時的配置可能存在差異。您可以通過環境變量的方式選擇使用不同的OSS的Bucket、數據庫或者表格。代碼在不同平臺部署時無需更改。
配置密鑰
連接數據庫的用戶名和密碼、您的阿里云AccessKey或者其他安全敏感性的認證信息都可以通過環境變量設置。
配置系統變量
在配置PATH和HOME等目錄時能夠更靈活地使用系統庫。
通過控制臺配置環境變量
前提條件
操作步驟
- 登錄函數計算控制臺,在左側導航欄,單擊服務及函數。
- 在頂部菜單欄,選擇地域,然后在服務列表頁面,單擊目標服務。
- 在函數管理頁面,單擊目標函數操作列的配置。
在編輯函數配置頁面的環境變量區域,按需選擇配置環境變量的方式,然后單擊保存。
使用表單編輯(默認方式)
單擊+添加變量。
配置環境變量的鍵值對:
變量:自定義。
值:自定義。
示例如下。
使用JSON格式編輯
單擊使用JSON格式編輯。
在文本框內,輸入對應的JSON格式的鍵值對,格式如下。
{ "key": "value" }
示例如下。
{ "BUCKET_NAME": "MY_BUCKET", "TABLE_NAME": "MY_TABLE" }
驗證環境變量是否創建成功。
在函數詳情頁面,單擊函數代碼頁簽。
在代碼編輯器中編寫代碼,然后單擊保存并部署,等待部署成功后單擊測試函數。
本文以Python事件函數為例,驗證環境變量的代碼示例如下。
# -*- coding: utf-8 -*- import logging import os def handler(event, context): logger = logging.getLogger() value = os.environ.get('BUCKET_NAME') logger.info('BUCKET_NAME: {}'.format(value)) value = os.environ.get('TABLE_NAME') logger.info('TABLE_NAME: {}'.format(value)) return "done"
在函數代碼頁簽,查看日志輸出。
從打印日志中可以看出環境變量已經創建成功。
通過Serverless Devs配置環境變量
前提條件
操作步驟
創建一個用于測試的代碼目錄,如
test
。進入
test
目錄,基于上述代碼創建index.py
文件。創建
s.yaml
文件。文件內容如下:
edition: 1.0.0 name: transform_fun access: default vars: region: cn-shenzhen services: fc-Demo-envdemo: component: devsapp/fc props: region: ${vars.region} service: name: Demo # 聲明一個名稱為Demo的服務 internetAccess: true function: name: envdemo # 在Demo服務下聲明一個名稱為envdemo的函數 handler: index.handler # 配置函數的請求處理程序 runtime: python3 # 配置函數的運行環境 environmentVariables: # 為函數配置如下兩個環境變量 BUCKET_NAME: MY_BUCKET TABLE_NAME: MY_TABLE codeUri: ./ # 從當前目錄"./"部署函數。部署函數時,Serverless Devs會將當前目錄打包上傳
執行
s deploy
部署項目。執行成功后,您可以登錄函數計算控制臺查看已創建的服務和函數,以及為該函數配置的兩個環境變量。
通過SDK配置環境變量
以Python SDK為例,環境變量的參數為environmentVariables,參數取值以字典形式存儲。創建、更新、獲取環境變量的示例代碼如下。
創建環境變量
# coding: utf-8 import fc2 import os client = fc2.Client( endpoint='your endpoint', # 接入點信息。 # 阿里云賬號AccessKey擁有所有API的訪問權限,建議您使用RAM用戶進行API訪問或日常運維。 # 建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。 # 本示例以將AccessKey ID和AccessKey Secret保存在環境變量中實現身份驗證為例。 # 運行本示例前請先在本地環境中設置環境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。 # 在FC Runtime運行環境下,配置執行權限后,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環境變量會自動被設置。 accessKeyID=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'), # AccessKey ID,阿里云身份驗證,在RAM控制臺創建。 accessKeySecret=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET') # AccessKey Secret,阿里云身份驗證,在RAM控制臺創建。 client.create_service('test') client.create_function( 'test', 'test_env', 'python3', 'main.handler', codeDir='/path/to/code/', environmentVariables={'testKey': 'testValue'}) #test 服務名 #test_env 函數名 #python3 Runtime類型 #main.handler 請求處理程序 #codeDir 代碼目錄 #environmentVariables 要配置的環境變量 res = client.get_function('test', 'test_env') print(res.data)
更新環境變量
client.update_function( 'test', 'test_env', 'python3', 'main.handler', codeDir='/path/to/code/', environmentVariables={'newKey': 'newValue'}) res = client.get_function('test', 'test_env') print(res.data)
獲取環境變量
resp = client.get_function('test', 'test_env') env = func['environmentVariables']
在代碼中使用環境變量
假設配置的環境變量為{"key":"val"}
,以下為各運行環境讀取并打印此環境變量值的方法。
var value = process.env.key
console.log(value)
import os
value = os.environ.get('key')
print(value)
System.out.println("value: "+ System.getenv("key"));
$value = getenv('key');
Console.WriteLine(Environment.GetEnvironmentVariable("key"));
常見問題
可以。您在LATEST版本設置環境變量后,發布版本,然后修改環境變量,這樣LATEST版本和發布的新版本的環境變量就不相同。
您可以將環境變量存儲在密鑰管理服務中,確保敏感信息以加密形式存儲,執行函數前,通過調用KMS的服務接口,對存儲的加密環境變量進行解密,解密后將環境變量設置到函數的運行環境中。更多信息,請參見什么是密鑰管理服務。