有沒有想過一件事情,既然我們都已經使用 container 跟 serverless 的架構了,我們真的會需要侷限在某朵公有雲上面嗎?
Serverless Framework 是一個協助串接各個公有雲的產品,它提供了一個通用的介面,可以讓你從 Azure Function 跳轉到 AWS Lambda。
之後你需要跳到阿里雲、騰訊雲的 Serverless Solution 也都是可以的。
它擁有一些特性:
近幾年來 IaC (Infrastructure as Code),基礎設施即代碼越來越盛行,Serverless Framework 因其特性是將各家雲端服務上包一層框架。因此有些設定例如: 記憶體大小、回應逾時時間、依賴相關的服務定義,都是透過 YAML 檔來設定。
也因為是檔案的關係,也可以納入版控,這也是 IaC 其中一項優勢。
Serverless framework 提供了儀錶板畫面,由於它算是 SaaS 服務。是透過 CLI 的方式佈署一些設定,並將資料呈現在他們所提的網頁。會在使用率、錯誤率突然竄升的的時候提示警告,同時也可以發出通知或是透過 webhook 綁定你的 API。(如果公司是使用 Slack 來溝通的也有福了~ 他們有直接支援)
Serverless framework 會根據過往的 Function 執行狀況,建議你更適合的 memorySize、timeout,不會讓你多花錢。
首先你需要先有 npm
這個 Javascript 的套件安裝工具。
執行以下指令:
npm install -g serverless
最後可以執行
serverless info
確認你安裝是否成功,以及它的版本
執行 serverless
這個 command 會跳出以下讓你選擇:
Creating a new serverless project? What do you want to make?
AWS - Node.js - Starter
AWS - Node.js - HTTP API
AWS - Node.js - Scheduled Task
AWS - Node.js - SQS Worker
AWS - Node.js - Express API
AWS - Node.js - Express API with DynamoDB
AWS - Python - Starter
AWS - Python - HTTP API
AWS - Python - Scheduled Task
AWS - Python - SQS Worker
❯ AWS - Python - Flask API
AWS - Python - Flask API with DynamoDB
選擇你要的專案性質,我們這邊可以選 AWS - Python - Flask API。當然我們也可以直接執行:
serverless create aws-python-flask-api
這時候會問你要不要登入 serverless dashboard,可以選擇登入後,之後可以查看你佈署的 AWS Lambda 執行的狀況如何。
一旦完成這些步驟,會得到一個下面的目錄架構
1. 2└── aws-serverless-project 3 ├── README.md 4 ├── handler.py 5 ├── package-lock.json 6 ├── package.json 7 └── serverless.yml -----> 我們主要的設定檔案
其中最重要的檔案就是 serverless.yml
,以下有切一個子章節來說明。
到這邊為止大致上就已經是完成第一個 serverless framework 的應用程式了。
檔案的內容結構大致上長的如下:
整個設定檔可以分為以下幾個區塊:
大多時候,我們可以用單純的 key-value 來描述 serverless 設定檔
但有時候,我們可以用變數的方式來描述,將你要參照的變數以這樣的方式索引 ${variable-name}
serverless 提供以下幾個變數來源:
cli 參數
透過 deploy --stage 所帶的參數,可能是 dev / uat / prod 其中一個
custom:
deploy_env: ${opt:stage}
AWS Parameter Store
provider:
name: aws
role: ${ssm:/lambda/permission/role-arn}
AWS Secret Manager
custom:
DB_USERNAME: ${ssm:/aws/reference/secretsmanager/ambda-${self:custom.deploy_env}}.username
DB_PASSWORD: ${ssm:/aws/reference/secretsmanager/lambda-${self:custom.deploy_env}}.password
AWS Secret Manager 適合存放金鑰資訊,最大的好處是他整合了任何 AWS 需要 credential 的服務(例如 RDS ),並能夠自動汰換更新,而不需要重新部署服務
AWS CloudFormation
layers:
- ${cf:mop-lambda-layer-dev.MopLambdaLayerArn}
我們可以在 provider 底下增加一個 environment 的參數,定義環境變數的檔案
provider:
environment:
${file(./environments.yml)}
其定義長得有點像 .env
檔案。
# environments.yml
CONFIG_ENABLE: true
EVENT_LOG_ENABLE: true
TRACK_ENABLE: true
執行以下指令即可完成佈署
serverless deploy --stage dev