

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

# 教學課程：建立 Amazon Rekognition Lambda 應用程式
<a name="lambda-rekognition-example"></a>

本教學課程說明如何建立使用 Amazon Rekognition 以偵測到的標籤標記 Amazon S3 物件的 Lambda 應用程式。

如需設定 的先決條件和資訊 AWS Toolkit for Visual Studio，請參閱 [AWS Toolkit for Visual Studio 中的使用 AWS Lambda 範本](lambda-index.md)。

## 建立 Visual Studio .NET Core Lambda Image Rekognition 專案
<a name="create-a-visual-studio-net-core-lam-image-rekognition-project"></a>

下列程序說明如何從 建立 Amazon Rekognition Lambda 應用程式 AWS Toolkit for Visual Studio。

**注意**  
建立時，您的應用程式具有兩個專案的解決方案：包含要部署至 Lambda 之 Lambda 函數程式碼的來源專案，以及使用 xUnit 在本機測試函數的測試專案。  
有時 Visual Studio 找不到專案的所有 NuGet 參考。這是因為藍圖需要必須從 NuGet 擷取的相依性。建立新專案時，Visual Studio 只會提取本機參考，而不是從 NuGet 提取遠端參考。若要修正 NuGet 錯誤：在參考上按一下滑鼠右鍵，然後選擇**還原套件**。

1. 從 Visual Studio 展開**檔案**功能表，展開**新增**，然後選擇**專案**。

1. 在**新增專案**對話方塊中，確保**語言**、**平台**和**專案類型**下拉式方塊設定為「全部...」，然後在**aws lambda****搜尋**欄位中輸入 。

1. 選取**AWS Lambda 含測試 (.NET Core - C\$1)** 範本的 。

1. 按一下**下一步**以開啟**設定您的新專案**對話方塊。

1. 從**設定您的新專案**對話方塊中，輸入**名稱**的「ImageRekognition」，然後根據您的偏好設定完成其餘欄位。選擇**建立**按鈕以繼續至**選取藍圖**對話方塊。

1. 從**選取藍圖**對話方塊中，選擇**偵測影像標籤**藍圖，然後選擇**完成**以建立 Visual Studio 專案。
**注意**  
此藍圖提供用於接聽 Amazon S3 事件的程式碼，並使用 Amazon Rekognition 偵測標籤，並將其新增至 S3 物件做為標籤。

## 檢閱專案檔案
<a name="examine-the-files"></a>

下列各節會檢查這些專案檔案：

1. `Function.cs`

1. `aws-lambda-tools-defaults.json`

### 1. Function.cs
<a name="functioncs"></a>

在`Function.cs`檔案中，程式碼的第一個區段是位於檔案頂端的組件屬性。根據預設，Lambda 只接受輸入參數和傳回類型的 `System.IO.Stream`。您必須註冊序列化程式，才能針對輸入參數和傳回類型使用類型類別。組件屬性會註冊 Lambda JSON 序列化程式，其會使用 `Newtonsoft.Json`將串流轉換為輸入類別。您可以在組件或方法層級設定序列化程式。

以下是組件屬性的範例：

```
// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
```

類別有兩個建構函數。第一個是 Lambda 調用函數時使用的預設建構函數。此建構函數會建立 Amazon S3 和 Amazon Rekognition 服務用戶端。建構函數也會從您在部署這些用戶端時指派給函數的 IAM 角色擷取這些用戶端的 AWS 登入資料。用戶端 AWS 的區域設定為 Lambda 函數執行所在的區域。在此藍圖中，只有在 Amazon Rekognition 服務對標籤具有最低的可信度時，才想要將標籤新增至 Amazon S3 物件。 Amazon Rekognition 此建構函數會檢查環境變數`MinConfidence`，以判斷可接受的可信度等級。您可以在部署 Lambda 函數時設定此環境變數。

以下是 中第一類建構函數的範例`Function.cs`：

```
public Function()
{
    this.S3Client = new AmazonS3Client();
    this.RekognitionClient = new AmazonRekognitionClient();

    var environmentMinConfidence = System.Environment.GetEnvironmentVariable(MIN_CONFIDENCE_ENVIRONMENT_VARIABLE_NAME);
    if(!string.IsNullOrWhiteSpace(environmentMinConfidence))
    {
        float value;
        if(float.TryParse(environmentMinConfidence, out value))
        {
            this.MinConfidence = value;
            Console.WriteLine($"Setting minimum confidence to {this.MinConfidence}");
        }
        else
        {
            Console.WriteLine($"Failed to parse value {environmentMinConfidence} for minimum confidence. Reverting back to default of {this.MinConfidence}");
        }
    }
    else
    {
        Console.WriteLine($"Using default minimum confidence of {this.MinConfidence}");
    }
}
```

下列範例示範如何利用第二個建構函數進行測試。測試專案會設定自己的 S3 和 Rekognition 用戶端，並將其傳遞至：

```
public Function(IAmazonS3 s3Client, IAmazonRekognition rekognitionClient, float minConfidence)
{
    this.S3Client = s3Client;
    this.RekognitionClient = rekognitionClient;
    this.MinConfidence = minConfidence;
}
```

以下是 `Function.cs` 檔案內 `FunctionHandler`方法的範例。

