Remotion LabRemotion Lab
Lambda從 Go 使用 Lambda

從 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

前置條件與注意事項

在繼續之前,請注意以下幾點:

  1. 完成 Lambda 設定:請先依照設定指引完成 Lambda 環境設定
  2. 大型輸入參數限制:目前 Go 客戶端不支援傳送超過 200KB 的大型輸入參數(input props)
  3. 版本對應:Go 客戶端版本必須與你部署的 Lambda 函式版本完全一致,否則呼叫會因版本不符而失敗

環境變數設定

請在 .env 檔案中設定以下環境變數:

變數名稱說明
REMOTION_APP_SERVE_URLWebpack 打包的服務 URL
REMOTION_APP_FUNCTION_NAMELambda 函式名稱
REMOTION_APP_REGION部署的 AWS 區域,例如 us-east-1

AWS 憑證須透過標準方式提供,例如環境變數 AWS_ACCESS_KEY_IDAWS_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

發起渲染請求的設定結構:

欄位型別必填說明
ServeUrlstringRemotion 專案的服務 URL
FunctionNamestringLambda 函式名稱
RegionstringAWS 區域
Compositionstring要渲染的 composition 名稱
InputPropsmap[string]interface{}傳入 composition 的輸入參數
Codecstring輸出編碼,例如 "h264"
PrivacystringS3 物件存取權限,例如 "public"

lambda_go_sdk.RenderConfig

查詢渲染進度的設定結構:

欄位型別必填說明
FunctionNamestringLambda 函式名稱
RegionstringAWS 區域
RenderIdstring渲染 ID(來自渲染回應)
BucketNamestringS3 儲存桶名稱(來自渲染回應)
LogLevelstring日誌等級,例如 "info"

RenderMediaOnLambda() 回應

欄位型別說明
RenderIdstring唯一的渲染識別碼
BucketNamestring存放渲染輸出的 S3 儲存桶

GetRenderProgress() 回應

欄位型別說明
OverallProgressfloat64整體進度(0.0 至 1.0)
Donebool渲染是否已完成
FatalErrorEncounteredbool是否發生嚴重錯誤
OutputFilestring完成後的輸出檔案 URL

更新日誌

版本更新內容
v4.0.6回應 payload 結構已變更,請查閱本頁歷史以了解先前的結構

相關資源