
# 配置函数的环境变量
本章节介绍如何通过函数工作流控制台，为函数配置环境变量，便于调整函数的执行行为。
#### 操作场景
为函数配置环境变量，可以在不修改代码的情况下，将动态参数传递到函数，调整函数的执行行为。
环境变量在函数中适用于以下场景：
- 区分多环境：相同的函数逻辑，可根据部署环境的不同，配置不同的环境变量以区分。例如，通过环境变量给测试和开发环境配置不同的数据库。
- 加密配置：函数中访问其他服务的认证信息，如账号和密码，可通过配置加密环境变量在代码中动态获取，确保敏感数据的安全。
- 动态配置：函数逻辑中需要动态调整的配置，如查询周期、超时时间，可提取为环境变量，以避免业务每次变化都需要修改代码。
 
#### 约束与限制
设置环境变量时，FunctionGraph会明文展示所有输入信息，请不要输入敏感信息（如账户密码等），以防止信息泄露。
#### 配置环境变量
1. 登录[函数工作流控制台](https://console.huaweicloud.com/functiongraph/?locale=zh-cn)，在左侧的导航栏选择"函数 \> 函数列表"。
2. 单击函数的名称，进入函数详情页。
3. 在"设置"页签下选择"环境变量"，单击"编辑环境变量"。
   图1添加环境变量   
   ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002346625453.png "点击放大") 