```
public async Task FunctionHandler(S3Event input, ILambdaContext context)
{
    foreach(var record in input.Records)
    {
        if(!SupportedImageTypes.Contains(Path.GetExtension(record.S3.Object.Key)))
        {
            Console.WriteLine($"Object {record.S3.Bucket.Name}:{record.S3.Object.Key} is not a supported image type");
            continue;
        }

        Console.WriteLine($"Looking for labels in image {record.S3.Bucket.Name}:{record.S3.Object.Key}");
        var detectResponses = await this.RekognitionClient.DetectLabelsAsync(new DetectLabelsRequest
        {
            MinConfidence = MinConfidence,
            Image = new Image
            {
                S3Object = new Amazon.Rekognition.Model.S3Object
                {
                    Bucket = record.S3.Bucket.Name,
                    Name = record.S3.Object.Key
                }
            }
        });

        var tags = new List();
        foreach(var label in detectResponses.Labels)
        {
            if(tags.Count < 10)
            {
                Console.WriteLine($"\tFound Label {label.Name} with confidence {label.Confidence}");
                tags.Add(new Tag { Key = label.Name, Value = label.Confidence.ToString() });
            }
            else
            {
                Console.WriteLine($"\tSkipped label {label.Name} with confidence {label.Confidence} because maximum number of tags reached");
            }
        }

        await this.S3Client.PutObjectTaggingAsync(new PutObjectTaggingRequest
        {
            BucketName = record.S3.Bucket.Name,
            Key = record.S3.Object.Key,
            Tagging = new Tagging
            {
                TagSet = tags
            }
        });
    }
    return;
}
```

 `FunctionHandler` 是 Lambda 在建構執行個體之後呼叫 的方法。請注意，輸入參數為 類型`S3Event`，而非 `Stream`。您可以因為已註冊的 Lambda JSON 序列化程式而執行此操作。`S3Event` 包含 Amazon S3 中觸發之事件的所有資訊。函數會循環瀏覽屬於事件一部分的所有 S3 物件，並告知 Rekognition 偵測標籤。偵測到標籤後，它們會新增為 S3 物件的標籤。

**注意**  
此程式碼包含對 的呼叫`Console.WriteLine()`。當函數在 Lambda 中執行時，所有`Console.WriteLine()`重新導向至 Amazon CloudWatch Logs 的呼叫。

### 2. aws-lambda-tools-defaults.json
<a name="toolsdefaults"></a>

`aws-lambda-tools-defaults.json` 檔案包含藍圖設定為預先填入部署精靈中部分欄位的預設值。它也有助於設定命令列選項以與 .NET Core CLI 整合。

若要存取 .NET Core CLI 整合，請導覽至函數的專案目錄並輸入 **dotnet lambda help**。

**注意**  
函數處理常式指出 Lambda 呼叫 以回應調用函數的方法。此欄位的格式為：`<assembly-name>::<full-type-name>::<method-name>`。命名空間必須包含在類型名稱中。

## 部署 函數
<a name="deploy-the-function"></a>

下列程序說明如何部署 Lambda 函數。

1. 從**解決方案總管**中，在 Lambda 專案上按一下滑鼠右鍵，然後選擇**發佈至 AWS Lambda** 以開啟**上傳至 AWS Lambda**視窗。
**注意**  
預設值會從 `aws-lambda-tools-defaults.json` 檔案擷取。

1. 從**上傳到 AWS Lambda**視窗中，在**函數名稱**欄位中輸入名稱，然後選擇**下一步**按鈕以進入**進階函數詳細資訊**視窗。
**注意**  
此範例使用**函數名稱** **ImageRekognition**。  
![\[AWS Lambda function upload interface with package type, runtime, and configuration options.\]](http://docs.aws.amazon.com/zh_tw/toolkit-for-visual-studio/latest/user-guide/images/lambda-upload-imgrek-03192024.png)

1. 從**進階函數詳細資訊**視窗中，選取授予程式碼存取 Amazon S3 和 Amazon Rekognition 資源許可的 IAM 角色。
**注意**  
如果您遵循此範例，請選取`AWSLambda_FullAccess`角色。

1. 將環境變數`MinConfidence`設定為 60，然後選擇**上傳**以啟動部署程序。當**函數**檢視顯示在 **AWS Explorer** 中時，發佈程序即完成。  
![\[AWS Lambda function configuration interface showing permissions, execution, and environment settings.\]](http://docs.aws.amazon.com/zh_tw/toolkit-for-visual-studio/latest/user-guide/images/lambda-upload-imgrek-advanced-03192024.png)

1. 成功部署後，請導覽至事件**來源**索引標籤，設定 Amazon S3 將其事件傳送至您的新函數。

1. 從**事件來源**索引標籤中，選擇**新增**按鈕，然後選取要與您的 Lambda 函數連線的 Amazon S3 儲存貯體。
**注意**  
儲存貯體必須與 Lambda 函數位於相同的 AWS 區域。

## 測試 函數
<a name="test-the-function"></a>

現在已部署 函數，並將 S3 儲存貯體設定為其事件來源，請從您選取的儲存貯體的 **AWS Explorer** 開啟 S3 儲存貯體瀏覽器。然後上傳一些影像。

上傳完成時，您可以查看函數檢視中的日誌，以確認函數執行。或者，在儲存貯體瀏覽器中的映像上按一下滑鼠右鍵，然後選擇**屬性**。在**標籤**索引標籤上，您可以檢視套用至物件的標籤。

![\[Properties window showing metadata tags for an image file in a cloud storage bucket.\]](http://docs.aws.amazon.com/zh_tw/toolkit-for-visual-studio/latest/user-guide/images/lambda-object-properties.png)
