

# Lambda コンテキストオブジェクトを使用して Go 関数の情報を取得する
<a name="golang-context"></a>

Lambda では、コンテキストオブジェクトは呼び出し、関数、および実行環境に関する情報を持つメソッドおよびプロパティを提供します。Lambda で関数が実行されると、コンテキストオブジェクトが[ハンドラー](golang-handler.md)に渡されます。ハンドラーでコンテキストオブジェクトを使用するには、オプションでハンドラーへの入力パラメータとして宣言できます。コンテキストオブジェクトは、ハンドラーで以下を実行する場合に必要です:
+ コンテキストオブジェクトが提供する[グローバル変数、メソッド、またはプロパティ](#golang-context-library)のいずれかにアクセスする必要があります。これらのメソッドとプロパティは、[context の呼び出し情報へのアクセス](#golang-context-access) に示すように、関数を呼び出すエンティティの決定や関数の呼び出し時間の測定などのタスクに役立ちます。
+ AWS SDK for Go を使用して、他のサービスに呼び出しを行う必要があります。コンテキストオブジェクトは、これらのほとんどの呼び出しにとって重要な入力パラメータです。詳細については、「[AWS SDK クライアントの初期化と呼び出しでのコンテキストの使用](#golang-context-sdk)」を参照してください。

**Topics**
+ [コンテキストオブジェクトでサポートされている変数、メソッド、プロパティ](#golang-context-library)
+ [context の呼び出し情報へのアクセス](#golang-context-access)
+ [AWS SDK クライアントの初期化と呼び出しでのコンテキストの使用](#golang-context-sdk)

## コンテキストオブジェクトでサポートされている変数、メソッド、プロパティ
<a name="golang-context-library"></a>

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

**グローバル変数**
+ `FunctionName` － Lambda 関数の名前。
+ `FunctionVersion` － 関数の[バージョン](configuration-versions.md)。
+ `MemoryLimitInMB` － 関数に割り当てられたメモリの量。
+ `LogGroupName` － 関数のロググループ。
+ `LogStreamName` — 関数インスタンスのログストリーム。

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

**context プロパティ**
+ `InvokedFunctionArn` － 関数を呼び出すために使用される Amazon リソースネーム (ARN)。呼び出し元でバージョン番号またはエイリアスが指定されているかどうかを示します。
+ `AwsRequestID` － 呼び出しリクエストの ID。
+ `Identity` — (モバイルアプリケーション) リクエストを認可した Amazon Cognito ID に関する情報。
+ `ClientContext` — (モバイルアプリケーション) クライアントアプリケーションが Lambda に提供したクライアントコンテキスト。

## context の呼び出し情報へのアクセス
<a name="golang-context-access"></a>

Lambda 関数は、環境と呼び出しリクエストに関するメタデータにアクセスできます。これには、[パッケージのコンテキスト](https://golang.org/pkg/context/)でアクセスできます。ハンドラーにはパラメータとして `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 クライアントの初期化と呼び出しでのコンテキストの使用
<a name="golang-context-sdk"></a>

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