목차 정보

목차

해당 문서는 실시간으로 업데이트 되고 있습니다. (2019-02)

2019-02-22 (v0.9)


피드백이 있을 경우, meelong0@studydev.com 으로 문의 주시면 됩니다.


버전 업데이트 예고 - 2019-10-17

Pinpoint의 기능 개선이 지속적으로 이루어지고 있습니다. UI가 상이하거나 없었던 부분이 지원되거나 새로운 기능들이 하나씩 추가되고 있습니다.

아래 실습은 화면 구성상에 차이가 있을 수는 있으나 동작되는 것을 확인했습니다. 새로운 스크린샷과 새로 나온 기능들에 대해서 파트별로 나누어서 설명하는 형태로 변경됩니다. (지금은 Pinpoint 기본 기능 사용부터 분석까지 모두 묶여 있는 상태)

해당 업데이트는 2019 리인벤트 직후 새로운 기능이 나오면, 해당 기능을 포함하여 12월에 이루어질 예정입니다.


시작하기 전, 개념 정리

시작하기 앞서, 마케팅을 위해서 고객 참여를 유도하고, 고객의 행동을 분석하는 일련의 과정과 사례가 궁금할 경우 다음 영상을 먼저 보는 것을 추천 드립니다.


해당 실습 자료는 마케팅을 위하여 발송한 이메일 별 상태를 확인하는 방법을  Amazon Pinpoint  서비스와 관련 AWS 서비스와 연계하여 설명합니다. (SMS, Push Notifications도 유사하게 구현)


소개

Pinpoint 실습 소개

본 실습은 이메일을 발송하고, 발송한 이메일을 분석하는 서비스입니다.

  • Segment에 이메일을 발송하기 위한 고객 정보를 등록합니다.
  • Campaign에 이메일 내용을 만들어서 메일을 전달합니다.
  • 전달된 이메일이 잘 도착하였는지, 열어 보았는지, 링크를 클릭했는지 추척합니다.
    추적을 위한 코드(이미지)가 포함되어 있어 이메일 열람시 카운팅이 되고, 링크는 Pinpoint에서 체크 가능하도록 Wrapping 된 URL을 방문 후 원래 Link로 리다이렉트 됩니다.
  • Pinpoint 대시보드를 통해서 통계를 확인할 수 있습니다.
  • 자세한 로그 분석은 Pinpoint에서 받는 데이터를 Kinesis를 통해서 전달하고 전처리 과정을 거친 후 Athena에서 SQL을 이용해서 쿼리하여 결과를 추출합니다.
    • RAW 데이터에 대한 전처리는 Lambda를 이용할 수 있으며, Glue를 이용해서 ETL Job을 수행할 수 있습니다.
    • AWS Glue의 Crawler를 이용하여 S3에 저장된 스키마 정보가 없는 Log에 대하여 Glue Data Catalog를 생성합니다.
    • Glue Data Catalog와 S3에 저장된 데이터를 조합하여 SQL을 이용하여 대화식 쿼리를 수행할 수 있는 서버스인 Athena를 이용할 수 있습니다.
  • Quicksight를 이용하여 데이터를 시각화 합니다. 여기서는 이메일 별, 시간대별 로그 데이터를 분석하는 방법을 살펴 봅니다.


아키텍처 다이어그램

ETL 작업을 위해서 아래와 같이 Glue를 쓰는 방법이 있습니다. raw 데이터를 원형 그대로 저장하고 요구상황에 맞게 ETL 작업을 해서 사용할 수 있습니다.


실습 전 확인해야할 내용

현재 Pinpoint 서비스를 활용할 수 있는 리전에서 서비스를 테스트 합니다. (2019년 2월 기준 미국 2개, 유럽 2개 리전에서 서비스를 활용할 수 있습니다.)
서비스가 해외 리전에 위치해 있지만, 국내에서도 동일하게 사용할 수 있습니다.

해당 실습 자료는 us-east-1 N. Virginia 를 기준으로 작성 되었습니다. 

기본적으로 Pinpoint를 이용해서 Email 발송서비스의 경우, 리전별로 샌드박스 환경이기 때문에 등록하고 확인 받지 않은 고객에게 이메일을 발송할 수 없습니다.
사전에 등록하지 않은 사용자에게 이메일을 발송하고자 할 경우, Pinpoint 샌드박스 환경을 종료하도록 다음과 같이 요청합니다.

하루 또는 이틀이 소요될 수 있기 때문에, 사전에 신청을 하고 시작해야 합니다.


실습 환경 구축

실습 환경 구축 1. 프로젝트 생성

AWS 관리 콘솔에서 Pinpoint 서비스로 이동합니다. 프로젝트를 만듭니다. 


실습 환경 구축 2. 프로젝트 설정

SMS, Email, Push 알람 서비스를 사용하기 위해서는 설정이 필요합니다. 해당 실습에서는 Email을 설정합니다.

Email 설정하기

Configure features에서 Email 메뉴에 있는 Configure 버튼을 클릭합니다.

전송에 사용할 이메일 주소를 입력 후, Verify 버튼을 클릭하여 검증을 받습니다.

