fun deploy 功能支持两种部署方式,直接使用 fun deploy
命令部署和使用 ROS 方式部署。
ROS 通过 Transform 宏实现了将函数计算的模板语法转换为 ROS 支持的语法。这意味着对于 Fun 规范文档 里描述的语法规则,ROS 是同样支持的。同时,ROS 支持的资源 也能在 Fun 模板文件中进行声明了,比如 RAM 、函数工作流 等等。
ROS 方式部署解决了以下问题:
下面我们用一个简单的 http 触发器示例演示 fun deploy
命令部署函数。首先在项目根目录下创建一个 index.js 文件。
var getRawBody = require('raw-body')
module.exports.handler = function (request, response, context) {
// get request body
getRawBody(request, function (err, body) {
var respBody = {
headers: request.headers,
url: request.url,
path: request.path,
queries: request.queries,
method: request.method,
clientIP: request.clientIP,
body: body.toString()
};
response.setStatusCode(200);
response.setHeader('content-type', 'application/json');
response.send(JSON.stringify(respBody, null, 4));
});
};
接下来配置相关服务。在项目根目录创建一个 template.yml 文件:
ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
local-http-test:
Type: 'Aliyun::Serverless::Service'
Properties:
Description: 'local invoke demo'
nodejs8:
Type: 'Aliyun::Serverless::Function'
Properties:
Handler: index.handler
CodeUri: './'
Description: 'http trigger demo with nodejs8!'
Runtime: nodejs8
Events:
http-test:
Type: HTTP
Properties:
AuthType: ANONYMOUS
Methods: ['GET', 'POST', 'PUT']
代码以及模板文件编写完成后,就可以使用 fun deploy
命令一键将服务部署到线上环境了:
$ fun deploy
using region: cn-shanghai
using accountId: ***********8320
using accessKeyId: ***********1EXB
using timeout: 10
Waiting for service local-http-test to be deployed...
Waiting for function nodejs8 to be deployed...
Waiting for packaging function nodejs8 code...
package function nodejs8 code done
Waiting for HTTP trigger http-test to be deployed...
methods: GET
url: https://1984152879328320.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/local-http-test/nodejs8/
function http-test deploy success
function nodejs8 deploy success
service local-http-test deploy success
可以使用 -h,查看 fun deploy 的帮助文档:
$ fun deploy -h
Usage: fun deploy [options] [resource]
Deploy a serverless application.
use 'fun deploy' to deploy all resources
use 'fun deploy serviceName' to deploy all functions under a service
use 'fun deploy functionName' to deploy only a function resource
with '--only-config' parameter, will only update resource config without updating the function code
Options:
-t, --template [template] The path of fun template file.
-c, --only-config Update only configuration flags
--use-ros Deploy resources using ROS
--stack-name <stackName> The name of the ROS stack
-h, --help output usage information
当部署 ROS 相关资源时,需要在 fun deploy 后面追加 --use-ros
以及 --stack-name
两个参数,—use-ros 表示使用 ROS 的方式进行部署,—stack-name 表示使用 ROS 部署时使用的资源栈
的名称。
如何理解资源栈呢?简单理解起来就是使用模板文件部署的一整套应用(云端资源集合)的 ID。即使同一个模板文件,也可以通过指定不同的资源栈的名称,实现部署多套应用。当通过模板文件进行部署时,会将模板文件的资源属性与所指定的资源栈进行对比并计算差异,进而完成线上资源的创建、删除、更新等操作。
直接执行下面的命令即可初始化一个简单的函数示例:
fun init -n RosDemo event-nodejs8
在体验上,由于 ROS 部署,要求资源必须“云化”。也就是没办法直接使用本地的代码资源。必须先通过 fun package 命令将资源上传到 oss:
fun package --oss-bucket bucket-name
最后将资源通过 ROS 的方式进行部署:
fun deploy --use-ros --stack-name bucket-name
通过在部署时,指定不同的 stackName ,可以部署应用到不同的环境:
fun deploy --use-ros --stack-name test
fun deploy --use-ros --stack-name staging
fun deploy --use-ros --stack-name prod
... ...
使用相关示例进行一些测试后,想要将这些资源全部清理干净。可以 打开 ROS 控制台,找到想要删除的资源栈,点击删除后。我们测试时创建的所有云资源,就都会被正确的清理掉了。
在部署过程中,任何资源的操作失败,都会导致整个资源栈的回滚,通过这种机制,可以成功解决部署过程中的服务不可用的问题。
除了原有的 Fun 定义的 资源 外,现在 ROS 支持资源 也可以在 Fun 的模板文件里声明了,比如我们可以通过下面的方式声明一个 oss 的 bucket 实例:
Bucket:
Type: 'ALIYUN::OSS::Bucket'
Properties:
BucketName: 'oss-unzip-demo-bucket'
在文档使用中是否遇到以下问题
更多建议
匿名提交