最近剛好把 drone-lambda 新增了一些新的功能,也就是可以透過 CI/CD 的方式來更新 AWS Lambda 基本設定,像是 Memory Size, Handler, Timeout, Runtime 或 Role 等 …,趁這機會寫篇教學紀錄如何透過 GitHub Actions, Drone CI 或 GitLab CI 部署 AWS Lambda。這三套部署方式都是透過 drone-lambda 包好的 Image 來進行。底下的程式碼都可以在這邊找到。
GitHub Actions
此篇直接用 Go 語言的範例來進行線上部署,GitHub Actions 直接使用 lambda-action。
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
---
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 方式來進行部署。
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 這塊,才可以完成整個串接。