Amazon Pinpoint에서 사용자 지정 채널 생성 - Amazon Pinpoint

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

Amazon Pinpoint에서 사용자 지정 채널 생성

Amazon Pinpoint에는 푸시 알림, 이메일, SMS 및 음성 채널을 통해 메시지를 보내는 기능이 내장되어 있습니다. 사용자 지정 채널을 만들어 다른 채널을 통해 메시지를 보내도록 Amazon Pinpoint를 구성할 수도 있습니다. Amazon Pinpoint에서 사용자 지정 채널을 사용하면 타사 서비스를 비롯해 API가 있는 모든 서비스를 통해 메시지를 전송할 수 있습니다. 웹후크를 사용하거나 함수를 호출하여 API와 상호 작용할 수 있습니다. AWS Lambda

사용자 지정 채널 캠페인을 보내는 세그먼트에는 모든 유형의 엔드포인트(즉, ChannelType 속성 값이 EMAIL, VOICE, SMS, CUSTOM 또는 다양한 푸시 알림 엔드포인트 유형 중 하나인 엔드포인트)가 포함될 수 있습니다.

사용자 지정 채널을 통해 메시지를 보내는 캠페인 생성

개별 캠페인에 Lambda 함수 또는 웹후크를 할당하려면 Amazon Pinpoint API를 사용하여 캠페인 객체를 생성하거나 업데이트합니다.

캠페인의 MessageConfiguration 객체에는 CustomMessage 객체도 포함되어야 합니다. 이 객체에는 하나의 멤버 Data가 있습니다. Data의 값은 사용자 지정 채널로 보낼 메시지 페이로드가 포함된 JSON 문자열입니다.

캠페인은 CustomDeliveryConfiguration 객체를 포함해야 합니다. CustomDeliveryConfiguration 객체 내에서 다음을 지정합니다.

  • EndpointTypes - 사용자 지정 채널 캠페인을 보내야 하는 모든 엔드포인트 유형을 포함하는 배열입니다. 다음 채널 유형 중 일부 또는 전부 포함할 수 있습니다.

    • ADM

    • APNS

    • APNS_SANDBOX

    • APNS_VOIP

    • APNS_VOIP_SANDBOX

    • BAIDU

    • CUSTOM

    • EMAIL

    • GCM

    • SMS

    • VOICE

  • DeliveryUri - 엔드포인트를 보낼 대상입니다. 다음 중 하나를 지정할 수 있습니다.

    • 캠페인이 실행될 때 실행하려는 Lambda 함수의 Amazon 리소스 이름(ARN).

    • 캠페인이 실행될 때 엔드포인트 데이터를 보내려는 웹후크의 URL.

참고

Campaign 객체에는 Hook 객체도 포함될 수도 있습니다. 이 객체는 캠페인이 실행될 때 Lambda 함수에 의해 사용자 지정되는 세그먼트를 만드는 데에만 사용됩니다. 자세한 정보는 를 사용하여 세그먼트 사용자 지정하기 AWS Lambda을 참조하세요.

Amazon Pinpoint가 사용자 지정 채널로 보내는 이벤트 데이터 이해

사용자 지정 채널을 통해 메시지를 보내는 Lambda 함수를 만들기 전에 Amazon Pinpoint가 내보내는 데이터를 숙지해야 합니다. Amazon Pinpoint 캠페인은 사용자 지정 채널을 통해 메시지를 보낼 때 다음 예제와 비슷한 대상 Lambda 함수에 페이로드를 보냅니다.

