打包部署

最近更新时间:2019-07-05 10:14:29

通过 scf cli,我们可以简单的通过命令,完成云函数本地项目的打包,云端函数的创建、更新,代码的上传。

函数打包

scf cli 通过 package 子命令来完成函数打包。scf 命令行工具依据指定的函数模板配置文件,将配置文件中指定的代码及相关文件打包为函数的部署包,并依据配置保存在本地等待上传部署,或上传至 COS bucket 中等待上传部署。完成打包后,scf 命令行工具将生成后续部署使用的配置文件,用于进一步的函数部署操作。

注意:

scf package 命令的执行过程均基于函数模板配置文件。具体的模板文件说明和写法请参见 模板文件说明

参数说明

scf package 命令支持的参数如下:

参数 必填 描述 示例
template-file 函数项目的描述配置文件,支持 yaml 格式文件 template.yaml
cos-bucket 将打包后的代码包上传到指定的 cos bucket code
output-template-file 生成的项目部署用配置文件的路径或文件名。默认为 deploy.yaml deploy.yaml

使用示例

在通过 scf init 初始化得到的示例项目中,均带有已准备好的代码文件及模板配置文件。例如,在环境为 Python 2.7下,/Users/xxx/code/scf 目录中创建的 testproject 项目包含了如下文件:

$ tree /Users/xxx/code/scf/testproject
/Users/xxx/code/scf/testproject
├── README.md
├── hello_world
│   └── main.py
└── template.yaml

1 directory, 3 files

其中 template.yaml 文件内容如下,CodeUri 指向代码保存的目录。

Resources:
    hello_world:
        Type: 'TencentCloud::Scf::Function'
        Properties:
            Handler: main.main_handler
            Runtime: Python3.6
            CodeUri: ./hello_world
            Description: This is a template function
            Environment:
            Variables:
                ENV_FIRST: env1
                ENV_SECOND: env2
            MemorySize: 128
            Timeout: 5
            Events:
                HelloWorld1:
                    Type: Api
                    Properties:
                        Path: /hello
                        Method: get
                        StageName: release # new apigw default value
                        ResponseIntegration: true # default true

执行以下命令,进入对应目录并打包配置文件。

$ cd /Users/xxx/code/scf/testproject

$ scf package --template-file template.yaml 
Generate deploy file 'deploy.yaml' success

$ tree .
.
├── README.md
├── deploy.yaml
├── f762790f-38e4-11e9-baf0-9801a7af1801.zip
├── hello_world
│   └── main.py
└── template.yaml

1 directory, 5 files

根据返回的信息,得知目录中增加了一个 uid 命令的 zip 包,及 deploy.yaml 文件。其中 deploy.yaml 文件应用了刚生成的 zip 文件作为后续部署用的代码包。具体内容如下:

Resources:
  hello_world:
    Properties:
      CodeUri: ./hello_world
      Description: This is a template function
      Environment: null
      Events:
        HelloWorld1:
          Properties:
            Method: get
            Path: /hello
            ResponseIntegration: true
            StageName: release
          Type: Api
      Handler: main.main_handler
      LocalZipFile: /Users/xxx/code/scf/testproject/f762790f-38e4-11e9-baf0-9801a7af1801.zip
      MemorySize: 128
      Runtime: Python3.6
      Timeout: 5
      Variables:
        ENV_FIRST: env1
        ENV_SECOND: env2
    Type: TencentCloud::Scf::Function

函数部署

scf cli 通过 deploy 子命令来完成函数部署。scf 命令行工具依据指定的函数模板配置文件,将配置文件中指定的代码包、函数配置等信息,部署到云端,或更新云端的函数。

注意:

scf deploy 命令的执行过程均基于函数模板配置文件,具体的模板文件说明和写法请见 模板文件说明

参数说明

scf deploy 命令支持的参数如下:

参数 必填 描述 示例
template-file 函数项目的部署用配置文件,支持 yaml 格式文件。 deploy.yaml
forced 当函数已存在时,强制更新并覆盖原有函数,默认为false。

使用示例

本示例使用 函数打包示例 中已经完成 package 操作的函数项目。项目目录下已经包含了 deploy.yaml 以及对应的部署程序包。
执行以下命令,进入函数项目目录,并部署程序包。

