在创建函数时需要指定部署程序包,包括函数代码和依赖项的 ZIP 或 JAR 包。您在本地开发完成后需要将部署程序包部署到函数计算,或者通过函数计算控制台、Funcraft、VSCode 插件开发后,再上传部署程序包。本文以 Python 语言安装 pymysql 库为例分别演示使用 Funcraft 部署和手动构建部署程序包并通过控制台部署的过程。

背景信息

您部署的函数是否有依赖项将决定您打包的内容和方式:
  • 部署没有依赖项的函数

    如果您的函数代码只需要使用标准库和函数计算环境内置的库,不需要安装额外依赖,则可以直接通过函数计算控制台的编辑器、Funcraft、VSCode 插件编写代码,各工具会将函数代码及相关的配置信息自动压缩至一个可运行的部署程序包中。

  • 部署有依赖项的函数
    • 如果您需要在函数计算控制台上完成业务代码开发,且还需第三方依赖(即自定义模块,如使用图形库进行图像处理、使用数据库驱动等),则您需要手动上传部署程序包到函数计算平台。手动打包的步骤请参见通过控制台部署程序包
    • 如果您使用函数计算提供的 Funcraft 工具来开发业务代码,那么 Funcraft 可以帮您安装自定义模块并打包成部署程序包上传到函数计算,您无需手动打包。
说明 如果您的部署包大于 50 MB,则可以将部署包上传到 OSS 上,并将部署包的地址提供给函数计算,提交工单即可。或者精简部署包大小,将大依赖上传至 NAS,在初始化函数中加载存储至 NAS 的依赖。

通过 Funcraft 工具部署

  1. 在函数根目录下初始化 Funfile 文件。
    $ fun install init
    ? Select a runtime 
      nodejs8 
      nodejs10 
      python2.7 
    ❯ python3 
      java8 
      php7.2 
      dotnetcore2.1 
    (Move up and down to reveal more choices)
    选择 python3 后,会在当前目录生成一个名为 Funfile 的文件
  2. 编辑 Funfile 文件内容。
    RUNTIME python3
    RUN fun-install pip install PyMySQL
  3. 创建 template.yml 文件,例如 /tmp/code/template.yml,内容如下。
    ROSTemplateFormatVersion: '2015-09-01'
    Transform: 'Aliyun::Serverless-2018-04-03'
    Resources:
     FunDemo: 
       Type: 'Aliyun::Serverless::Service'
       pythondemo: 
         Type: 'Aliyun::Serverless::Function'
         Properties:
           Handler: index.handler
           Runtime: python3
           CodeUri: './'

    此示例中,template.yml 文件含义为声明名为 FunDemo 的服务,在这个服务下,声明一个名为 pythondemo 的函数,配置函数入口为 index.handler,函数的运行时(Runtime)为 python3,并指定 CodeUri 为当前目录。在部署时,Funcraft 会将 CodeUri 指定的目录打包上传。

  4. 在函数根目录下执行 fun install 命令安装依赖。
    $ fun install
    using template: template.yml
    start installing function dependencies without docker
    
    building FunDemo/pythondemo
    Funfile exist, Fun will use container to build forcely
    Step 1/2 : FROM registry.cn-beijing.aliyuncs.com/aliyunfc/runtime-python3.6:build-1.9.4
    ---> 702c91653452
    Step 2/2 : RUN fun-install pip install PyMySQL
    ---> Using cache
    ---> 8f59062f15bb
    sha256:8f59062f15bb7a86bd59b85e3b61bd0e4ed711c536fe0cd10fdefebc78eae152
    Successfully built 8f59062f15bb
    Successfully tagged fun-cache-a6f4221c-33c8-4050-93b8-015e42396475:latest
    copying function artifact to /Users/txd123/Desktop/express
    
    Install Success
    
    
    Tips for next step
    ======================
    * Invoke Event Function: fun local invoke
    * Invoke Http Function: fun local start
    * Build Http Function: fun build
    * Deploy Resources: fun deploy
  5. 执行以下命令部署程序包。
    fun deploy -y
    执行成功时,会看到相关日志。
    $ fun deploy -y
    using template: template.yml
    using region: cn-hangzhou
    using accountId: ***********3743
    using accessKeyId: ***********Ptgk
    using timeout: 60
    
    Collecting your services information, in order to caculate devlopment changes...
    
    Resources Changes(Beta version! Only FC resources changes will be displayed):
    
    ┌────────────┬──────────────────────────────┬────────┬──────────┐
    │ Resource   │ ResourceType                 │ Action │ Property │
    ├────────────┼──────────────────────────────┼────────┼──────────┤
    │            │                              │        │ Handler  │
    │            │                              │        ├──────────┤
    │ pythondemo │ Aliyun::Serverless::Function │ Add    │ Runtime  │
    │            │                              │        ├──────────┤
    │            │                              │        │ CodeUri  │
    └────────────┴──────────────────────────────┴────────┴──────────┘
    
    Waiting for service FunDemo to be deployed...
          Waiting for function pythondemo to be deployed...
                  Waiting for packaging function pythondemo code...
                  The function pythondemo has been packaged. A total of 51 files were compressed and the final size was 114.35 KB
          function pythondemo deploy success
    service FunDemo deploy success
  6. 登录函数计算控制台
  7. 在左侧导航栏,单击服务-函数
  8. 找到目标服务下的目标函数,单击函数名称。
  9. 在该函数页面,选择代码执行 > 执行
    函数执行成功且返回正确结果。

通过控制台部署程序包

  1. 建立一个目录,用于存放代码和依赖模块。
    mkdir /tmp/code
  2. /tmp/code 目录下安装依赖。
    cd /tmp/code
    pip install -t . PyMySQL
  3. 新建代码文件,例如 /tmp/code/index.py,在代码中使用 pymysql
    import pymysql.cursors
    # Connect to the database
    connection = pymysql.connect(host='localhost',
                                 user='user',
                                 password='passwd',
                                 db='db',
                                 charset='utf8mb4',
                                 cursorclass=pymysql.cursors.DictCursor)
    def handler(event, context):
     with connection.cursor() as cursor:
         # Read a single record
         sql = "SELECT count(*) FROM `users`"
         cursor.execute(sql)
         result = cursor.fetchone()
         print(result)
         return result
  4. 按照以下要求打包程序包。
    • Windows

      进入函数代码目录,全选所有文件,单击鼠标右键,在下拉菜单中选择压缩为 zip 包,生成代码包。

    • Linux

      通过调用 zip 命令,将源文件指定为代码目录下的所有文件,实现生成部署代码包,例如 zip code.zip /home/code/*

  5. 登录函数计算控制台
  6. 在顶部菜单栏,选择地域。
  7. 在左侧导航栏,单击服务-函数
  8. 找到目标服务下的目标函数,单击函数名称。
  9. 在该函数页面,选择代码执行 > 代码包上传 > 选择文件,上传您的程序包,然后单击保存并执行
    函数执行成功且返回正确结果。

更多信息

使用其他语言构建部署程序包请参见以下文档:
如需了解 Funcraft 或 VSCode 的更多信息,请参见以下文档: