開發函數計算的正確姿式 —— 使用 ROS 進行資源編排

前言node

首先介紹下在本文出現的幾個比較重要的概念: 函數計算(Function Compute):
函數計算是一個事件驅動的服務,經過函數計算,用戶無需管理服務器等運行狀況,只需編寫代碼並上傳。函數計算準備計算資源,並以彈性伸縮的方式運行用戶代碼,而用戶只需根據實際代碼運行所消耗的資源進行付費。函數計算更多信息
參考。

Fun: Fun 是一個用於支持 Serverless 應用部署的工具,能幫助您便捷地管理函數計算、API 網關、日誌服務等資源。它經過一個資源配置文件(template.yml),協助您進行開發、構建、部署操做。Fun 的更多文檔 參考。
ROS: 阿里雲資源編排服務(ROS)助您簡化雲計算資源的管理。您能夠遵循ROS定義的模板規範,在模板中定義所需雲計算資源的集合及資源間依賴關係。ROS自動完成全部資源的建立和配置,實現自動化部署和運維。更多文檔參考。
備註: 本文介紹的技巧須要 Fun 版本大於等於 3.0.0+。
背景介紹
在 Fun 3.0 版本以前,Fun Deploy 功能只有一種部署方式,即直接使用 fun deploy 命令進行部署。
隨着用戶的不斷反饋,雖然咱們一直在加強 deploy 的功能,但咱們 Fun 依舊在某些場景下作的依舊不夠好:
沒有完善的資源狀態管理機制:原有的 Fun 部署的資源,只支持建立、更新兩種操做。咱們但願,在部署時,Fun 可以準確的感知到,哪些資源是新增的、哪些資源是更新的、哪些資源是被刪除了的以及哪些資源是不變的。經過感知到這些資源的狀態變化,Fun 才能做出正確的決策,達到預期的行爲。
回滾機制缺失:一次部署每每涉及很是多的資源,而這些資源可能存在着錯中複雜的依賴關係,其中的某服務部署失敗,均可能會致使整個部署操做的失敗,一旦部署失敗,可否自動回滾到上一正確狀態,是保證用戶服務可用性的關鍵。
嚴格遵循模型定義:一般一個 template.yml 用來描述一個完整的應用,咱們想爲用戶提供保證,你看到的 template.yml 的內容,就是你部署到線上的應用的最終形態。
難以明確部署差別。若是是一個許久沒有更新的應用,用戶可能很難做出直接將本地模板部署到生產的決定。難於做出這種決定的緣由在於,用戶也沒法知曉當前的模板文件與線上是否爲同步的狀態。
支持有限的雲資源。咱們已經爲用戶提供了比較多的雲資源的支持,但即便這樣,也很難覆蓋全用戶的場景,咱們須要歸入更多的雲資源的管理。
沒法快速建立多套開發環境。因爲沒有資源集合的概念,因此,使用不一樣的模板進行部署時,操做的單位永遠是單個資源,因此,單個模板文件進行屢次部署時,操做的永遠都是同一批資源。當須要建立多套開發環境時,須要手動修改資源的惟一名稱等標識。
爲了解決這些問題,咱們在 Fun 3.0 引入了一種全新的部署方式:ROS。
ROS 經過 Transform 宏實現了將函數計算的模板語法轉換爲 ROS 支持的語法。這意味着對於 Fun 規範文檔 裏描述的語法規則,ROS 是一樣支持的。同時,ROS 支持的資源 也能在 Fun 模板文件中進行聲明瞭,好比 RAM、函數工做流 等等。
ROS 部署方式的命令格式
可使用 -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。即便同一個模板文件,也能夠經過指定不一樣的資源棧的名稱,實現部署多套應用。當經過模板文件進行部署時,會將模板文件的資源屬性與所指定的資源棧進行對比並計算差別,進而完成線上資源的建立、刪除、更新等操做。
ROS 部署示例app

  1. 初始化示例項目

直接執行下面的命令便可初始化一個簡單的函數示例:less

fun init -n RosDemo event-nodejs8
  1. 項目打包

在體驗上,因爲 ROS 部署,要求資源必須「雲化」。也就是沒辦法直接使用本地的代碼資源。必須先經過 fun package 命令將資源上傳到 oss:運維

fun package --oss-bucket bucket-name
  1. 項目部署

最後將資源經過 ROS 的方式進行部署:函數

fun deploy --use-ros --stack-name bucket-name

ROS 更多使用場景舉例工具

  1. 快速建立多套應用部署環境

經過在部署時,指定不一樣的 stackName,能夠部署應用到不一樣環境:測試

fun deploy --use-ros --stack-name test
fun deploy --use-ros --stack-name staging
fun deploy --use-ros --stack-name prod
... ...
  1. 測試 demo 效果,並快速清理

從網上、模板或者官方文檔看到相關示例,進行一些測試後,想要將這些資源所有清理乾淨。能夠打開 ROS 控制檯,找到想要刪除的資源棧,點擊刪除後。咱們測試時建立的全部雲資源,就都會被正確的清理掉了。阿里雲

  1. 部署過程失敗,自動回滾上一正確狀態

在部署過程當中,任何資源的操做失敗,都會致使整個資源棧的回滾,經過這種機制,能夠成功解決部署過程當中的服務不可用的問題。雲計算

  1. 在模板文件裏描述更多資源

除了原有的 Fun 定義的資源外,如今 ROS 支持資源也能夠在 Fun 的模板文件裏聲明瞭,好比咱們能夠經過下面的方式聲明一個 oss 的 bucket 實例:

Bucket:
  Type: 'ALIYUN::OSS::Bucket'
  Properties:
    BucketName: 'oss-unzip-demo-bucket'

總結經過引入 ROS 的部署方式,解決了咱們在開篇提到的幾個問題(除「部署差別查看」功能還在開發外,其餘功能都可以在 Fun 3.0.0 版本中使用了)。本文做者:tanhe123原文連接本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索