이메일을 확인하면 다음과 같은 검증 메일이 도착합니다. 링크를 클릭하여 확인합니다.


실습 환경 구축 3. 데이터 보관용 S3 버킷 생성

S3 버킷 생성

S3 버킷을 하나 생성하고, 3개의 폴더(Prefix)를 만듭니다.

버킷명: pinpoint-data- hyouk (해당 버킷명은 전 세계에 유일해야 합니다. 접미사를 수정해서 생성 합니다.)

폴더명: 아래와 같이 폴더를 만듭니다.

  • Prefix 1. pinpoint_user
  • Prefix 2. pinpoint_log
  • Prefix 3. pinpoint_segment

S3 버킷을 한 개 생성합니다.
 

S3 버킷 내 폴더 3개 생성

아래와 같이 폴더 3개를 생성합니다.

  

다음과 같이 3개의 폴더가 만들어진 것을 확인합니다. 보이지 않을 경우, 폴더 리스트 우측 상단의 새로 고침 아이콘을 눌러서 확인합니다.


실습 환경 구축 4. Pinpoint Log 데이터 수집을 위한 Kinesis Data Firehose 연결

이메일 발송 후, 잘 전달 되었는지, 열어 보았는지, 클릭이 발생했는지를 체크할 수 있습니다. Kinesis Firehose를 이용해서 S3에 로그를 다운로드 받습니다.

Pinpoint 만으로도 발신한 이메일에 대한 정보를 기본적으로 확인할 수 있지만, 상세한 상태를 파악하기 위해서는 Kinesis로 별도로 확인하는 로직을 만드는 것이 편리합니다.

이때 2가지 방법을 사용할 수 있습니다. 첫 번째는 raw 데이터를 원형 그대로 S3에 다운로드 받는 방법입니다. 두 번째는 raw 데이터를 Lambda에서 전처리 한 다음에 필요한 데이터만 저장하는 방법입니다.

첫 번째 방법의 경우, ETL을 위해서 Glue를 이용해서 작업을 할 수 있고, 이 실습에서는 실습 과정의 간소화를 위해서 두 번째 방법을 소개 합니다.

Kinesis 서비스 생성

Kinesis 서비스 화면으로 이동 후 Data Firehose 메뉴를 클릭 합니다.

Create delivery stream 버튼을 클릭

Kinesis Firehose Step 1. Name and source

pinpoint-email-firehose 입력 후 하단 Next 버튼 클릭

Kinesis Firehose Step 2. Process records

Record transformation 옵션을 Enabled로 변경하고, Create New 버튼을 클릭하여 Lambda 함수를 생성합니다. General Firehose Processing 블루프린트를 선택합니다.


새창이 뜨면, pinpoint-email-pre-processing 함수 이름을 만들고, 역할은 사용자 지정 역할 생성을 합니다. 새창이 뜨면, 역할 이름을 LamdaKinesisFirehoseRole 이라고 만듭니다. 정책과 함수 코드는 생성후 수정합니다.

IAM에서 방금 생성한 Role에 대한 정책을 수정합니다. 정책 연결 버튼을 클릭하고 AmazonKinesisFirehoseFullAccess 정책을 추가 합니다.

 

 

실습 환경 구축 5. 전처리 Lambda 함수 만들기

Raw 데이터 전처리를 위한 함수 생성 방법

이 방법은 원본 Raw 데이터를 유실하거나, 에러 발생시 데이터 유실의 문제가 발생할 수 있습니다. 

따라서 가능하면, Lambda 보다는 ETL 작업시에 활용할 수 있겠으나, 실시간 스트리밍 데이터를 분석하는데 사용하는 것은 상대적으로 안전한 첫 번째 방법을 추천 드립니다.

(체크 필요) Kinesis에서 Lambda 함수를 아래와 같이 만듭니다.

ETL Lambda
'use strict';
console.log('Loading function');
var email_type = ["_email.send", "_email.delivered", "_email.rejected", "_email.hardbounce", "_email.softbounce", "_email.complaint", "_email.open", "_email.click", "_email.unsubscribe"];

exports.handler = (event, context, callback) => {
    /* Process the list of records and transform them */
    console.log(event);
    const output = event.records.map( function(record) {
        var new_record = {};
        var ori_data = JSON.parse(Buffer.from(record.data, 'base64').toString());
        new_record.recordId = record.recordId;
        new_record.result = 'Ok';
        console.log(ori_data.event_type);
        new_record.data = {
            "event_type": ori_data.event_type,
            "event_timestamp": ori_data.event_timestamp,
            "arrival_timestamp": ori_data.arrival_timestamp,
            "application_id": ori_data.application.app_id,
            "client_id": ori_data.client.client_id,
            "campaign_activity_id": ori_data.attributes.campaign_activity_id,
            "campaign_id": ori_data.attributes.campaign_id
        };
        if (email_type.includes(ori_data.event_type))
        {
            new_record.data.feedback = ori_data.attributes.feedback;
            new_record.data.destination = ori_data.facets.email_channel.mail_event.mail.destination[0];
            new_record.data.message_send_timestamp = ori_data.facets.email_channel.mail_event.mail.message_send_timestamp;
            new_record.data.subject = ori_data.facets.email_channel.mail_event.mail.common_headers.subject;
        }
        else {
            new_record.data.feedback = ori_data.event_type;
            new_record.data.destination = "none";
            new_record.data.message_send_timestamp = ori_data.arrival_timestamp;
            new_record.data.subject = "none";
        }
        new_record.data = Buffer.from(JSON.stringify(new_record.data)+"\n").toString('base64');
        return new_record;
    });
    
    console.log(output);
    console.log(`Processing completed.  Successful records ${output.length}.`);
    callback(null, { records: output });
};