{ "Message":{}, "Data":"The payload that's provided in the CustomMessage object in MessageConfiguration", "ApplicationId":"3a9b1f4e6c764ba7b031e7183example", "CampaignId":"13978104ce5d6017c72552257example", "TreatmentId":"0", "ActivityId":"575cb1929d5ba43e87e2478eeexample", "ScheduledTime":"2020-04-08T19:00:16.843Z", "Endpoints":{ "1dbcd396df28ac6cf8c1c2b7fexample":{ "ChannelType":"EMAIL", "Address":"mary.major@example.com", "EndpointStatus":"ACTIVE", "OptOut":"NONE", "Location":{ "City":"Seattle", "Country":"USA" }, "Demographic":{ "Make":"OnePlus", "Platform":"android" }, "EffectiveDate":"2020-04-01T01:05:17.267Z", "Attributes":{ "CohortId":[ "42" ] }, "CreationDate":"2020-04-01T01:05:17.267Z" } } }

이벤트 데이터는 다음 속성을 제공합니다.

  • ApplicationId - 캠페인이 속한 Amazon Pinpoint 프로젝트의 ID입니다.

  • CampaignId - Lambda 함수를 간접적으로 호출한 Amazon Pinpoint 캠페인의 ID입니다.

  • TreatmentId - 캠페인 변형의 ID입니다. 표준 캠페인을 만든 경우 이 값은 항상 0입니다. A/B 테스트 캠페인을 만든 경우 이 값은 0~4 사이의 정수입니다.

  • ActivityId - 캠페인에 의해 수행 중인 활동의 ID입니다.

  • ScheduledTime - Amazon Pinpoint가 캠페인을 실행한 시간(ISO 8601 형식)입니다.

  • Endpoints - 캠페인이 대상으로 지정한 엔드포인트의 목록입니다. 각 페이로드는 최대 50개의 엔드포인트를 포함할 수 있습니다. 캠페인을 보낸 세그먼트에 포함된 엔드포인트가 50개를 초과하는 경우 Amazon Pinpoint는 모든 엔드포인트가 처리될 때까지 한 번에 최대 50개의 엔드포인트를 사용하여 함수를 반복적으로 간접 호출합니다.

사용자 지정 채널 Lambda 함수를 생성하고 테스트할 경우 이 샘플 데이터를 사용할 수 있습니다.

웹후크 구성

웹후크를 사용하여 사용자 지정 채널 메시지를 전송하는 경우 웹후크의 URL은 “https://”로 시작해야 합니다. 웹후크 URL에는 영숫자 외에 하이픈(-), 마침표(.), 밑줄(_), 물결표(~), 물음표(?), 슬래시 또는 솔리더스(/), 파운드 또는 해시 기호(#) 및 세미콜론(:)만 포함될 수 있습니다. URL은 RFC3986을 준수해야 합니다.

웹후크 URL을 지정하는 캠페인을 만들면 Amazon Pinpoint가 해당 URL에 HTTP HEAD를 발행합니다. HEAD 요청에 대한 응답에는 X-Amz-Pinpoint-AccountId라는 헤더가 포함되어야 합니다. 이 헤더의 값은 AWS 계정 ID와 같아야 합니다.

Lambda 함수 구성

이 섹션에서는 사용자 지정 채널을 통해 메시지를 보내는 Lambda 함수를 만들 때 수행해야 하는 단계를 개략적으로 설명합니다. 먼저 함수를 만듭니다. 그런 다음 함수에 실행 정책을 추가합니다. 이 정책은 캠페인이 실행될 때 Amazon Pinpoint가 정책을 실행하도록 허용합니다.

Lambda 함수 생성에 대한 소개는 AWS Lambda 개발자 안내서Lambda 함수 빌드를 참조하세요.

Lambda 함수 예제

다음 코드 예제는 페이로드를 처리하고 각 엔드포인트 유형의 엔드포인트 수를 기록합니다. CloudWatch

