您可以使用环境变量,在不修改代码的前提下灵活调整FC函数的行为。环境变量作为函数配置的一部分,以字符串键值对的方式存储,不同函数拥有独立的环境变量。本文介绍环境变量的基本信息、配置方式和示例代码以及如何在代码中使用环境变量。
安全性
创建或者更新环境变量时,函数计算会对您的环境变量使用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等目录时能够更灵活地使用系统库。
通过控制台配置环境变量
前提条件
操作步骤
登录函数计算控制台,在左侧导航栏,单击函数。
在顶部菜单栏,选择地域,然后在函数页面,单击目标函数。
在函数配置页面,选择配置页签。
选择左侧环境变量页签,单击编辑,选择配置环境变量的方式,按照下方步骤完成配置,然后单击部署。
使用表单编辑(默认方式)
单击+添加变量。
配置环境变量的键值对:
变量:自定义。
值:自定义。
使用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
部署项目。执行成功后,您可以登录函数计算控制台查看已创建的函数,以及为该函数配置的两个环境变量。
通过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');