함수 실행 시간을 5분으로 변경하고 저장합니다.

Lambda 화면을 갱신하면, 변경된 Role의 Policy가 적용된 것을 확인할 수 있습니다. (Kinesis Firehose)

다시 Step2로 돌아와서 새로 만든 Lambda 함수를 연결합니다.

Kinesis Firehose Step 3. Choose destination

S3 Bucket 이름은 이전 단계에서 만든 버킷 이름을 선택하고 prefix는 "pinpoint_log/"를 입력합니다. 자동으로 년/월/일/시간 으로 폴더가 구분되면서 로그가 저장됩니다.
로그 에러를 위한 폴더도 설정해 줍니다. "pinpoint_log_error/"

Kinesis Firehose Step 4. Configure settings

S3에 담을 데이터의 크기 또는 시간을 지정합니다. 두 가지 조건 중 하나를 만족할 때, 데이터가 저장됩니다. 테스트를 위해서 최소 단위인 1MB / 60초로 지정하도록 하겠습니다.

Kinesis가 수행될 때 S3에 접근해서 로그를 기록하기 위해서는 접근 권한이 필요합니다. 따라서 새로운 Role을 하나 등록합니다.

Kinesis Firehose Step 5. Review

모든 설정이 완료되었으면, 우측 하단의 Create delivery stream 버튼을 클릭하여 Firehose 생성 작업을 완료합니다.

Firehose가 하나 새롭게 추가되는 것을 볼 수 있습니다.

캠페인이 시작하고 이메일을 발송하고, 발송된 이메일에 대한 정보를 수집하기 위한 작업이 완료되었습니다.

실습 환경 구축 6. Pinpoint Export data 설정

이벤트를 분석하기 위해서 Firehose에 연결하는 작업을 지정합니다. Pinpoint에서 발생한 로그 데이터는 Firehose로 이벤트를 보내고, Lambda에서 전처리 된 후, S3로 저장합니다. 

설정에서 Event stream 관리하기

이벤트 스트림 설정하기


이메일 발송

이메일 발송 1. Segment 등록

Endpoint로 Email 활용

아래 이메일 정보는 보내고자 하는 정보로 변경해야 합니다.

ChannelTypeAddressUser.UserAttributes.FirstNameUser.UserAttributes.LastNameUser.UserAttributes.AliasUser.UserAttributes.Favorite
EMAIL hyouk@amazon.com 현수1amazonSports
EMAIL meelong0@gmail.com 현수2gmailSports
EMAIL meelong0@studydev.com 현수3studydevTravel
EMAIL kim_hyounsoo@nate.com 현수4nateMusic
EMAIL meelong0@naver.com 현수5naverTravel

이메일 발송하려는 정보를 모아서 컴마(,)를 포함하는 csv 형태의 파일로 만들고, S3 버킷에 prefix를 포함하여 업로드 합니다.

해당 작업은 엑셀 등과 같은 애플리케이션 또는 메모장에서 직접 작성하실 수 있습니다.

현재 운영중인 CRM이나 DB에 정보가 있을 경우, 위와 같은 포맷으로 csv 파일을 만들면 됩니다.

Segment 정보 생성


세그먼트 파일 S3에 업로드

Pinpoint에서 Segment  정보를 등록합니다. 위에서 생성된 파일을 S3에 업로드 합니다.

Pinpoint 서비스에서 Segment 등록

Segment 이름과, S3에 업로드한 폴더의 위치, Pinpoint가 S3의 파일에 접근하기 위한 권한을 위한 Role을 생성하고, CSV 파일은 컴마(,)로 구분되어 있음을 체크 합니다.

등록이 진행되는 것을 확인할 수 있습니다. 등록이 되면 Segment 정보를 볼 수 있습니다.

Link: Segment에서 사용 가능한 속성 값에 대한 확인 링크 이동

이메일 발송 2. 캠페인 작성

캠페인을 만들어서 이메일을 발송하겠습니다.

캠페인 생성

캠페인 메뉴에서 새로운 캠페인을 생성합니다.

Campaign Step 1. Create a campaign

Campaign Step 2. Choose a segment 

Campaign Step 3. Create your message

Campaign Step 4. Choose when to send the campaign

Campaign Step 5. Review and launch

템플릿 코드 예

안녕하세요. {{User.UserAttributes.FirstName}} {{User.UserAttributes.LastName}}님,

Pinpoint 테스트 안내 메일입니다.

선호하는 정보를 클릭하면 맞춤형 서비스를 제공해 드립니다.