$ cd /Users/xxx/code/scf/testproject

$ scf deploy --template-file deploy.yaml 
Deploy function 'hello_world' success

部署成功后,即可在控制台上的函数列表中,查询到已创建的 “hello_world” 函数。

说明:

如需修改代码,请在完成修改代码后重新打包、部署。建议您按先执行 package 命令,再执行 deploy 命令的操作流程,重新将函数进行打包、部署。若模板配置文件没有修改,函数将进行更新操作。

修改代码后,需要重新打包上传的操作示例如下:

$ vim hello_world/main.py

$ scf package --template-file template.yaml 
Generate deploy file 'deploy.yaml' success

$ scf deploy --template-file deploy.yaml 
Deploy  function 'hello_world' success

代码上传方式

目前 scf cli 工具支持以下两种上传方式:

  • 通过 COS 对象存储上传代码。
  • 通过本地 zip 包上传代码。

通过 COS 对象存储上传代码

使用 package 命令时,指定 cos bucket 参数,即可将 zip 包上传至指定的 bucket 中,并同时生成的 deploy.yaml,将指定使用 COS bucket 中的文件作为部署用的代码包。

使用示例

本示例以 函数打包的使用示例 为例。例如,在环境为 Python 2.7 下,/Users/xxx/code/scf 目录中创建的 testproject 项目。

  1. 执行以下命令,进入对应目录,打包配置文件并将 cos bucket 指定为 “temp-code”。

    注意:

    cos bucket 需要与函数在相同地域。

    $ cd /Users/xxx/code/scf/testproject
    $ scf package --template-file template.yaml --cos-bucket temp-code
    2019-02-27 15:34:19 put object, url=:https://temp-code-1253970226.cos.ap-guangzhou.myqcloud.com/18029fbd-3a62-11e9-8add-9801a7af1801.zip ,headers=:{'x-cos-acl': 'public-read', 'Content-Type': 'application/x-zip-compressed'}
    Upload function zip file '18029fbd-3a62-11e9-8add-9801a7af1801.zip' to COS bucket 'temp-code' success
    Generate deploy file 'deploy.yaml' success
    $ tree .
    .
    ├── 18029fbd-3a62-11e9-8add-9801a7af1801.zip
    ├── README.md
    ├── deploy.yaml
    ├── hello_world
    │   └── main.py
    └── template.yaml
    1 directory, 5 files
    根据返回的信息,得知本地创建 zip 文件后,scf 将 zip 包传递到 COS bucket 中。也可以通过访问控制台查看已经上传的 zip 包,以及 deploy.yaml 代码。deploy.yaml 代码示例如下:
    Resources:
    hello_world:
     Properties:
       CodeUri: ./hello_world
       CosBucketName: temp-code
       CosObjectName: /18029fbd-3a62-11e9-8add-9801a7af1801.zip
       Description: This is a template function
       Environment: null
       Events:
         HelloWorld1:
           Properties:
             Method: get
             Path: /hello
             ResponseIntegration: true
             StageName: release
           Type: Api
       Handler: main.main_handler
       MemorySize: 128
       Runtime: Python3.6
       Timeout: 5
       Variables:
         ENV_FIRST: env1
         ENV_SECOND: env2
     Type: TencentCloud::Scf::Function
    CosBucketName 和 CosObjectName 指向刚刚上传的具体 bucket 和 对象名。
  2. 执行以下命令,使用此deploy.yaml文件完成函数部署。
    $ scf deploy --template-file deploy.yaml 
    Deploy  function 'hello_world' success

通过本地 zip 包上传代码

注意:

当您通过本地 zip 包上传代码的方式创建函数时, zip 包的大小不能大于30MB。超过30MB的 zip 包将无法直接创建函数。若 zip 包大于30MB,建议您选择 通过 COS 对象存储上传代码 方式进行创建。

packagedelpoy 子命令中的示例均以本地 zip 包上传方式完成。使用本地代码包上传方式时,package 子命令无需带有 cos-bucket 参数,scf cli 会将本地代码打包并生成一个随机名的 zip 文件,并在用于部署的 deploy.yaml 文件中引用此文件。随后使用 deploy 子命令时,将会使用本地的 zip 包来创建函数。