import boto3 import random import pprint import json import time cloudwatch = boto3.client('cloudwatch') def lambda_handler(event, context): customEndpoints = 0 smsEndpoints = 0 pushEndpoints = 0 emailEndpoints = 0 voiceEndpoints = 0 numEndpoints = len(event['Endpoints']) print("Payload:\n", event) print("Endpoints in payload: " + str(numEndpoints)) for key in event['Endpoints'].keys(): if event['Endpoints'][key]['ChannelType'] == "CUSTOM": customEndpoints += 1 elif event['Endpoints'][key]['ChannelType'] == "SMS": smsEndpoints += 1 elif event['Endpoints'][key]['ChannelType'] == "EMAIL": emailEndpoints += 1 elif event['Endpoints'][key]['ChannelType'] == "VOICE": voiceEndpoints += 1 else: pushEndpoints += 1 response = cloudwatch.put_metric_data( MetricData = [ { 'MetricName': 'EndpointCount', 'Dimensions': [ { 'Name': 'CampaignId', 'Value': event['CampaignId'] }, { 'Name': 'ApplicationId', 'Value': event['ApplicationId'] } ], 'Unit': 'None', 'Value': len(event['Endpoints']) }, { 'MetricName': 'CustomCount', 'Dimensions': [ { 'Name': 'CampaignId', 'Value': event['CampaignId'] }, { 'Name': 'ApplicationId', 'Value': event['ApplicationId'] } ], 'Unit': 'None', 'Value': customEndpoints }, { 'MetricName': 'SMSCount', 'Dimensions': [ { 'Name': 'CampaignId', 'Value': event['CampaignId'] }, { 'Name': 'ApplicationId', 'Value': event['ApplicationId'] } ], 'Unit': 'None', 'Value': smsEndpoints }, { 'MetricName': 'EmailCount', 'Dimensions': [ { 'Name': 'CampaignId', 'Value': event['CampaignId'] }, { 'Name': 'ApplicationId', 'Value': event['ApplicationId'] } ], 'Unit': 'None', 'Value': emailEndpoints }, { 'MetricName': 'VoiceCount', 'Dimensions': [ { 'Name': 'CampaignId', 'Value': event['CampaignId'] }, { 'Name': 'ApplicationId', 'Value': event['ApplicationId'] } ], 'Unit': 'None', 'Value': voiceEndpoints }, { 'MetricName': 'PushCount', 'Dimensions': [ { 'Name': 'CampaignId', 'Value': event['CampaignId'] }, { 'Name': 'ApplicationId', 'Value': event['ApplicationId'] } ], 'Unit': 'None', 'Value': pushEndpoints }, { 'MetricName': 'EndpointCount', 'Dimensions': [ ], 'Unit': 'None', 'Value': len(event['Endpoints']) }, { 'MetricName': 'CustomCount', 'Dimensions': [ ], 'Unit': 'None', 'Value': customEndpoints }, { 'MetricName': 'SMSCount', 'Dimensions': [ ], 'Unit': 'None', 'Value': smsEndpoints }, { 'MetricName': 'EmailCount', 'Dimensions': [ ], 'Unit': 'None', 'Value': emailEndpoints }, { 'MetricName': 'VoiceCount', 'Dimensions': [ ], 'Unit': 'None', 'Value': voiceEndpoints }, { 'MetricName': 'PushCount', 'Dimensions': [ ], 'Unit': 'None', 'Value': pushEndpoints } ], Namespace = 'PinpointCustomChannelExecution' ) print("cloudwatchResponse:\n",response)

Amazon Pinpoint 캠페인이 이 Lambda 함수를 실행하면 Amazon Pinpoint는 세그먼트 멤버의 목록을 함수에 보냅니다. 이 함수는 각 ChannelType의 엔드포인트 수를 계산합니다. 그런 다음 해당 데이터를 Amazon으로 보냅니다 CloudWatch. CloudWatch 콘솔의 Metrics 섹션에서 이러한 지표를 볼 수 있습니다. 메트릭은 PinpointCustomChannelExecution네임스페이스에서 사용할 수 있습니다.

이 코드 예제를 수정하여 외부 서비스의 API에도 연결하여 해당 서비스를 통해 메시지를 보낼 수 있습니다.

Amazon Pinpoint용 Lambda 함수 응답 형식

