

**지원 종료 알림:** 2026년 10월 30일에 Amazon Pinpoint에 대한 지원이 AWS 종료됩니다. 2026년 10월 30일 이후에는 Amazon Pinpoint 콘솔 또는 Amazon Pinpoint 리소스(엔드포인트, 세그먼트, 캠페인, 여정, 분석)에 더 이상 액세스할 수 없습니다. 자세한 내용은 [Amazon Pinpoint 지원 종료](https://docs.aws.amazon.com/console/pinpoint/migration-guide)를 참조하세요. **참고:** SMS, 음성, 모바일 푸시, OTP 및 전화번호 검증과 관련된 APIs는이 변경의 영향을 받지 않으며 AWS 최종 사용자 메시징에서 지원됩니다.

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

# Amazon Pinpoint에 대한 Lambda 함수를 생성하여 추천자 모델에 대해 간접적으로 호출
<a name="ml-models-rm-lambda-create-function"></a>

Lambda 함수를 생성하는 방법을 알아보려면 *AWS Lambda 개발자 안내서*의 [시작하기](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)를 참조하세요. 함수를 설계하고 개발할 때 다음 요구 사항과 지침을 염두에 두십시오.

## 입력 이벤트 데이터
<a name="ml-models-rm-lambda-create-function-input"></a>

Amazon Pinpoint는 추천 모델에 대한 Lambda 함수를 간접적으로 호출할 때 메시지를 보내는 캠페인 또는 여정에 대한 구성 및 기타 설정이 포함된 페이로드를 보냅니다. 페이로드에는 메시지 수신자에 대한 엔드포인트 정의와 엔드포인트 ID를 연결하는 맵인 `Endpoints` 객체가 포함됩니다.

엔드포인트 정의는 Amazon Pinpoint API의 [엔드포인트](https://docs.aws.amazon.com/pinpoint/latest/apireference/apps-application-id-endpoints-endpoint-id.html) 리소스에서 정의한 구조를 사용합니다. 그러나 여기에는 `RecommendationItems`라는 동적 추천 속성에 대한 필드도 포함됩니다. `RecommendationItems` 필드에는 Amazon Personalize 캠페인에서 반환된 엔드포인트에 대한 추천 항목이 하나 이상 포함됩니다. 이 필드의 값은 1\~5개 추천 항목(문자열)의 정렬된 배열입니다. 배열의 항목 수는 각 엔드포인트 또는 사용자에 대해 검색하도록 Amazon Pinpoint를 구성한 추천 항목 수에 따라 다릅니다.

예제:

```
"Endpoints": {
    "endpointIDexample-1":{
        "ChannelType":"EMAIL",
        "Address":"sofiam@example.com",
        "EndpointStatus":"ACTIVE",
        "OptOut":"NONE",
        "EffectiveDate":"2020-02-26T18:56:24.875Z",
        "Attributes":{
            "AddressType":[
                "primary"
            ]
        },
        "User":{
            "UserId":"SofiaMartínez",
            "UserAttributes":{
                "LastName":[
                    "Martínez"
                ],
                "FirstName":[
                    "Sofia"
                ],
                "Neighborhood":[
                    "East Bay"
                ]
            }
        },
        "RecommendationItems":[
            "1815",
            "2009",
            "1527"
        ],
        "CreationDate":"2020-02-26T18:56:24.875Z"
    },
    "endpointIDexample-2":{
        "ChannelType":"EMAIL",
        "Address":"alejandror@example.com",
        "EndpointStatus":"ACTIVE",
        "OptOut":"NONE",
        "EffectiveDate":"2020-02-26T18:56:24.897Z",
        "Attributes":{
            "AddressType":[
                "primary"
            ]
        },
        "User":{
            "UserId":"AlejandroRosalez",
            "UserAttributes":{
                "LastName ":[
                    "Rosalez"
                ],
                "FirstName":[
                    "Alejandro"
                ],
                "Neighborhood":[
                    "West Bay"
                ]
            }
        },
        "RecommendationItems":[
            "1210",
            "6542",
            "4582"
        ],
        "CreationDate":"2020-02-26T18:56:24.897Z"
    }
}
```

앞의 예에서 관련 Amazon Pinpoint 설정은 다음과 같습니다.
+ 추천 모델은 각 엔드포인트 또는 사용자에 대해 세 가지 추천 항목을 검색하도록 구성됩니다. (`RecommendationsPerMessage` 속성 값은 `3`으로 설정됩니다.) 이 설정을 사용하면 Amazon Pinpoint에서는 각 엔드포인트 또는 사용자에 대해 첫 번째, 두 번째 및 세 번째 추천 항목만 검색하고 추가합니다.
+ 프로젝트는 각 사용자의 이름, 성 및 거주하는 지역을 저장하는 사용자 지정 사용자 속성을 사용하도록 구성됩니다. (`UserAttributes` 객체에는 이러한 속성의 값이 포함되어 있습니다.)
+ 프로젝트는 해당 엔드포인트가 프로젝트에서 메시지를 수신하기 위한 사용자의 기본 주소(채널)인지 여부를 나타내는 사용자 지정 엔드포인트 속성(`AddressType`)을 사용하도록 구성됩니다. (`Attributes` 객체에는 이 속성의 값이 포함되어 있습니다.)

Amazon Pinpoint에서 Lambda 함수를 간접적으로 호출하고 이 페이로드를 이벤트 데이터로 전송하면 AWS Lambda 에서 처리를 위해 Lambda 함수에 데이터를 전달합니다.

각 페이로드는 최대 50개의 엔드포인트에 대한 데이터를 포함할 수 있습니다. 세그먼트에 50개 이상의 엔드포인트가 포함된 경우, Amazon Pinpoint는 함수가 모든 데이터를 처리할 때까지 한 번에 최대 50개의 엔드포인트에 대해 함수를 반복적으로 간접 호출합니다.

## 응답 데이터 및 요구 사항
<a name="ml-models-rm-lambda-create-function-response"></a>

Lambda 함수를 설계하고 개발할 경우 [기계 학습 모델에 대한 할당량](quotas.md#quotas-ML-models)을 염두에 둡니다. 함수가 이러한 할당량에 의해 정의된 조건을 충족하지 않으면 Amazon Pinpoint에서 메시지를 처리하고 보낼 수 없습니다.

또한 다음 요구 사항을 염두에 두십시오.
+ 함수는 입력 이벤트 데이터에 의해 제공된 것과 동일한 형식으로 업데이트된 엔드포인트 정의를 반환해야 합니다.
+ 업데이트된 각 엔드포인트 정의에는 엔드포인트 또는 사용자에 대해 1\~10개의 사용자 지정 추천 속성이 포함될 수 있습니다. 이러한 속성의 이름은 Amazon Pinpoint에서 추천 모델을 구성할 때 지정하는 속성 이름과 일치해야 합니다.
+ 모든 사용자 지정 추천 속성은 각 엔드포인트 또는 사용자에 대해 단일 `Recommendations` 객체로 반환되어야 합니다. 이 요구 사항은 이름 충돌이 발생하지 않도록 하는 데 도움이 됩니다. 엔드포인트 정의의 모든 위치에 `Recommendations` 객체를 추가할 수 있습니다.
+ 각 사용자 지정 추천 속성의 값은 문자열(단일 값) 또는 문자열 배열(다중 값)이어야 합니다. 값이 문자열 배열인 경우 `RecommendationItems` 필드에 표시된 대로 Amazon Personalize가 반환한 추천 항목의 순서를 유지하는 것이 좋습니다. 그렇지 않으면 콘텐츠가 엔드포인트 또는 사용자에 대한 모델의 예측을 반영하지 않을 수 있습니다.
+ 함수는 엔드포인트 또는 사용자에 대한 다른 속성 값을 포함하여 이벤트 데이터의 다른 요소를 수정해서는 안 됩니다. 사용자 지정 추천 속성에 대한 값만 추가하고 반환해야 합니다. Amazon Pinpoint는 함수의 응답에 있는 다른 값에 대한 업데이트는 수락하지 않습니다.
+ 함수는 함수를 호출하는 Amazon Pinpoint 프로젝트와 동일한 AWS 리전에서 호스팅되어야 합니다. 함수와 프로젝트가 동일한 리전에 있지 않으면 Amazon Pinpoint에서 이벤트 데이터를 함수로 보낼 수 없습니다.

위의 요구 사항 중 하나라도 충족되지 않으면 Amazon Pinpoint에서 메시지를 처리하고 하나 이상의 엔드포인트로 보낼 수 없습니다. 이로 인해 캠페인 또는 여정 활동이 실패할 수 있습니다.

마지막으로 함수에 대해 256개의 동시 실행을 예약하는 것이 좋습니다.

전반적으로 Lambda 함수는 Amazon Pinpoint에서 보낸 이벤트 데이터를 처리하고 수정된 엔드포인트 정의를 반환해야 합니다. `Endpoints` 객체의 각 엔드포인트를 반복하고 각 엔드포인트에 대해 사용하려는 사용자 지정 추천 속성에 대한 값을 만들고 설정하여 이 작업을 수행할 수 있습니다. Python으로 작성되어 앞의 입력 이벤트 데이터 예제를 계속 진행하는 다음 예제 핸들러가 이를 보여 줍니다.

```
import json
import string
 
def lambda_handler(event, context):
    print("Received event: " + json.dumps(event))
    print("Received context: " +  str(context))
    segment_endpoints = event["Endpoints"]
    new_segment = dict()
    for endpoint_id in segment_endpoints.keys():
        endpoint = segment_endpoints[endpoint_id]
        if supported_endpoint(endpoint):
            new_segment[endpoint_id] = add_recommendation(endpoint)
 
    print("Returning endpoints: " + json.dumps(new_segment))
    return new_segment
 
def supported_endpoint(endpoint):
    return True
 
def add_recommendation(endpoint):
    endpoint["Recommendations"] = dict()
 
    customTitleList = list()
    customGenreList = list()
    for i,item in enumerate(endpoint["RecommendationItems"]):
        item = int(item)
        if item == 1210:
            customTitleList.insert(i, "Hanna")
            customGenreList.insert(i, "Action")
        elif item == 1527:
            customTitleList.insert(i, "Catastrophe")
            customGenreList.insert(i, "Comedy")
        elif item == 1815:
            customTitleList.insert(i, "Fleabag")
            customGenreList.insert(i, "Comedy")
        elif item == 2009:
            customTitleList.insert(i, "Late Night")
            customGenreList.insert(i, "Drama")
        elif item == 4582:
            customTitleList.insert(i, "Agatha Christie\'s The ABC Murders")
            customGenreList.insert(i, "Crime")
        elif item == 6542:
            customTitleList.insert(i, "Hunters")
            customGenreList.insert(i, "Drama")
        
    endpoint["Recommendations"]["Title"] = customTitleList
    endpoint["Recommendations"]["Genre"] = customGenreList
    
    return endpoint
```

이전 예제에서는 이벤트 데이터를 `event` 파라미터로 핸들러에 AWS Lambda 전달합니다. 핸들러는 `Endpoints` 객체의 각 엔드포인트를 반복하고 `Recommendations.Title` 및 `Recommendations.Genre`라는 사용자 지정 추천 속성의 값을 설정합니다. `return` 문은 업데이트된 각 엔드포인트 정의를 Amazon Pinpoint로 반환합니다.

앞의 입력 이벤트 데이터 예제를 계속 진행하면서 업데이트된 엔드포인트 정의는 다음과 같습니다.

```
"Endpoints":{
    "endpointIDexample-1":{
        "ChannelType":"EMAIL",
        "Address":"sofiam@example.com",
        "EndpointStatus":"ACTIVE",
        "OptOut":"NONE",
        "EffectiveDate":"2020-02-26T18:56:24.875Z",
        "Attributes":{
            "AddressType":[
                "primary"
            ]
        },
        "User":{
            "UserId":"SofiaMartínez",
            "UserAttributes":{
                "LastName":[
                    "Martínez"
                ],
                "FirstName":[
                    "Sofia"
                ],
                "Neighborhood":[
                    "East Bay"
                ]
            }
        },
        "RecommendationItems":[
            "1815",
            "2009",
            "1527"
        ],
        "CreationDate":"2020-02-26T18:56:24.875Z",
        "Recommendations":{
            "Title":[
                "Fleabag",
                "Late Night",
                "Catastrophe"
            ],
            "Genre":[
                "Comedy",
                "Comedy",
                "Comedy"
            ]
        }
    },
    "endpointIDexample-2":{
        "ChannelType":"EMAIL",
        "Address":"alejandror@example.com",
        "EndpointStatus":"ACTIVE",
        "OptOut":"NONE",
        "EffectiveDate":"2020-02-26T18:56:24.897Z",
        "Attributes":{
            "AddressType":[
                "primary"
            ]
        },
        "User":{
            "UserId":"AlejandroRosalez",
            "UserAttributes":{
                "LastName ":[
                    "Rosalez"
                ],
                "FirstName":[
                    "Alejandro"
                ],
                "Neighborhood":[
                    "West Bay"
                ]
            }
        },
        "RecommendationItems":[
            "1210",
            "6542",
            "4582"
        ],
        "CreationDate":"2020-02-26T18:56:24.897Z",
        "Recommendations":{
            "Title":[
                "Hanna",
                "Hunters",
                "Agatha Christie\'s The ABC Murders"
            ],
            "Genre":[
                "Action",
                "Drama",
                "Crime"
            ]
        }
    }
}
```

앞의 예제에서 함수는 결과를 수신하고 반환한 `Endpoints` 객체를 수정했습니다. 이제 각 엔드포인트의 `Endpoint` 객체에 `Title` 및 `Genre` 필드가 포함된 새 `Recommendations` 객체가 포함됩니다. 이러한 각 필드는 세 개의 정렬된 값 배열(문자열)을 저장합니다. 여기서 각 값은 `RecommendationItems` 필드의 해당 추천 항목에 대한 개선된 내용을 제공합니다.