serverless 快速上手:使用 API Gateway + Lambda (Golang)
還記得早期(2015~2016)剛接觸 API Gateway + Lambda Function 時,一方面讚嘆這個神奇的東西,另一面也對於如何做到 CI/CD 相當無力,當時的工具和社群並不豐富,支援 IaaS 的工具印象只有自家的 CloudFormation 而已。
如今 Serverless 的生態系越來越豐富,工具也越來越多,今天就來介紹一個好用的 serverless 工具 — serverless.com,該工具支援多種語言,常用的 Python/Golang/Nods.js 都沒問題,也支援主流的 Cloud provider 如 AWS/GCP/Azure 等等。
前置作業
- 設定 AWS 身份 (~/.aws/credentials 或是環境變數)
- 安裝 make
安裝 sls (serverless CLI)
sls 是 serverless.com 提供的 cli tool,用來將本地端的 code 佈署至雲端上。
必須先在自己的開發環境(或是 CI/CD 環境) 安裝 serverless,它是由 node.js 寫成的 tool,因此 node.js 也要安裝,詳細步驟請參照官方文件。
建立 Lambda for Golang 專案
serverless 的工具包相當貼心,可以快速產生Golang 的 lambda function template,只要在 $GOPATH/src/path/to/your_project
下面執行 sls create --template aws-go --path myService
即可。
上圖可以看到 sls 已經幫你產生了三種東西,分別是 *.go
, serverless.yml
, Makefile
hello/main.go
自動產生的 lambda template for Golang, 可以看出來會回應一個 JSON response,一個很簡單的 hello world function。
serverless.yaml
serverless.yaml 是該專案的設定檔,可以把它想像成是 CloudFormation 的 wrapper,事實上也的確是這樣,serverless 背後會把他轉成 CloudFormation 的 template 去發佈。這個設定檔是 serverless 的精髓所在,一切有關 API Gateway 和 Lambda 的設定都在這邊,而底層所需要的資源,他都幫你配置好了,不需要操心。
當你的專案越來越大,或是需要更動態的佈署時,serverless.yml
就沒辨法寫的這麼簡單了,以下兩個連結會是你的好朋友
- serverless.yaml 的設定參考: 該設定檔有哪些參數可以設定
- serverless.yaml 的變數傳遞: 如何動態設定/引用參數,或是環境變數/program argument 該如何傳遞等等…(好用!)
Makefile
Makefile 嚴格說起來可有可無,就是讓你方便去 Build golang/ Deploy serverless 而已,相當簡單。
發佈服務
直接執行 make build
即可
可以看到在 bin/
下面已經產生兩個 binary file 了,即是 hello/main.go
與 world/main.go
執行 make deploy
接下來就看到 serverless 開始在幫你 deploy 了。
同時也可以打開 CloudFormation 的介面,看看它到底在做什麼事,點進 Resources
看到它幫你建立了相當多資源啊,這要我們一個一個建立是相當繁瑣的。
大約兩分鐘,一切都完成後,從 cli 也可以看到 deploy 完成的 endpoint URL,就直接打開 browser 試試看吧。
大功告成!一個 API Gateway + Lambda function 已經完成囉!那接下來還可以做些什麼強化呢?
後續
一個基本的 AWS Gateway + Lambda function 就是這麼簡單,接著可以補上下列的設定,讓它更完整。
- 設定 Route53 + Custom domain name: 使用自己的 domain 當作網址,看起來更有一致性。
- VPC Lambda: 如果有要 access 到 VPC 底下的資源(如 DB),一定要接到 VPC Lambda 裡面。
- 接到 CI pipeline 中 (Gitlab runner, CircleCI, …): 讓一切都自動化。
- 如果是 Get method,可以串接到 CloudFront 做成 cache,避免 API Gateway 成本大幅上升。
官方 Blog: https://serverless.com/blog/framework-example-golang-lambda-support/