昨天介紹了『在 AWS Lambda 上寫 Go 語言』,無服務器的時代已經來臨,透過昨天的教學,開發者可以很快的用 Go 語言寫簡易的 Restful API 或 GraphQL 服務,直接無痛丟到 AWS Lambda,然而寫完編譯打包上傳整個流程,是非常枯燥乏味的,如何有效地透過自動化工具像是 Jenkins 或 Drone 來達到自動化上傳,減少工程師花時間手動上傳,省下的時間,可以讓工程師多寫個幾行程式碼呢。
上傳 AWS Lambda
要上傳更新 Lambda 服務,步驟很簡單編譯
=> 打包
=> 上傳
,三個步驟就可以搞定,底下來看看如何執行指令
# 編譯 $ GOOS=linux go build -o main . # 打包 $ zip deployment.zip main上傳部分則是可以透過 Web Console 或 AWS CLI,這些步驟可以很輕易的整合進 Jenkins 或其他 CI/CD 服務,但是我個人又開發了 drone-lambda,讓開發者可以不用裝任何套件,就可以跨平台執行 Lambda 上傳。
drone-lambda 功能
drone-lambda 是 Go 語言開發的跨平台 CLI 工具,目前支援 Windows, MacOS, Linux 三種系統環境,開發者可以透過此頁面來下載最新版本。此 CLI 功能如下- 動態指定 AWS Secret 及 Access Key
- 動態指定 AWS Profile (多環境)
- 支援自動 zip 打包功能
- 支援 Rexp Path (打包多個檔案)
- 支援 zip 上傳
- 支援 s3 bucket 上傳
透過 zip 檔案上傳
假設已經打包好 zip 檔案,就可以透過底指令上傳$ drone-lambda --region ap-southeast-1 \ --access-key xxxx \ --secret-key xxxx \ --function-name upload-s3 \ --zip-file deployment.zip
透過 s3 bucket 上傳
前提是 zip 檔案已經在 s3 bucket 內$ drone-lambda --region ap-southeast-1 \ --access-key xxxx \ --secret-key xxxx \ --function-name upload-s3 \ --s3-bucket some-bucket \ --s3-key lambda-dir/lambda.zip
自動打包上傳
開發者可以指定需要打包的檔案,如果有多個檔案,這邊支援正規語法喔$ drone-lambda --region ap-southeast-1 \ --access-key xxxx \ --secret-key xxxx \ --function-name upload-s3 \ --source main其中的
main
就是 Go 語言產生的執行檔,使用 --source
好處就是直接幫忙打包成 zip 檔案直接上傳,這樣在 Deploy 流程就可以少一個 zip 步驟。
設定 AWS 權限
由於此工具使用到 AWS Lambda 上傳的功能,所以必須要在 AWS Role 打開底下權限:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "iam:ListRoles", "lambda:UpdateFunctionCode", "lambda:CreateFunction" ], "Resource": "arn:aws:logs:*:*:*" } ] }注意務必加上
UpdateFunctionCode
。
整合 Drone CI/CD
在 Drone 的 Yaml 檔案設定方式非常容易,請直接參考底下:lambda: image: appleboy/drone-lambda pull: true secrets: [ aws_access_key_id, aws_secret_access_key ] region: ap-southeast-1 function_name: gin source: - main其中
aws_access_key_id
及 aws_secret_access_key
可以透過 Web 或 CLI 方式設定。