1. 메인 (http://www.chosun.com/index.html)
2. 뉴스 (http://news.chosun.com/index.html)
3. 정치 (http://news.chosun.com/politics/index.html)
4. 스포츠 (http://news.chosun.com/sports/index.html)
5. 경제 (http://biz.chosun.com/index.html)
6. 연예 (http://news.chosun.com/ent/index.html)

감사합니다.
----

만약 위 내용을 이메일로 보낼 경우 아래와 같은 형태로 작성할 수 있습니다.
향후 Personalize를 활용하기 위한 예시입니다. (사용자별로 어떤 컨텐츠를 선호하는지 구분하고, 맞춤형서비스를 제공하는 것을 타겟으로 할 경우)

제목: {{User.UserAttributes.LastName}}님 선호하는 정보를 선택해 주세요
code 기준
<p>안녕하세요. {{User.UserAttributes.FirstName}} {{User.UserAttributes.LastName}}님({{User.UserAttributes.Alias}}),</p><p>Pinpoint 테스트 안내 메일입니다.</p><p>선호하는 정보를 클릭하면 맞춤형 서비스를 제공해 드립니다.</p><ol><li><a href="http://www.chosun.com/index.html" target="_blank">메인</a></li><li><a href="http://news.chosun.com/index.html" target="_blank">뉴스</a></li><li><a href="http://news.chosun.com/politics/index.html" target="_blank">정치</a></li><li><a href="http://news.chosun.com/sports/index.html" target="_blank">스포츠</a></li><li><a href="http://biz.chosun.com/index.html" target="_blank">경제</a></li><li><a href="http://news.chosun.com/ent/index.html" target="_blank">연예</a></li></ol><p>감사합니다.</p>

이메일 발송 3. 이메일 수신 확인

이메일별 수신 확인

이메일 발송 4. Pinpoint를 이용한 이메일 상태 확인

Pinpoint 대시보드를 이용하면, 이메일 전달 상태를 모니터링 할 수 있습니다. 집계 정보는 다음과 같이 표시됩니다.

5개 메일을 보냈고, 1개를 열어 본 것을 알 수 있습니다. 테스트를 위해서 몇 개 이메일을 제외하고 열어보고 중복으로 여러 링크를 클릭해 봅니다.


이메일 상세 분석

이메일 상세 분석 1. Pinpoint Log 분석

Firehose + Lambda 동작에 대한 확인을 CloudWatch Logs에서 볼 수 있습니다. 연결이 제대로 되면 다음과 같이 로그를 확인할 수 있습니다.

원본 데이터 및 재처리된 데이터는 Base64 인코딩 되어 있습니다.

다음과 같이 테스트 연결에 대한 정보를 확인할 수 있습니다.

누가 언제 메일을 열어보았는지, 어떤 링크를 클릭했는지 정보를 알 수 있습니다. 사용자별로 선호 채널에 대한 정보를 수집할 수 있습니다.

테스트를 위해서 이메일 별로 열어서 확인해 볼 수 있습니다.

이메일 상세 분석 2. AWS Glue를 이용한 S3 데이터에 대한 Data catalog 생성

S3에는 Raw 데이터 또는 전처리 된 데이터 집한이 들어 있습니다. 이 데이터에 쿼리를 하기 위해서는 필요한 정보에 대해서 스키마 정보가 필요합니다. 이런 스키마 정보와 메타 데이터 정보를 추가하고 관리할 수 있는 기능을 Glue Data catalog가 제공합니다.

직접 스키마를 만들수도 있지만, 데이터를 기반으로 자동으로 스키마 정보를 생성하고 Data Type을 선택할 수 있습니다.

이러한 기능을 Glue Crawler를 이용해서 자동으로 만들 수 있습니다. 여기서는 Glue Crawler를 이용하여 스키마 정보를 생성하겠습니다.

Glue Crawler 등록

Glue 크롤러 이름을 입력

로그 데이터를 가져올 S3 버킷의 폴더 위치를 지정

 

데이터 스토어 지정

 

IAM 역할 생성

크롤러 일정을 생성

데이터를 수집할 때, 파티션(prefix) 정보를 포함하기 때문에 추가 되는 데이터가 필요할 때는 다시 수집해야 합니다. 또는 1회성이 아닌 주기적으로 확인하도록 설정이 필요합니다.

크롤러 결과 데이터 카달로그가 만들어질 정보를 생성

크롤러를 실행하여 데이터 수집

이 작업 전에, 데이터 생성을 위해서 발송한 이메일을 확인하고 링크를 클릭하는 작업을 합니다.

Glue에 생성된 Table 확인

스키마 정보 확인

자동으로 스키마 정보가 생성됩니다. 스키마 정보는 편집이 가능합니다.


이메일 상세 분석 3. Athena에서 SQL 쿼리하기

Glue에서 제공하는  Data Catalog 정보와 S3의 raw data(전처리 된 데이터)를 조합하면, SQL를 사용할 수 있습니다.

Glue Crawler의 경우, Pinpoint에서 생성한 로그를 파티션 단위로 가져올 수 있으며, 추가될 경우, 다시 데이터를 가져오는 작업이 필요할 수 있습니다. (파티션 정보가 누락되어 있는 경우에 대해서 참고하기 위함)

Athena 콘솔에서 Glue에서 데이터베이스와 테이블 정보를 확인 

SQL for Athena

사용자별 마지막 이메일 수신 상태 정보
SELECT
  last_activity_by_user.*
FROM 
(
  SELECT
    email_log.destination, email_log.event_type, email_log.event_timestamp, email_log.feedback
  FROM 
  (
    SELECT
      destination, MAX(event_timestamp) AS last_timestamp
    FROM
      pinpoint_log
    GROUP BY
      destination
  ) last_data
  INNER JOIN
    pinpoint_log email_log
  ON
    last_data.destination = email_log.destination AND last_data.last_timestamp = email_log.event_timestamp
) last_activity_by_user
ORDER BY event_timestamp ASC


CREATE OR REPLACE VIEW "email_log_view" AS
SELECT destination, feedback, event_type, event_timestamp FROM "pinpoint"."pinpoint_log" WHERE destination != 'none' ORDER BY event_timestamp ASC;

결과는 CSV 파일 형태로 다운로드 받을 수 있습니다.

만약 이메일을 받지 않은 사용자를 추출하고자 할 때에는 쿼리 후의 결과를 토대로 확인 가능합니다.


이메일 상세 분석 4. Segment 정보 Export 하기

Pinpoint에 등록한 Segment 정보와 Raw Log 데이터와 결합하기 위해서는 업로드한 Segment 정보에 등록된 ID 값이 필요합니다. 이 값을 분석할 때, Join해서 사용할 것입니다.

Pinpoint에서 Segment로 등록한 사용자 정보를 Export 하기 위해서는 AWS CLI나 SDK를 사용할 수 있습니다. 이때, S3에 export 하기 때문에, 아래와 같이 Policy와 Role을 생성해야 합니다.

해당 Role은 AWS CLI를 수행할 때, 수행할 수 있는 Role의 ARN 정보를 주어 실행하도록 합니다.

Segment 정보 Export 하기 1. Pinpoint to S3를 위한 Policy로 생성

Pinpoint에서 S3로 Segment 정보를 추출해서 저장할 수 있는 정책을 생성 (콘솔에서 하거나, 또는 json 파일 만들어서 AWS CLI로 등록 가능)

Policy 생성
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowUserToSeeBucketListInTheConsole",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Sid": "AllowRootAndHomeListingOfBucket",
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::pinpoint-data-hyouk"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:delimiter": [
                        "/"
                    ],
                    "s3:prefix": [
                        "",
                        "pinpoint_segment/"
                    ]
                }
            }
        },
        {
            "Sid": "AllowListingOfUserFolder",
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::pinpoint-data-hyouk"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "pinpoint_segment/*"
                    ]
                }
            }
        },
        {
            "Sid": "AllowAllS3ActionsInUserFolder",
            "Action": [
                "s3:*"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::pinpoint-data-hyouk/pinpoint_segment/*"
            ]
        }
    ]
}

Segment 정보 Export 하기 2. Pinpoint to S3를 위한 Role 생성

위 Policy에서 만들어진 ARN으로 등록

trustpolicy.json
{
    "Role": {
        "Path": "/",
        "RoleName": "s3ExportRole",
        "RoleId": "AROAIIPCRD2PFUZKC766O",
        "Arn": "arn:aws:iam::501497829891:role/s3ExportRole",
        "CreateDate": "2019-02-18T02:31:02Z",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "pinpoint.amazonaws.com"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        }
    }
}


Role 생성
$ aws iam create-role --role-name s3ExportRole --assume-role-policy-document file://trustpolicy.json

Segment 정보 Export 하기 3. Pinpoint의 사용자 정보 추출

$ aws pinpoint create-export-job --application-id 3236d7413d154bd6badd940d96a5a043 --export-job-request S3UrlPrefix=s3://pinpoint-data-hyouk/pinpoint_segment/,RoleArn=arn:aws:iam::501497829891:role/s3ExportRole
{
    "ExportJobResponse": {
        "CreationDate": "2019-02-18T03:38:51.081Z",
        "Definition": {
            "RoleArn": "arn:aws:iam::501497829891:role/s3ExportRole",
            "S3UrlPrefix": "s3://pinpoint-data-hyouk/pinpoint_segment/"
        },
        "Id": "ba9a7396829448619862b19a8bf34992",
        "JobStatus": "CREATED",
        "Type": "EXPORT"
    }
}

S3에 추출되어 있는 파일의 사용자 정보

Segment Export Data
{"ChannelType":"EMAIL","Address":"kim_hyounsoo@nate.com","EndpointStatus":"ACTIVE","OptOut":"NONE","EffectiveDate":"2019-02-18T00:02:34.876Z","User":{"UserAttributes":{"Favorite":["Music"],"FirstName":["Kim"],"LastName":["HyounsooNate"]}},"ApplicationId":"3236d7413d154bd6badd940d96a5a043","Id":"zzwl/devcx5mobniyoqdorvgjja","CreationDate":"2019-02-18T00:02:34.876Z"}
{"ChannelType":"EMAIL","Address":"hyouk@amazon.com","EndpointStatus":"ACTIVE","OptOut":"NONE","EffectiveDate":"2019-02-18T00:02:34.876Z","User":{"UserAttributes":{"Favorite":["Sports"],"FirstName":["Kim"],"LastName":["HyounsooA"]}},"ApplicationId":"3236d7413d154bd6badd940d96a5a043","Id":"hfqagb8bxtwccbiong1euah9yl4","CreationDate":"2019-02-18T00:02:34.876Z"}
{"ChannelType":"EMAIL","Address":"meelong0@gmail.com","EndpointStatus":"ACTIVE","OptOut":"NONE","EffectiveDate":"2019-02-18T00:02:34.876Z","User":{"UserAttributes":{"Favorite":["Sports"],"FirstName":["Kim"],"LastName":["HyounsooG"]}},"ApplicationId":"3236d7413d154bd6badd940d96a5a043","Id":"r+aodq6fdiv23z3hdososax+gru","CreationDate":"2019-02-18T00:02:34.876Z"}
{"ChannelType":"EMAIL","Address":"meelong0@studydev.com","EndpointStatus":"ACTIVE","OptOut":"NONE","EffectiveDate":"2019-02-18T00:02:34.876Z","User":{"UserAttributes":{"Favorite":["Travel"],"FirstName":["Kim"],"LastName":["HyounsooS"]}},"ApplicationId":"3236d7413d154bd6badd940d96a5a043","Id":"ljvckifoswwnlskvd++i2jicf6y","CreationDate":"2019-02-18T00:02:34.876Z"}
{"ChannelType":"EMAIL","Address":"meelong0@naver.com","EndpointStatus":"ACTIVE","OptOut":"NONE","EffectiveDate":"2019-02-18T00:02:34.876Z","User":{"UserAttributes":{"Favorite":["Travel"],"FirstName":["Kim"],"LastName":["HyounsooNaver"]}},"ApplicationId":"3236d7413d154bd6badd940d96a5a043","Id":"gkkboumyo6yqsodhxuvrtebrkky","CreationDate":"2019-02-18T00:02:34.876Z"}

SQL View Table Result (사용자 정보를 받았을 경우)

CREATE OR REPLACE VIEW pinpoint_email_log AS 
SELECT
  "id"
, "address"
, "user"."userattributes"."firstname"
, "user"."userattributes"."lastname"
, "applicationid"
, "campaign_activity_id"
, "channeltype"
, "endpointstatus"
, "event_type"
, "event_timestamp"
, "destination"
, "feedback"
FROM
  pptest.emaillog email_log
LEFT JOIN
  pptest.exports user_info
ON
  email_log.client_id = user_info.id
ORDER BY email_log.event_timestamp ASC, user_info.id ASC

데이터 시각화

QuickSight는 Athena, Redshift, S3에 저장되어 있는 정보를 기반으로 시각화를 할 수 있는 기능을 제공합니다.

데이터 시각화 1. QuickSight 데이터 수집 권한 추가

QuickSight에서 Data를 참고할 때에는 Athena 뿐만 아니라, 원본 Data인 S3에 대한 접근 권한이 필요 합니다.

 

이 권한을 주지 않을 경우, Import 하다가 에러가 발생할 수 있습니다. 필요에 따라서는 다른 계정의 S3를 연계하여 사용할 수 있습니다.

데이터 시각화 2. QuickSight로 데이터 수집

New Analysis 버튼 클릭

New data set 버튼 클릭

Athena를 데이터 소스로 지정

Athena 테이블 정보 선택

Data 정보를 활용하기 위한 스토리지 선택 (in-Memory는 SPICE)

데이터 시각화 3. QuickSight로 데이터 시각화

QuickSight에서 대시보드를 만들어서, 통계 정보를 쉽게 볼 수 있도록 기능을 제공하세요.  차트를 선택하고 데이터로 필드 정보를 클릭하여 시각화 합니다.


가격

테스트 가격 정보

아래 테이블은 us-east-1 N. Virginia 테스트 기준이며, 각 서비스별 Free tier 볼륨이 있을 수 있으므로 적절한 시뮬레이션이 필요합니다.

비용이 가장 많이 발생한 Glue의 CrawlerRun은 테스트를 위해서 반복적으로 많이 돌려서 사용했습니다.
CloudWatch 역시 개발 Log 테스트를 위해서 대부분의 Raw 데이터와 ETL 데이터를 로깅하는데 사용했습니다.

서비스상세가격 단위사용량예상 비용비고
AWS Glue



CrawlerRun$0.44 Data Processing Unit-Hour for AWS Glue crawler

0.785 DPU-Hour

$0.35
Request

$0 for AWS Glue Data Catalog requests under the free tier

4,596 Request

$0.00


Storage

$0 for AWS Glue Data Catalog storage under the free tier

0.574 Obj-Month

$0.00


Pinpoint E-mail

$1/10,000

45 Count$0.00


Push notification

처음 1백만 개의 알림은 $0, 그 후 $1/1,000,000


$0
SMS

발송한 메시지당 요금을 지불 (대한민국: $0.02414)


$0
Voice분당 음성 요금 적용
$0

QuickSight

Standard Edition$12/1-user/1-month (작성자 기준)
$0
LambdaCompute Free Tier 400,000 GB-Seconds

2.075 seconds

$0
RequestsFree Tier - 1,000,000 Requests81 Requests$0
AthenaData scannedData scanned per query in Terabytes

0.002 Terabytes

$0.01


CloudWatchstandard $0.10 per alarm metric month

1.382 Alarms

$0.14


PutLogEventsFirst 5GB per month of log data ingested is free

0.001 GB

$0
TimedStorage-ByteHrs

First 5GB-mo per month of logs storage is free.

0.000000270 GB-Mo

$0
Kinesis FirehosePutRecordBatch

Tier 1 $0.029 per GB of data ingested

0.001 GB

$0.00


S3Requests-Tier1$0.005 per 1,000 PUT, COPY, POST, or LIST requests

2,197 Requests

$0.01
Requests-Tier2

$0.004 per 10,000 GET and all other requests

4,623 Requests

$0
TimedStorage-ByteHrs$0.023 per GB - first 50 TB / month of storage used

0.000005 GB-Mo

$0
합계


$0.51


기타 정보

Email 발송시 발생하는 이벤트 타입 RAW 데이터 예

_campaign.send: 캠페인이시작되었을때발생

{"event_type":"_campaign.send","event_timestamp":1550717400850,"arrival_timestamp":1550717401085,"event_version":"3.1","application":{"app_id":"0e19ae99d54c40f199483417dcd19d31","sdk":{}},"client":{"client_id":"gkkboumyo6yqsodhxuvrtebrkky"},"device":{"platform":{}},"session":{},"attributes":{"treatment_id":"0","campaign_activity_id":"348241f1c3aa4442bc0887aa65f10372","campaign_id":"43f200c4680540f89b7459c710a1893f","campaign_send_status":"SUCCESS"},"client_context":{"custom":{"endpoint":"{\"ChannelType\":\"EMAIL\",\"EndpointStatus\":\"ACTIVE\",\"OptOut\":\"NONE\",\"EffectiveDate\":\"2019-02-21T02:43:57.103Z\",\"User\":{\"UserAttributes\":{\"Favorite\":[\"Travel\"],\"Alias\":[\"naver\"],\"FirstName\":[\"김\"],\"LastName\":[\"현수5\"]}}}"}},"awsAccountId":"501497829891"}

_email.delivered: 이메일이 정상적으로 전달되었을 때 발생

{"event_type":"_email.delivered","event_timestamp":1550717401726,"arrival_timestamp":1550717400869,"event_version":"3.1","application":{"app_id":"0e19ae99d54c40f199483417dcd19d31","sdk":{}},"client":{},"device":{"platform":{}},"session":{},"attributes":{"feedback":"delivered","treatment_id":"0","campaign_activity_id":"348241f1c3aa4442bc0887aa65f10372","campaign_id":"43f200c4680540f89b7459c710a1893f"},"client_context":{"custom":{"pp:legacy_identifier":"0e19ae99d54c40f199483417dcd19d31"}},"awsAccountId":"501497829891","facets":{"email_channel":{"mail_event":{"mail":{"message_id":"02000000vadbv9o8-q920qecu-ghpa-9fhb-defb-26rqom018d00-000000","message_send_timestamp":1550717400869,"from_address":"meelong0@studydev.com","destination":["hyouk@amazon.com"],"headers_truncated":false,"headers":[{"name":"Date","value":"Thu, 21 Feb 2019 02:50:00 +0000"},{"name":"From","value":"meelong0@studydev.com"},{"name":"To","value":"hyouk@amazon.com"},{"name":"Message-ID","value":"<415151185.7195180.1550717401116.JavaMail.ec2-user@ip-10-0-118-38.ec2.internal>"},{"name":"Subject","value":"현수1님 선호하는 정보를 선택해 주세요"},{"name":"MIME-Version","value":"1.0"},{"name":"Content-Type","value":"multipart/alternative;  boundary=\"----=_Part_7195179_1177699404.1550717401114\""},{"name":"Content-Transfer-Encoding","value":"quoted-printable"}],"common_headers":{"from":"meelong0@studydev.com","date":"Thu, 21 Feb 2019 02:50:00 +0000","to":["hyouk@amazon.com"],"subject":"현수1님 선호하는 정보를 선택해 주세요"}},"delivery":{"smtp_response":"250 ok:  Message 183158971 accepted","reporting_mta":"a8-58.smtp-out.amazonses.com","recipients":["hyouk@amazon.com"],"processing_time_millis":857}}}}}

_email.open: 이메일을 열었을 때 발생

{"event_type":"_email.open","event_timestamp":1550717500298,"arrival_timestamp":1550717400868,"event_version":"3.1","application":{"app_id":"0e19ae99d54c40f199483417dcd19d31","sdk":{}},"client":{},"device":{"platform":{}},"session":{},"attributes":{"feedback":"opened","treatment_id":"0","campaign_activity_id":"348241f1c3aa4442bc0887aa65f10372","campaign_id":"43f200c4680540f89b7459c710a1893f"},"client_context":{"custom":{"pp:legacy_identifier":"0e19ae99d54c40f199483417dcd19d31"}},"awsAccountId":"501497829891","facets":{"email_channel":{"mail_event":{"mail":{"message_id":"02000000i6hkn91h-kmka1r0d-7dqt-fka4-0jot-st8klfn7l300-000000","message_send_timestamp":1550717400868,"from_address":"meelong0@studydev.com","destination":["meelong0@gmail.com"],"headers_truncated":false,"headers":[{"name":"Date","value":"Thu, 21 Feb 2019 02:50:00 +0000"},{"name":"From","value":"meelong0@studydev.com"},{"name":"To","value":"meelong0@gmail.com"},{"name":"Message-ID","value":"<1506996128.7186845.1550717401046.JavaMail.ec2-user@ip-10-0-162-204.ec2.internal>"},{"name":"Subject","value":"현수2님 선호하는 정보를 선택해 주세요"},{"name":"MIME-Version","value":"1.0"},{"name":"Content-Type","value":"multipart/alternative;  boundary=\"----=_Part_7186844_67699459.1550717401045\""}],"common_headers":{"from":"meelong0@studydev.com","date":"Thu, 21 Feb 2019 02:50:00 +0000","to":["meelong0@gmail.com"],"subject":"현수2님 선호하는 정보를 선택해 주세요"}},"open":{"ip_address":"66.249.82.141","user_agent":"Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)"}}}}}

_email.click: 이메일에서 링크를 클릭했을 때 발생

{"event_type":"_email.click","event_timestamp":1550717509949,"arrival_timestamp":1550717400868,"event_version":"3.1","application":{"app_id":"0e19ae99d54c40f199483417dcd19d31","sdk":{}},"client":{},"device":{"platform":{}},"session":{},"attributes":{"feedback":"http://www.chosun.com/index.html","treatment_id":"0","campaign_activity_id":"348241f1c3aa4442bc0887aa65f10372","campaign_id":"43f200c4680540f89b7459c710a1893f"},"client_context":{"custom":{"pp:legacy_identifier":"0e19ae99d54c40f199483417dcd19d31"}},"awsAccountId":"501497829891","facets":{"email_channel":{"mail_event":{"mail":{"message_id":"02000000i6hkn91h-kmka1r0d-7dqt-fka4-0jot-st8klfn7l300-000000","message_send_timestamp":1550717400868,"from_address":"meelong0@studydev.com","destination":["meelong0@gmail.com"],"headers_truncated":false,"headers":[{"name":"Date","value":"Thu, 21 Feb 2019 02:50:00 +0000"},{"name":"From","value":"meelong0@studydev.com"},{"name":"To","value":"meelong0@gmail.com"},{"name":"Message-ID","value":"<1506996128.7186845.1550717401046.JavaMail.ec2-user@ip-10-0-162-204.ec2.internal>"},{"name":"Subject","value":"현수2님 선호하는 정보를 선택해 주세요"},{"name":"MIME-Version","value":"1.0"},{"name":"Content-Type","value":"multipart/alternative;  boundary=\"----=_Part_7186844_67699459.1550717401045\""}],"common_headers":{"from":"meelong0@studydev.com","date":"Thu, 21 Feb 2019 02:50:00 +0000","to":["meelong0@gmail.com"],"subject":"현수2님 선호하는 정보를 선택해 주세요"}},"click":{"ip_address":"114.202.31.81","user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36","link":"http://www.chosun.com/index.html"}}}}}
  • 레이블 없음

2 댓글

  1. Streaming Amazon Pinpoint Events to Kinesis

    상세 JSON 값은 위 제목 링크 클릭

    Standard Email Event Types

    • _email.send

    • _email.delivered

    • _email.rejected

    • _email.hardbounce

    • _email.softbounce

    • _email.complaint

    • _email.open

    • _email.click

    • _email.unsubscribe

    Standard SMS Event Types

    • _sms.send

    • _sms.success

    • _sms.fail

    • _sms.optout

    Standard App Event Types

    • _campaign.send

    • _monetization.purchase

    • _session.start

    • _session.stop

    • _session.pause

    • _session.resume

    • _userauth.sign_in

    • _userauth.sign_up

    • _userauth.auth_fail

  2. Google Analytics 분석 정보: https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce

    Load the Ecommerce Plugin

    ga('require', 'ecommerce');

    Adding a Transaction

    ga('ecommerce:addItem', {
      'id': '1234',                     // Transaction ID. Required.
      'name': 'Fluffy Pink Bunnies',    // Product name. Required.
      'sku': 'DD23444',                 // SKU/code.
      'category': 'Party Toys',         // Category or variation.
      'price': '11.99',                 // Unit price.
      'quantity': '1'                   // Quantity.
    });

    Adding Items

    ga('ecommerce:addItem', {
      'id': '1234',                     // Transaction ID. Required.
      'name': 'Fluffy Pink Bunnies',    // Product name. Required.
      'sku': 'DD23444',                 // SKU/code.
      'category': 'Party Toys',         // Category or variation.
      'price': '11.99',                 // Unit price.
      'quantity': '1'                   // Quantity.
    });

    Sending Data

    ga('ecommerce:send');