

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# チュートリアル: 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>

次の手順では、 AWS Toolkit for Visual Studioから Amazon Rekognition Lambda アプリケーションを作成する方法について説明します。

**注記**  
作成すると、アプリケーションには 2 つのプロジェクトを含むソリューションが作成されます。1 つは Lambda にデプロイする Lambda 関数コードを含むソースプロジェクト、もう 1 つは関数をローカルでテストするための xUnit を使用したテストプロジェクトです。  
Visual Studio がプロジェクトの NuGet の参照をすべて見つけられない場合があります。これは、これらのブループリントで必要な依存関係を、NuGet から取得する必要があるからです。新しいプロジェクトが作成されたとき、Visual Studio はローカル参照だけを取り込み、NuGet からリモート参照を取り込みません。NuGet エラーを修正するには: 参照を右クリックし、**[パッケージの復元]** を選択します。

1. Visual Studio の **[ファイル]** メニューを展開し、**[新規]** を展開し、**[プロジェクト]** を選択します。

1. **[新しいプロジェクト]** ダイアログボックスで、**[言語]**、**[プラットフォーム]**、および **[プロジェクトタイプ]** のドロップダウンボックスが [すべて...] に設定されていることを確認して、**[検索]** フィールドに **aws lambda** を入力します。

1. **AWS Lambda with Tests (.NET Core - C\$1)** テンプレートを選択します。

1. **[次へ]** へをクリックして、**[新しいプロジェクトを設定]** ダイアログを開きます。

1. **[新しいプロジェクトを設定]** ダイアログで、**[名前]** に 「ImageRekognition」と入力し、残りのフィールドを必要に応じて入力します。**[作成]** ボタンを選択して、**[ブループリントを選択]** ダイアログに進みます。

1. **[ブループリントの選択]** ダイアログで、**[Detect Image Labels**] ブループリントを選択し、**[完了]** を選択して Visual Studio プロジェクトを作成します。
**注記**  
このブループリントには Amazon S3 イベントをリッスンするためのコードがあり、Amazon Rekognition を使用してラベルを検出し、それらを Amazon 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` ファイル内の最初のコードセグメントは、ファイルの先頭にある assembly 属性です。デフォルトでは、Lambda はタイプ `System.IO.Stream` の戻り値型と入力パラメータのみを受け入れます。入力パラメータや戻り値型で型付きのクラスを使用するには、シリアライザーを登録する必要があります。この assembly 属性は、`Newtonsoft.Json` を使用してストリームを型付きクラスに変換する Lambda JSON シリアライザーを登録します。シリアライザーをアセンブリまたはメソッドレベルで設定できます。

以下は assembly 属性の例です。

```
// 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 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}");
    }
}
```

次の例は、2番目のコンストラクタをテストにどのように活用するかを示しています。テストプロジェクトでは、独自の S3 クライアントと Rekognition クライアントを設定し、それらを渡します。

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

以下は、`FunctionHandler` ファイル内の `Function.cs` メソッドの例です。

```
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 S３でトリガーされたイベントに関するすべての情報が含まれています。関数は、イベントの一部であるすべての 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. **Solution Explorer** から、Lambda プロジェクトを右クリックし、** AWS Lambda に発行**を選択して、**Upload to 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/ja_jp/toolkit-for-visual-studio/latest/user-guide/images/lambda-upload-imgrek-03192024.png)

1. **[関数の高度な詳細]** ページで、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/ja_jp/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 バケットが関数に対して設定されたので、S3 バケットブラウザを **AWS Explorer** から、選択したバケットについて開きます。次に、いくつかのイメージをアップロードします。

アップロードが完了すると、使用する関数のビューからログを調べることで、関数が実行されたことを確認できます。または、バケットブラウザ内のイメージを右クリックし、[**Properties (プロパティ)**] を選択します。[**Tags (タグ)**] タブで、使用するオブジェクトに適用されたタグを表示できます。

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