

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 를 사용하여 사용자 지정 레이블 지정 워크플로에서 데이터 처리 AWS Lambda
<a name="sms-custom-templates-step3"></a>

이 주제에서는 사용자 지정 레이블 지정 워크플로를 생성할 때 선택적 [AWS Lambda](https://aws.amazon.com/lambda/) 함수를 배포하는 방법을 배울 수 있습니다. 사용자 지정 레이블 지정 워크플로에 사용할 두 가지 유형의 Lambda 함수를 지정할 수 있습니다.
+ *주석 전 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) 섹션을 통해 Lambda 함수를 생성하는 방법을 알아보세요.

1. Lambda 함수를 테스트하는 방법을 알아보려면 [주석 전 및 주석 후 Lambda 함수 테스트](sms-custom-templates-step3-lambda-test.md) 섹션을 참조하세요.

1. 사전 처리 및 사후 처리 Lambda 함수를 생성한 후 Ground Truth 콘솔에서 사용자 지정 HTML용 코드 편집기 다음에 있는 **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 형식 요청 예제입니다.

------
#### [ 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에서 전송한 단일 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 객체): Amazon S3에 있는 해당 데이터 객체의 주석 데이터 위치를 식별하는 `s3Uri` 키가 포함된 JSON입니다. 아래 두 번째 코드 블록은 이 주석 파일의 예를 보여줍니다.

다음 코드 블록에는 주석 후 요청에 대한 예시가 포함되어 있습니다. 이러한 예시 요청의 각 파라미터는 코드 블록 아래에 설명되어 있습니다.

**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` 키(예: 문자열)를 사용하여 식별되는 경우, 데이터 객체를 식별하는 `content` 키가 `dataObject`에 포함되어 있습니다. 그렇지 않으면 데이터 객체의 위치(예: 링크 또는 S3 URI)가 `s3Uri`로 식별됩니다.
+ `annotations`(JSON 객체 목록): 이 목록에는 해당 `dataObject`에 대해 작업자가 제출한 각 주석을 위한 단일 JSON 객체가 포함되어 있습니다. 단일 JSON 객체에는 해당 주석을 제출한 작업자를 식별하는 데 사용할 수 있는 고유한 `workerId`가 포함되어 있습니다. `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
                }
            }
        }
    }
    .
    .
    .
]
```
이 시점에서 `datasetObjectId`를 제외하고 S3 버킷으로 보내는 모든 데이터는 `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에 대한 자격 증명 기반 IAM 정책](https://docs.aws.amazon.com/lambda/latest/dg/access-control-identity-based.html) 설명서를 참조하여 사용 사례에 맞는 IAM 정책을 생성하는 방법을 알아보세요.

**Lambda 콘솔 사용 정책**

IAM 엔터티에 Lambda 콘솔을 사용할 수 있는 권한을 부여하려면 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) 참조하세요.

또한 사용자가 Lambda 콘솔에서를 사용하여 Ground Truth 스타터 주석 전 및 주석 후 함수 AWS Serverless Application Repository 에 액세스하고 배포할 수 있게 하려면 함수를 배포할 *`<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 함수를 확인하기 위한 정책**

사용자가 사용자 지정 라벨링 작업을 생성할 때 Ground Truth 콘솔에서 Lambda 함수를 볼 수 있는 권한을 IAM 엔터티에 부여하려면 해당 엔터티가 [사용자 지정 레이블 워크플로 권한](sms-security-permission-console-access.md#sms-security-permissions-custom-workflow) 섹션에서 설명하는 권한을 포함하여 [Amazon SageMaker Ground Truth 콘솔을 사용하는 IAM 권한 부여](sms-security-permission-console-access.md) 섹션에 설명된 권한이 있어야 합니다.

## AWS Lambda 함수를 호출할 수 있는 IAM 실행 역할 권한 부여
<a name="sms-custom-templates-step3-postlambda-execution-role-perms"></a>

라벨링 작업을 생성하는 데 사용된 IAM 실행 역할에 IAM 관리형 정책 [AmazonSageMakerGroundTruthExecution](https://console.aws.amazon.com/iam/home?#/policies/arn:aws:iam::aws:policy/AmazonSageMakerGroundTruthExecution)을 추가하면, 이 역할은 함수 이름에 `GtRecipe`, `SageMaker`, `Sagemaker`, `sagemaker` 또는 `LabelingFunction` 문자열 중 하나를 사용하여 Lambda 함수를 나열하고 호출할 권한을 가집니다.

주석 전 또는 주석 후 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` 문자열로 식별됩니다. 수신 시 주석을 처리하려면 간단한 전달 함수라 하더라도 Amazon S3에서 파일을 읽을 수 있도록 주석 후 [Lambda 실행 역할](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)에 필수 권한을 할당해야 합니다.

