用 10 分鐘部署專案到 AWS Lambda

Screen Shot 2018-10-24 at 9.37.49 AM

看到這標題也許非常聳動,也可能覺得不可思議,今天來探討如何將專案直接部署到 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/apexServerless。您可以想像使用 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
  • 買了結果沒興趣想退費怎麼辦?沒關係,在 Udemy 平台 30 天內都可以全額退費,所以不用擔心買了後悔。如果你對 Go 語言 (現在 $1800) 及 Drone 自動化部署 (現在 $1800) 都有興趣,想要一起購買,你可以直接匯款到底下帳戶,有合購優惠價

    使用 up 工具

    up 可以在幾秒鐘的時間將專案直接部署到 AWS Lambda,透過 up 可以快速將 Staging 及 Productoon 環境建置完成。底下直接用 GO 語言當例子。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    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 檔案,內容如下:

    1
    2
    3
    4
    5
    6
    7
    
    {
      "name": "demo",
      "profile": "default",
      "regions": [
        "ap-southeast-1"
      ]
    }
    

    name 代表 aws lambda 函數名稱,profile 會讀 ~/.aws/credentials 底下的 profile 設定。接著執行 up -v

    1
    
    $ up -v
    

    up_json_—_training

    從上圖可以看到預設編譯行為是

    1
    
    $ GOOS=linux GOARCH=amd64 go build -o server *.go
    

    並且上傳完成後會將 server 移除。登入 AWS Lambda 入口,可以看到 up 幫忙建立了兩個環境,一個是 staging 另一個是 production,假設要部署專案到 production 環境可以下

    1
    
    $ up deploy production -v
    

    部署完成後,可以直接透過 up 拿到 API Gateway 給的測試 URL,可以在瀏覽器瀏覽

    1
    2
    
    $ 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 設定檔

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    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 會有預設編譯行為,但是專案複雜的話就需要透過其他指令去執行。只要去蓋掉預設行為就可以。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    {
      "name": "demo",
      "profile": "default",
      "regions": [
        "ap-southeast-1"
      ],
      "hooks": {
        "build": [
          "up version"
        ],
        "clean": [
        ]
      }
    }
    

    看到 hooks 階段,其中 build 部分需要填寫,不可以是空白。

    心得

    如果您想快速的架設好 API 後端,或者是靜態網站,我相信 up 是一套不錯的工具,可以快速架設好開發或測試環境。而且可以省下不少開 EC2 費用,如果有興趣的話大家可以參考看看 up 工具。


    See also