

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

# を使用したカスタムラベル付けワークフローでのデータの処理 AWS Lambda
<a name="sms-custom-templates-step3"></a>

このトピックでは、カスタムラベル付けワークフローを作成するときに、オプションで [AWS Lambda](https://aws.amazon.com/lambda/) 関数をデプロイする方法について説明します。カスタムラベル付けワークフローで使用する Lambda 関数は 2 種類あります。
+ *前注釈 Lambda*: この関数は、ラベル付けジョブに送信された各データオブジェクトをワーカーに送信する前に開始し、前処理します。
+ *注釈後 Lambda*: ワーカーがタスクを送信すると、この関数は結果を処理します。データオブジェクトごとに複数のワーカーを指定する場合、この関数に注釈を統合するロジックが含まれる場合があります。

Lambda と Ground Truth を初めて使用する場合は、このセクションのページを以下のように使用することをお勧めします。

1. まず、「[前注釈と後注釈の Lambda 関数をテストするLambda 関数を使用する](sms-custom-templates-step3-lambda-requirements.md)」 を確認します。

1. 次に、「[Ground Truth AWS Lambda で使用するために必要なアクセス許可を追加する](sms-custom-templates-step3-lambda-permissions.md)」の ページを使用して、Ground Truth カスタムラベル付けジョブで注釈前と注釈後の Lambda 関数を使用するためのセキュリティ要件と権限要件について学習します。

1. 次に、Lambda コンソールにアクセスするか、Lambda の API を使用して関数を作成する必要があります。関数の作成方法については「[Ground Truth テンプレートを使用して Lambda 関数を作成する](sms-custom-templates-step3-lambda-create.md)」 セクションで確認できます。

1. Lambda 関数のテスト方法については、「[前注釈と後注釈の Lambda 関数をテストする](sms-custom-templates-step3-lambda-test.md)」を参照してください。

1. 前処理と後処理の Lambda 関数を作成したら、Ground Truth コンソールでカスタム HTML のコードエディタの後に表示される **[Lambda functions]** (Lambda 関数) セクションからそれらを選択します。`CreateLabelingJob` API リクエストでこれらの関数を使用する方法については、「[ラベル付けジョブを作成 (API)](sms-create-labeling-job-api.md)」を参照してください。

前注釈と後注釈の Lambda 関数の例を含むカスタムラベル付けワークフローのチュートリアルについては、「[デモテンプレート: `crowd-bounding-box` を使用したイメージの注釈](sms-custom-templates-step2-demo1.md)」ドキュメントを参照してください。

**Topics**
+ [前注釈と後注釈の Lambda 関数をテストする](sms-custom-templates-step3-lambda-requirements.md)
+ [Ground Truth AWS Lambda で使用するために必要なアクセス許可を追加する](sms-custom-templates-step3-lambda-permissions.md)
+ [Ground Truth テンプレートを使用して Lambda 関数を作成する](sms-custom-templates-step3-lambda-create.md)
+ [前注釈と後注釈の Lambda 関数をテストする](sms-custom-templates-step3-lambda-test.md)

# 前注釈と後注釈の Lambda 関数をテストする
<a name="sms-custom-templates-step3-lambda-requirements"></a>

このセクションでは、前注釈と後注釈の Lambda 関数に送信されるリクエストの構文と、Ground Truth でカスタムラベル付けワークフローを実行するために必要な応答構文について学習します。

**Topics**
+ [前注釈 Lambda](#sms-custom-templates-step3-prelambda)
+ [後注釈 Lambda](#sms-custom-templates-step3-postlambda)

## 前注釈 Lambda
<a name="sms-custom-templates-step3-prelambda"></a>

ラベル付けタスクがワーカーに送信される前に、前注釈の Lambda 関数をオプションで呼び出すことができます。

Ground Truth は、Lambda 関数に JSON 形式のリクエストを送信し、ラベル付けジョブとデータオブジェクトに関する詳細を提供します。

JSON 形式のリクエストの例を次に 2 つ示します。

------
#### [ Data object identified with "source-ref" ]

```
{
    "version": "2018-10-16",
    "labelingJobArn": <labelingJobArn>
    "dataObject" : {
        "source-ref": <s3Uri>
    }
}
```

------
#### [ Data object identified with "source" ]

```
{
    "version": "2018-10-16",
    "labelingJobArn": <labelingJobArn>
    "dataObject" : {
        "source": <string>
    }
}
```

------

 次のリストに、前注釈リクエストスキーマを示します。各パラメータの詳細は以下のとおりです。
+ `version`(文字列): Ground Truth で内部的に使用されるバージョン番号です。
+ `labelingJobArn`(文字列): ラベル付けジョブの Amazon リソースネーム (ARN) です。この ARN は、`DescribeLabelingJob` のようなGround Truth ス API オペレーションを使用するときにラベル付けジョブを参照するために使用できます。
+ `dataObject` (JSON オブジェクト): キーには、入力マニフェストファイルから、または Amazon SNS から送信された 1 つの JSON 行が含まれます。マニフェストの JSON 行オブジェクトのサイズは最大 100 キロバイトで、さまざまなデータを含むことができます。非常に基本的な画像注釈ジョブでは、`dataObject` JSONには注釈を付けるイメージを指定する `source-ref`キーのみが含まれる場合があります。データオブジェクト (テキスト行など) が入力マニフェストファイルに直接含まれている場合、データオブジェクトは `source` で識別されます。検証ジョブまたは調整ジョブを作成する場合、この行には、前のラベル付けジョブのラベルデータとメタデータが含まれる場合があります。

次の各タブに、前注釈リクエストの例を示します。これらのリクエストの例の各パラメータの説明は、タブ付きテーブルの下にあります。

------
#### [ Data object identified with "source-ref" ]

```
{
    "version": "2018-10-16",
    "labelingJobArn": "arn:aws:sagemaker:us-west-2:111122223333:labeling-job/<labeling_job_name>"
    "dataObject" : {
        "source-ref": "s3://input-data-bucket/data-object-file-name"
    }
}
```

------
#### [ Data object identified with "source" ]

```
{
    "version": "2018-10-16",
    "labelingJobArn": "arn:aws:sagemaker:<aws_region>:111122223333:labeling-job/<labeling_job_name>"
    "dataObject" : {
        "source": "Sue purchased 10 shares of the stock on April 10th, 2020"
    }
}
```

------

代わりに、Ground Truth には、次のような形式の応答が必要です。

**Example 想定される戻りデータの**  

```
{
    "taskInput": <json object>,
    "isHumanAnnotationRequired": <boolean> # Optional
}
```

前の例では、`<json object>` には、カスタムワーカーテンプレートに必要な*すべての*データが含まれている必要があります。手順が常に同じである境界ボックスタスクを実行している場合は、単にイメージファイルの HTTP(S) または Amazon S3 リソースであることがあります。これが感情分析タスクであり、さまざまなオブジェクトに各種の選択肢がある場合には、文字列としてのオブジェクト参照、文字列の配列としての選択肢になります。

**`isHumanAnnotationRequired` の意義**  
デフォルト値が `true` に設定されるため、この値は任意です。明示的な設定の主なユースケースは、このデータオブジェクトを人間のワーカーによるラベル付けから除外する場合です。

マニフェストに複数のオブジェクトがあり、それらの中に人間の注釈を必要とするものと必要としないものがある場合は、`isHumanAnnotationRequired` 値を各データオブジェクトに含めることができます。注釈前 Lambda にロジックを追加して、オブジェクトに注釈が必要かどうかを動的に判断し、それに応じてこのブール値を設定できます。

### 前注釈 Lambda 関数の例
<a name="sms-custom-templates-step3-prelambda-example"></a>

次の基本的な前注釈 Lambda 関数は、最初のリクエストから `dataObject` の JSON オブジェクトにアクセスし、`taskInput` パラメータで返します。

```
import json

def lambda_handler(event, context):
    return {
        "taskInput":  event['dataObject']
    }
```

入力マニフェストファイルが `"source-ref"` を使用してデータオブジェクトを識別すると仮定して、この注釈前 Lambda と同じラベル付けジョブで使用されるワーカータスクテンプレートには、`dataObject` を取り込むために以下のような Liquid 要素を含める必要があります。

```
{{ task.input.source-ref | grant_read_access }}
```

入力マニフェストファイルが `source` を使用してデータオブジェクトを識別する場合は、ワーカータスクテンプレートは、以下を使用して `dataObject` を取り込むことができます。

```
{{ task.input.source }}
```

次の注釈前 Lambda の例には、`dataObject` で使用されたキーを識別するロジックが含まれており、Lambda の return ステートメントで `taskObject` を使用してそのデータオブジェクトをポイントします。

```
import json

def lambda_handler(event, context):

    # Event received
    print("Received event: " + json.dumps(event, indent=2))

    # Get source if specified
    source = event['dataObject']['source'] if "source" in event['dataObject'] else None

    # Get source-ref if specified
    source_ref = event['dataObject']['source-ref'] if "source-ref" in event['dataObject'] else None

    # if source field present, take that otherwise take source-ref
    task_object = source if source is not None else source_ref

    # Build response object
    output = {
        "taskInput": {
            "taskObject": task_object
        },
        "humanAnnotationRequired": "true"
    }

    print(output)
    # If neither source nor source-ref specified, mark the annotation failed
    if task_object is None:
        print(" Failed to pre-process {} !".format(event["labelingJobArn"]))
        output["humanAnnotationRequired"] = "false"

    return output
```

## 後注釈 Lambda
<a name="sms-custom-templates-step3-postlambda"></a>

すべてのワーカーがデータオブジェクトに注釈を付けたとき、または [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_HumanLoopConfig.html#SageMaker-Type-HumanLoopConfig-TaskAvailabilityLifetimeInSeconds](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_HumanLoopConfig.html#SageMaker-Type-HumanLoopConfig-TaskAvailabilityLifetimeInSeconds) に達したときのいずれか早い方で、Ground Truth はそれらの注釈を注釈後 Lambda に送信します。この Lambda は一般に、[注釈統合](sms-annotation-consolidation.md) に使用されます。

**注記**  
統合後の Lambda 関数の例については、[aws-sagemaker-ground-truth-recipe](https://github.com/aws-samples/aws-sagemaker-ground-truth-recipe) GitHub リポジトリの [annotation\$1consolidation\$1lambda.py](https://github.com/aws-samples/aws-sagemaker-ground-truth-recipe/blob/master/aws_sagemaker_ground_truth_sample_lambda/annotation_consolidation_lambda.py) を参照してください。

次のコードブロックには、注釈後のリクエストスキーマが含まれています。各パラメータの説明は、下の箇条書きにあります。

```
{
    "version": "2018-10-16",
    "labelingJobArn": <string>,
    "labelCategories": [<string>],
    "labelAttributeName": <string>,
    "roleArn" : <string>,
    "payload": {
        "s3Uri": <string>
    }
 }
```
+ `version` (文字列): Ground Truth で内部的に使用されるバージョン番号です。
+ `labelingJobArn` (文字列): ラベル付けジョブの Amazon リソースネーム (ARN) です。この ARN は、`DescribeLabelingJob` のようなGround Truth ス API オペレーションを使用するときにラベル付けジョブを参照するために使用できます。
+ `labelCategories` (文字列のリスト): コンソールで指定した、またはラベルカテゴリ設定ファイルに含まれるラベルカテゴリとその他の属性が含まれます。
+ `labelAttributeName` (文字列): ラベル付けジョブの名前、またはラベル付けジョブの作成時に指定したラベル属性名のいずれかです。
+ `roleArn` (文字列): ラベル付けジョブの作成時に指定する IAM 実行ロールの Amazon リソースネーム (ARN) です。
+ `payload` (JSON オブジェクト): `s3Uri` を含む JSON キー。Amazon S3 内のそのデータオブジェクトの注釈データの場所を特定します。次の 2 番目のコードブロックは、この注釈ファイルの例です。

次のコードブロックは、注釈後リクエストの例を示しています。このサンプルリクエストの各パラメータの説明は、コードブロックの下にあります。

**Example 注釈後 Lambda リクエストの**  

```
{
    "version": "2018-10-16",
    "labelingJobArn": "arn:aws:sagemaker:us-west-2:111122223333:labeling-job/labeling-job-name",
    "labelCategories": ["Ex Category1","Ex Category2", "Ex Category3"],
    "labelAttributeName": "labeling-job-attribute-name",
    "roleArn" : "arn:aws:iam::111122223333:role/role-name",
    "payload": {
        "s3Uri": "s3://amzn-s3-demo-bucket/annotations.json"
    }
 }
```

**注記**  
データオブジェクトで作業するワーカーがいない場合、`TaskAvailabilityLifetimeInSeconds` に達すると、データオブジェクトは失敗としてマークされ、注釈後 Lambda の呼び出しの一部として含まれません。

次のコードブロックには、ペイロードスキーマが含まれています。これは、注釈後 Lambda リクエストの `payload` JSON オブジェクトの `s3Uri` パラメータで示されるファイルです。例えば、前のコードブロックが注釈後の Lambda リクエストの場合、次の注釈ファイルの場所は `s3://amzn-s3-demo-bucket/annotations.json` になります。

各パラメータの説明は、下の箇条書きにあります。

**Example 注釈ファイルの**  

```
[
    {
        "datasetObjectId": <string>,
        "dataObject": {
            "s3Uri": <string>,
            "content": <string>
        },
        "annotations": [{
            "workerId": <string>,
            "annotationData": {
                "content": <string>,
                "s3Uri": <string>
            }
       }]
    }
]
```
+ `datasetObjectId` (文字列): ラベル付けジョブに送信する各データオブジェクトに Ground Truth が割り当てる一意の ID を指定します。
+ `dataObject` (JSON オブジェクト): ラベル付けされたデータオブジェクト。データオブジェクトが入力マニフェストファイルに含まれており、`source` キー (文字列など) によって特定されている場合は、`dataObject` にデータオブジェクトを特定する `content` キーが含まれます。それ以外の場合、データオブジェクトの場所 (リンクや S3 URI など) は、`s3Uri` で特定されます。
+ `annotations` (JSON オブジェクトのリスト): このリストには、その `dataObject` にワーカーから送信された注釈ごとに 1 つの JSON オブジェクトが含まれます。注釈を送信したワーカーを特定するために使用できる一意の `workerId` を含む単一の JSON オブジェクト。`annotationData` キーには次のいずれかが含まれます。
  + `content` (文字列): 注釈データが含まれます。
  + `s3Uri` (文字列): 注釈データの場所を特定する S3 URI が含まれます。

次の表に、さまざまなタイプの注釈のペイロードに表示されるコンテンツの例を示します。

------
#### [ Named Entity Recognition Payload ]

```
[
    {
      "datasetObjectId": "1",
      "dataObject": {
        "content": "Sift 3 cups of flour into the bowl."
      },
      "annotations": [
        {
          "workerId": "private.us-west-2.ef7294f850a3d9d1",
          "annotationData": {
            "content": "{\"crowd-entity-annotation\":{\"entities\":[{\"endOffset\":4,\"label\":\"verb\",\"startOffset\":0},{\"endOffset\":6,\"label\":\"number\",\"startOffset\":5},{\"endOffset\":20,\"label\":\"object\",\"startOffset\":15},{\"endOffset\":34,\"label\":\"object\",\"startOffset\":30}]}}"
          }
        }
      ]
    }
]
```

------
#### [ Semantic Segmentation Payload ]

```
[
    {
      "datasetObjectId": "2",
      "dataObject": {
        "s3Uri": "s3://amzn-s3-demo-bucket/gt-input-data/images/bird3.jpg"
      },
      "annotations": [
        {
          "workerId": "private.us-west-2.ab1234c5678a919d0",
          "annotationData": {
            "content": "{\"crowd-semantic-segmentation\":{\"inputImageProperties\":{\"height\":2000,\"width\":3020},\"labelMappings\":{\"Bird\":{\"color\":\"#2ca02c\"}},\"labeledImage\":{\"pngImageData\":\"iVBOR...\"}}}"
          }
        }
      ]
    }
  ]
```

------
#### [ Bounding Box Payload ]

```
[
    {
      "datasetObjectId": "0",
      "dataObject": {
        "s3Uri": "s3://amzn-s3-demo-bucket/gt-input-data/images/bird1.jpg"
      },
      "annotations": [
        {
          "workerId": "private.us-west-2.ab1234c5678a919d0",
          "annotationData": {
            "content": "{\"boundingBox\":{\"boundingBoxes\":[{\"height\":2052,\"label\":\"Bird\",\"left\":583,\"top\":302,\"width\":1375}],\"inputImageProperties\":{\"height\":2497,\"width\":3745}}}"
          }
        }
      ]
    }
 ]
```

------

注釈後 Lambda 関数には、リクエストに含まれるすべての注釈をループしてアクセスするための次のようなロジックが含まれている場合があります。すべての例については、[aws-sagemaker-ground-truth-recipe](https://github.com/aws-samples/aws-sagemaker-ground-truth-recipe)GitHub リポジトリの [annotation\$1consolidation\$1lambda.py](https://github.com/aws-samples/aws-sagemaker-ground-truth-recipe/blob/master/aws_sagemaker_ground_truth_sample_lambda/annotation_consolidation_lambda.py) を参照してください。この GitHub の例では、独自の注釈統合ロジックを追加する必要があります。

```
for i in range(len(annotations)):
    worker_id = annotations[i]["workerId"]
    annotation_content = annotations[i]['annotationData'].get('content')
    annotation_s3_uri = annotations[i]['annotationData'].get('s3uri')
    annotation = annotation_content if annotation_s3_uri is None else s3_client.get_object_from_s3(
        annotation_s3_uri)
    annotation_from_single_worker = json.loads(annotation)

    print("{} Received Annotations from worker [{}] is [{}]"
            .format(log_prefix, worker_id, annotation_from_single_worker))
```

**ヒント**  
データに対して連結アルゴリズムを実行する場合は、 AWS データベースサービスで結果を保存するか、処理された結果を Ground Truth に戻すことができます。Ground Truth に返すデータは、ラベル付けジョブの設定中に出力用に指定された S3 バケット内の統合注釈マニフェストに保存されます。

代わりに、Ground Truth には、次のような形式の応答が必要です。

**Example 想定される戻りデータの**  

```
[
   {        
        "datasetObjectId": <string>,
        "consolidatedAnnotation": {
            "content": {
                "<labelattributename>": {
                    # ... label content
                }
            }
        }
    },
   {        
        "datasetObjectId": <string>,
        "consolidatedAnnotation": {
            "content": {
                "<labelattributename>": {
                    # ... label content
                }
            }
        }
    }
    .
    .
    .
]
```
この時点で、S3 バケットに送信している、`datasetObjectId` 以外のすべてのデータが `content` オブジェクトに配置されます。

`content` で注釈を返すとき、これにより、ジョブの出力マニフェストに次のようなエントリが生成されます。

**Example 出力マニフェストでのラベル形式の**  

```
{  "source-ref"/"source" : "<s3uri or content>", 
   "<labelAttributeName>": {
        # ... label content from you
    },   
   "<labelAttributeName>-metadata": { # This will be added by Ground Truth
        "job_name": <labelingJobName>,
        "type": "groundTruth/custom",
        "human-annotated": "yes", 
        "creation_date": <date> # Timestamp of when received from Post-labeling Lambda
    }
}
```

カスタムテンプレートとその収集データは複雑な特性を持つ可能性があるため、Ground Truth ではデータの詳細な処理は行いません。

# Ground Truth AWS Lambda で使用するために必要なアクセス許可を追加する
<a name="sms-custom-templates-step3-lambda-permissions"></a>

Ground Truth で AWS Lambda を作成および使用するには、次の一部またはすべてを設定する必要があります。
+ を使用して注釈前および注釈後の Lambda 関数を作成し AWS Lambda、ラベル付けジョブの作成時にそれらを選択するためのアクセス許可を IAM ロールまたはユーザー (総称して IAM エンティティ) に付与する必要があります。
+ ラベル付けジョブが設定されたときに指定された IAM 実行ロールには、注釈前と注釈後の Lambda 関数を呼び出すためのアクセス許可が必要です。
+ 注釈後の Lambda 関数では、Amazon S3 にアクセスするためのアクセス許可が必要な場合があります。

以下のセクションでは、IAM エンティティを作成し、前述したアクセス許可を付与する方法について学習します。

**Topics**
+ [AWS Lambda 関数を作成および選択するアクセス許可を付与する](#sms-custom-templates-step3-postlambda-create-perms)
+ [AWS Lambda 関数を呼び出すアクセス許可を IAM 実行ロールに付与する](#sms-custom-templates-step3-postlambda-execution-role-perms)
+ [注釈にアクセスするための注釈後の Lambda アクセス許可を付与する](#sms-custom-templates-step3-postlambda-perms)

## AWS Lambda 関数を作成および選択するアクセス許可を付与する
<a name="sms-custom-templates-step3-postlambda-create-perms"></a>

注釈前および注釈後の Lambda 関数を開発するために詳細なアクセス許可を必要としない場合は、 AWS 管理ポリシーをユーザーまたはロール`AWSLambda_FullAccess`にアタッチできます。このポリシーは、すべての Lambda 機能を使用するための広範なアクセス許可と、Lambda がやり取りする他の AWS サービスでアクションを実行するためのアクセス許可を付与します。

セキュリティに敏感なユースケースのより詳細なポリシーを作成するには、「 AWS Lambda デベロッパーガイド」の[「Lambda のアイデンティティベースの](https://docs.aws.amazon.com/lambda/latest/dg/access-control-identity-based.html) IAM ポリシー」のドキュメントを参照して、ユースケースに合った IAM ポリシーを作成する方法を確認してください。

**Lambda コンソールを使用するポリシー**

Lambda コンソールを使用するアクセス許可を IAM エンティティに付与する場合は、「 AWS Lambda デベロッパーガイド」の[「Lambda コンソールの使用](https://docs.aws.amazon.com/lambda/latest/dg/security_iam_id-based-policy-examples.html#security_iam_id-based-policy-examples-console)」を参照してください。

さらに、ユーザーが AWS Serverless Application Repository Lambda コンソールの を使用して Ground Truth スターターの注釈前および注釈後の関数にアクセスしてデプロイできるようにするには、関数をデプロイ*`<aws-region>`*する を指定し (ラベル付けジョブの作成に使用した AWS リージョンと同じである必要があります）、次のポリシーを IAM ロールに追加する必要があります。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "serverlessrepo:ListApplicationVersions",
                "serverlessrepo:GetApplication",
                "serverlessrepo:CreateCloudFormationTemplate"
            ],
            "Resource": "arn:aws:serverlessrepo:us-east-1:838997950401:applications/aws-sagemaker-ground-truth-recipe"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "serverlessrepo:SearchApplications",
            "Resource": "*"
        }
    ]
}
```

------

**Ground Truth コンソールで Lambda 関数を表示するためのポリシー**

ユーザーがカスタムラベル付けジョブを作成しているときに、IAM エンティティに Ground Truth コンソールで Lambda 関数を表示するためのアクセス許可を付与するには、エンティティには、「[Amazon SageMaker Ground Truth コンソールを使用するための IAM アクセス許可を付与する](sms-security-permission-console-access.md)」で説明されているアクセス許可が必要です。これには、「[カスタムラベル付けワークフローのアクセス許可](sms-security-permission-console-access.md#sms-security-permissions-custom-workflow)」セクションで説明されているアクセス許可を含みます。

## AWS Lambda 関数を呼び出すアクセス許可を IAM 実行ロールに付与する
<a name="sms-custom-templates-step3-postlambda-execution-role-perms"></a>

IAM 管理ポリシー [AmazonSageMakerGroundTruthExecution](https://console.aws.amazon.com/iam/home?#/policies/arn:aws:iam::aws:policy/AmazonSageMakerGroundTruthExecution) をラベル付けジョブの作成に使用される IAM 実行ロールに追加すると、このロールには、関数名に次の文字列のいずれかを含む Lambda 関数を一覧表示して呼び出すアクセス許可があります: `GtRecipe`、`SageMaker`、`Sagemaker`、`sagemaker`、または`LabelingFunction`。

注釈前または注釈後の Lambda 関数名に前の段落の用語のいずれかが含まれていない場合、または `AmazonSageMakerGroundTruthExecution` 管理ポリシーの用語よりも詳細なアクセス許可が必要な場合は、次のようなポリシーを追加して、注釈前と注釈後関数を呼び出すための実行ロールアクセス許可を追加できます。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": [
                "arn:aws:lambda:us-east-1:111122223333:function:<pre-annotation-lambda-name>",
                "arn:aws:lambda:us-east-1:111122223333:function:<post-annotation-lambda-name>"
            ]
        }
    ]
}
```

------

## 注釈にアクセスするための注釈後の Lambda アクセス許可を付与する
<a name="sms-custom-templates-step3-postlambda-perms"></a>

[後注釈 Lambda](sms-custom-templates-step3-lambda-requirements.md#sms-custom-templates-step3-postlambda) で説明したように、注釈後 Lambda リクエストには、Amazon S3 内の注釈データの場所が含まれます。この場所は、`payload` オブジェクトの `s3Uri` 文字列で特定されます。注釈を取り込みながら処理するには、シンプルなパススルー関数の場合でも、注釈後の [Lambda 実行ロール](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)に必要なアクセス許可を割り当てて、Amazon S3 からファイルを読み取る必要があります。

Lambda を設定し、Amazon S3 の注釈データにアクセスするにはいくつかの方法があります。2 つの一般的な方法は次のとおりです。
+ Lambda 実行ロールが、注釈後 Lambda リクエストの `roleArn` で特定された SageMaker AI 実行ロールを引き受けることを許可します。この SageMaker AI 実行ロールは、ラベル付けジョブの作成に使用されるロールで、注釈データが格納されている Amazon S3 出力バケットにアクセスできます。
+ Lambda 実行ロールに、Amazon S3 出力バケットに直接アクセスするためのアクセス許可を付与します。

次のセクションでは、これらのオプションを設定する方法について説明します。

**SageMaker AI 実行ロールを引き受けるためのLambda 権限を付与する**

Lambda 関数が SageMaker AI 実行ロールを引き受けるようにするには、Lambda 関数の実行ロールにポリシーをアタッチし、SageMaker AI 実行ロールの信頼関係を変更して、Lambda がそれを引き受けられるようにする必要があります。

1. Lambda 関数の実行ロールに[次の IAM ポリシーをアタッチ](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)し、`Resource` で特定された SageMaker AI 実行ロールを引き受けます。`222222222222` を [AWS アカウント ID](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html) に置き換えます。`sm-execution-role` を引き受けるロールの名前に置き換えます。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Action": "sts:AssumeRole",
           "Resource": "arn:aws:iam::222222222222:role/sm-execution-role"
       }
   }
   ```

------

1. SageMaker AI 実行ロールの[信頼ポリシーを変更](https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-console.html#roles-managingrole_edit-trust-policy)し、以下の `Statement` を含めます。`222222222222` を [AWS アカウント ID](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html) に置き換えます。`my-lambda-execution-role` を引き受けるロールの名前に置き換えます。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "AWS": "arn:aws:iam::222222222222:role/my-lambda-execution-role"
               },
               "Action": "sts:AssumeRole"
           }
       ]
   }
   ```

------

**S3 へのアクセス権限を Lambda 実行ロールに付与する**

次のようなポリシーを注釈後の Lambda 関数の実行ロールに追加して、S3 読み取り権限を付与できます。*amzn-s3-demo-bucket* を、ラベル付けジョブの作成時に指定した出力バケットの名前に置き換えます。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
        }
    ]
}
```

------

Lambda コンソールで Lambda 実行ロールに S3 読み取りアクセス許可を追加するには、以下の手順を使用します。

**S3 読み取りアクセス許可を注釈後 Lambda に追加するには以下の手順に従います。**

1. Lambda コンソールの [**[Functions]** (関数) ページ](https://console.aws.amazon.com/lambda/home#/functions)を開きます。

1. 注釈後関数の名前を選択します。

1. **[設定]** を選択して、**[アクセス許可]** を選択します。

1. **[Role name]** (ロール名) を選択すると、IAM コンソールで新しいタブにそのロールの概要ページが開きます。

1. **[Attach policies]** (ポリシーをアタッチ) を選択します。

1. 次のいずれかを行います。
   + **`AmazonS3ReadOnlyAccess`** を検索して選択し、アカウント内のすべてのバケットとオブジェクトを読み取るアクセス許可を関数に付与します。
   + より詳細なアクセス許可が必要な場合は、**[Create policy]** (ポリシーの作成) をクリックし、前のセクションのポリシー例を使用してポリシーを作成します。ポリシーを作成したら、実行ロールの概要ページに戻る必要があります。

1. `AmazonS3ReadOnlyAccess` 管理ポリシーを使用した場合は、**[Attach policy]** (ポリシーのアタッチ)を選択します。

   新しいポリシーを作成した場合は、Lambda 実行ロールの概要ページに戻り、作成したポリシーをアタッチします。

# Ground Truth テンプレートを使用して Lambda 関数を作成する
<a name="sms-custom-templates-step3-lambda-create"></a>

Lambda 関数は、Lambda コンソール、、または AWS SDK を使用して AWS CLI、任意のサポートされているプログラミング言語で作成できます。以下の各オプションの詳細については、 AWS Lambda デベロッパーガイドを参照してください。
+ コンソールを使用して Lambda 関数を作成する方法については、「[コンソールで Lambda 関数を作成する](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html)」を参照してください。
+ を使用して Lambda 関数を作成する方法については AWS CLI、[「 コマンドラインインターフェイスでの AWS Lambda AWS の使用](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-awscli.html)」を参照してください。
+ 任意の言語で Lambda を使用する方法についての詳細は、目次の該当するセクションを選択して参照してください。例えば、 AWS SDK for Python (Boto3)で Lambda を使用する場合は、[[Working with Python]](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html) (Python を使用する) を選択します。

Ground Truth は AWS Serverless Application Repository 、(SAR) *レシピ*を通じて注釈前および注釈後のテンプレートを提供します。以下の手順を使用して、Lambda コンソールでGround Truth レシピを選択します。

**Ground Truth SAR レシピを使用して、注釈前と注釈後の Lambda 関数を作成します。**

1. Lambda コンソールの [**[Functions]** (関数) ページ](https://console.aws.amazon.com/lambda/home#/functions)を開きます。

1. **[Create Function]** (関数を作成) を選択します。

1. **[Browse serverless app repository]** (Serverless Application Repository の参照) を選択します。

1. 検索ボックスに、**aws-sagemaker-ground-truth-recipe** と入力してそのアプリを選択します。

1. **[Deploy]** (デプロイ) を選択します。アプリのデプロイには数分かかることがあります。

   アプリがデプロイされると、2 つの関数、`serverlessrepo-aws-sagema-GtRecipePreHumanTaskFunc-<id>` と `serverlessrepo-aws-sagema-GtRecipeAnnotationConsol-<id>` がLambda コンソールの **[Functions]** (関数) セクションに表示されます。

1. これらの関数のいずれかを選択し、カスタムロジックを**[Code]** (コード) セクションに追加します。

1. 変更が完了したら、**[Deploy]** (デプロイ) を選択し、デプロイします。

# 前注釈と後注釈の Lambda 関数をテストする
<a name="sms-custom-templates-step3-lambda-test"></a>

Lambda コンソールで、注釈前と注釈後の Lambda 関数をテストできます。Lambda を初めて使用する場合は、 AWS Lambda デベロッパーガイドのコンソールで *Lambda 関数を作成する*のチュートリアルを使用し、Lambda 関数をコンソールでテストまたは[呼び出す](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html#gettingstarted-zip-function)方法を学習できます。このページのセクションを使用して、 AWS Serverless Application Repository (SAR) を通じて提供される Ground Truth 注釈前テンプレートと注釈後テンプレートをテストする方法について説明します。

**Topics**
+ [前提条件](#sms-custom-templates-step3-lambda-test-pre)
+ [注釈前 Lambda 関数をテストする](#sms-custom-templates-step3-lambda-test-pre-annotation)
+ [注釈後 Lambda 関数をテストする](#sms-custom-templates-step3-lambda-test-post-annotation)

## 前提条件
<a name="sms-custom-templates-step3-lambda-test-pre"></a>

このページで説明されているテストを使用するには、次の操作を行う必要があります。
+ Lambda コンソールへのアクセスと、Lambda 関数を作成して呼び出すためのアクセス許可が必要です。これらのアクセス許可の設定方法については、「[AWS Lambda 関数を作成および選択するアクセス許可を付与する](sms-custom-templates-step3-lambda-permissions.md#sms-custom-templates-step3-postlambda-create-perms)」を参照してください。
+ Ground Truth SAR レシピをデプロイしていない場合は、「[Ground Truth テンプレートを使用して Lambda 関数を作成する](sms-custom-templates-step3-lambda-create.md)」の手順を使用してデプロイします。
+ 注釈後の Lambda 関数をテストするには、Amazon S3 にサンプル注釈データを含むデータファイルが必要です。簡単なテストでは、次のコードをコピーしてファイルに貼り付け、`sample-annotations.json` として保存し、[このファイルを Amazon S3 にアップロード](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)します。このファイルの S3 URI を記録しておきます。注釈後の Lambda テストを設定する際にこの情報が必要です。

  ```
  [{"datasetObjectId":"0","dataObject":{"content":"To train a machine learning model, you need a large, high-quality, labeled dataset. Ground Truth helps you build high-quality training datasets for your machine learning models."},"annotations":[{"workerId":"private.us-west-2.0123456789","annotationData":{"content":"{\"crowd-entity-annotation\":{\"entities\":[{\"endOffset\":8,\"label\":\"verb\",\"startOffset\":3},{\"endOffset\":27,\"label\":\"adjective\",\"startOffset\":11},{\"endOffset\":33,\"label\":\"object\",\"startOffset\":28},{\"endOffset\":51,\"label\":\"adjective\",\"startOffset\":46},{\"endOffset\":65,\"label\":\"adjective\",\"startOffset\":53},{\"endOffset\":74,\"label\":\"adjective\",\"startOffset\":67},{\"endOffset\":82,\"label\":\"adjective\",\"startOffset\":75},{\"endOffset\":102,\"label\":\"verb\",\"startOffset\":97},{\"endOffset\":112,\"label\":\"verb\",\"startOffset\":107},{\"endOffset\":125,\"label\":\"adjective\",\"startOffset\":113},{\"endOffset\":134,\"label\":\"adjective\",\"startOffset\":126},{\"endOffset\":143,\"label\":\"object\",\"startOffset\":135},{\"endOffset\":169,\"label\":\"adjective\",\"startOffset\":153},{\"endOffset\":176,\"label\":\"object\",\"startOffset\":170}]}}"}}]},{"datasetObjectId":"1","dataObject":{"content":"Sift 3 cups of flour into the bowl."},"annotations":[{"workerId":"private.us-west-2.0123456789","annotationData":{"content":"{\"crowd-entity-annotation\":{\"entities\":[{\"endOffset\":4,\"label\":\"verb\",\"startOffset\":0},{\"endOffset\":6,\"label\":\"number\",\"startOffset\":5},{\"endOffset\":20,\"label\":\"object\",\"startOffset\":15},{\"endOffset\":34,\"label\":\"object\",\"startOffset\":30}]}}"}}]},{"datasetObjectId":"2","dataObject":{"content":"Jen purchased 10 shares of the stock on Janurary 1st, 2020."},"annotations":[{"workerId":"private.us-west-2.0123456789","annotationData":{"content":"{\"crowd-entity-annotation\":{\"entities\":[{\"endOffset\":3,\"label\":\"person\",\"startOffset\":0},{\"endOffset\":13,\"label\":\"verb\",\"startOffset\":4},{\"endOffset\":16,\"label\":\"number\",\"startOffset\":14},{\"endOffset\":58,\"label\":\"date\",\"startOffset\":40}]}}"}}]},{"datasetObjectId":"3","dataObject":{"content":"The narrative was interesting, however the character development was weak."},"annotations":[{"workerId":"private.us-west-2.0123456789","annotationData":{"content":"{\"crowd-entity-annotation\":{\"entities\":[{\"endOffset\":29,\"label\":\"adjective\",\"startOffset\":18},{\"endOffset\":73,\"label\":\"adjective\",\"startOffset\":69}]}}"}}]}]
  ```
+ [注釈にアクセスするための注釈後の Lambda アクセス許可を付与する](sms-custom-templates-step3-lambda-permissions.md#sms-custom-templates-step3-postlambda-perms) の指示を使用して、注釈後 Lambda 関数の実行ロールに、ラベル付けジョブの作成に使用する SageMaker AI 実行ロールを引き受けるためのアクセス許可を付与する必要があります。注釈後 Lambda 関数は、SageMaker AI 実行ロールを使用して注釈データファイル、S3 にある `sample-annotations.json` にアクセスします。



## 注釈前 Lambda 関数をテストする
<a name="sms-custom-templates-step3-lambda-test-pre-annotation"></a>

Ground Truth AWS Serverless Application Repository (SAR) レシピをデプロイしたときに作成された注釈前 Lambda 関数をテストするには、次の手順に従います。

**Ground Truth SAR レシピの注釈前 Lambda 関数をテストする**

1. Lambda コンソールの [**[Functions]** (関数) ページ](https://console.aws.amazon.com/lambda/home#/functions)を開きます。

1. Ground Truth SAR レシピからデプロイされた注釈前関数を選択します。この関数の名前は、`serverlessrepo-aws-sagema-GtRecipePreHumanTaskFunc-<id>` と同様の名前になります。

1. **[Code source]** (コードソース) セクションで、**[Test]** (テスト) の横にある矢印を選択します。

1. **[Configure test event]** (テストイベントを構成する) を選択します。

1. **[Create new test event]** (新しいテストイベントの作成) オプションを選択したままにします。

1. **[Event template]** (イベントテンプレート) で、**[SageMaker Ground Truth PreHumanTask]** を選択します。

1. テストに**イベント名**を付けます。

1. **[作成]** を選択します。

1. 再度 **Test** (テスト) の横にある矢印を選択すると、作成したテストが選択されて表示されます。これはイベント名のドットで識別できます。選択されていない場合は、選択します。

1. **[Test]** (テスト) を選択して、テストを実行します。

テストを実行した後、**[Execution results]** (実行結果) を表示できます。**[Function logs]** (関数ログ) に、次のような応答が表示されます。

```
START RequestId: cd117d38-8365-4e1a-bffb-0dcd631a878f Version: $LATEST
Received event: {
  "version": "2018-10-16",
  "labelingJobArn": "arn:aws:sagemaker:us-east-2:123456789012:labeling-job/example-job",
  "dataObject": {
    "source-ref": "s3://sagemakerexample/object_to_annotate.jpg"
  }
}
{'taskInput': {'taskObject': 's3://sagemakerexample/object_to_annotate.jpg'}, 'isHumanAnnotationRequired': 'true'}
END RequestId: cd117d38-8365-4e1a-bffb-0dcd631a878f
REPORT RequestId: cd117d38-8365-4e1a-bffb-0dcd631a878f	Duration: 0.42 ms	Billed Duration: 1 ms	Memory Size: 128 MB	Max Memory Used: 43 MB
```

この応答では、Lambda 関数の出力が必須の注釈前応答構文と一致していることがわかります。

```
{'taskInput': {'taskObject': 's3://sagemakerexample/object_to_annotate.jpg'}, 'isHumanAnnotationRequired': 'true'}
```

## 注釈後 Lambda 関数をテストする
<a name="sms-custom-templates-step3-lambda-test-post-annotation"></a>

Ground Truth AWS Serverless Application Repository (SAR) レシピをデプロイしたときに作成された注釈後の Lambda 関数をテストするには、次の手順に従います。

**Ground Truth SAR レシピ注釈後の Lambda 関数をテストする**

1. Lambda コンソールの [**[Functions]** (関数) ページ](https://console.aws.amazon.com/lambda/home#/functions)を開きます。

1. Ground Truth SAR レシピからデプロイされた注釈後関数を選択します。この関数の名前は、`serverlessrepo-aws-sagema-GtRecipeAnnotationConsol-<id>` と同様の名前になります。

1. **[Code source]** (コードソース) セクションで、**[Test]** (テスト) の横にある矢印を選択します。

1. **[Configure test event]** (テストイベントを構成する) を選択します。

1. **[Create new test event]** (新しいテストイベントの作成) オプションを選択したままにします。

1. **[Event template]** (イベントテンプレート)で、**[SageMaker Ground Truth AnnotationConsolidation]** を選択します。

1. テストに**イベント名**を付けます。

1. 指定されたテンプレートコードを次のように変更します。
   + `roleArn` の Amazon リソースネーム (ARN) を、ラベル付けジョブの作成に使用した SageMaker AI 実行ロールの ARN に置き換えます。
   + `s3Uri` の S3 URI を、Amazon S3 に追加した `sample-annotations.json` ファイルの URIに置き換えます。

   これらの変更を行った後、テストは次のようになります。

   ```
   {
     "version": "2018-10-16",
     "labelingJobArn": "arn:aws:sagemaker:us-east-2:123456789012:labeling-job/example-job",
     "labelAttributeName": "example-attribute",
     "roleArn": "arn:aws:iam::222222222222:role/sm-execution-role",
     "payload": {
       "s3Uri": "s3://your-bucket/sample-annotations.json"
     }
   }
   ```

1. **[作成]** を選択します。

1. 再度 **Test** (テスト) の横にある矢印を選択すると、作成したテストが選択されて表示されます。これはイベント名のドットで識別できます。選択されていない場合は、選択します。

1. **[Test]** (テスト) を選択して、テストを実行します。

テストの実行後、**[Function Logs]** (関数ログ) に「`-- Consolidated Output --`」セクションが表示されます。これには、`sample-annotations.json` に含まれるすべての注釈のリストが掲載されています。