环境变量可以动态地将配置信息传递给函数代码,避免将其写死到函数代码中。环境变量以键值对的方式存储,是函数配置的一部分。不同函数拥有不同的环境变量,并且互不影响。本文介绍环境变量的基本信息、控制台部署方式和示例代码。

前提条件

创建函数

安全性

在配置环境变量后,环境变量将在函数运行时配置到所在的操作系统环境中。您可以使用读取系统环境变量的方式来获取设置的环境变量。

创建或者更新环境变量时,函数计算会对您的环境变量使用AES256(Advanced Encryption Standard 256)标准加密存储,在运行函数时自动反向解密,您无需担心自己的数据安全。

使用场景

  • 跨平台或服务部署

    同一份代码,在测试环境和生产环境运行时的配置可能有差异。例如,您可以通过环境变量的方式选择使用不同的对象存储OSS的Bucket、数据库或者表格。函数在不同平台部署时无需更改代码。

  • 配置密钥

    连接数据库的用户名和密码、您的阿里云AccessKey、或者其他有安全敏感性的认证信息都可以通过环境变量设置。

  • 配置系统变量

    在配置PATH和HOME等目录时能够更灵活地使用系统库。

使用限制

  • 字符集规则
    • Key的字符集:必须以大小写字母开头,只能包含大小写字母、数字。
    • Value的字符集:必须是可显示的ASCII字符,不能包含中文等其他字符。
  • 数量限制

    所有环境变量的大小不能超过4 KB。

  • 系统预留变量

    为避免系统混淆,您不能使用函数计算系统预留的环境变量。系统预留变量包括FC_*accessKeyIDaccessKeySecretsecurityTokentopic

通过控制台配置环境变量

  1. 登录函数计算控制台
  2. 在左侧导航栏,单击服务及函数
  3. 在顶部菜单栏,选择地域。
  4. 服务列表页面,单击目标服务。
  5. 函数管理页面,单击目标函数操作列的配置
  6. 环境变量区域,按需选择配置环境变量的方式,然后单击保存
    • 使用表单编辑(默认方式)
      1. 单击+添加变量
      2. 配置环境变量的键值对:
        • :自定义。
        • :自定义。

        示例如下:

        sc_edit_environment_variables
    • 使用JSON格式编辑
      1. 单击使用JSON格式编辑
      2. 在文本框内,输入对应的JSON格式的键值对,格式如下:
        {
            "key": "value"
        }
        示例如下:
        {
            "BUCKET_NAME": "MY_BUCKET",
            "TABLE_NAME": "MY_TABLE"
        }
    成功保存后,页面会跳转至函数详情页面。
  7. 验证环境变量是否创建成功。
    1. 在函数详情页面单击函数代码页签。
    2. 在代码编辑器中编写代码,单击部署代码,然后单击测试函数
      不同函数触发方式的代码示例如下。
      • 通过事件触发
        module.exports.handler = function(event, context, callback) {
          var bucket_name = process.env['BUCKET_NAME']
          var table_name = process.env['TABLE_NAME']
          console.log('BUCKET_NAME: ',bucket_name)
          console.log('TABLE_NAME: ',table_name)
          callback(null, "success")
        }
      • 通过HTTP事件触发
        exports.handler = (req, resp, context) => {
            var bucket_name = process.env['BUCKET_NAME'];
            var table_name = process.env['TABLE_NAME'];
            console.log('BUCKET_NAME: ', bucket_name);
            console.log('TABLE_NAME: ', table_name);
        }
      说明 RAM角色和自定义镜像环境不支持使用在线IDE。在线IDE适用于PHP、Python、Node.JS和Custom Runtime。
    3. 函数代码页签,查看日志输出区域。
      从打印日志中可以看出环境变量已经创建成功。sc_result

通过Serverless Devs配置环境变量

  1. 执行以下代码示例配置函数及环境变量。
    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
            internetAccess: true
          function:
            name: envdemo
            handler: index.handler
            runtime: python2.7
            environmentVariables:
              OSSEndpoint: oss-cn-hangzhou.aliyuncs.com
              BucketName: s-local-test
            codeUri: ./

    以上示例的含义是:声明一个名为Demo的服务,并在这个服务下,再声明一个名为envdemo的函数,配置函数入口为index.handler,以及函数的runtime为Python 2.7。并且,我们指定了当前目录为CodeUri。在部署时,Serverless Devs会将CodeUri指定的目录打包上传,可以将依赖放置CodeUri指向的目录。

    函数还配置了名为OSSEndpointBucketName的环境变量,取值分别为oss-cn-hangzhou.aliyuncs.com和fun-local-test。

  2. 执行s deploy部署。
    部署成功后,您可以登录函数计算控制台查看已创建的名为FunDemo的服务、envdemo的函数,且该函数配置了BUCKET_NAMETABLE_NAME这两个环境变量。

通过SDK配置环境变量

以Python SDK为例,环境变量的参数为environmentVariables,参数取值以字典形式存储。创建、更新、获取环境变量的示例代码如下。

  • 创建环境变量
    # coding: utf-8
    
    import fc2
    client = fc2.Client(
        endpoint='your endpoint',
        accessKeyID='your accessKeyID',
        accessKeySecret='your accessKeySecret')
    client.create_service('test')
    client.create_function(
        'test', 'test_env', 'python2.7',  'main.handler',
        codeDir='/path/to/code/', environmentVariables={'testKey': 'testValue'})
    res = client.get_function('test', 'test_env')
    print res.data                   
  • 更新环境变量
    client.update_function(
        'test', 'test_env', 'python2.7',  '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"));