4. 在"编辑环境变量"弹窗中单击"添加环境变量"，配置环境变量信息。
   使用表单编辑
   - 使用表单编辑环境变量的参数说明请参考[表1]。
      表1环境变量配置参数说明 
     | 参数    | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
     |:---|:---|
     | 键     | 环境变量的键（key）。 取值范围：以大小写字母开头，可包含大小写字母、数字、下划线（_）、中划线（-）和点（.），键和值的总长度不超过4096个字符。 系统预置了部分环境变量配置，您无法配置和预置值同名的环境变量，预置的环境变量请参见[环境变量预置值]。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
     | 值     | 环境变量的值（value）。 取值范围：键和值的总长度不超过4096个字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
     | 加密参数  | 开启加密参数后，环境变量的值将以"\*"号加密显示，参数传输过程中键值也处于加密状态。 已开启加密并保存的环境变量值，取消加密后将重置为空。 图2使用表单编辑环境变量 ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002346694825.png "点击放大")                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
     | 传输中加密 | **此参数仅"拉美-圣保罗一"区域支持配置。** 注意： 密码安全中心DEW将按需收取费用，详情请参见[密码安全中心计费说明](https://support.huaweicloud.com/price-dew/dew_03_0006.html)**。** 单击"加密"按钮为环境变量加密，支持以下加密类型： - AES加密：使用AES加密环境变量，无需手动创建密钥。  - KMS加密：支持选择已创建的KMS密钥加密函数环境变量。 **前提条件** 使用KMS加密环境变量前，需向函数授予调用Decrypt操作的权限，请参考[JSON视图配置自定义策略](https://support.huaweicloud.com/usermanual-iam/iam_01_0605.html#section1)前往IAM控制台将"委托权限策略"添加至函数委托中，并参考[配置函数委托](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0920.html#functiongraph_01_0920__section35661045182115)为该函数配置委托权限。 **选择KMS密钥** 请选择已启用的自主管理型密钥，如无可用密钥，可参考创建用户主密钥[创建自定义密钥](https://support.huaweicloud.com/usermanual-dew/dew_01_0178.html)进行创建。 注意： 在后续使用中请勿在DEW服务中删除用于函数加密的主密钥，否则将因加密数据无法解密而导致函数执行失败。 **解密环境变量** 使用KMS加密环境变量后，需在函数代码中添加"解密密钥代码段"用以解密环境变量，请注意将代码段中的 {endpoint} 替换为对应区域的[终端节点](https://developer.huaweicloud.com/endpoint?FunctionGraph)。 图3传输中加密 ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002312895862.png "点击放大")     开启加密参数后，环境变量的值将以"\*"号加密显示，参数传输过程中键值也处于加密状态。 已开启加密并保存的环境变量值，取消加密后将重置为空。 |
        
     
    
   使用JSON格式编辑
   - 使用JSON格式编辑环境变量的示例说明。
     ```
     {
         "obs_output_bucket": "obs_image"
     }
     ```
     如需使用AES加密环境变量，需为键添加前缀"_encrypt_"。
     ```
     {
         "_encrypt_obs_output_bucket": "obs_image"
     }
     ```
     
     
5. （可选，仅"拉美-圣保罗一"区域支持配置）选择为环境变量是否使用"静态加密配置"。
   如选择使用KMS静态加密，请先将"委托权限策略"添加至该函数的委托中。支持选择以下两种KMS静态加密：
   - （默认）functiongraph/default：函数会在DEW服务中自动创建默认密钥，您无需手动创建。
   
   - 使用用户主密钥：选择已创建的用户主密钥加密函数代码。创建用户主密钥可参考[创建自定义密钥](https://support.huaweicloud.com/usermanual-dew/dew_01_0178.html)。
    
   ![](https://support.huaweicloud.com/usermanual-functiongraph/public_sys-resources/caution_3.0-zh-cn.png)
   若选择"使用用户主密钥"，在后续使用中请勿在DEW服务中删除用于函数加密的主密钥，否则将因加密数据无法解密而导致函数执行失败。
   
6. 配置完成后，单击"确定"保存环境变量。 环境变量配置完成后，即可在函数中使用环境变量，具体应用示例可参见[环境变量应用示例]。
   
 
 #### 环境变量预置值
FunctionGraph预置的环境变量如[表2]所示。
 表2环境变量预置值说明 
| 环境变量名                       | 含义                                       | 获取方式                     |
|:---|:---|:---|
| RUNTIME_PROJECT_ID          | 函数的项目ID。                                 | Context类提供接口或通过系统环境变量获取。 |
| RUNTIME_FUNC_NAME           | 函数名称。                                    | Context类提供接口或通过系统环境变量获取。 |
| RUNTIME_FUNC_VERSION        | 函数版本。                                    | Context类提供接口或通过系统环境变量获取。 |
| RUNTIME_HANDLER             | 函数执行入口。                                  | 通过系统环境变量获取。              |
| RUNTIME_TIMEOUT             | 函数执行的超时时间。                               | 通过系统环境变量获取。              |
| RUNTIME_USERDATA            | 用户通过环境变量传入的值。                            | Context类提供接口或通过系统环境变量获取。 |
| RUNTIME_CPU                 | 函数占用的CPU资源，取值与MemorySize成比例。             | Context类提供接口或通过系统环境变量获取。 |
| RUNTIME_MEMORY              | 函数配置的内存大小，单位MB。                          | Context类提供接口或通过系统环境变量获取。 |
| RUNTIME_MAX_RESP_BODY_SIZE  | 最大返回值限制，系统默认值为6,291,456 Byte。            | 通过系统环境变量获取。              |
| RUNTIME_INITIALIZER_HANDLER | 函数初始化入口。                                 | 通过系统环境变量获取。              |
| RUNTIME_INITIALIZER_TIMEOUT | 函数初始化超时时间。                               | 通过系统环境变量获取。              |
| RUNTIME_ROOT                | Runtime包的路径，系统默认路径为/home/snuser/runtime。 | 通过系统环境变量获取。              |
| RUNTIME_CODE_ROOT           | 代码在容器中的存放目录，系统默认路径为/opt/function/code    | 通过系统环境变量获取。              |
| RUNTIME_LOG_DIR             | 系统日志在容器中存放的目录，系统默认路径为/home/snuser/log。   | 通过系统环境变量获取。              |
   
 #### 环境变量应用示例
使用环境变量设置以下信息：安装文件的目录、存储输出的位置、存储连接和日志记录设置等。这些设置与应用程序逻辑解耦，在需要变更设置时，无需更新函数代码。
1. 设置环境变量obs_output_bucket，用于灵活设置存储输出图片的OBS桶。
   图4环境变量   
   ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002142811316.png "点击放大") 
2. 在函数代码中使用环境变量。 在如下函数代码片段中，参数"obs_output_bucket"为图片处理后存储地址。
   ![](https://support.huaweicloud.com/usermanual-functiongraph/public_sys-resources/note_3.0-zh-cn.png)
   - 非HTTP函数使用context.getUserData('xxx')方式获取环境变量。
   
   - HTTP函数使用系统方法获取环境变量，例如Python函数使用os.Environ\['xx'\]；Node.js函数使用process.env.xx，Node.js获取加密环境变量使用process.env.RUNTIME_USERDATA。
    
   - **Python语言示例**
     ```
     def handler(event, context):
         srcBucket, srcObjName = getObsObjInfo4OBSTrigger(event)
         obs_address = context.getUserData('obs_address')
         outputBucket = context.getUserData('obs_output_bucket')
         if obs_address is None:
             obs_address = '{obs_address_ip}'
         if outputBucket is None:
             outputBucket = 'casebucket-out'
                 
         ak = context.getSecurityAccessKey()
         sk = context.getSecuritySecretKey()
         st = context.getSecurityToken()
         # download file uploaded by user from obs 
         # TODO: Replace with actual implementation
         GetObject(obs_address, srcBucket, srcObjName, ak, sk, st)
         outFile = watermark_image(srcObjName)
         
         # 将转换后的文件上传到新的obs桶中
         # TODO: Replace with actual implementation
         PostObject(obs_address, outputBucket, outFile, ak, sk, st)
         return 'OK'
     ```
     
   
   - **NodeJS语言示例**
     ```
     exports.handler = async (event, context) => {
         let bucket = context.getUserData('obs_output_bucket');
         console.log(bucket);
         const output =
         {
             'statusCode': 200,
             'headers':
             {
                 'Content-Type': 'application/json'
             },
             'isBase64Encoded': false,
             'body': JSON.stringify(event),
         }
         return output;
     }
     ```
     
    
 
#### 相关文档
- 除使用控制台外，函数工作流支持通过API的方式管理函数的生命周期，详情请参见[函数生命周期管理API](https://support.huaweicloud.com/api-functiongraph/FunctionLifecycleManagement.html)。
- 函数环境变量相关常见问题详情请参见[配置函数常见问题](https://support.huaweicloud.com/functiongraph_faq/functiongraph_03_0351.html)。
 
