

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

# 使用 Lambda 內容物件擷取 Go 函數資訊
<a name="golang-context"></a>

在 Lambda 中，內容物件提供的方法和各項屬性包含了有關調用、函數以及執行環境的資訊。當 Lambda 執行您的函數時，它會將內容物件傳遞至[處理常式](golang-handler.md)。若要在處理常式中使用內容物件，您可以選擇將其宣告為處理常式的輸入參數。如果您想要在處理常式中執行以下動作，則需要使用內容物件：
+ 您需要存取內容物件提供的任何[全域變數、方法或屬性](#golang-context-library)。這些方法和屬性對於諸如判斷調用函數的實體或測量函數的調用時間等任務很有用，如[存取叫用內容資訊](#golang-context-access)所述。
+ 您需要使用 適用於 Go 的 AWS SDK 來呼叫其他服務。對於大多數這樣的呼叫，內容物件是重要的輸入參數。如需更多詳細資訊，請參閱 [在 AWS SDK 用戶端初始化和呼叫中使用內容](#golang-context-sdk)。

**Topics**
+ [內容物件中支援的變數、方法和屬性](#golang-context-library)
+ [存取叫用內容資訊](#golang-context-access)
+ [在 AWS SDK 用戶端初始化和呼叫中使用內容](#golang-context-sdk)

## 內容物件中支援的變數、方法和屬性
<a name="golang-context-library"></a>

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

**全域變數**
+ `FunctionName` – Lambda 函數的名稱。
+ `FunctionVersion` – 函數的[版本](configuration-versions.md)。
+ `MemoryLimitInMB` - 分配給函數的記憶體數量。
+ `LogGroupName` - 函數的日誌群組。
+ `LogStreamName` - 函數執行個體的記錄串流。

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

**內容屬性**
+ `InvokedFunctionArn` - 用於叫用此函數的 Amazon Resource Name (ARN)。指出叫用者是否指定版本號或別名。
+ `AwsRequestID` - 叫用請求的識別符。
+ `Identity` - (行動應用程式) 已授權請求的 Amazon Cognito 身分的相關資訊。
+ `ClientContext` - (行動應用程式) 用戶端應用程式提供給 Lambda 的用戶端內容。

## 存取叫用內容資訊
<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>

如果處理常式需要使用 適用於 Go 的 AWS SDK 來呼叫其他服務，請將內容物件做為處理常式的輸入。在 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 呼叫中傳遞正確的內容物件。