您可以使用環境變數,在不修改代碼的前提下靈活調整FC函數的行為。環境變數作為函數配置的一部分,以字串索引值對的方式儲存,不同函數擁有獨立的環境變數。本文介紹環境變數的基本資料、配置方式和範例程式碼以及如何在代碼中使用環境變數。
安全性
建立或者更新環境變數時,Function Compute會對您的環境變數使用AES256(Advanced Encryption Standard 256)標準加密儲存,在初始化函數執行個體時,會將環境變數解密後注入到函數執行個體環境中。
使用限制
字元集規則
Key的字元集:必須以大小寫字母開頭,只能包含大小寫字母、數字。
大小限制
所有環境變數的大小總和不能超過4 KB。
系統預留環境變數
為避免系統混淆,設定環境變數時,您不能使用系統預留的環境變數FC_*。
您可以使用以下系統內容變數:
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_CUSTOM_LISTEN_PORT:函數自訂監聽連接埠。
FC_INSTANCE_ID:函數執行個體ID。
重要系統內容變數ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET和ALIBABA_CLOUD_SECURITY_TOKEN為臨時密鑰敏感資訊,請勿透漏給第三方。
使用情境
跨平台或跨服務共用代碼
同一份代碼,在測試環境和生產環境運行時的配置可能存在差異。您可以通過環境變數的方式選擇使用不同的OSS的Bucket、資料庫或者表格。代碼在不同平台部署時無需更改代碼。
配置密鑰
串連資料庫的使用者名稱和密碼、您的阿里雲AccessKey或者其他安全敏感性的認證資訊都可以通過環境變數設定。
配置系統變數
在配置PATH和HOME等目錄時能夠更靈活地使用系統庫。
通過控制台配置環境變數
前提條件
操作步驟
登入Function Compute控制台,在左側導覽列,單擊函數。
在頂部功能表列,選擇地區,然後在函數頁面,單擊目標函數。
在函數配置頁面,選擇配置頁簽。
選擇左側環境變數頁簽,單擊編輯,選擇配置環境變數的方式,按照下方步驟完成配置,然後單擊部署。
使用表單編輯(預設)
單擊+添加變數。
配置環境變數的索引值對:
變數:自訂。
值:自訂。
使用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
檔案。代碼目錄如下。
. ├── code │ └── index.py └── s.yaml
index.py
為代碼檔案,程式碼範例,請參見本頁面通過控制台配置環境變數使用的範例程式碼。s.yaml
為函數設定檔,樣本如下。edition: 3.0.0 name: hello-world-app # access 是當前應用所需要的密鑰資訊配置: # 密鑰配置可以參考:https://www.serverless-devs.com/serverless-devs/command/config # 密鑰使用順序可以參考:https://www.serverless-devs.com/serverless-devs/tool#密鑰使用順序與規範 access: "default" vars: # 全域變數 region: "cn-hangzhou" resources: hello_world: # 如果只想針對 hello_world 下面的業務進行相關操作,可以在命令列中加上 hello_world,例如: # 只對 hello_world 進行構建:s hello_world build # 如果不帶有 hello_world ,而是直接執行 s build,工具則會對當前Yaml下,所有和 hello_world 平級的業務模組(如有其他平級的模組,例如下面注釋的next_function),按照一定順序進行 build 操作 component: fc3 # 組件名稱,Serverless Devs 工具本身類似於一種遊戲機,不具備具體的業務能力,組件類似於遊戲卡,使用者通過向遊戲機中插入不同的遊戲卡實現不同的功能,即通過使用不同的組件實現不同的具體業務能力 # actions: # 自訂執行邏輯,關於actions 的使用,可以參考:https://docs.serverless-devs.com/serverless-devs/yaml#%E8%A1%8C%E4%B8%BA%E6%8F%8F%E8%BF%B0actions props: region: ${vars.region} # 關於變數的使用方法,可以參考:https://docs.serverless-devs.com/serverless-devs/yaml#%E5%8F%98%E9%87%8F%E8%B5%8B%E5%80%BC functionName: envdemo # 聲明一個名稱為envdemo的函數 description: 'hello world by serverless devs' runtime: python3 # 配置函數的運行環境 code: ./code handler: index.handler # 配置函數的請求處理常式 memorySize: 128 timeout: 30 environmentVariables: # 為函數配置如下兩個環境變數 BUCKET_NAME: MY_BUCKET TABLE_NAME: MY_TABLE codeUri: ./ # 從目前的目錄"./"部署函數。部署函數時,Serverless Devs會將目前的目錄打包上傳
執行
s deploy
部署專案。執行成功後,您可以登入Function Compute控制台查看已建立的函數,以及為該函數配置的兩個環境變數。
通過SDK配置環境變數
以Python SDK為例,環境變數的參數為environmentVariables,參數取值以字典形式儲存。建立、更新、擷取環境變數的範例程式碼如下。
建立環境變數
# coding: utf-8 import fc2 import os client = fc2.Client( endpoint='your endpoint', # 存取點資訊。 # 建議不要把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');