티스토리 뷰

AWS의 Amazon Pinpoint에 이벤트를 보내고, 이벤트 발생시 캠페인을 발송 하도록 만들어 보자.

Custom Event 생성

{
    "ApplicationId": "80716e293edf4c43a3023f4ade22f26c",
    "EventsRequest": {
        "BatchItem": {
            "email-h": {
                "Endpoint": {
                    "Address": "jakemraz100@gmail.com",
                    "ChannelType": "EMAIL"
                },
                "Events": {
                    "KeyName": {
                        "EventType": "_userauth.sign_up",
                        "Timestamp": "2020-05-15T11:10:02Z"
                    }
                }
            }
        }
    }
}

위에서 "email-h"는 endpoint의 id이다.

위 이벤트를 한번 수행하고 나면 Pinpoint Web Console의 캠페인 생성시에 'When an event occurs'를 선택 할 수 있게 된다. (이벤트 보내고 나서 약 30분 정도 걸린다.)

이걸 처음에 시도할 때 굉장히 안 됐었다. When an event occurs를 체크하고 아래 있는 Events에서 트리거 할 이벤트에 아무것도 나오지 않는 것 아닌가..

이벤트 스트림 로그를 읽어보면 분명

_email.open, _email.click, _campaign.opened_notification 등등 많은데 어째서 이벤트에 센싱 되는 것이 하나도 없는 것인가..ㅜㅜ 아니 무엇보다.. 내 맘대로 적는 것은 왜 안되는 것인가.. 굳이 꼭 콤보박스에서 선택을 해야하는것인가..??

이럴땐 개발자 가이드를 다시 상세히 읽어보자

https://docs.aws.amazon.com/ko_kr/pinpoint/latest/userguide/campaigns-schedule.html#campaigns-event-triggered

여기에 이런 말이 있다..

<사용자로부터 이벤트 데이터를 더 많이 수집할수록 이벤트 트리거를 설정할 때 더 많은 옵션을 이용할 수 있습니다. 이러한 값을 Amazon Pinpoint에 제공한 경우에만 이벤트 속성 및 지표를 사용할 수 있습니다. 이벤트 데이터 수집에 대한 자세한 내용은 Amazon Pinpoint 개발자 안내서의 애플리케이션에서 이벤트 보고를 참조하십시오.>

즉.. Event 기반으로 캠페인을 발송하려면.. 사전에 Pinpoint에 이벤트 항목을 제공해야 한다.

'선 트리거', '후 수집' 이 아니고, '선 수집'을 하고 나서야 그 이후 부터 Event 트리거를 설정 할 수 있다는 얘기..

참고로 웹 콘솔이 아니라 API를 통해서 강제로 Campaign을 생성하면 수집 되지 않은 이벤트에 대해서도 이벤트가 발송되는 것을 테스트를 통해 확인했다.

이벤트 중에 _email.open 처럼 email 관련된건 trigger에 안걸리는 듯 하다.

이것 저것 실험 해본 결과 Event Trigger가 걸리지 않는 이벤트는 아래와 같음을 알아냈다.

'_campaign.send', '_email.open', '_email.click', '_email.softbounce', '_email.delivered', '_email.send', '_SMS.SUCCESS', '_SMS.FAILURE', '_SMS.OPTOUT'

특정 커스텀 이벤트에 반응하여 메세지 발송하기

한번이라도 PutEvents API를 통하여 이벤트를 전달한 적이 있으면, AWS Pinpoint의 Console에서 해당 Attributes 및 Metrics의 값이 센싱 된다.

나의 경우는 아래의 Payload로 PutEvents를 수행하고 30분 정도 기다렸더니 Campaign 생성 시에 Attributes와 Metrics 둘다 웹 콘솔에서 확인이 가능했다.

{
    "ApplicationId": "80716e293edf4c43a3023f4ade22f26c",
    "EventsRequest": {
        "BatchItem": {
            "email-c": {
                "Endpoint": {
                    "Address": "jakemraz100@gmail.com",
                    "ChannelType": "EMAIL"
                },
                "Events": {
                    "key1": {
                        "EventType": "device.status",
                        "Timestamp": "2020-05-17T19:09:02+09:00",
                        "Attributes": {
                            "wheel_power": "3"
                        },
                        "Metrics": {
                            "battery_remain": 12.7
                        }
                    }
                }
            }
        }
    }
}

input.json 파일

$ aws pinpoint put-events --cli-input-json file://input.json

위 명령까지 수행해 놓고 30분 정도 기다렸다. 이후 AWS Pinpoint Web Console의 Campaign 생성 화면에서 When an event occurs에 체크 했더니 Attributes 항목과 Metrics 항목에서 wheel_power 항목과 battery_remain 항목이 센싱 되었다. (참고로 Web Console 통하지 않고 CreateCampaign API 통해서 캠페인을 생성하면 기다릴 필요도 없다. 그냥 값 넣어주면 바로 된다.)

위 처럼 Metrics.battery_remain이 less than 10 일 경우 트리거 되도록 캠페인을 생성해 놓고 PutEvents API를 통해 battery_remain 값이 10 미만이 되도록 이벤트를 전송하면 정상적으로 캠페인이 수행되는 것을 확인 할 수 있다.

참고로 위 옵션을 통해 생성한 캠페인에 대한 정보는 아래와 같다.