사용자 지정 채널 활동 후 여정 다변량 또는 예/아니요 분할을 사용하여 엔드포인트 경로를 결정하려면, Amazon Pinpoint가 이해할 수 있는 형식으로 Lambda 함수 응답을 구성한 다음 엔드포인트를 올바른 경로로 보내야 합니다.

응답 구조는 다음과 같은 형식이어야 합니다.

{ 
    <Endpoint ID 1>:{
        EventAttributes: {
            <Key1>: <Value1>,
            <Key2>: <Value2>, 
            ...
        } 
    }, 
    <Endpoint ID 2>:{ 
        EventAttributes: {
            <Key1>: <Value1>,
            <Key2>: <Value2>, 
            ...
        } 
    }, 
... 
}

이렇게 하면 엔드포인트 경로를 결정할 키와 값을 선택할 수 있습니다.

사용자 지정 다변량 분할의 예.

Amazon Pinpoint에 Lambda 함수를 간접적으로 호출할 수 있는 권한 부여

AWS Command Line Interface (AWS CLI) 를 사용하여 Lambda 함수에 할당된 Lambda 함수 정책에 권한을 추가할 수 있습니다. Amazon Pinpoint가 함수를 간접적으로 호출하도록 허용하려면 다음 예제와 같이 Lambda add-permission 명령을 사용합니다.

aws lambda add-permission \ --function-name myFunction \ --statement-id sid0 \ --action lambda:InvokeFunction \ --principal pinpoint.us-east-1.amazonaws.com \ --source-arn arn:aws:mobiletargeting:us-east-1:111122223333:apps/* --source-account 111122223333

위의 명령에서 다음을 수행합니다.

  • myFunction을 Lambda 함수의 이름으로 바꿉니다.

  • us-east-1을 아마존 Pinpoint를 사용하는 지역으로 바꾸십시오 AWS .

  • 111122223333을 AWS 계정 ID로 바꿉니다.

add-permission 명령을 실행하면 Lambda에서 다음 출력이 반환됩니다.

{ "Statement": "{\"Sid\":\"sid\", \"Effect\":\"Allow\", \"Principal\":{\"Service\":\"pinpoint.us-east-1.amazonaws.com\"}, \"Action\":\"lambda:InvokeFunction\", \"Resource\":\"arn:aws:lambda:us-east-1:111122223333:function:myFunction\", \"Condition\": {\"ArnLike\": {\"AWS:SourceArn\": \"arn:aws:mobiletargeting:us-east-1:111122223333:apps/*\"}}, {\"StringEquals\": {\"AWS:SourceAccount\": \"111122223333\"}}} }

Statement 값은 Lambda 함수 정책에 추가된 구문의 JSON 문자열 버전입니다.

실행 정책 추가 제한

실행 정책을 특정 Amazon Pinpoint 프로젝트로 제한하여 수정할 수 있습니다. 이렇게 하려면 앞의 예제에서 *를 프로젝트의 고유 ID로 바꿉니다. 정책을 특정 캠페인으로 제한하여 추가로 제한할 수 있습니다. 예를 들어 프로젝트 ID가 dbaf6ec2226f0a9a8615e3ea5example인 프로젝트에서 캠페인 ID가 95fee4cd1d7f5cd67987c1436example인 캠페인만 허용하도록 정책을 제한하려면 source-arn 속성에 다음 값을 사용합니다.

arn:aws:mobiletargeting:us-east-1:111122223333:apps/dbaf6ec2226f0a9a8615e3ea5example/campaigns/95fee4cd1d7f5cd67987c1436example
참고

Lambda 함수의 실행을 특정 캠페인으로 제한하는 경우 먼저 덜 제한적인 정책을 사용하여 함수를 만들어야 합니다. 그런 다음 Amazon Pinpoint에서 캠페인을 만들고 함수를 선택해야 합니다. 마지막으로, 지정한 캠페인을 참조하도록 실행 정책을 업데이트해야 합니다.