Lambda コンテキストオブジェクトを使用して Go 関数の情報を取得する - AWS Lambda

Lambda コンテキストオブジェクトを使用して Go 関数の情報を取得する

Lambda では、コンテキストオブジェクトは呼び出し、関数、および実行環境に関する情報を持つメソッドおよびプロパティを提供します。Lambda で関数が実行されると、コンテキストオブジェクトがハンドラーに渡されます。ハンドラーでコンテキストオブジェクトを使用するには、オプションでハンドラーへの入力パラメータとして宣言できます。コンテキストオブジェクトは、ハンドラーで以下を実行する場合に必要です:

コンテキストオブジェクトでサポートされている変数、メソッド、プロパティ

Lambda コンテキストライブラリは、次のグローバル変数、メソッド、およびプロパティを提供します。

グローバル変数
  • FunctionName - Lambda 関数の名前。

  • FunctionVersion - 関数のバージョン

  • MemoryLimitInMB - 関数に割り当てられたメモリの量。

  • LogGroupName - 関数のロググループ。

  • LogStreamName — 関数インスタンスのログストリーム。

context メソッド
  • Deadline — 実行がタイムアウトした日付 (Unix 時間のミリ秒単位) を返します。

context プロパティ
  • InvokedFunctionArn - 関数を呼び出すために使用される Amazon リソースネーム (ARN)。呼び出し元でバージョン番号またはエイリアスが指定されているかどうかを示します。

  • AwsRequestID - 呼び出しリクエストの ID。

  • Identity — (モバイルアプリケーション) リクエストを認可した Amazon Cognito ID に関する情報。

  • ClientContext — (モバイルアプリケーション) クライアントアプリケーションが Lambda に提供したクライアントコンテキスト。

context の呼び出し情報へのアクセス

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 呼び出しで正しいコンテキストオブジェクトを渡してください。