使用 Lambda 內容物件擷取 Go 函數資訊 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Lambda 內容物件擷取 Go 函數資訊

在 Lambda 中,內容物件提供的方法和各項屬性包含了有關調用、函數以及執行環境的資訊。當 Lambda 執行您的函數時,它會將內容物件傳遞至處理常式。若要在處理常式中使用內容物件,您可以選擇將其宣告為處理常式的輸入參數。如果您想要在處理常式中執行以下動作,則需要使用內容物件:

內容物件中支援的變數、方法和屬性

Lambda 內容程式庫提供下列全域變數、方法和屬性。

全域變數
  • FunctionName – Lambda 函數的名稱。

  • FunctionVersion – 函數的版本

  • MemoryLimitInMB - 分配給函數的記憶體數量。

  • LogGroupName - 函數的日誌群組。

  • LogStreamName - 函數執行個體的記錄串流。

內容方法
  • Deadline - 傳回執行逾時的日期,以 Unix 時間毫秒為單位。

內容屬性
  • InvokedFunctionArn - 用於叫用此函數的 Amazon Resource Name (ARN)。指出叫用者是否指定版本號或別名。

  • AwsRequestID - 叫用請求的識別符。

  • Identity - (行動應用程式) 已授權請求的 Amazon Cognito 身分的相關資訊。

  • ClientContext - (行動應用程式) 用戶端應用程式提供給 Lambda 的用戶端內容。

存取叫用內容資訊

Lambda 函數有權存取有關其環境和叫用請求的中繼資料。這可以在套件內容進行存取。如果處理常式將 context.Context 納為參數,Lambda 即會將函數的相關資訊插入至內容的 Value 屬性。請注意,您需要匯入 lambdacontext 程式庫以存取 context.Context 物件的內容。

package main import ( "context" "log" "github.com/aws/aws-lambda-go/lambda" "github.com/aws/aws-lambda-go/lambdacontext" ) func CognitoHandler(ctx context.Context) { lc, _ := lambdacontext.FromContext(ctx) log.Print(lc.Identity.CognitoIdentityPoolID) } func main() { lambda.Start(CognitoHandler) }

在上面的範例中,lc 是用於取用內容物件擷取之資訊的變數,而 log.Print(lc.Identity.CognitoIdentityPoolID) 則會列印該資訊,在此例為 CognitoIdentityPoolID。

以下範例說明如何使用內容物件來監控執行 Lambda 函數的時間長度。這可讓您分析效能期望值,並在必要時據以調整您的函式程式碼。

package main import ( "context" "log" "time" "github.com/aws/aws-lambda-go/lambda" ) func LongRunningHandler(ctx context.Context) (string, error) { deadline, _ := ctx.Deadline() deadline = deadline.Add(-100 * time.Millisecond) timeoutChannel := time.After(time.Until(deadline)) for { select { case <- timeoutChannel: return "Finished before timing out.", nil default: log.Print("hello!") time.Sleep(50 * time.Millisecond) } } } func main() { lambda.Start(LongRunningHandler) }

在 AWS SDK 用戶端初始化和呼叫中使用內容

如果處理常式需要使用 AWS SDK for Go 來呼叫其他服務,請將內容物件做為處理常式的輸入。在 AWS 中,最佳實務是在大多數 AWS SDK 呼叫中傳遞內容物件。例如,Amazon S3 PutObject 呼叫接受內容物件 (ctx) 做為其第一個引數:

// Upload an object to S3 _, err = s3Client.PutObject(ctx, &s3.PutObjectInput{ ... })

若要正確初始化 SDK 用戶端,您也可以使用內容物件載入正確的組態,然後再將該組態物件傳遞給用戶端:

// Load AWS SDK configuration using the default credential provider chain cfg, err := config.LoadDefaultConfig(ctx) ... s3Client = s3.NewFromConfig(cfg)

如果您想要在主要處理常式之外初始化 SDK 用戶端 (即在初始化階段),您可以傳遞預留位置內容物件:

func init() { // Initialize the S3 client outside of the handler, during the init phase cfg, err := config.LoadDefaultConfig(context.TODO()) ... s3Client = s3.NewFromConfig(cfg) }

如果您以這種方式初始化用戶端,請確保您從主要處理常式在 SDK 呼叫中傳遞正確的內容物件。