翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
チュートリアル: Amazon Rekognition Lambda アプリケーションの作成
このチュートリアルでは、Amazon Rekognition を使用して、検出ラベルのタグを Amazon S3 オブジェクトに付ける Lambdaアプリケーションを作成する方法を示します。
の設定に関する前提条件と情報については AWS Toolkit for Visual Studio、 AWS Toolkit for Visual Studio の AWS 「Lambda テンプレートの使用」を参照してください。
Visual Studio の NET Core Lambda Image Rekognition プロジェクトを作成します
次の手順では、 から Amazon Rekognition Lambda アプリケーションを作成する方法について説明します AWS Toolkit for Visual Studio。
注記
作成時に、アプリケーションには、Lambda にデプロイする Lambda 関数コードを含むソースプロジェクトと、関数をローカルでテストするための xUnit を使用するテストプロジェクトの 2 つのプロジェクトを含むソリューションがあります。
Visual Studio がプロジェクトのすべての NuGet リファレンスを見つけることができない場合があります。これは、設計図には NuGet から取得する必要がある依存関係が必要なためです。新しいプロジェクトが作成されたとき、Visual Studio はローカル参照だけを取り込み、NuGet からリモート参照を取り込みません。NuGet エラーを修正するには: 参照を右クリックし、パッケージの復元を選択します。
-
Visual Studio でファイルメニューを展開し、新規を展開して、プロジェクトを選択します。
-
新しいプロジェクトダイアログボックスで、言語、プラットフォーム、およびプロジェクトタイプのドロップダウンボックスが「すべて...」に設定され、検索フィールドに
aws lambda
「」と入力します。 -
AWS Lambda テストあり (.NET Core - C#) テンプレートを選択します。
-
次へをクリックして、新しいプロジェクトの設定ダイアログを開きます。
-
新しいプロジェクトを設定するダイアログから、名前に「ImageRekognition」と入力し、残りのフィールドを必要に応じて入力します。作成ボタンを選択して、設計図の選択ダイアログに進みます。
-
設計図の選択ダイアログで、イメージラベルの検出の設計図を選択し、完了を選択して Visual Studio プロジェクトを作成します。
注記
このブループリントには Amazon S3 イベントをリッスンするためのコードがあり、Amazon Rekognition を使用してラベルを検出し、それらを Amazon S3 オブジェクトにタグとして追加できます。
プロジェクトファイルの確認
以下のセクションでは、これらのプロジェクトファイルについて説明します。
-
Function.cs
-
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))]
このクラスには、2 つのコンストラクタがあります。1 つ目は、デフォルトコンストラクタで、Lambda がユーザーの関数を呼び出すときに使用されます。このコンストラクタは、Amazon S3 および Amazon Rekognition サービスクライアントを作成します。また、コンストラクタは、デプロイ時に関数に割り当てる IAM ロールからこれらのクライアントの AWS 認証情報を取得します。クライアントの AWS リージョンは、Lambda 関数が実行されているリージョンに設定されます。このブループリントでは、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}"); } }
次の例は、2 番目のコンストラクタをテストに使用する方法を示しています。テストプロジェクトは、独自の 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
aws-lambda-tools-defaults.json
ファイルには、デプロイウィザードの一部のフィールドに事前入力するためにブループリントが設定したデフォルト値が含まれています。また、.NET Core CLI との統合のためのコマンドラインオプションの設定にも役立ちます。
.NET Core CLI 統合にアクセスするには、関数のプロジェクトディレクトリに移動し、 と入力しますdotnet lambda help
。
注記
関数ハンドラーは、呼び出された関数に応答して Lambda が呼び出すメソッドを示します。このフィールドの形式は です<assembly-name>::<full-type-name>::<method-name>
。名前空間はタイプ名に含める必要があります。
関数をデプロイする
次の手順では、Lambda 関数をデプロイする方法について説明します。
-
Solution Explorer で、Lambda プロジェクトを右クリックし、 AWS Lambda に発行を選択して、Upload to AWS Lambda ウィンドウを開きます。
注記
プリセット値は
aws-lambda-tools-defaults.json
ファイルから取得されます。 -
Upload to AWS Lambda ウィンドウから、関数名フィールドに名前を入力し、次へボタンを選択して高度な関数の詳細ウィンドウに進みます。
注記
この例では、 は関数名 を使用します
ImageRekognition
。 -
高度な関数の詳細ウィンドウから、Amazon S3 および Amazon Rekognition リソースにアクセスするアクセス許可をコードに付与する IAM ロールを選択します。
注記
この例に従っている場合は、
AWSLambda_FullAccess
ロールを選択します。 -
環境変数を
MinConfidence
60 に設定し、アップロードを選択してデプロイプロセスを起動します。関数ビューが AWS Explorer に表示されると、公開プロセスが完了します。 -
デプロイが成功したら、Event Sources タブに移動して、Amazon S3 が新しい関数にイベントを送信するように設定します。
-
イベントソースタブで、追加ボタンを選択し、Lambda 関数に接続する Amazon S3 バケットを選択します。
注記
バケットは Lambda 関数と同じ AWS リージョンに存在する必要があります。
関数をテストする
これで、関数がデプロイされ、イベントのソースとして S3 バケットが関数に対して設定されたので、S3 バケットブラウザを AWS Explorer から、選択したバケットについて開きます。次に、いくつかのイメージをアップロードします。
アップロードが完了すると、使用する関数のビューからログを調べることで、関数が実行されたことを確認できます。または、バケットブラウザ内のイメージを右クリックし、[Properties (プロパティ)] を選択します。[Tags (タグ)] タブで、使用するオブジェクトに適用されたタグを表示できます。
