全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 更多
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 智能硬件

执行环境

更新时间:2018-03-30 14:22:12

当函数被调用时,函数的代码会在一个受限的环境中执行:

环境配置 备注
执行用户 普通用户(无root权限)
代码目录 env["FC_FUNC_CODE_PATH"]
可写目录 /tmp(其他目录是只读的)
操作系统 Linux 4.4.24-2.al7.x86_64
网络 允许访问公网及同区域的阿里云服务(例如OSS/TableStore等)内网

用户可以通过这个Web Shell工具来体验函数的执行环境。

不同编程语言的环境中,还会包含一些常用的库,具体参见每个语言的编程文档:

使用代码目录

如果用户将一些配置文件或者数据文件与代码一起打包上传,并且需要在代码中访问这些文件的话,就需要使用FC_FUNC_CODE_PATH这个环境变量来获取文件的绝对路径,下面分别给出使用 Python、Node.js 和 Java 的示例:

Python:

  1. import os
  2. def handler(event, context):
  3. cfg_file = os.environ['FC_FUNC_CODE_PATH'] + '/config.json'
  4. print cfg_file

Node.js:

  1. exports.handler = function(event, context, callback) {
  2. cfgFile = process.env['FC_FUNC_CODE_PATH'] + '/config.json';
  3. console.log(cfgFile);
  4. callback(null, 'done');
  5. }

Java:

  1. import com.aliyun.fc.runtime.Context;
  2. import com.aliyun.fc.runtime.StreamRequestHandler;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.OutputStream;
  6. public class HelloFC implements StreamRequestHandler {
  7. @Override
  8. public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
  9. String cfgFile = System.getenv("FC_FUNC_CODE_PATH") + "/config.json";
  10. outputStream.write(cfgFile.getBytes());
  11. }
  12. }

使用内网域名

在函数中访问其他云服务,建议使用内网域名,一方面使用内网域名能够有更好的性能;另一方面可以避免公网流量收费。下面分别给出使用Python和Node.js使用内网域名访问OSS的示例:

Python:

  1. import oss2
  2. def my_handler(event, context):
  3. creds = context.credentials
  4. auth = oss2.StsAuth(creds.accessKeyId, creds.accessKeySecret, creds.securityToken)
  5. bucket = oss2.Bucket(auth, 'oss-cn-shanghai-internal.aliyuncs.com', 'my-bucket')
  6. bucket.put_object('my-object', 'hello world')

Node.js:

  1. var OSSClient = require('ali-oss').Wrapper;
  2. exports.handler = function(event, context, callback) {
  3. console.log(event.toString());
  4. var ossClient = new OSSClient({
  5. accessKeyId: context.credentials.accessKeyId,
  6. accessKeySecret: context.credentials.accessKeySecret,
  7. stsToken: context.credentials.securityToken,
  8. region: 'oss-cn-shanghai',
  9. internal: true,
  10. bucket: 'my-bucket',
  11. });
  12. ossClient.put('my-object', new Buffer('hello world'))
  13. .then(function(res) {
  14. callback(null, res);
  15. }).catch(function(err) {
  16. callback(err);
  17. });
  18. };
本文导读目录