全部產品
Search
文件中心

Function Compute:環境變數

更新時間:Jan 16, 2025

您可以使用環境變數,在不修改代碼的前提下靈活調整FC函數的行為。環境變數作為函數配置的一部分,以字串索引值對的方式儲存,不同函數擁有獨立的環境變數。本文介紹環境變數的基本資料、配置方式以及如何在代碼中使用環境變數等。

安全性

建立或者更新環境變數時,Function Compute會對您的環境變數使用AES256(Advanced Encryption Standard 256)標準加密儲存,在初始化函數執行個體時,會將環境變數解密後注入到函數執行個體環境中。

使用限制

  • 字元集規則

    • Key的字元集:必須以大小寫字母開頭,只能包含大小寫字母、數字。

  • 大小限制

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

  • 系統預留環境變數

    為避免系統混淆,設定環境變數時,您不能使用系統預留的環境變數FC_*accessKeyIDaccessKeySecretsecurityTokentopic

    您可以使用以下系統內容變數:

    • 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。

    重要

    系統內容變數accessKeyIDaccessKeySecretsecurityTokenALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRETALIBABA_CLOUD_SECURITY_TOKEN為臨時密鑰敏感資訊,請勿透露給第三方。

使用情境

  • 跨平台或跨服務共用代碼

    同一份代碼,在測試環境和生產環境運行時的配置可能存在差異。您可以通過環境變數的方式選擇使用不同的OSS的Bucket、資料庫或者表格。代碼在不同平台部署時無需更改。

  • 配置密鑰

    串連資料庫的使用者名稱和密碼、您的阿里雲AccessKey或者其他安全敏感性的認證資訊都可以通過環境變數設定。

  • 配置系統變數

    在配置PATH和HOME等目錄時能夠更靈活地使用系統庫。

通過控制台配置環境變數

前提條件

建立函數

操作步驟

  1. 登入Function Compute控制台,在左側導覽列,單擊服務及函數
  2. 在頂部功能表列,選擇地區,然後在服務列表頁面,單擊目標服務。
  3. 函數管理頁面,單擊目標函數操作列的配置
  4. 在編輯函數配置頁面的環境變數地區,按需選擇配置環境變數的方式,然後單擊儲存

    • 使用表單編輯(預設)

      1. 單擊+添加變數

      2. 配置環境變數的索引值對:

        • 變數:自訂。

        • :自訂。

        樣本如下。

        sc_edit_environment_variables

    • 使用JSON格式編輯

      1. 單擊使用JSON格式編輯

      2. 在文字框內,輸入對應的JSON格式的索引值對,格式如下。

        {
            "key": "value"
        }

        樣本如下。

        {
            "BUCKET_NAME": "MY_BUCKET",
            "TABLE_NAME": "MY_TABLE"
        }
  5. 驗證環境變數是否建立成功。

    1. 在函數詳情頁面,單擊函數代碼頁簽。

    2. 在代碼編輯器中編寫代碼,然後單擊儲存並部署,等待部署成功後單擊測試函數

      本文以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"
    3. 函數代碼頁簽,查看日誌輸出

      從列印日誌中可以看出環境變數已經建立成功。

通過Serverless Devs配置環境變數

前提條件

操作步驟

  1. 建立一個用於測試的代碼目錄,如test

  2. 進入test目錄,基於上述代碼建立index.py檔案。

  3. 建立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會將目前的目錄打包上傳
  4. 執行s deploy部署專案。

    執行成功後,您可以登入Function Compute控制台查看已建立的服務和函數,以及為該函數配置的兩個環境變數。

通過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版本和發布的新版本的環境變數就不相同。

想要控制台不明文顯示環境變數的值如何處理?配置環境變數時如何加密敏感性資料?

您可以將環境變數儲存在Key Management Service中,確保敏感資訊以加密形式儲存,執行函數前,通過調用KMS的服務介面,對儲存的加密環境變數進行解密,解密後將環境變數設定到函數的運行環境中。更多資訊,請參見什麼是Key Management Service