從 Go 使用 Lambda
如何使用 Go 語言搭配 Remotion Lambda Go SDK,透過 Remotion Lambda 觸發影片渲染請求並追蹤渲染進度,包含 HTTP 請求設定與完整範例程式碼。
從 Go 使用 Lambda
此功能為實驗性功能,如遇到任何問題請至 GitHub 或 Discord 回報。
本頁說明如何從 Go 應用程式觸發 Remotion Lambda 渲染,包含 SDK 安裝、環境設定與完整的程式碼範例。
安裝
透過 Go 觸發 Lambda 渲染,可使用 Remotion Lambda Go 客戶端 SDK:
go get github.com/remotion-dev/lambda_go_sdk前置條件與注意事項
在繼續之前,請注意以下幾點:
- 完成 Lambda 設定:請先依照設定指引完成 Lambda 環境設定
- 大型輸入參數限制:目前 Go 客戶端不支援傳送超過 200KB 的大型輸入參數(input props)
- 版本對應:Go 客戶端版本必須與你部署的 Lambda 函式版本完全一致,否則呼叫會因版本不符而失敗
環境變數設定
請在 .env 檔案中設定以下環境變數:
| 變數名稱 | 說明 |
|---|---|
REMOTION_APP_SERVE_URL | Webpack 打包的服務 URL |
REMOTION_APP_FUNCTION_NAME | Lambda 函式名稱 |
REMOTION_APP_REGION | 部署的 AWS 區域,例如 us-east-1 |
AWS 憑證須透過標準方式提供,例如環境變數 AWS_ACCESS_KEY_ID 與 AWS_SECRET_ACCESS_KEY,或共用憑證檔案 ~/.aws/credentials。
完整範例
以下範例展示如何發起渲染請求並取得渲染進度:
package main
import (
"fmt"
"log"
"os"
"time"
"github.com/go-playground/validator/v10"
"github.com/joho/godotenv"
"github.com/remotion-dev/lambda_go_sdk"
)
type ValidationError struct {
Field string
Message string
}
func msgForTag(fe validator.FieldError) string {
switch fe.Tag() {
case "required":
return "此欄位為必填"
}
return fe.Error()
}
func main() {
// 從 .env 檔案載入環境變數
err := godotenv.Load()
if err != nil {
log.Fatal(err)
}
serveUrl := os.Getenv("REMOTION_APP_SERVE_URL")
functionName := os.Getenv("REMOTION_APP_FUNCTION_NAME")
region := os.Getenv("REMOTION_APP_REGION")
// 設定渲染參數
renderInputRequest := lambda_go_sdk.RemotionOptions{
ServeUrl: serveUrl,
FunctionName: functionName,
Region: region,
InputProps: map[string]interface{}{
"title": "Hello from Go",
"subtitle": "透過 Go 觸發的渲染",
},
Composition: "MyVideo",
}
// 執行渲染
renderResponse, renderError := lambda_go_sdk.RenderMediaOnLambda(renderInputRequest)
if renderError != nil {
validationOut := make([]ValidationError, len(renderError.(validator.ValidationErrors)))
for i, fieldError := range renderError.(validator.ValidationErrors) {
validationOut[i] = ValidationError{fieldError.Field(), msgForTag(fieldError)}
}
for _, apiError := range validationOut {
fmt.Printf("%s: %s\n", apiError.Field, apiError.Message)
}
return
}
fmt.Printf("渲染已啟動,ID:%s\n", renderResponse.RenderId)
fmt.Printf("儲存桶:%s\n", renderResponse.BucketName)
// 輪詢渲染進度
renderProgressInput := lambda_go_sdk.RenderConfig{
FunctionName: functionName,
Region: region,
RenderId: renderResponse.RenderId,
BucketName: renderResponse.BucketName,
LogLevel: "info",
}
for {
progressResponse, progressError := lambda_go_sdk.GetRenderProgress(renderProgressInput)
if progressError != nil {
log.Fatalf("取得渲染進度失敗:%s", progressError)
}
fmt.Printf("整體進度:%.1f%%\n", progressResponse.OverallProgress*100)
if progressResponse.Done {
fmt.Println("渲染完成!")
fmt.Printf("輸出 URL:%s\n", progressResponse.OutputFile)
break
}
if progressResponse.FatalErrorEncountered {
fmt.Println("發生嚴重錯誤,渲染中止")
break
}
time.Sleep(1 * time.Second)
}
}API 說明
lambda_go_sdk.RemotionOptions
發起渲染請求的設定結構:
| 欄位 | 型別 | 必填 | 說明 |
|---|---|---|---|
ServeUrl | string | 是 | Remotion 專案的服務 URL |
FunctionName | string | 是 | Lambda 函式名稱 |
Region | string | 是 | AWS 區域 |
Composition | string | 是 | 要渲染的 composition 名稱 |
InputProps | map[string]interface{} | 否 | 傳入 composition 的輸入參數 |
Codec | string | 否 | 輸出編碼,例如 "h264" |
Privacy | string | 否 | S3 物件存取權限,例如 "public" |
lambda_go_sdk.RenderConfig
查詢渲染進度的設定結構:
| 欄位 | 型別 | 必填 | 說明 |
|---|---|---|---|
FunctionName | string | 是 | Lambda 函式名稱 |
Region | string | 是 | AWS 區域 |
RenderId | string | 是 | 渲染 ID(來自渲染回應) |
BucketName | string | 是 | S3 儲存桶名稱(來自渲染回應) |
LogLevel | string | 否 | 日誌等級,例如 "info" |
RenderMediaOnLambda() 回應
| 欄位 | 型別 | 說明 |
|---|---|---|
RenderId | string | 唯一的渲染識別碼 |
BucketName | string | 存放渲染輸出的 S3 儲存桶 |
GetRenderProgress() 回應
| 欄位 | 型別 | 說明 |
|---|---|---|
OverallProgress | float64 | 整體進度(0.0 至 1.0) |
Done | bool | 渲染是否已完成 |
FatalErrorEncountered | bool | 是否發生嚴重錯誤 |
OutputFile | string | 完成後的輸出檔案 URL |
更新日誌
| 版本 | 更新內容 |
|---|---|
| v4.0.6 | 回應 payload 結構已變更,請查閱本頁歷史以了解先前的結構 |