看到這標題也許非常聳動,也可能覺得不可思議,今天來探討如何將專案直接部署到 AWS Lambda 並且自動化將 API Gateway 設定完成。當然要做到完全自動化,必須要使用一些工具才能完成,本篇將介紹由 TJ 所開發的 apex/up 工具,如果您不熟悉 EC2 也不太懂 Command line 操作,本文非常適合您,不需要管理任何 EC2 機器,也不需要在熟悉任何 Linux Command 就可以完成簡單的專案部署。首先為什麼我選擇 apex/up 而不是選擇 apex/apex,原因是使用 up 工具,您的專案是不用更動任何程式碼,就可以將專案直接執行在 AWS Lambda,那 API Gateway 部分也會一並設定完成,將所有 Request 直接 Proxy 到該 Lambda function。如果您希望對於 AWS Lambda 有更多進階操作,我會建議您用 apex/apex 或 Serverless。您可以想像使用 up 就可以將 AWS Lambda 當作小型的 EC2 服務,但是不用自己管理 EC2,現在 up 支援 Golang, Node.js, Python 或 Java 程式語言,用一行 command 就可以將專案部署到雲端了。
影片教學
本系列影片不只有介紹 up 工具,還包含『設定 custom domain 在 API Gateway』及『用 drone 搭配 apex/up 自動化部署 AWS Lambda』。有興趣可以參考底下:- 使用 apex/up 工具部署 Go 專案到 AWS Lambda Youtube, Udemy
- 設定 Custom Domain Names 在 API Gateway 上 Udemy
- 用 drone-apex-up 自動化更新 Go 專案到 AWS Lambda Udemy
- 富邦銀行: 012
- 富邦帳號: 746168268370
- 匯款金額: 台幣 $3400 元
使用 up 工具
up 可以在幾秒鐘的時間將專案直接部署到 AWS Lambda,透過 up 可以快速將 Staging 及 Productoon 環境建置完成。底下直接用 GO 語言當例子。package main import ( "os" "github.com/gin-gonic/gin" ) func main() { port := ":" + os.Getenv("PORT") stage := os.Getenv("UP_STAGE") r := gin.Default() r.GET("/", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong " + stage, }) }) r.GET("/v1", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong " + stage + " v1 ++ drone", }) }) r.Run(port) }接著在專案內放置
up.json
檔案,內容如下:
{ "name": "demo", "profile": "default", "regions": [ "ap-southeast-1" ] }
name
代表 aws lambda 函數名稱,profile
會讀 ~/.aws/credentials
底下的 profile 設定。接著執行 up -v
$ up -v從上圖可以看到預設編譯行為是
$ GOOS=linux GOARCH=amd64 go build -o server *.go並且上傳完成後會將
server
移除。登入 AWS Lambda 入口,可以看到 up 幫忙建立了兩個環境,一個是 staging
另一個是 production
,假設要部署專案到 production 環境可以下
$ up deploy production -v部署完成後,可以直接透過 up 拿到 API Gateway 給的測試 URL,可以在瀏覽器瀏覽
$ up url https://xxxxxxx.execute-api.ap-southeast-1.amazonaws.com/staging/當然也可以到 API Gateway 那邊設定好 Custom Domain 就可以直接用自己的 Domain,而不會有
/staging/
字眼在 URL 路徑上。
搭配 Drone 自動化部署
在自己電腦測試完成後,接著要設定 CI/CD 來達到自動化部署,本文直接拿 Drone 來串接。底下是 .drone.yml 設定檔pipeline: build: image: golang:1.11 pull: true environment: TAGS: sqlite GO111MODULE: "on" commands: - cd example23-deploy-go-application-with-up && GOOS=linux GOARCH=amd64 go build -o server *.go up: image: appleboy/drone-apex-up pull: true secrets: [aws_secret_access_key, aws_access_key_id] stage: - staging directory: ./example23-deploy-go-application-with-up when: event: push branch: master up: image: appleboy/drone-apex-up pull: true secrets: [aws_secret_access_key, aws_access_key_id] stage: - production directory: ./example23-deploy-go-application-with-up when: event: tag上面可以很清楚看到,只要是 push 到 master branch 就會觸發 staging 環境部署。而下 Tag 則是部署到 Production。要注意的是由於 up 會有預設編譯行為,但是專案複雜的話就需要透過其他指令去執行。只要去蓋掉預設行為就可以。
{ "name": "demo", "profile": "default", "regions": [ "ap-southeast-1" ], "hooks": { "build": [ "up version" ], "clean": [ ] } }看到
hooks
階段,其中 build 部分需要填寫,不可以是空白。