"Schedule": {
    "EndTime": "2020-05-19T00:00:00+09:00",
    "EventFilter": {
        "Dimensions": {
            "Attributes": {},
            "EventType": {
                "DimensionType": "INCLUSIVE",
                "Values": [
                    "mask.status"
                ]
            },
            "Metrics": {
                "battery_remain": {
                    "ComparisonOperator": "LESS_THAN",
                    "Value": 10.0
                }
            }
        },
        "FilterType": "ENDPOINT"
    },
    "Frequency": "EVENT",
    "IsLocalTime": false,
    "QuietTime": {},
    "StartTime": "2020-05-17T22:52:00+09:00",
    "Timezone": "UTC+09"
}

아쉬운 점은 ComparisonOperator에 BETWEEN이 없다..

이제 다시 PutEvents API를 사용할 경우, 조건에 맞는 이벤트를 캐치하여 캠페인이 수행되는 것을 확인 할 수 있다.

이런 저런 실험

콘솔에서는 스케쥴이 15분 뒤 실행밖에 안된다. API로 스케쥴을 1분 뒤에 바로 실행되게 만든다면?

바로 생성된다. 콘솔에서 15분 뒤에 수행하도록 강제 하는 것은 프론트엔드 측면에서 막는 것인 듯. 서버에서는 막지 않는다. 단 정상적으로 동작할거라고 보장할 순 없을 것 같다. 15분이 뭔가 안정적이니 그렇게 해놨겠지..

A 엔드포인트가 포함되지 않은 세그먼트를 대상으로 (예를 들면 해당 세그먼트에는 B랑 C만 포함) 생성한 이벤트 기반 캠페인을 만든 후 A 엔드포인트 정보가 아닌 다른 엔드포인트 정보(예를 들면 B)를 담아서 PutEvents 한다면?

전달되지 않는다. B를 대상으로 한 세그먼트를 타겟으로 캠페인을 만들었다면, 이벤트도 무조건 B가 수행해야지 B한테 캠페인이 전달된다.

CreateCampaign API를 통하여 수집된 적 없는 이벤트 이름을 넣고 이벤트 기반 캠페인을 생성하면?

제대로 생성되며, 이벤트 받을 경우 캠페인도 성공적으로 수행한다.

아래 넣는 key의 의미는?

"EventsRequest": {
    "BatchItem": {
        "email-c": {
            "Endpoint": {
            },
            "Events": {
                "key": {
                    "EventType": "play.song",
                    "Timestamp": "2020-05-17T18:25:02+09:00"
                }
            }
        }
    }
}

이벤트를 여러개 넣을 때 각 이벤트의 식별자가 되는 듯

그냥 event1, event2 이런식으로 넣으면 될 듯 하다. 중요한것은 email-c 부분이다. endpoint의 id를 넣어줘야 한다. endpoint id만 정확히 넣어줬으면 해당 value는 비워놔도 된다.

put-events의 timestamp를 이벤트 Range 이전으로 한다면? 즉 arrival_timestamp를 보는지 event_timestamp를 보는지 예측 가능

arrival_timestamp 기반인듯. event_timestamp를 캠페인 시작 시간 이전 값으로 넣고 put-events 했지만 정상적으로 수행됨

API를 통해 _email.open 이벤트 기반으로 캠페인 수행하게 할 경우?

즉 이 경우

"Schedule": {
    "EndTime": "2020-05-18T00:00:00+09:00",
    "EventFilter": {
        "Dimensions": {
            "Attributes": {},
            "EventType": {
                "DimensionType": "INCLUSIVE",
                "Values": [
                    "_email.open"
                ]
            },
            "Metrics": {}
        },
        "FilterType": "ENDPOINT"
    },
    "Frequency": "EVENT",
    "StartTime": "2020-05-17T18:46:00+09:00",
    "Timezone": "UTC+09"
}

트리거 되지 않는다

API를 통해 _email.open 이벤트 기반으로 캠페인 수행하게 할 경우? 그리고 FilterType을 System으로 할 경우?

아래 처럼 FilterType을 SYSTEM으로 하는 경우는?

"Schedule": {
    "EndTime": "2020-05-18T00:00:00+09:00",
    "EventFilter": {
        "Dimensions": {
            "Attributes": {},
            "EventType": {
                "DimensionType": "INCLUSIVE",
                "Values": [
                    "_email.open"
                ]
            },
            "Metrics": {}
        },
        "FilterType": "SYSTEM"
    },
    "Frequency": "EVENT",
    "StartTime": "2020-05-17T18:46:00+09:00",
    "Timezone": "UTC+09"
}

여전히 안된다. _email.open 으로 뭔가 하려면 Journey 기능을 통해야 하나 보다.

도대체 FilterType: System은 워따 쓰는겨...?

심지어 내가 PutEvents API를 통하여 _email.open을 강제로 보내도 트리거 되지 않는다.

Analytics에 데이터가 잡히는 시점은?

경우에 따라 다르지만 30분도 넘게 걸리는 경우도 있다. 그러니 조급해 하지말고 천천히 기다리자.

미래 시점으로 Timestamp 값을 적용하여 이벤트를 보내는 경우?

정상적으로 전달된다. 심지어 이벤트 Range를 벗어나는 시점으로 설정해도 잘 전달 된다.

이벤트 트리거는 무조건 arraival_timestamp 기준인 것으로..!

따라서 이벤트 스트림을 ElasticSearch를 통해서 보길 원한다면, 정렬 기준을 event_timestamp 보다는 arraival_timestamp로 잡는 것이 좋다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함