

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

# 檢測 AWS Lambda 函數
<a name="scorekeep-lambda"></a>

**注意**  
X-Ray 開發套件/協助程式維護通知 – 在 2026 年 2 月 25 日， AWS X-Ray SDKs/協助程式將進入維護模式，其中 AWS 將限制 X-Ray 開發套件和協助程式版本，以僅解決安全問題。如需支援時間表的詳細資訊，請參閱 [X-Ray SDK 和協助程式支援時間表](xray-sdk-daemon-timeline.md)。建議您遷移至 OpenTelemetry。如需遷移至 OpenTelemetry 的詳細資訊，請參閱[從 X-Ray 檢測遷移至 OpenTelemetry 檢測](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-migration.html)。

Scorekeep 使用兩個 AWS Lambda 函數。第一個是來自 `lambda` 分支的 Node.js 函數，會為新使用者產生隨機名稱。當使用者在未輸入名稱的情況下建立工作階段時，應用程式會使用 適用於 Java 的 AWS SDK呼叫名為 `random-name` 的函數。適用於 Java 的 X-Ray 開發套件會在子區段中記錄 Lambda 呼叫的相關資訊，就像使用經檢測的 AWS 開發套件用戶端進行的任何其他呼叫一樣。

**注意**  
執行 `random-name` Lambda 函數需要在 Elastic Beanstalk 環境外部建立其他資源。如需詳細資訊和指示，請參閱讀我檔案：[AWS Lambda 整合](https://github.com/awslabs/eb-java-scorekeep/tree/xray/README.md#aws-lambda-integration)。

第二個函數 (`scorekeep-worker`) 是一種 Python 函數，會在 Scorekeep API 之外獨立執行。遊戲結束時，API 會將工作階段 ID 及遊戲 ID 寫入 SQS 佇列。工作者函數會從佇列讀取項目，並呼叫 Scorekeep API 來建構每個遊戲工作階段的完整記錄，以便在 Amazon S3 中儲存。

Scorekeep 包含建立這兩個函數的 CloudFormation 範本和指令碼。由於您需要將 X-Ray 開發套件與函數程式碼綁定，因此範本會建立不含任何程式碼的函數。部署 Scorekeep 時，包含在 `.ebextensions` 資料夾中的組態檔會建立包含軟體開發套件的來源套件，並使用 AWS Command Line Interface更新函數程式碼及組態。

**Topics**
+ [隨機名稱](#scorekeep-lambda-randomname)
+ [工作程序](#scorekeep-lambda-worker)

## 隨機名稱
<a name="scorekeep-lambda-randomname"></a>

Scorekeep 會在使用者未登入或未指定任何使用者名稱啟動遊戲工作階段時呼叫隨機名稱函數。當 Lambda 處理對 的呼叫時`random-name`，它會讀取[追蹤標頭](xray-concepts.md#xray-concepts-tracingheader)，其中包含由適用於 Java 的 X-Ray 開發套件所撰寫的追蹤 ID 和取樣決策。

對於每個取樣請求，Lambda 會執行 X-Ray 協助程式並寫入兩個區段。第一個區段會記錄叫用函數的 Lambda 呼叫相關資訊。此區段包含與 Scorekeep 記錄的子區段相同的資訊，但從 Lambda 觀點來看。第二個區段則代表函數進行的工作。

Lambda 透過函數內容將函數區段傳遞至 X-Ray SDK。當您檢測 Lambda 函數時，不會使用 SDK 為[傳入請求建立區段](xray-sdk-nodejs-middleware.md)。Lambda 提供區段，您可以使用 SDK 來檢測用戶端和寫入子區段。

![\[顯示 scorekeep 如何呼叫 Lambda 函數以取得新使用者的隨機名稱的追蹤地圖\]](http://docs.aws.amazon.com/zh_tw/xray/latest/devguide/images/scorekeep-servicemap-lambda-node.png)


`random-name` 函數實作於 Node.js 中。它使用 Node.js 中適用於 JavaScript 的 SDK 來透過 Amazon SNS 傳送通知，並使用適用於 Node.js 的 X-Ray 開發套件來檢測 AWS SDK 用戶端。為寫入標註，函數會使用 `AWSXRay.captureFunc` 建立子區段，然後在受檢測函數中寫入標註。在 Lambda 中，您無法將註釋直接寫入函數區段，只能寫入您建立的子區段。

**Example [https://github.com/awslabs/eb-java-scorekeep/tree/xray/function/index.js](https://github.com/awslabs/eb-java-scorekeep/tree/xray/function/index.js) -- 隨機名稱 Lambda 函數**  

```
var AWSXRay = require('aws-xray-sdk-core');
var AWS = AWSXRay.captureAWS(require('aws-sdk'));

AWS.config.update({region: process.env.AWS_REGION});
var Chance = require('chance');

var myFunction = function(event, context, callback) {
  var sns = new AWS.SNS();
  var chance = new Chance();
  var userid = event.userid;
  var name = chance.first();

  AWSXRay.captureFunc('annotations', function(subsegment){
    subsegment.addAnnotation('Name', name);
    subsegment.addAnnotation('UserID', event.userid);
  });

  // Notify
  var params = {
    Message: 'Created randon name "' + name + '"" for user "' + userid + '".',
    Subject: 'New user: ' + name,
    TopicArn: process.env.TOPIC_ARN
  };
  sns.publish(params, function(err, data) {
    if (err) {
      console.log(err, err.stack);
      callback(err);
    }
    else {
      console.log(data);
      callback(null, {"name": name});
    }
  });
};

exports.handler = myFunction;
```

此函數會在您將簡易應用程式部署到 Elastic Beanstalk 時自動建立。`xray` 分支包含用來建立空白 Lambda 函數的指令碼。`.ebextensions` 資料夾中的組態檔案會在部署`npm install`期間使用 建置函數套件，然後使用 CLI 更新 Lambda AWS 函數。

## 工作程序
<a name="scorekeep-lambda-worker"></a>

受檢測工作者函數會在自己的分支 (`xray-worker`) 中提供，因為除非您先建立工作者函數及相關資源，否則它便無法執行。如需說明，請參閱[分支讀我檔案](https://github.com/awslabs/eb-java-scorekeep/tree/xray-worker/README.md)。

該函數由綁定的 Amazon CloudWatch Events 事件每 5 分鐘觸發一次。執行時，函數會從 Scorekeep 管理的 Amazon SQS 佇列中提取項目。每個訊息都包含完整遊戲的相關資訊。

工作者會從遊戲記錄參考的其他資料表提取遊戲記錄及文件。例如，DynamoDB 中的遊戲記錄包含遊戲期間執行的移動清單。清單不包含移動本身，但包含存放在單獨資料表中移動的 ID。

工作階段及狀態也會以參考存放。這可避免遊戲資料表中的項目過大，但需要額外的呼叫才能取得所有遊戲相關資訊。工作者會解譯所有這些項目，並在 Amazon S3 中建構遊戲的完整記錄做為單一文件。當您想要對資料進行分析時，可以使用 Amazon Athena 直接在 Amazon S3 中對其執行查詢，而無需執行讀取密集型資料遷移，以從 DynamoDB 取得您的資料。 Amazon Athena 

![\[顯示 scorekeep 工作者函數如何使用 Amazon SQS、Amazon S3 和 scorekeep API 的追蹤地圖。\]](http://docs.aws.amazon.com/zh_tw/xray/latest/devguide/images/scorekeep-servicemap-lambdaworker-node.png)


工作者函數在其位於 AWS Lambda內的組態中已啟用主動式追蹤。與隨機名稱函數不同，工作者不會收到來自經檢測應用程式的請求，因此 AWS Lambda 不會收到追蹤標頭。透過主動追蹤，Lambda 會建立追蹤 ID 並做出抽樣決策。

適用於 Python 的 X-Ray 開發套件只是函數頂端的幾行，可匯入開發套件並執行其`patch_all`函數，以修補用來呼叫 Amazon SQS 適用於 Python (Boto) 的 AWS SDK 和 Amazon S3 的 和 HTTclients。工作者呼叫 Scorekeep API 時，軟體開發套件會將[追蹤標頭](xray-concepts.md#xray-concepts-tracingheader)新增至請求，來追蹤透過 API 進行的呼叫。

**Example [https://github.com/awslabs/eb-java-scorekeep/tree/xray-worker/_lambda/scorekeep-worker/scorekeep-worker.py](https://github.com/awslabs/eb-java-scorekeep/tree/xray-worker/_lambda/scorekeep-worker/scorekeep-worker.py) -- 工作者 Lambda 函數**  

```
import os
import boto3
import json
import requests
import time
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch_all

patch_all()
queue_url = os.environ['WORKER_QUEUE']

def lambda_handler(event, context):
    # Create SQS client
    sqs = boto3.client('sqs')
    s3client = boto3.client('s3')

    # Receive message from SQS queue
    response = sqs.receive_message(
        QueueUrl=queue_url,
        AttributeNames=[
            'SentTimestamp'
        ],
        MaxNumberOfMessages=1,
        MessageAttributeNames=[
            'All'
        ],
        VisibilityTimeout=0,
        WaitTimeSeconds=0
    )
   ...
```