教學課程:建立 Amazon Rekognition Lambda 應用程式 - AWS Amazon Q 的工具包

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

教學課程:建立 Amazon Rekognition Lambda 應用程式

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

如需有關設定的先決條件和資訊 AWS Toolkit for Visual Studio,請參閱使用 Visual Studio AWS 工具組中的 AWS Lambda 範本

建立視覺工作室 .NET 核心 Lambda 影像 Rekognition 專案

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

注意

建立後,您的應用程式會有一個包含兩個專案的解決方案:包含要部署到 Lambda 的 Lambda 函數程式碼的原始程式碼,以及使用 xUnit 在本機測試函數的測試專案。

有時候 Visual Studio 找不到您專案的所有 NuGet 參考資料。這是因為藍圖需要必須從中 NuGet擷取的相依性。建立新專案時,Visual Studio 只會從中擷取本機參考,而不會從中擷取遠端參考 NuGet。若要修正 NuGet 錯誤:以滑鼠右鍵按一下您的參考檔,然後選擇

  1. 從 Visual Studio 展開 [檔案] 功能表,展開 [新增],然後選擇 [案]。

  2. 在 [新增專案] 對話方塊中,確定 [語言]、[平台] 和 [專案類型] 下拉式方塊已設定為 [全部...],然後aws lambda在 [搜尋] 欄位中輸入。

  3. 選擇AWS Lambda 與測試(.NET 核心-C#)模板。

  4. 一下「下一步」以開啟「規劃新專案」對話方塊。

  5. 在 [設定新專案] 對話方塊中,輸入 "ImageRekognition" 做為 [名稱],然後根據您的偏好填寫其餘欄位。選擇建立按鈕以繼續執行「選取藍圖」對話方塊。

  6. 從 [選取藍圖] 對話方塊中,選擇 [偵測影像標籤] 藍圖,然後選擇 [完成] 以建立 Visual Studio 專案。

    注意

    此藍圖提供程式碼以偵聽 Amazon S3 事件,並使用 Amazon Rekognition 偵測標籤,並將其新增至 S3 物件做為標籤。

審閱專案檔案

以下各節將檢查這些專案檔案:

  1. Function.cs

  2. aws-lambda-tools-defaults.json

1. Function.cs

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 物件。此構造函數檢查環境變量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 日誌。

2. aws-lambda-tools-defaults.json

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

若要存取 .NET Core CLI 整合,請瀏覽至函式的專案目錄並輸入dotnet lambda help

注意

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

部署功能

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

  1. 解決方案總管中,以滑鼠右鍵按一下 Lambda 專案,然後選擇「發佈到 AWS Lambda」以開啟「上傳到 AWS Lambda

    注意

    預置值會從aws-lambda-tools-defaults.json檔案中擷取。

  2. 從「上傳至 AWS Lambda」視窗的「功能名稱」欄位中輸入名稱,然後選擇「下一步」按鈕,以前進至「進階功能明細」視窗。

    注意

    此範例使用函數名稱ImageRekognition

  3. 在「進階功能詳細資料」視窗中,選取一個 IAM 角色,以授予程式碼存取 Amazon S3 和 Amazon Rekognition 資源的權限。

    注意

    如果您正在遵循此範例,請選取AWSLambda_FullAccess角色。

  4. 將環境變數設定MinConfidence為 60,然後選擇上傳以啟動部署程序。當「函數」檢視顯示在AWS 檔案總管中時,就會完成發佈程序。

  5. 成功部署後,透過導覽至「事件來源」索引標籤,設定 Amazon S3 將其事件傳送到新功能。

  6. 在「事件來源」索引標籤中,選擇「新增」按鈕,然後選取要與 Lambda 函數連接的 Amazon S3 儲存貯體。

    注意

    值區必須與 Lambda 函數位於相同的 AWS 區域。

測試 函數

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

上傳完成後,您可以通過查看函數視圖中的日誌來確認您的功能是否運行。或者,在值區瀏覽器中的影像上按一下滑鼠右鍵,然後擇「 在「標籤」頁籤上,您可以檢視套用至物件的標籤。