serverless 快速上手:使用 API Gateway + Lambda (Golang)

Neil Wei
BlendVision
Published in
6 min readMar 25, 2019
https://serverless.com

還記得早期(2015~2016)剛接觸 API Gateway + Lambda Function 時,一方面讚嘆這個神奇的東西,另一面也對於如何做到 CI/CD 相當無力,當時的工具和社群並不豐富,支援 IaaS 的工具印象只有自家的 CloudFormation 而已。

如今 Serverless 的生態系越來越豐富,工具也越來越多,今天就來介紹一個好用的 serverless 工具 — serverless.com,該工具支援多種語言,常用的 Python/Golang/Nods.js 都沒問題,也支援主流的 Cloud provider 如 AWS/GCP/Azure 等等。

serverless.com 支援的程式語言(https://serverless.com/framework/docs/providers/aws/examples/hello-world/)
serverless 支援的 Cloud provider (https://serverless.com/framework/docs/providers/)
Golang

前置作業

  • 設定 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 建立 golang lambda template
project path 下的路徑結構

上圖可以看到 sls 已經幫你產生了三種東西,分別是 *.go, serverless.yml, Makefile

hello/main.go

自動產生的 lambda template for Golang, 可以看出來會回應一個 JSON response,一個很簡單的 hello world function。

hello/main.go

serverless.yaml

serverless.yaml

serverless.yaml 是該專案的設定檔,可以把它想像成是 CloudFormation 的 wrapper,事實上也的確是這樣,serverless 背後會把他轉成 CloudFormation 的 template 去發佈。這個設定檔是 serverless 的精髓所在,一切有關 API Gateway 和 Lambda 的設定都在這邊,而底層所需要的資源,他都幫你配置好了,不需要操心。

當你的專案越來越大,或是需要更動態的佈署時,serverless.yml就沒辨法寫的這麼簡單了,以下兩個連結會是你的好朋友

Makefile

Makefile 嚴格說起來可有可無,就是讓你方便去 Build golang/ Deploy serverless 而已,相當簡單。

Makefile

發佈服務

直接執行 make build 即可

可以看到在 bin/下面已經產生兩個 binary file 了,即是 hello/main.goworld/main.go

make build

執行 make deploy

接下來就看到 serverless 開始在幫你 deploy 了。

serverless deploy

同時也可以打開 CloudFormation 的介面,看看它到底在做什麼事,點進 Resources看到它幫你建立了相當多資源啊,這要我們一個一個建立是相當繁瑣的。

CloudFomraiton Console

大約兩分鐘,一切都完成後,從 cli 也可以看到 deploy 完成的 endpoint URL,就直接打開 browser 試試看吧。

API GW endpoint
API GW output

大功告成!一個 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/

--

--