用 GitHub Actions, Drone CI 或 GitLab CI 部署 AWS Lambda

Screen Shot 2018-10-24 at 9.37.49 AM

最近剛好把 drone-lambda 新增了一些新的功能,也就是可以透過 CI/CD 的方式來更新 AWS Lambda 基本設定,像是 Memory Size, Handler, Timeout, Runtime 或 Role 等 …,趁這機會寫篇教學紀錄如何透過 GitHub Actions, Drone CIGitLab CI 部署 AWS Lambda。這三套部署方式都是透過 drone-lambda 包好的 Image 來進行。底下的程式碼都可以在這邊找到

線上教學

如果對於課程內容有興趣,可以參考底下課程。

如果需要搭配購買請直接透過 FB 聯絡我,直接匯款(價格再減 100

GitHub Actions

此篇直接用 Go 語言的範例來進行線上部署,GitHub Actions 直接使用 lambda-action

 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
name: deploy to lambda
on: [push]
jobs:

  deploy_zip:
    name: deploy lambda function from zip
    runs-on: ubuntu-latest
    strategy:
      matrix:
        go-version: [1.15.x]
    steps:
      - name: checkout source code
        uses: actions/checkout@v1
      - name: Install Go
        uses: actions/setup-go@v1
        with:
          go-version: ${{ matrix.go-version }}
      - name: Build binary
        run: |
          cd example && GOOS=linux go build -v -a -o main main.go && zip deployment.zip main          
      - name: deploy zip
        uses: appleboy/lambda-action@v0.0.8
        with:
          aws_access_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws_region: ${{ secrets.AWS_REGION }}
          function_name: gorush
          zip_file: example/deployment.zip
          debug: true

首先第一個步驟就是編譯 Binary 接著打包成 zip 檔案後,才可以進行部署,接著在 Plugin 寫上 function name 跟 zip 檔案路徑就可以直接更新到 AWS Lambda 了。

Drone CI

 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
---
kind: pipeline
name: testing

platform:
  os: linux
  arch: amd64

steps:
- name: build
  image: golang:1.15
  commands:
  - apt-get update && apt-get -y install zip
  - cd example && GOOS=linux go build -v -a -o main main.go && zip deployment.zip main

- name: deploy-lambda
  image: appleboy/drone-lambda
  settings:
    pull: true
    aws_access_key_id:
      from_secret: AWS_ACCESS_KEY_ID
    aws_secret_access_key:
      from_secret: AWS_SECRET_ACCESS_KEY
    aws_region:
      from_secret: AWS_REGION
    function_name: gorush
    zip_file: example/deployment.zip
    debug: true

寫法跟 GitHub Actions 非常類似,因為在同一個 Piepline,所以可以在第一個步驟產生出來的 zip 檔案,也可以在第二個步驟部署。

GitLab CI

其實 GitLab CI 已經有寫一篇完整的教學,裡面用的是 Server less 框架來部署程式碼,所以開發者還需要看一下怎麼使用此框架,相對來說比較難上手,那底下來介紹用 drone-lambda 方式來進行部署。

 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
30
31
32
33
34
35
variables:
  ARTIFACTS_DIR: artifacts
  GIT_DEPTH: 1

before_script:
  - mkdir -p ${CI_PROJECT_DIR}/${ARTIFACTS_DIR}

stages:
  - build
  - deploy

build:
  image: golang:1.15
  stage: build
  script:
    - apt-get update && apt-get -y install zip
    - cd example && GOOS=linux go build -v -a -o main main.go && zip deployment.zip main
    - mv deployment.zip ${CI_PROJECT_DIR}/${ARTIFACTS_DIR}/
  artifacts:
    paths:
      - ${ARTIFACTS_DIR}

deploy:
  image: appleboy/drone-lambda
  variables:
    FUNCTION_NAME: 'gorush'
    DEBUG: 'true'
    ZIP_FILE: '${CI_PROJECT_DIR}/${ARTIFACTS_DIR}/deployment.zip'
    GIT_STRATEGY: none
  stage: deploy
  artifacts:
    paths:
      - ${ARTIFACTS_DIR}
  script:
    - /bin/drone-lambda

在 GitLab CI 比較不同的是,每個步驟都是需要重新 git clone 整個專案,步驟結束,就會把整個容器砍掉,包含整個 Project Data,這邊就需要透過 artifacts 來共享資料。詳細資料可以參考艦長寫的這篇『CI/CD Pipeline 之 stage: build

心得

目前使用起來 GitHub Action 跟 Drone CI 行為是一致的,反倒是使用 GitLab CI 之後,需要多了解 artifacts 這塊,才可以完成整個串接。


See also