Amazon S3의 주석 데이터에 액세스하도록 Lambda를 구성하는 방법은 여러 가지가 있습니다. 일반적인 두 가지 방법은 다음과 같습니다.
+ Lambda 실행 역할이 주석 후 Lambda 요청의 `roleArn`에서 식별된 SageMaker AI 실행 역할을 맡도록 허용합니다. 이 SageMaker AI 실행 역할은 레이블링 작업을 생성하는 데 사용되며 주석 데이터가 저장되는 Amazon S3 출력 버킷에 액세스할 수 있습니다.
+ Lambda 실행 역할에 Amazon S3 출력 버킷에 직접 액세스할 수 있는 권한을 부여합니다.

다음 섹션을 통해 이러한 옵션을 구성하는 방법을 알아보세요.

**Lambda에 SageMaker AI 실행 역할을 맡을 수 있는 권한 부여**

Lambda 함수가 SageMaker AI 실행 역할을 맡도록 허용하려면 Lambda 함수의 실행 역할에 정책을 연결하고 Lambda가 이를 수임할 수 있도록 SageMaker AI 실행 역할의 신뢰 관계를 수정해야 합니다.

1. [다음 IAM 정책을 Lambda 함수의 실행 역할에 연결](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. 다음 `Statement`를 포함하도록 SageMaker AI 실행 역할의 [신뢰 정책을 수정](https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-console.html#roles-managingrole_edit-trust-policy)합니다. `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"
           }
       ]
   }
   ```

------

**Lambda 실행 역할에 S3에 액세스할 수 있는 권한 부여**

주석 후 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 읽기 권한을 추가하려면 다음 절차를 따르세요.

**주석 후 Lambda에 S3 읽기 권한을 추가합니다.**

1. Lambda 콘솔에서 [**함수** 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 주석 후 함수의 이름을 선택합니다.

1. **구성**을 선택한 다음 **권한**을 선택합니다.

1. **역할 이름**을 선택하면 IAM 콘솔의 새 탭에 해당 역할의 요약 페이지가 열립니다.

1. **정책 연결**을 선택합니다.

1. 다음 중 하나를 수행하세요.
   + 계정에 있는 모든 버킷과 객체를 읽을 수 있는 권한을 함수에 부여하도록 **`AmazonS3ReadOnlyAccess`**를 검색해서 선택합니다.
   + 더 세분화된 권한이 필요한 경우 **정책 생성**을 선택하고 이전 섹션의 정책 예시를 사용하여 정책을 생성합니다. 정책을 생성한 후에는 실행 역할 요약 페이지로 돌아가야 합니다.

1. `AmazonS3ReadOnlyAccess` 관리형 정책을 사용한 경우 **정책 연결**을 선택합니다.

   새 정책을 생성한 경우 Lambda 실행 역할 요약 페이지로 돌아가서 방금 생성한 정책을 연결합니다.

# Ground Truth 템플릿을 사용하여 Lambda 함수 생성
<a name="sms-custom-templates-step3-lambda-create"></a>

Lambda 콘솔, AWS CLI또는 원하는 지원되는 프로그래밍 언어로 AWS SDK를 사용하여 Lambda 함수를 생성할 수 있습니다. AWS Lambda 개발자 안내서를 사용하여 다음 각 옵션에 대해 자세히 알아보세요.
+ 콘솔을 사용하여 Lambda 함수를 생성하는 방법을 알아보려면 [콘솔로 Lambda 함수 생성](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html) 섹션을 참조하세요.
+ 를 사용하여 Lambda 함수를 생성하는 방법을 알아보려면 명령줄 인터페이스에서 Lambda 사용을 AWS CLI참조하세요. [AWSAWS](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-awscli.html) 
+ 목차에서 관련 섹션을 선택하여 원하는 언어로 Lambda를 사용해 작업하는 방법에 대해 자세히 알아보세요. 예를 들어, [Python 작업](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html)을 선택하여 Lambda를 AWS SDK for Python (Boto3)와 함께 사용하는 방법에 대해 자세히 알아볼 수 있습니다.

Ground Truth는 AWS Serverless Application Repository (SAR) *레시피*를 통해 주석 전 및 주석 후 템플릿을 제공합니다. Lambda 콘솔에서 Ground Truth 레시피를 선택하려면 다음 절차를 따르세요.

**Ground Truth SAR 레시피를 사용하여 주석 전 및 주석 후 Lambda 함수를 생성합니다.**

1. Lambda 콘솔에서 [**함수** 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. **함수 생성**을 선택합니다.

1. **서버리스 앱 리포지토리 찾아보기**를 선택합니다.

1. 검색 텍스트 상자에 **aws-sagemaker-ground-truth-recipe**를 입력하고 해당 앱을 선택합니다.

1. **배포**를 선택합니다. 앱을 배포하는 데 몇 분 정도 걸릴 수 있습니다.

   앱이 배포되면 Lambda 콘솔의 **함수** 섹션에 두 개의 함수가 나타나는데, 그것은 바로 `serverlessrepo-aws-sagema-GtRecipePreHumanTaskFunc-<id>`, `serverlessrepo-aws-sagema-GtRecipeAnnotationConsol-<id>`입니다.

1. 이러한 함수 중 하나를 선택하고 **코드** 섹션에 사용자 지정 로직을 추가합니다.

1. 변경이 완료되면 **배포**를 선택하여 배포합니다.

# 주석 전 및 주석 후 Lambda 함수 테스트
<a name="sms-custom-templates-step3-lambda-test"></a>

Lambda 콘솔에서 주석 전 및 주석 후 Lambda 함수를 테스트할 수 있습니다. Lambda를 처음 사용하는 경우 AWS Lambda 개발자 안내서의 콘솔과 함께 [Lambda 함수 생성](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html#gettingstarted-zip-function) 자습서를 사용하여 콘솔에서 Lambda 함수를 테스트하거나 *호출*하는 방법을 배울 수 있습니다. 이 페이지의 섹션을 사용하여 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)의 지침에 따라 레이블링 작업을 생성하는 데 사용되는 SageMaker AI 실행 역할을 수임하는 권한을 주석 후 Lambda 함수의 실행 역할에 부여해야 합니다. 주석 후 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 콘솔에서 [**함수** 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. Ground Truth SAR 레시피에서 배포된 주석 전 기능을 선택합니다. 이 함수의 이름은 `serverlessrepo-aws-sagema-GtRecipePreHumanTaskFunc-<id>`와 비슷합니다.

1. **코드 소스** 섹션에서 **테스트** 옆의 화살표를 선택합니다.

1. **테스트 이벤트 구성**을 선택합니다.

1. **새 테스트 이벤트 생성** 옵션을 선택한 상태로 유지합니다.

1. **이벤트 템플릿**에서 **SageMaker Ground Truth PreHumanTask**를 선택합니다.

1. 테스트에 **이벤트 이름**을 지정합니다.

1. **생성**을 선택합니다.

1. **테스트** 옆의 화살표를 다시 선택하면 생성한 테스트가 선택된 것을 확인할 수 있으며, 이벤트 이름 옆에 점이 표시됩니다. 선택되지 않은 경우 선택합니다.

1. **테스트**를 선택하여 테스트를 실행합니다.

테스트를 실행한 후 **실행 결과**를 볼 수 있습니다. **함수 로그**에 다음과 비슷한 응답이 표시되어야 합니다.

```
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 콘솔에서 [**함수** 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. Ground Truth SAR 레시피에서 배포된 주석 후 함수를 선택합니다. 이 함수의 이름은 `serverlessrepo-aws-sagema-GtRecipeAnnotationConsol-<id>`와 비슷합니다.

1. **코드 소스** 섹션에서 **테스트** 옆의 화살표를 선택합니다.

1. **테스트 이벤트 구성**을 선택합니다.

1. **새 테스트 이벤트 생성** 옵션을 선택한 상태로 유지합니다.

1. **이벤트 템플릿**에서 **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. **테스트** 옆의 화살표를 다시 선택하면 생성한 테스트가 선택된 것을 확인할 수 있으며, 이벤트 이름 옆에 점이 표시됩니다. 선택되지 않은 경우 선택합니다.

1. **테스트**를 선택하여 테스트를 실행합니다.

테스트를 실행한 후에는 `sample-annotations.json`에 포함된 모든 주석의 목록을 포함하고 있는 **함수 로그**의 `-- Consolidated Output --` 섹션이 표시됩니다.